@aidotnet/server-darwin-arm64 0.14.3101 → 0.14.3103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/astra-server +2 -2
- package/bin/wwwroot/assets/ClientsPage-CbisrdvY.js +9 -0
- package/bin/wwwroot/assets/KeyPage-BJkqoRws.js +1 -0
- package/bin/wwwroot/assets/McpPage-lDbAQFBD.js +3 -0
- package/bin/wwwroot/assets/ModelDetailPage-2SDue3md.js +1 -0
- package/bin/wwwroot/assets/ModelsPage-Djwi1_69.js +1 -0
- package/bin/wwwroot/assets/PluginsPage-Cr3_QueY.js +2 -0
- package/bin/wwwroot/assets/PrivacyPage-K20lHsrR.js +1 -0
- package/bin/wwwroot/assets/ProviderDetailPage-dCLgz9IA.js +3 -0
- package/bin/wwwroot/assets/ProvidersPage-B3UD_FXO.js +3 -0
- package/bin/wwwroot/assets/SettingsPage-BOv88_uQ.js +2 -0
- package/bin/wwwroot/assets/SmartRoutingPage-DUdAF-mO.js +2 -0
- package/bin/wwwroot/assets/TokenDetailPage-DAFuMypb.js +1 -0
- package/bin/wwwroot/assets/{TokenPoolEditor-DfmDnnxw.js → TokenPoolEditor-CGc4q0xj.js} +1 -1
- package/bin/wwwroot/assets/TokensPage-BAszgNt-.js +1 -0
- package/bin/wwwroot/assets/TracesPage-zR4Nhppl.js +8 -0
- package/bin/wwwroot/assets/{TrayPanelPage-xke1V9tu.js → TrayPanelPage-BzWJbHrV.js} +1 -1
- package/bin/wwwroot/assets/TrayPanelView-C8TTq4KZ.js +1 -0
- package/bin/wwwroot/assets/alert-BKRTQ9va.js +15 -0
- package/bin/wwwroot/assets/{arrow-down-DeIGdMUk.js → arrow-down-4QyszMPK.js} +1 -1
- package/bin/wwwroot/assets/{arrow-left-DX1c-nYY.js → arrow-left-CgusYKe5.js} +1 -1
- package/bin/wwwroot/assets/{arrow-up-right-D--u8dK5.js → arrow-up-right-CgKLuRMO.js} +1 -1
- package/bin/wwwroot/assets/{chart-column-zt3ZRFLH.js → chart-column-DrO0zSNb.js} +1 -1
- package/bin/wwwroot/assets/{checkbox-BJe8ekJy.js → checkbox-JghCvxwP.js} +1 -1
- package/bin/wwwroot/assets/{cloud-download-DWw6s5ag.js → cloud-download-Cq6X58YR.js} +1 -1
- package/bin/wwwroot/assets/confirm-morph-bdMiffHC.js +1 -0
- package/bin/wwwroot/assets/{ellipsis-BH_FL485.js → ellipsis-C09AxsS6.js} +1 -1
- package/bin/wwwroot/assets/{external-link-Bb6sx3jt.js → external-link-B54WZqyE.js} +1 -1
- package/bin/wwwroot/assets/{folder-open-Bcx5mAII.js → folder-open-DbnPnrzj.js} +1 -1
- package/bin/wwwroot/assets/index-8z9hfQDF.css +1 -0
- package/bin/wwwroot/assets/index-Cj8lNw6g.js +120 -0
- package/bin/wwwroot/assets/{log-out-Ch09k2bC.js → log-out-ZnLW7wzx.js} +1 -1
- package/bin/wwwroot/assets/minus-DosBdkUl.js +1 -0
- package/bin/wwwroot/assets/overlays-CizKmvVN.js +41 -0
- package/bin/wwwroot/assets/{pencil-fY6CohHT.js → pencil-BuVygJ9-.js} +1 -1
- package/bin/wwwroot/assets/{power-B9MMcl6Y.js → power-CfEiSxDi.js} +1 -1
- package/bin/wwwroot/assets/radio-cards-6WsHN05O.js +1 -0
- package/bin/wwwroot/assets/{rotate-ccw-DsmSscuv.js → rotate-ccw-BhDSBCvo.js} +1 -1
- package/bin/wwwroot/assets/{sortable.esm-CO34h2h7.js → sortable.esm-4hCCGHPl.js} +1 -1
- package/bin/wwwroot/index.html +4 -4
- package/package.json +1 -1
- package/bin/wwwroot/assets/ClientsPage-BsCvaS4d.js +0 -9
- package/bin/wwwroot/assets/KeyPage-bkK0B_mk.js +0 -1
- package/bin/wwwroot/assets/ModelDetailPage-BEVSPYM6.js +0 -1
- package/bin/wwwroot/assets/ModelsPage-BGij6zvC.js +0 -1
- package/bin/wwwroot/assets/PluginsPage-dVUvE8Lf.js +0 -2
- package/bin/wwwroot/assets/PrivacyPage-B-YBfQ6J.js +0 -1
- package/bin/wwwroot/assets/ProviderDetailPage-CQQdpDSf.js +0 -3
- package/bin/wwwroot/assets/ProvidersPage-BwigLnKs.js +0 -3
- package/bin/wwwroot/assets/SettingsPage-CvpROKS2.js +0 -2
- package/bin/wwwroot/assets/SmartRoutingPage-CYh7mRot.js +0 -2
- package/bin/wwwroot/assets/TokenDetailPage-GwSz8QI6.js +0 -1
- package/bin/wwwroot/assets/TokensPage-0hOOzLVU.js +0 -1
- package/bin/wwwroot/assets/TracesPage-A45sREZP.js +0 -8
- package/bin/wwwroot/assets/TrayPanelView-CHh9-E76.js +0 -1
- package/bin/wwwroot/assets/alert-CuKAE1Sv.js +0 -15
- package/bin/wwwroot/assets/confirm-morph-DGAHV4QP.js +0 -1
- package/bin/wwwroot/assets/download-DR9BLMVt.js +0 -1
- package/bin/wwwroot/assets/index-CKrvKDIJ.js +0 -17
- package/bin/wwwroot/assets/index-CpGX4nAj.css +0 -1
- package/bin/wwwroot/assets/minus-UfPYsFrp.js +0 -1
- package/bin/wwwroot/assets/overlays-DeHu6TU_.js +0 -41
- package/bin/wwwroot/assets/radio-cards-Rq9vGqnw.js +0 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports),s=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r},c=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},l=(n,r,o)=>(o=n==null?{}:e(i(n)),c(r||!n||!n.__esModule||!a.call(n,`default`)?t(o,`default`,{value:n,enumerable:!0}):o,n)),u=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.for(`react.view_transition`),m=Symbol.iterator;function h(e){return typeof e!=`object`||!e?null:(e=m&&e[m]||e[`@@iterator`],typeof e==`function`?e:null)}var g={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},_=Object.assign,v={};function y(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}y.prototype.isReactComponent={},y.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=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,e,t,`setState`)},y.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function b(){}b.prototype=y.prototype;function x(e,t,n){this.props=e,this.context=t,this.refs=v,this.updater=n||g}var S=x.prototype=new b;S.constructor=x,_(S,y.prototype),S.isPureReactComponent=!0;var C=Array.isArray;function w(){}var T={H:null,A:null,T:null,S:null},ee=Object.prototype.hasOwnProperty;function E(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function te(e,t){return E(e.type,t,e.props)}function ne(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function re(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ie=/\/+/g;function ae(e,t){return typeof e==`object`&&e&&e.key!=null?re(``+e.key):t.toString(36)}function oe(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(w,w):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function se(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,se(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+ae(e,0):a,C(o)?(i=``,c!=null&&(i=c.replace(ie,`$&/`)+`/`),se(o,r,i,``,function(e){return e})):o!=null&&(ne(o)&&(o=te(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ie,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(C(e))for(var u=0;u<e.length;u++)a=e[u],s=l+ae(a,u),c+=se(a,r,i,s,o);else if(u=h(e),typeof u==`function`)for(e=u.call(e),u=0;!(a=e.next()).done;)a=a.value,s=l+ae(a,u++),c+=se(a,r,i,s,o);else if(s===`object`){if(typeof e.then==`function`)return se(oe(e),r,i,a,o);throw r=String(e),Error(`Objects are not valid as a React child (found: `+(r===`[object Object]`?`object with keys {`+Object.keys(e).join(`, `)+`}`:r)+`). If you meant to render a collection of children, use an array instead.`)}return c}function ce(e,t,n){if(e==null)return e;var r=[],i=0;return se(e,r,``,``,function(e){return t.call(n,e,i++)}),r}function le(e){if(e._status===-1){var t=e._result,n=t();n.then(function(t){(e._status===0||e._status===-1)&&(e._status=1,e._result=t,n.status===void 0&&(n.status=`fulfilled`,n.value=t))},function(t){(e._status===0||e._status===-1)&&(e._status=2,e._result=t,n.status===void 0&&(n.status=`rejected`,n.reason=t))}),e._status===-1&&(e._status=0,e._result=n)}if(e._status===1)return e._result.default;throw e._result}var ue=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&&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)};function de(e){var t=T.T,n={};n.types=t===null?null:t.types,T.T=n;try{var r=e(),i=T.S;i!==null&&i(n,r),typeof r==`object`&&r&&typeof r.then==`function`&&r.then(w,ue)}catch(e){ue(e)}finally{t!==null&&n.types!==null&&(t.types=n.types),T.T=t}}function fe(e){var t=T.T;if(t!==null){var n=t.types;n===null?t.types=[e]:n.indexOf(e)===-1&&n.push(e)}else de(fe.bind(null,e))}var pe={map:ce,forEach:function(e,t,n){ce(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return ce(e,function(){t++}),t},toArray:function(e){return ce(e,function(e){return e})||[]},only:function(e){if(!ne(e))throw Error(`React.Children.only expected to receive a single React element child.`);return e}};e.Activity=f,e.Children=pe,e.Component=y,e.Fragment=r,e.Profiler=a,e.PureComponent=x,e.StrictMode=i,e.Suspense=l,e.ViewTransition=p,e.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=T,e.__COMPILER_RUNTIME={__proto__:null,c:function(e){return T.H.useMemoCache(e)}},e.addTransitionType=fe,e.cache=function(e){return function(){return e.apply(null,arguments)}},e.cacheSignal=function(){return null},e.cloneElement=function(e,t,n){if(e==null)throw Error(`The argument must be a React element, but you passed `+e+`.`);var r=_({},e.props),i=e.key;if(t!=null)for(a in t.key!==void 0&&(i=``+t.key),t)!ee.call(t,a)||a===`key`||a===`__self`||a===`__source`||a===`ref`&&t.ref===void 0||(r[a]=t[a]);var a=arguments.length-2;if(a===1)r.children=n;else if(1<a){for(var o=Array(a),s=0;s<a;s++)o[s]=arguments[s+2];r.children=o}return E(e.type,i,r)},e.createContext=function(e){return e={$$typeof:s,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null},e.Provider=e,e.Consumer={$$typeof:o,_context:e},e},e.createElement=function(e,t,n){var r,i={},a=null;if(t!=null)for(r in t.key!==void 0&&(a=``+t.key),t)ee.call(t,r)&&r!==`key`&&r!==`__self`&&r!==`__source`&&(i[r]=t[r]);var o=arguments.length-2;if(o===1)i.children=n;else if(1<o){for(var s=Array(o),c=0;c<o;c++)s[c]=arguments[c+2];i.children=s}if(e&&e.defaultProps)for(r in o=e.defaultProps,o)i[r]===void 0&&(i[r]=o[r]);return E(e,a,i)},e.createRef=function(){return{current:null}},e.forwardRef=function(e){return{$$typeof:c,render:e}},e.isValidElement=ne,e.lazy=function(e){return{$$typeof:d,_payload:{_status:-1,_result:e},_init:le}},e.memo=function(e,t){return{$$typeof:u,type:e,compare:t===void 0?null:t}},e.startTransition=de,e.unstable_useCacheRefresh=function(){return T.H.useCacheRefresh()},e.use=function(e){return T.H.use(e)},e.useActionState=function(e,t,n){return T.H.useActionState(e,t,n)},e.useCallback=function(e,t){return T.H.useCallback(e,t)},e.useContext=function(e){return T.H.useContext(e)},e.useDebugValue=function(){},e.useDeferredValue=function(e,t){return T.H.useDeferredValue(e,t)},e.useEffect=function(e,t){return T.H.useEffect(e,t)},e.useEffectEvent=function(e){return T.H.useEffectEvent(e)},e.useId=function(){return T.H.useId()},e.useImperativeHandle=function(e,t,n){return T.H.useImperativeHandle(e,t,n)},e.useInsertionEffect=function(e,t){return T.H.useInsertionEffect(e,t)},e.useLayoutEffect=function(e,t){return T.H.useLayoutEffect(e,t)},e.useMemo=function(e,t){return T.H.useMemo(e,t)},e.useOptimistic=function(e,t){return T.H.useOptimistic(e,t)},e.useReducer=function(e,t,n){return T.H.useReducer(e,t,n)},e.useRef=function(e){return T.H.useRef(e)},e.useState=function(e){return T.H.useState(e)},e.useSyncExternalStore=function(e,t,n){return T.H.useSyncExternalStore(e,t,n)},e.useTransition=function(){return T.H.useTransition()},e.version=`19.3.0`})),d=o(((e,t)=>{t.exports=u()})),f=o((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.fragment`);function r(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.Fragment=n,e.jsx=r,e.jsxs=r})),p=o(((e,t)=>{t.exports=f()})),m=l(d(),1),h=p(),g=m.createContext(void 0),_=e=>{let t=m.useContext(g);if(e)return e;if(!t)throw Error(`No QueryClient set, use QueryClientProvider to set one`);return t},v=({client:e,children:t})=>(m.useEffect(()=>(e.mount(),()=>{e.unmount()}),[e]),(0,h.jsx)(g.Provider,{value:e,children:t})),y={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e),setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)},b=new class{#e=y;setTimeoutProvider(e){this.#e=e}setTimeout(e,t){return this.#e.setTimeout(e,t)}clearTimeout(e){this.#e.clearTimeout(e)}setInterval(e,t){return this.#e.setInterval(e,t)}clearInterval(e){this.#e.clearInterval(e)}};function x(e){setTimeout(e,0)}var S=typeof window>`u`||`Deno`in globalThis;function C(){}function w(e,t){return typeof e==`function`?e(t):e}function T(e){return typeof e==`number`&&e>=0&&e!==1/0}function ee(e,t){return Math.max(e+(t||0)-Date.now(),0)}function E(e,t){return typeof e==`function`?e(t):e}function te(e,t){let{type:n=`all`,exact:r,fetchStatus:i,predicate:a,queryKey:o,stale:s}=e;if(o){if(r){if(t.queryHash!==re(o,t.options))return!1}else if(!ae(t.queryKey,o))return!1}if(n!==`all`){let e=t.isActive();if(n===`active`&&!e||n===`inactive`&&e)return!1}return!(typeof s==`boolean`&&t.isStale()!==s||i&&i!==t.state.fetchStatus||a&&!a(t))}function ne(e,t){let{exact:n,status:r,predicate:i,mutationKey:a}=e;if(a){if(!t.options.mutationKey)return!1;if(n){if(ie(t.options.mutationKey)!==ie(a))return!1}else if(!ae(t.options.mutationKey,a))return!1}return!(r&&t.state.status!==r||i&&!i(t))}function re(e,t){return(t?.queryKeyHashFn||ie)(e)}function ie(e){return JSON.stringify(e,(e,t)=>ue(t)?Object.keys(t).sort().reduce((e,n)=>(e[n]=t[n],e),{}):t)}function ae(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(e&&t&&typeof e==`object`&&typeof t==`object`){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>e.length)return!1;for(let n=0;n<t.length;n++)if(!ae(e[n],t[n]))return!1;return!0}let n=Object.keys(t);for(let r of n)if(!ae(e[r],t[r]))return!1;return!0}return!1}var oe=Object.prototype.hasOwnProperty;function se(e,t,n=0){if(e===t)return e;if(n>500)return t;let r=le(e)&&le(t);if(!r&&!(ue(e)&&ue(t)))return t;let i=(r?e:Object.keys(e)).length,a=r?t:Object.keys(t),o=a.length,s=r?Array(o):{},c=0;for(let l=0;l<o;l++){let o=r?l:a[l],u=e[o],d=t[o];if(u===d){s[o]=u,(r?l<i:oe.call(e,o))&&c++;continue}if(u===null||d===null||typeof u!=`object`||typeof d!=`object`){s[o]=d;continue}let f=se(u,d,n+1);s[o]=f,f===u&&c++}return i===o&&c===i?e:s}function ce(e,t){if(!t||Object.keys(e).length!==Object.keys(t).length)return!1;for(let n in e)if(e[n]!==t[n])return!1;return!0}function le(e){return Array.isArray(e)&&e.length===Object.keys(e).length}function ue(e){if(!de(e))return!1;let t=Object.getPrototypeOf(e),n=t?.constructor;if(n===void 0)return!0;if(typeof n!=`function`)return!1;let r=n.prototype;return!(!de(r)||!r.hasOwnProperty(`isPrototypeOf`)||t!==Object.prototype)}function de(e){return Object.prototype.toString.call(e)===`[object Object]`}function fe(e){return new Promise(t=>{b.setTimeout(t,e)})}function pe(e,t,n){return typeof n.structuralSharing==`function`?n.structuralSharing(e,t):n.structuralSharing===!1?t:se(e,t)}function me(e,t,n=0){let r=[...e,t];return n&&r.length>n?r.slice(1):r}function he(e,t,n=0){let r=[t,...e];return n&&r.length>n?r.slice(0,-1):r}var ge=Symbol();function _e(e,t){return!e.queryFn&&t?.initialPromise?()=>t.initialPromise:!e.queryFn||e.queryFn===ge?()=>Promise.reject(Error(`Missing queryFn: '${e.queryHash}'`)):e.queryFn}function ve(e,t){return typeof e==`function`?e(...t):!!e}function ye(e,t,n){let r=!1,i;return Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(i??=t(),r?i:(r=!0,i.aborted?n():i.addEventListener(`abort`,n,{once:!0}),i))}),e}var be=()=>S,xe=()=>be(),Se=class{constructor(){this.listeners=new Set,this.subscribe=this.subscribe.bind(this)}subscribe(e){return this.listeners.add(e),this.onSubscribe(),()=>{this.listeners.delete(e),this.onUnsubscribe()}}hasListeners(){return this.listeners.size>0}onSubscribe(){}onUnsubscribe(){}},Ce=new class extends Se{#e;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e();return window.addEventListener(`visibilitychange`,t,!1),()=>{window.removeEventListener(`visibilitychange`,t)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(e=>{typeof e==`boolean`?this.setFocused(e):this.onFocus()})}setFocused(e){this.#e!==e&&(this.#e=e,this.onFocus())}onFocus(){let e=this.isFocused();this.listeners.forEach(t=>{t(e)})}isFocused(){return typeof this.#e==`boolean`?this.#e:globalThis.document?.visibilityState!==`hidden`}},we=x;function Te(){let e=[],t=0,n=e=>{e()},r=e=>{e()},i=we,a=r=>{t?e.push(r):i(()=>{n(r)})},o=()=>{let t=e;e=[],t.length&&i(()=>{r(()=>{t.forEach(e=>{n(e)})})})};return{batch:e=>{let n;t++;try{n=e()}finally{t--,t||o()}return n},batchCalls:e=>(...t)=>{a(()=>{e(...t)})},schedule:a,setNotifyFunction:e=>{n=e},setBatchNotifyFunction:e=>{r=e},setScheduler:e=>{i=e}}}var Ee=Te(),De=new class extends Se{#e=!0;#t;#n;constructor(){super(),this.#n=e=>{if(typeof window<`u`&&window.addEventListener){let t=()=>e(!0),n=()=>e(!1);return window.addEventListener(`online`,t,!1),window.addEventListener(`offline`,n,!1),()=>{window.removeEventListener(`online`,t),window.removeEventListener(`offline`,n)}}}}onSubscribe(){this.#t||this.setEventListener(this.#n)}onUnsubscribe(){this.hasListeners()||(this.#t?.(),this.#t=void 0)}setEventListener(e){this.#n=e,this.#t?.(),this.#t=e(this.setOnline.bind(this))}setOnline(e){this.#e!==e&&(this.#e=e,this.listeners.forEach(t=>{t(e)}))}isOnline(){return this.#e}};function Oe(e){return Math.min(1e3*2**e,3e4)}function ke(e){return(e??`online`)!==`online`||De.isOnline()}var Ae=class extends Error{constructor(e){super(`CancelledError`),this.revert=e?.revert,this.silent=e?.silent}};function je(e){let t=!1,n=0,r,i=`pending`,a,o,s=new Promise((e,t)=>{a=e,o=t});s.catch(C);let c=()=>i!==`pending`,l=t=>{if(!c()){let n=new Ae(t);h(n),e.onCancel?.(n)}},u=()=>{t=!0},d=()=>{t=!1},f=()=>Ce.isFocused()&&(e.networkMode===`always`||De.isOnline())&&e.canRun(),p=()=>ke(e.networkMode)&&e.canRun(),m=e=>{c()||(r?.(),i=`resolved`,a(e))},h=e=>{c()||(r?.(),i=`rejected`,o(e))},g=()=>new Promise(t=>{r=e=>{(c()||f())&&t(e)},e.onPause?.()}).then(()=>{r=void 0,c()||e.onContinue?.()}),_=()=>{if(c())return;let r,i=n===0?e.initialPromise:void 0;try{r=i??e.fn()}catch(e){r=Promise.reject(e)}Promise.resolve(r).then(m).catch(r=>{if(c())return;let i=e.retry??(xe()?0:3),a=e.retryDelay??Oe,o=typeof a==`function`?a(n,r):a,s=i===!0||typeof i==`number`&&n<i||typeof i==`function`&&i(n,r);if(t||!s){h(r);return}n++,e.onFail?.(n,r),fe(o).then(()=>f()?void 0:g()).then(()=>{t?h(r):_()})})};return{promise:s,status:()=>i,cancel:l,continue:()=>(r?.(),s),cancelRetry:u,continueRetry:d,canStart:p,start:()=>(p()?_():g().then(_),s)}}var Me=class{#e;destroy(){this.clearGcTimeout()}scheduleGc(){this.clearGcTimeout(),T(this.gcTime)&&(this.#e=b.setTimeout(()=>{this.optionalRemove()},this.gcTime))}updateGcTime(e){this.gcTime=Math.max(this.gcTime||0,e??(xe()?1/0:3e5))}clearGcTimeout(){this.#e!==void 0&&(b.clearTimeout(this.#e),this.#e=void 0)}};function Ne(e){return{onFetch:(t,n)=>{let r=t.options,i=t.fetchOptions?.meta?.fetchMore?.direction,a=t.state.data?.pages||[],o=t.state.data?.pageParams||[],s={pages:[],pageParams:[]},c=0,l=async()=>{let n=!1,l=e=>{ye(e,()=>t.signal,()=>n=!0)},u=_e(t.options,t.fetchOptions),d=async(e,r,i)=>{if(n)return Promise.reject(t.signal.reason);if(r==null&&e.pages.length)return Promise.resolve(e);let a=(()=>{let e={client:t.client,queryKey:t.queryKey,pageParam:r,direction:i?`backward`:`forward`,meta:t.options.meta};return l(e),e})(),o=await u(a),{maxPages:s}=t.options,c=i?he:me;return{pages:c(e.pages,o,s),pageParams:c(e.pageParams,r,s)}};if(i&&a.length){let e=i===`backward`,t=e?Fe:Pe,n={pages:a,pageParams:o};s=await d(n,t(r,n),e)}else{let t=e??a.length;do{let e=c===0?o[0]??r.initialPageParam:Pe(r,s);if(c>0&&e==null)break;s=await d(s,e),c++}while(c<t)}return s};t.fetchFn=t.options.persister?()=>t.options.persister?.(l,{client:t.client,queryKey:t.queryKey,meta:t.options.meta,signal:t.signal},n):l}}}function Pe(e,{pages:t,pageParams:n}){let r=t.length-1;return t.length>0?e.getNextPageParam(t[r],t,n[r],n):void 0}function Fe(e,{pages:t,pageParams:n}){return t.length>0?e.getPreviousPageParam?.(t[0],t,n[0],n):void 0}var Ie=class extends Me{#e;#t;#n;#r;#i;#a;#o;#s;constructor(e){super(),this.#s=!1,this.#o=e.defaultOptions,this.setOptions(e.options),this.observers=[],this.#i=e.client,this.#r=this.#i.getQueryCache(),this.queryKey=e.queryKey,this.queryHash=e.queryHash,this.#t=ze(this.options),this.state=e.state??this.#t,this.scheduleGc()}get meta(){return this.options.meta}get queryType(){return this.#e}get promise(){return this.#a?.promise}setOptions(e){if(this.options={...this.#o,...e},e?._type&&(this.#e=e._type),this.updateGcTime(this.options.gcTime),this.state&&this.state.data===void 0){let e=ze(this.options);e.data!==void 0&&(this.setState(Re(e.data,e.dataUpdatedAt)),this.#t=e)}}optionalRemove(){!this.observers.length&&this.state.fetchStatus===`idle`&&this.#r.remove(this)}setData(e,t){let n=pe(this.state.data,e,this.options);return this.#c({data:n,type:`success`,dataUpdatedAt:t?.updatedAt,manual:t?.manual}),n}setState(e){this.#c({type:`setState`,state:e})}cancel(e){let t=this.#a?.promise;return this.#a?.cancel(e),t?t.then(C).catch(C):Promise.resolve()}destroy(){super.destroy(),this.cancel({silent:!0})}get resetState(){return this.#t}reset(){this.destroy(),this.setState(this.resetState)}isActive(){return this.observers.some(e=>E(e.options.enabled,this)!==!1)}isDisabled(){return this.getObserversCount()>0?!this.isActive():this.options.queryFn===ge||!this.isFetched()}isFetched(){return this.state.dataUpdateCount+this.state.errorUpdateCount>0}isStatic(){return this.getObserversCount()>0&&this.observers.some(e=>E(e.options.staleTime,this)===`static`)}isStale(){return this.getObserversCount()>0?this.observers.some(e=>e.getCurrentResult().isStale):this.state.data===void 0||this.state.isInvalidated}isStaleByTime(e=0){return this.state.data===void 0?!0:e===`static`?!1:this.state.isInvalidated?!0:!ee(this.state.dataUpdatedAt,e)}onFocus(){this.observers.find(e=>e.shouldFetchOnWindowFocus())?.refetch({cancelRefetch:!1}),this.#a?.continue()}onOnline(){this.observers.find(e=>e.shouldFetchOnReconnect())?.refetch({cancelRefetch:!1}),this.#a?.continue()}addObserver(e){this.observers.includes(e)||(this.observers.push(e),this.clearGcTimeout(),this.#r.notify({type:`observerAdded`,query:this,observer:e}))}removeObserver(e){let t=this.observers.indexOf(e);t!==-1&&(this.observers.splice(t,1),this.observers.length||(this.#a&&(this.#s||this.state.fetchStatus===`paused`&&this.state.status===`pending`?this.#a.cancel({revert:!0}):this.#a.cancelRetry()),this.scheduleGc()),this.#r.notify({type:`observerRemoved`,query:this,observer:e}))}getObserversCount(){return this.observers.length}invalidate(){this.state.isInvalidated||this.#c({type:`invalidate`})}async fetch(e,t){if(this.state.fetchStatus!==`idle`&&this.#a?.status()!==`rejected`){if(this.state.data!==void 0&&t?.cancelRefetch)this.cancel({silent:!0});else if(this.#a)return this.#a.continueRetry(),this.#a.promise}if(e&&this.setOptions(e),!this.options.queryFn){let e=this.observers.find(e=>e.options.queryFn);e&&this.setOptions(e.options)}let n=new AbortController,r=e=>{Object.defineProperty(e,"signal",{enumerable:!0,get:()=>(this.#s=!0,n.signal)})},i=()=>{let e=_e(this.options,t),n=(()=>{let e={client:this.#i,queryKey:this.queryKey,meta:this.meta};return r(e),e})();return this.#s=!1,this.options.persister?this.options.persister(e,n,this):e(n)},a=(()=>{let e={fetchOptions:t,options:this.options,queryKey:this.queryKey,client:this.#i,state:this.state,fetchFn:i};return r(e),e})();(this.#e===`infinite`?Ne(this.options.pages):this.options.behavior)?.onFetch(a,this),this.#n=this.state,(this.state.fetchStatus===`idle`||this.state.fetchMeta!==a.fetchOptions?.meta)&&this.#c({type:`fetch`,meta:a.fetchOptions?.meta});let o=this.#a=je({initialPromise:t?.initialPromise,fn:a.fetchFn,onCancel:e=>{e instanceof Ae&&e.revert&&this.setState({...this.#n,fetchStatus:`idle`}),n.abort()},onFail:(e,t)=>{this.#c({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#c({type:`pause`})},onContinue:()=>{this.#c({type:`continue`})},retry:a.options.retry,retryDelay:a.options.retryDelay,networkMode:a.options.networkMode,canRun:()=>!0});try{let e=await o.start();if(e===void 0)throw Error(`${this.queryHash} data is undefined`);return this.setData(e),this.#r.config.onSuccess?.(e,this),this.#r.config.onSettled?.(e,this.state.error,this),e}catch(e){if(e instanceof Ae){if(e.silent)return this.#a.promise;if(e.revert){if(this.state.data===void 0)throw e;return this.state.data}}throw this.#c({type:`error`,error:e}),this.#r.config.onError?.(e,this),this.#r.config.onSettled?.(this.state.data,e,this),e}finally{this.#a===o&&(this.#a=void 0),this.scheduleGc()}}#c(e){let t=t=>{switch(e.type){case`failed`:return{...t,fetchFailureCount:e.failureCount,fetchFailureReason:e.error};case`pause`:return{...t,fetchStatus:`paused`};case`continue`:return{...t,fetchStatus:`fetching`};case`fetch`:return{...t,...Le(t.data,this.options),fetchMeta:e.meta??null};case`success`:let n={...t,...Re(e.data,e.dataUpdatedAt),dataUpdateCount:t.dataUpdateCount+1,...!e.manual&&{fetchStatus:`idle`,fetchFailureCount:0,fetchFailureReason:null}};return this.#n=e.manual?n:void 0,n;case`error`:let r=e.error;return{...t,error:r,errorUpdateCount:t.errorUpdateCount+1,errorUpdatedAt:Date.now(),fetchFailureCount:t.fetchFailureCount+1,fetchFailureReason:r,fetchStatus:`idle`,status:`error`,isInvalidated:!0};case`invalidate`:return{...t,isInvalidated:!0};case`setState`:return{...t,...e.state}}};this.state=t(this.state),Ee.batch(()=>{this.observers.slice().forEach(e=>{e.onQueryUpdate()}),this.#r.notify({query:this,type:`updated`,action:e})})}};function Le(e,t){return{fetchFailureCount:0,fetchFailureReason:null,fetchStatus:ke(t.networkMode)?`fetching`:`paused`,...e===void 0&&{error:null,status:`pending`}}}function Re(e,t){return{data:e,dataUpdatedAt:t??Date.now(),error:null,isInvalidated:!1,status:`success`}}function ze(e){let t=typeof e.initialData==`function`?e.initialData():e.initialData,n=t!==void 0,r=n?typeof e.initialDataUpdatedAt==`function`?e.initialDataUpdatedAt():e.initialDataUpdatedAt:0;return{data:t,dataUpdateCount:0,dataUpdatedAt:n?r??Date.now():0,error:null,errorUpdateCount:0,errorUpdatedAt:0,fetchFailureCount:0,fetchFailureReason:null,fetchMeta:null,isInvalidated:!1,status:n?`success`:`pending`,fetchStatus:`idle`}}var Be=class extends Se{#e;#t=void 0;#n=void 0;#r=void 0;#i;#a;#o;#s;#c;#l;#u;#d;#f;#p=new Set;constructor(e,t){super(),this.options=t,this.#e=e,this.#o=null,this.bindMethods(),this.setOptions(t)}bindMethods(){this.refetch=this.refetch.bind(this)}onSubscribe(){this.listeners.size===1&&(this.#t.addObserver(this),He(this.#t,this.options)?this.#m():this.updateResult(),this.#y())}onUnsubscribe(){this.hasListeners()||this.destroy()}shouldFetchOnReconnect(){return Ue(this.#t,this.options,this.options.refetchOnReconnect)}shouldFetchOnWindowFocus(){return Ue(this.#t,this.options,this.options.refetchOnWindowFocus)}destroy(){this.listeners=new Set,this.#b(),this.#x(),this.#t.removeObserver(this)}setOptions(e){let t=this.options,n=this.#t;if(this.options=this.#e.defaultQueryOptions(e),this.options.enabled!==void 0&&typeof this.options.enabled!=`boolean`&&typeof this.options.enabled!=`function`&&typeof E(this.options.enabled,this.#t)!=`boolean`)throw Error(`Expected enabled to be a boolean or a callback that returns a boolean`);this.#S(),this.#t.setOptions(this.options),t._defaulted&&!ce(this.options,t)&&this.#e.getQueryCache().notify({type:`observerOptionsUpdated`,query:this.#t,observer:this});let r=this.hasListeners();r&&We(this.#t,n,this.options,t)&&this.#m(),this.updateResult(),r&&(this.#t!==n||E(this.options.enabled,this.#t)!==E(t.enabled,this.#t)||E(this.options.staleTime,this.#t)!==E(t.staleTime,this.#t))&&this.#g();let i=this.#_();r&&(this.#t!==n||E(this.options.enabled,this.#t)!==E(t.enabled,this.#t)||i!==this.#f)&&this.#v(i)}getOptimisticResult(e){let t=this.#e.getQueryCache().build(this.#e,e),n=this.createResult(t,e);return ce(this.getCurrentResult(),n)||(this.#r=n,this.#a=this.options,this.#i=this.#t.state),n}getCurrentResult(){return this.#r}trackResult(e,t){return new Proxy(e,{get:(e,n)=>(this.trackProp(n),t?.(n),Reflect.get(e,n))})}trackProp(e){this.#p.add(e)}getCurrentQuery(){return this.#t}refetch({...e}={}){return this.fetch({...e})}fetchOptimistic(e){let t=this.#e.defaultQueryOptions(e),n=this.#e.getQueryCache().build(this.#e,t),r=()=>{},i,a=new Promise(e=>{i=e,r=this.#e.getQueryCache().subscribe(i=>{i.type===`updated`&&i.query.queryHash===n.queryHash&&n.state.data!==void 0&&(r(),e(this.createResult(n,t)))})});return Promise.race([n.fetch().then(()=>{let e=this.createResult(n,t);return i?.(e),e}).finally(()=>{r()}),a])}fetch(e){return this.#m({...e,cancelRefetch:e.cancelRefetch??!0}).then(()=>(this.updateResult(),this.#r))}#m(e){this.#S();let t=this.#t.fetch(this.options,e);return e?.throwOnError||(t=t.catch(C)),t}#h(e){return!xe()&&E(this.options.enabled,this.#t)!==!1&&T(e)}#g(){this.#b();let e=E(this.options.staleTime,this.#t);if(this.#r.isStale||!this.#h(e))return;let t=ee(this.#r.dataUpdatedAt,e)+1;this.#u=b.setTimeout(()=>{this.#r.isStale||this.updateResult()},t)}#_(){return E(this.options.refetchInterval,this.#t)??!1}#v(e){this.#x(),this.#f=e,this.#f!==0&&this.#h(this.#f)&&(this.#d=b.setInterval(()=>{(this.options.refetchIntervalInBackground||Ce.isFocused())&&this.#m()},this.#f))}#y(){this.#g(),this.#v(this.#_())}#b(){this.#u!==void 0&&(b.clearTimeout(this.#u),this.#u=void 0)}#x(){this.#d!==void 0&&(b.clearInterval(this.#d),this.#d=void 0)}createResult(e,t){let n=this.#t,r=this.options,i=this.#r,a=this.#i,o=this.#a,s=e===n?this.#n:e.state,{state:c}=e,l={...c},u=!1,d;if(t._optimisticResults){let i=this.hasListeners(),a=!i&&He(e,t),o=i&&We(e,n,t,r);(a||o)&&(l={...l,...Le(c.data,e.options)}),t._optimisticResults===`isRestoring`&&(l.fetchStatus=`idle`)}let{error:f,errorUpdatedAt:p,status:m}=l;d=l.data;let h=!1;if(t.placeholderData!==void 0&&d===void 0&&m===`pending`){let e;i?.isPlaceholderData&&t.placeholderData===o?.placeholderData?(e=i.data,h=!0):e=typeof t.placeholderData==`function`?t.placeholderData(this.#l?.state.data,this.#l):t.placeholderData,e!==void 0&&(m=`success`,d=pe(i?.data,e,t),u=!0)}if(t.select&&d!==void 0&&!h){if(i&&d===a?.data&&t.select===this.#s)d=this.#c;else try{this.#s=t.select,d=t.select(d),d=pe(i?.data,d,t),this.#c=d,this.#o=null}catch(e){this.#o=e}}else d===void 0&&(this.#o=null);this.#o&&(f=this.#o,d=this.#c,p=Date.now(),m=`error`,u=!1);let g=l.fetchStatus===`fetching`,_=m===`pending`,v=m===`error`,y=_&&g,b=d!==void 0;return{status:m,fetchStatus:l.fetchStatus,isPending:_,isSuccess:m===`success`,isError:v,isInitialLoading:y,isLoading:y,data:d,dataUpdatedAt:l.dataUpdatedAt,error:f,errorUpdatedAt:p,failureCount:l.fetchFailureCount,failureReason:l.fetchFailureReason,errorUpdateCount:l.errorUpdateCount,isFetched:e.isFetched(),isFetchedAfterMount:l.dataUpdateCount>s.dataUpdateCount||l.errorUpdateCount>s.errorUpdateCount,isFetching:g,isRefetching:g&&!_,isLoadingError:v&&!b,isPaused:l.fetchStatus===`paused`,isPlaceholderData:u,isRefetchError:v&&b,isStale:Ge(e,t),refetch:this.refetch,isEnabled:E(t.enabled,e)!==!1}}updateResult(){let e=this.#r,t=this.createResult(this.#t,this.options);if(this.#i=this.#t.state,this.#a=this.options,this.#i.data!==void 0&&(this.#l=this.#t),ce(t,e))return;this.#r=t;let n=(()=>{if(!e)return!0;let{notifyOnChangeProps:t}=this.options,n=typeof t==`function`?t():t;if(n===`all`||!n&&!this.#p.size)return!0;let r=new Set(n??this.#p);return this.options.throwOnError&&r.add(`error`),Object.keys(this.#r).some(t=>{let n=t;return this.#r[n]!==e[n]&&r.has(n)})})();Ee.batch(()=>{n&&this.listeners.forEach(e=>{e(this.#r)}),this.#e.getQueryCache().notify({query:this.#t,type:`observerResultsUpdated`})})}#S(){let e=this.#e.getQueryCache().build(this.#e,this.options);if(e===this.#t)return;let t=this.#t;this.#t=e,this.#n=e.state,this.hasListeners()&&(t?.removeObserver(this),e.addObserver(this))}onQueryUpdate(){this.updateResult(),this.hasListeners()&&this.#y()}};function Ve(e,t){return E(t.enabled,e)!==!1&&e.state.data===void 0&&(e.state.status!==`error`||E(t.retryOnMount,e)!==!1)}function He(e,t){return Ve(e,t)||e.state.data!==void 0&&Ue(e,t,t.refetchOnMount)}function Ue(e,t,n){if(E(t.enabled,e)!==!1&&E(t.staleTime,e)!==`static`){let r=E(n,e);return r===`always`||r!==!1&&Ge(e,t)}return!1}function We(e,t,n,r){return(e!==t||E(r.enabled,e)===!1)&&(!n.suspense||e.state.status!==`error`)&&Ge(e,n)}function Ge(e,t){return E(t.enabled,e)!==!1&&e.isStaleByTime(E(t.staleTime,e))}var Ke=class extends Me{#e;#t;#n;#r;constructor(e){super(),this.#e=e.client,this.mutationId=e.mutationId,this.#n=e.mutationCache,this.#t=[],this.state=e.state||qe(),this.setOptions(e.options),this.scheduleGc()}setOptions(e){this.options=e,this.updateGcTime(this.options.gcTime)}get meta(){return this.options.meta}addObserver(e){this.#t.includes(e)||(this.#t.push(e),this.clearGcTimeout(),this.#n.notify({type:`observerAdded`,mutation:this,observer:e}))}removeObserver(e){this.#t=this.#t.filter(t=>t!==e),this.scheduleGc(),this.#n.notify({type:`observerRemoved`,mutation:this,observer:e})}optionalRemove(){this.#t.length||(this.state.status===`pending`?this.scheduleGc():this.#n.remove(this))}continue(){return this.#r?.continue()??(this.state.status===`pending`?this.execute(this.state.variables):Promise.resolve())}async execute(e){let t=()=>{this.#i({type:`continue`})},n={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey},r=this.#r=je({fn:()=>this.options.mutationFn?this.options.mutationFn(e,n):Promise.reject(Error(`No mutationFn found`)),onFail:(e,t)=>{this.#i({type:`failed`,failureCount:e,error:t})},onPause:()=>{this.#i({type:`pause`})},onContinue:t,retry:this.options.retry??0,retryDelay:this.options.retryDelay,networkMode:this.options.networkMode,canRun:()=>this.#n.canRun(this)}),i=this.state.status===`pending`,a=!r.canStart();try{if(i)t();else{this.#i({type:`pending`,variables:e,isPaused:a}),this.#n.config.onMutate&&await this.#n.config.onMutate(e,this,n);let t=await this.options.onMutate?.(e,n);t!==this.state.context&&this.#i({type:`pending`,context:t,variables:e,isPaused:a})}let o=await r.start();return await this.#n.config.onSuccess?.(o,e,this.state.context,this,n),await this.options.onSuccess?.(o,e,this.state.context,n),await this.#n.config.onSettled?.(o,null,this.state.variables,this.state.context,this,n),await this.options.onSettled?.(o,null,e,this.state.context,n),this.#i({type:`success`,data:o}),o}catch(t){try{await this.#n.config.onError?.(t,e,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onError?.(t,e,this.state.context,n)}catch(e){Promise.reject(e)}try{await this.#n.config.onSettled?.(void 0,t,this.state.variables,this.state.context,this,n)}catch(e){Promise.reject(e)}try{await this.options.onSettled?.(void 0,t,e,this.state.context,n)}catch(e){Promise.reject(e)}throw this.#i({type:`error`,error:t}),t}finally{this.#r===r&&(this.#r=void 0),this.#n.runNext(this)}}#i(e){let t=t=>{switch(e.type){case`failed`:return{...t,failureCount:e.failureCount,failureReason:e.error};case`pause`:return{...t,isPaused:!0};case`continue`:return{...t,isPaused:!1};case`pending`:return{...t,context:e.context,data:void 0,failureCount:0,failureReason:null,error:null,isPaused:e.isPaused,status:`pending`,variables:e.variables,submittedAt:Date.now()};case`success`:return{...t,data:e.data,failureCount:0,failureReason:null,error:null,status:`success`,isPaused:!1};case`error`:return{...t,data:void 0,error:e.error,failureCount:t.failureCount+1,failureReason:e.error,isPaused:!1,status:`error`}}};this.state=t(this.state),Ee.batch(()=>{this.#t.forEach(t=>{t.onMutationUpdate(e)}),this.#n.notify({mutation:this,type:`updated`,action:e})})}};function qe(){return{context:void 0,data:void 0,error:null,failureCount:0,failureReason:null,isPaused:!1,status:`idle`,variables:void 0,submittedAt:0}}var Je=class extends Se{#e;#t=void 0;#n;#r;constructor(e,t){super(),this.#e=e,this.setOptions(t),this.bindMethods(),this.#i()}bindMethods(){this.mutate=this.mutate.bind(this),this.reset=this.reset.bind(this)}setOptions(e){let t=this.options;this.options=this.#e.defaultMutationOptions(e),ce(this.options,t)||this.#e.getMutationCache().notify({type:`observerOptionsUpdated`,mutation:this.#n,observer:this}),t?.mutationKey&&this.options.mutationKey&&ie(t.mutationKey)!==ie(this.options.mutationKey)?this.reset():this.#n?.state.status===`pending`&&this.#n.setOptions(this.options)}onSubscribe(){this.listeners.size===1&&this.#n&&(this.#n.addObserver(this),this.#i())}onUnsubscribe(){this.hasListeners()||this.#n?.removeObserver(this)}onMutationUpdate(e){this.#i(),this.#a(e)}getCurrentResult(){return this.#t}reset(){this.#n?.removeObserver(this),this.#n=void 0,this.#i(),this.#a()}mutate(e,t){return this.#r=t,this.#n?.removeObserver(this),this.#n=this.#e.getMutationCache().build(this.#e,this.options),this.#n.addObserver(this),this.#n.execute(e)}#i(){let e=this.#n?.state??qe();this.#t={...e,isPending:e.status===`pending`,isSuccess:e.status===`success`,isError:e.status===`error`,isIdle:e.status===`idle`,mutate:this.mutate,reset:this.reset}}#a(e){Ee.batch(()=>{if(this.#r&&this.hasListeners()){let t=this.#t.variables,n=this.#t.context,r={client:this.#e,meta:this.options.meta,mutationKey:this.options.mutationKey};if(e?.type===`success`){try{this.#r.onSuccess?.(e.data,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(e.data,null,t,n,r)}catch(e){Promise.reject(e)}}else if(e?.type===`error`){try{this.#r.onError?.(e.error,t,n,r)}catch(e){Promise.reject(e)}try{this.#r.onSettled?.(void 0,e.error,t,n,r)}catch(e){Promise.reject(e)}}}this.listeners.forEach(e=>{e(this.#t)})})}},Ye=m.createContext(!1),Xe=()=>m.useContext(Ye);Ye.Provider;function Ze(){let e=!1;return{clearReset:()=>{e=!1},reset:()=>{e=!0},isReset:()=>e}}var Qe=m.createContext(Ze()),$e=()=>m.useContext(Qe),et=(e,t,n)=>{let r=n?.state.error&&typeof e.throwOnError==`function`?ve(e.throwOnError,[n.state.error,n]):e.throwOnError;(e.suspense||r)&&(t.isReset()||(e.retryOnMount=!1))},tt=e=>{m.useEffect(()=>{e.clearReset()},[e])},nt=({result:e,errorResetBoundary:t,throwOnError:n,query:r,suspense:i})=>e.isError&&!t.isReset()&&!e.isFetching&&r&&(i&&e.data===void 0||ve(n,[e.error,r])),rt=e=>{if(e.suspense){let t=1e3,n=e=>e===`static`?e:Math.max(e??t,t),r=e.staleTime;e.staleTime=typeof r==`function`?(...e)=>n(r(...e)):n(r),typeof e.gcTime==`number`&&(e.gcTime=Math.max(e.gcTime,t))}},it=(e,t)=>e?.suspense&&t.isPending,at=(e,t,n)=>t.fetchOptimistic(e).catch(()=>{n.clearReset()});function ot(e,t,n){let r=Xe(),i=$e(),a=_(n),o=a.defaultQueryOptions(e),s=a.getQueryCache().get(o.queryHash),c=e.subscribed!==!1;o._optimisticResults=r?`isRestoring`:c?`optimistic`:void 0,rt(o),et(o,i,s),tt(i);let[l]=m.useState(()=>new t(a,o)),u=l.getOptimisticResult(o),d=!r&&c;if(m.useSyncExternalStore(m.useCallback(e=>{let t=d?l.subscribe(Ee.batchCalls(e)):C;return l.updateResult(),t},[l,d]),()=>l.getCurrentResult(),()=>l.getCurrentResult()),m.useEffect(()=>{l.setOptions(o)},[o,l]),it(o,u))throw at(o,l,i);if(nt({result:u,errorResetBoundary:i,throwOnError:o.throwOnError,query:s,suspense:o.suspense}))throw u.error;return o.notifyOnChangeProps?u:l.trackResult(u)}function D(e,t){return ot(e,Be,t)}function O(e,t){let n=_(t),[r]=m.useState(()=>new Je(n,e));m.useEffect(()=>{r.setOptions(e)},[r,e]);let i=m.useSyncExternalStore(m.useCallback(e=>r.subscribe(Ee.batchCalls(e)),[r]),()=>r.getCurrentResult(),()=>r.getCurrentResult()),a=m.useCallback((...e)=>{r.mutate(e[0],e[1]).catch(C)},[r]);if(i.error&&ve(r.options.throwOnError,[i.error]))throw i.error;return{...i,mutate:a,mutateAsync:i.mutate}}var st=(0,m.createContext)({});function ct(e){let t=(0,m.useRef)(null);return t.current===null&&(t.current=e()),t.current}var lt=typeof window<`u`?m.useLayoutEffect:m.useEffect,ut=(0,m.createContext)(null);function dt(e,t){e.indexOf(t)===-1&&e.push(t)}function ft(e,t){let n=e.indexOf(t);n>-1&&e.splice(n,1)}var pt=(e,t,n)=>n>t?t:n<e?e:n,mt={},ht=e=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(e),gt=e=>typeof e==`object`&&!!e,_t=e=>/^0[^.\s]+$/u.test(e);function vt(e){let t;return()=>(t===void 0&&(t=e()),t)}var yt=e=>e,bt=(...e)=>e.reduce((e,t)=>n=>t(e(n))),xt=(e,t,n)=>{let r=t-e;return r?(n-e)/r:1},St=class{constructor(){this.subscriptions=[]}add(e){return dt(this.subscriptions,e),()=>this.remove(e)}remove(e){ft(this.subscriptions,e)}notify(e,t,n){let r=this.subscriptions.length;if(r){if(r===1)this.subscriptions[0](e,t,n);else for(let i=0;i<r;i++){let r=this.subscriptions[i];r&&r(e,t,n)}}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}},k=e=>e*1e3,Ct=e=>e/1e3,wt=(e,t)=>t?1e3/t*e:0,Tt=(e,t,n)=>{let r=t-e;return((n-e)%r+r)%r+e},Et=(e,t,n)=>(((1-3*n+3*t)*e+(3*n-6*t))*e+3*t)*e,Dt=1e-7,Ot=12;function kt(e,t,n,r,i){let a,o,s=0;do o=t+(n-t)/2,a=Et(o,r,i)-e,a>0?n=o:t=o;while(Math.abs(a)>Dt&&++s<Ot);return o}function At(e,t,n,r){if(e===t&&n===r)return yt;let i=t=>kt(t,0,1,e,n);return e=>e===0||e===1?e:Et(i(e),t,r)}var jt=e=>t=>t<=.5?e(2*t)/2:(2-e(2*(1-t)))/2,Mt=e=>t=>1-e(1-t),Nt=At(.33,1.53,.69,.99),Pt=Mt(Nt),Ft=jt(Pt),It=e=>e>=1?1:(e*=2)<1?.5*Pt(e):.5*(2-2**(-10*(e-1))),Lt=e=>1-Math.sin(Math.acos(e)),Rt=Mt(Lt),zt=jt(Lt),Bt=At(.42,0,1,1),Vt=At(0,0,.58,1),Ht=At(.42,0,.58,1),Ut=e=>Array.isArray(e)&&typeof e[0]!=`number`;function Wt(e,t){return Ut(e)?e[Tt(0,e.length,t)]:e}var Gt=e=>Array.isArray(e)&&typeof e[0]==`number`,Kt={linear:yt,easeIn:Bt,easeInOut:Ht,easeOut:Vt,circIn:Lt,circInOut:zt,circOut:Rt,backIn:Pt,backInOut:Ft,backOut:Nt,anticipate:It},qt=e=>typeof e==`string`,Jt=e=>{if(Gt(e)){e.length;let[t,n,r,i]=e;return At(t,n,r,i)}return qt(e)?(Kt[e],`${e}`,Kt[e]):e},A={delta:0,timestamp:0,isProcessing:!1},Yt;function Xt(){Yt=void 0}var j={now:()=>(Yt===void 0&&j.set(A.isProcessing||mt.useManualTiming?A.timestamp:performance.now()),Yt),set:e=>{Yt=e,queueMicrotask(Xt)}},Zt=e=>Math.round(e*1e5)/1e5,Qt=e=>t=>typeof t==`string`&&t.startsWith(e),$t=Qt(`--`),en=Qt(`var(--`),tn=e=>en(e)?nn.test(e.split(`/*`)[0].trim()):!1,nn=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;function rn(e){return typeof e==`string`&&e.split(`/*`)[0].includes(`var(--`)}var an={test:e=>typeof e==`number`,parse:parseFloat,transform:e=>e},on={...an,transform:e=>pt(0,1,e)},sn={...an,default:1},cn=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function ln(e){return e==null}var un=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,dn=(e,t)=>n=>!!(typeof n==`string`&&un.test(n)&&n.startsWith(e)||t&&!ln(n)&&Object.prototype.hasOwnProperty.call(n,t)),fn=(e,t,n)=>r=>{if(typeof r!=`string`)return r;let[i,a,o,s]=r.match(cn);return{[e]:parseFloat(i),[t]:parseFloat(a),[n]:parseFloat(o),alpha:s===void 0?1:parseFloat(s)}},pn=e=>pt(0,255,e),mn={...an,transform:e=>Math.round(pn(e))},hn={test:dn(`rgb`,`red`),parse:fn(`red`,`green`,`blue`),transform:({red:e,green:t,blue:n,alpha:r=1})=>`rgba(`+mn.transform(e)+`, `+mn.transform(t)+`, `+mn.transform(n)+`, `+Zt(on.transform(r))+`)`};function gn(e){let t=``,n=``,r=``,i=``;return e.length>5?(t=e.substring(1,3),n=e.substring(3,5),r=e.substring(5,7),i=e.substring(7,9)):(t=e.substring(1,2),n=e.substring(2,3),r=e.substring(3,4),i=e.substring(4,5),t+=t,n+=n,r+=r,i+=i),{red:parseInt(t,16),green:parseInt(n,16),blue:parseInt(r,16),alpha:i?parseInt(i,16)/255:1}}var _n={test:dn(`#`),parse:gn,transform:hn.transform},vn=e=>({test:t=>typeof t==`string`&&t.endsWith(e)&&t.split(` `).length===1,parse:parseFloat,transform:t=>`${t}${e}`}),yn=vn(`deg`),bn=vn(`%`),M=vn(`px`),xn=vn(`vh`),Sn=vn(`vw`),Cn={...bn,parse:e=>bn.parse(e)/100,transform:e=>bn.transform(e*100)},wn={test:dn(`hsl`,`hue`),parse:fn(`hue`,`saturation`,`lightness`),transform:({hue:e,saturation:t,lightness:n,alpha:r=1})=>`hsla(`+Math.round(e)+`, `+bn.transform(Zt(t))+`, `+bn.transform(Zt(n))+`, `+Zt(on.transform(r))+`)`},N={test:e=>hn.test(e)||_n.test(e)||wn.test(e),parse:e=>hn.test(e)?hn.parse(e):wn.test(e)?wn.parse(e):_n.parse(e),transform:e=>typeof e==`string`?e:e.hasOwnProperty(`red`)?hn.transform(e):wn.transform(e),getAnimatableNone:e=>{let t=N.parse(e);return t.alpha=0,N.transform(t)}},Tn=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu,En=new RegExp(cn.source),Dn=new RegExp(Tn.source,`i`);function On(e){return isNaN(e)&&typeof e==`string`&&(En.test(e)||Dn.test(e))}var kn=`number`,An=`color`,jn=`var`,Mn=`var(`,Nn="${}",Pn=/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 Fn(e){let t=e.toString();return En.test(t)||Dn.test(t)}function In(e){let t=e.toString(),n=[],r={color:[],number:[],var:[]},i=[],a=0;return{values:n,split:t.replace(Pn,e=>(N.test(e)?(r.color.push(a),i.push(An),n.push(N.parse(e))):e.startsWith(Mn)?(r.var.push(a),i.push(jn),n.push(e)):(r.number.push(a),i.push(kn),n.push(parseFloat(e))),++a,Nn)).split(Nn),indexes:r,types:i}}function Ln(e){return In(e).values}function Rn({split:e,types:t}){let n=e.length;return r=>{let i=``;for(let a=0;a<n;a++)if(i+=e[a],r[a]!==void 0){let e=t[a];i+=e===kn?Zt(r[a]):e===An?N.transform(r[a]):r[a]}return i}}function zn(e){return Rn(In(e))}var Bn=e=>typeof e==`number`?0:N.test(e)?N.getAnimatableNone(e):e,Vn=(e,t)=>typeof e==`number`?t?.trim().endsWith(`/`)?e:0:Bn(e);function Hn(e){let t=In(e);return Rn(t)(t.values.map((e,n)=>Vn(e,t.split[n])))}var P={test:On,parse:Ln,createTransformer:zn,getAnimatableNone:Hn};function Un(e,t,n){return n<0&&(n+=1),n>1&&--n,n<1/6?e+(t-e)*6*n:n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function Wn({hue:e,saturation:t,lightness:n,alpha:r}){e/=360,t/=100,n/=100;let i=0,a=0,o=0;if(!t)i=a=o=n;else{let r=n<.5?n*(1+t):n+t-n*t,s=2*n-r;i=Un(s,r,e+1/3),a=Un(s,r,e),o=Un(s,r,e-1/3)}return{red:Math.round(i*255),green:Math.round(a*255),blue:Math.round(o*255),alpha:r}}function Gn(e,t){return n=>n>0?t:e}var F=(e,t,n)=>e+(t-e)*n,Kn=(e,t,n)=>{let r=e*e,i=n*(t*t-r)+r;return i<0?0:Math.sqrt(i)},qn=[_n,hn,wn],Jn=e=>qn.find(t=>t.test(e));function Yn(e){let t=Jn(e);if(!t)return`${e}`,!1;let n=t.parse(e);return t===wn&&(n=Wn(n)),n}var Xn=(e,t)=>{let n=Yn(e),r=Yn(t);if(!n||!r)return Gn(e,t);let i={...n};return e=>(i.red=Kn(n.red,r.red,e),i.green=Kn(n.green,r.green,e),i.blue=Kn(n.blue,r.blue,e),i.alpha=F(n.alpha,r.alpha,e),hn.transform(i))},Zn=new Set([`none`,`hidden`]);function Qn(e,t){return Zn.has(e)?n=>n<=0?e:t:n=>n>=1?t:e}function $n(e,t){return n=>F(e,t,n)}function er(e){return typeof e==`number`?$n:typeof e==`string`?tn(e)?Gn:N.test(e)?Xn:ir:Array.isArray(e)?tr:typeof e==`object`?N.test(e)?Xn:nr:Gn}function tr(e,t){let n=[...e],r=n.length,i=e.map((e,n)=>er(e)(e,t[n]));return e=>{for(let t=0;t<r;t++)n[t]=i[t](e);return n}}function nr(e,t){let n={...e,...t},r={};for(let i in n)e[i]!==void 0&&t[i]!==void 0&&(r[i]=er(e[i])(e[i],t[i]));return e=>{for(let t in r)n[t]=r[t](e);return n}}function rr(e,t){let n=[],r={color:0,var:0,number:0};for(let i=0;i<t.values.length;i++){let a=t.types[i],o=e.indexes[a][r[a]],s=e.values[o]??0;n[i]=s,r[a]++}return n}var ir=(e,t)=>{let n=P.createTransformer(t),r=In(e),i=In(t);return r.indexes.var.length===i.indexes.var.length&&r.indexes.color.length===i.indexes.color.length&&r.indexes.number.length>=i.indexes.number.length?Zn.has(e)&&!i.values.length||Zn.has(t)&&!r.values.length?Qn(e,t):bt(tr(rr(r,i),i.values),n):(`${e}${t}`,Gn(e,t))},ar=/^(-?(?:\d+(?:\.\d*)?|\.\d+))([a-z%]*)$/iu;function or(e,t){let n=ar.exec(e);if(!n)return;let r=ar.exec(t);if(!r||n[2]!==r[2])return;let i=n[2],a=parseFloat(n[1]),o=parseFloat(r[1]);return e=>Zt(F(a,o,e))+i}function sr(e,t,n){if(typeof e==`number`&&typeof t==`number`&&typeof n==`number`)return F(e,t,n);if(typeof e==`string`&&typeof t==`string`){let n=or(e,t);if(n)return n}return er(e)(e,t)}var cr=[`setup`,`read`,`resolveKeyframes`,`preUpdate`,`update`,`preRender`,`render`,`postRender`];function lr(e){let t=new Set,n=new Set,r=!1,i=!1,a=new Set,o={delta:0,timestamp:0,isProcessing:!1};function s(t){a.has(t)&&(n.add(t),e()),t(o)}let c={schedule:(e,i=!1,o=!1)=>{let s=o&&r?t:n;return i&&a.add(e),s.add(e),e},cancel:e=>{n.delete(e),a.delete(e)},process:e=>{if(o=e,r){i=!0;return}r=!0;let a=t;t=n,n=a,t.forEach(s),t.clear(),r=!1,i&&(i=!1,c.process(e))}};return c}var ur=40;function dr(e,t,n={delta:0,timestamp:0,isProcessing:!1}){let r=!1,i=!0,a=()=>r=!0,o=cr.reduce((e,t)=>(e[t]=lr(a),e),{}),{setup:s,read:c,resolveKeyframes:l,preUpdate:u,update:d,preRender:f,render:p,postRender:m}=o,h=()=>{let a=mt.useManualTiming,o=a?n.timestamp:performance.now();r=!1,a||(n.delta=i?1e3/60:Math.max(Math.min(o-n.timestamp,ur),1)),n.timestamp=o,n.isProcessing=!0,s.process(n),c.process(n),l.process(n),u.process(n),d.process(n),f.process(n),p.process(n),m.process(n),n.isProcessing=!1,r&&t&&(i=!1,e(h))},g=()=>{r=!0,i=!0,n.isProcessing||e(h)};return{schedule:cr.reduce((e,t)=>{let n=o[t];return e[t]=(e,t=!1,i=!1)=>(r||g(),n.schedule(e,t,i)),e},{}),cancel:e=>{for(let t=0;t<cr.length;t++)o[cr[t]].cancel(e)},state:n,steps:o}}var{schedule:I,cancel:fr,steps:pr}=dr(typeof requestAnimationFrame<`u`?requestAnimationFrame:yt,!0,A),mr=e=>{let t=({timestamp:t})=>e(t);return{start:(e=!0)=>I.update(t,e),stop:()=>fr(t),now:()=>A.isProcessing?A.timestamp:j.now()}},hr=(e,t,n=10)=>{let r=``,i=Math.max(Math.round(t/n),2);for(let t=0;t<i;t++)r+=Math.round(e(t/(i-1))*1e4)/1e4+`, `;return`linear(${r.substring(0,r.length-2)})`},gr=2e4;function _r(e,t=50,n=gr,r){let i=0,a=e.next(i);for(r?.push(a.value);!a.done&&i<n;)i+=t,a=e.next(i),r?.push(a.value);return i>=n?1/0:i}function vr(e,t=100,n){let r=n({...e,keyframes:[0,t]}),i=Math.min(_r(r),gr);return{type:`keyframes`,ease:e=>r.next(i*e).value/t,duration:Ct(i)}}var L={stiffness:100,damping:10,mass:1,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05},yr=e=>e<0?1/Math.max(1+e,L.minDamping):Math.max(1-e,L.minDamping);function br(e,t){if(!(e>1))return 1;let n=Math.sqrt(e*e-1),r=e-n,i=e+n,a=2*n*Math.exp(-t)*(1+t);return Cr(e=>i*Math.exp(-r*e)-r*Math.exp(-i*e)-a,e=>Math.exp(-i*e)-Math.exp(-r*e),t)/t}function xr(e,t){return e*Math.sqrt(1-t*t)}var Sr=12;function Cr(e,t,n){let r=n;for(let n=1;n<Sr;n++)r-=e(r)/t(r);return r}var wr=.001;function Tr({duration:e=L.duration,bounce:t=L.bounce}){let n,r;L.maxDuration;let i=yr(t);e=pt(L.minDuration,L.maxDuration,Ct(e)),i<1?(n=t=>{let n=t*i,r=n*e,a=xr(t,i),o=Math.exp(-r);return wr-n/a*o},r=t=>{let r=t*i*e,a=i*i*t*t*e,o=Math.exp(-r),s=xr(t*t,i);return(-n(t)+wr>0?-1:1)*-a*o/s}):(n=t=>-.001+Math.exp(-t*e)*(t*e+1),r=t=>Math.exp(-t*e)*(-t*(e*e)));let a=5/e,o=Cr(n,r,a),s=o*br(i,o*e),c=s*s;return{stiffness:c,damping:i*2*Math.sqrt(c),duration:k(e)}}var Er=(e,t)=>(t?e>=0:e>0)&&e<1/0;function Dr(e,t){if(Er(e,t))return e}function Or(e){let t=Dr(e.stiffness),n=Dr(e.damping,!0),r=Dr(e.mass),i={...e,stiffness:t??L.stiffness,damping:n??L.damping,mass:r??L.mass,isResolvedFromDuration:!1,isTimeDefined:(t??n??r)===void 0&&(e.duration!==void 0||e.bounce!==void 0)};if(i.isTimeDefined){if(e.visualDuration){let t=yr(e.bounce||0),n=2*Math.PI/(e.visualDuration*1.2)*br(t,2*Math.PI/1.2);i.stiffness=n*n,i.damping=2*t*Math.sqrt(i.stiffness)}else Object.assign(i,Tr(i)),i.isResolvedFromDuration=!0;(!Er(i.stiffness)||!Er(i.damping,!0))&&(i.stiffness=L.stiffness,i.damping=L.damping)}return i}function kr(e=L.visualDuration,t=L.bounce){let n=typeof e==`object`?e:{visualDuration:e,keyframes:[0,1],bounce:t},r=n.keyframes[0],i=n.keyframes[n.keyframes.length-1],a={done:!1,value:r},{stiffness:o,damping:s,mass:c,duration:l,isResolvedFromDuration:u,isTimeDefined:d}=Or({...n}),f=e=>d?0:-Ct(e),p=s/(2*Math.sqrt(o*c)),m=Ct(Math.sqrt(o/c)),h=p*m,g={target:i,delta:i-r,velocity:f(n.velocity||0)||0,restSpeed:0,restDelta:0},_=()=>{let e=Math.abs(g.delta)<5;g.restSpeed=n.restSpeed||(e?L.restSpeed.granular:L.restSpeed.default),g.restDelta=n.restDelta||(e?L.restDelta.granular:L.restDelta.default)};_();let v,y,b;if(p<1){let e=xr(m,p),t={A:0,sinC:0,cosC:0,t:-1,env:0,sin:0,cos:0};b=()=>{t.A=(g.velocity+h*g.delta)/e,t.sinC=h*t.A+g.delta*e,t.cosC=h*g.delta-t.A*e};let n=n=>{n!==t.t&&(t.t=n,t.env=Math.exp(-h*n),t.sin=Math.sin(e*n),t.cos=Math.cos(e*n))};v=e=>(n(e),g.target-t.env*(t.A*t.sin+g.delta*t.cos)),y=e=>(n(e),t.env*(t.sinC*t.sin+t.cosC*t.cos))}else if(p===1){v=e=>g.target-Math.exp(-m*e)*(g.delta+(g.velocity+m*g.delta)*e);let e={C:0};b=()=>{e.C=g.velocity+m*g.delta},y=t=>Math.exp(-m*t)*(m*e.C*t-g.velocity)}else{let e=m*Math.sqrt(p*p-1),t=h-e,n=h+e,r=d?1/0:300/e,i=(e,t)=>Math.exp(t>r?-e*r-h*(t-r):-e*t),a={S:0,F:0};b=()=>{let t=(g.velocity+h*g.delta)/e;a.S=(g.delta+t)/2,a.F=(g.delta-t)/2},v=e=>g.target-a.S*i(t,e)-a.F*i(n,e),y=e=>t*a.S*i(t,e)+n*a.F*i(n,e)}b();let x=u&&l||null,S={calculatedDuration:x,retarget:(e,t)=>{g.target=e[e.length-1],g.delta=g.target-e[0],g.velocity=f(t),n.restSpeed&&n.restDelta||_(),S.calculatedDuration=x,a.done=!1,b()},velocity:e=>k(y(e)),next:e=>{let t=v(e);if(u)a.done=e>=l;else{let n=k(y(e));a.done=Math.abs(n)<=g.restSpeed&&Math.abs(g.target-t)<=g.restDelta}return a.value=a.done?g.target:t,a},toString:()=>{let e=Math.min(_r(S),gr),t=hr(t=>S.next(e*t).value,e,30);return e+`ms `+t},toTransition:()=>{}};return S}kr.applyToOptions=e=>{let t=vr(e,100,kr);return e.ease=t.ease,e.duration=k(t.duration),e.type=`keyframes`,e};function Ar({keyframes:e,velocity:t=0,power:n=.8,timeConstant:r=325,bounceDamping:i=10,bounceStiffness:a=500,modifyTarget:o,min:s,max:c,restDelta:l=.5,restSpeed:u}){let d=e[0],f={done:!1,value:d},p=e=>e<s||e>c,m=e=>s===void 0?c:c===void 0||Math.abs(s-e)<Math.abs(c-e)?s:c,h=n*t,g=d+h,_=o===void 0?g:o(g);_!==g&&(h=_-d);let v=e=>-h*Math.exp(-e/r),y=e=>{let t=v(e);f.done=Math.abs(t)<=l,f.value=f.done?_:_+t},b,x,S=e=>{p(f.value)&&(b=e,x=kr({keyframes:[f.value,m(f.value)],velocity:-v(e)/r*1e3,damping:i,stiffness:a,restDelta:l,restSpeed:u}))};return S(0),{calculatedDuration:null,next:e=>{let t=!1;return!x&&b===void 0&&(t=!0,y(e),S(e)),b!==void 0&&e>=b?x.next(e-b):(!t&&y(e),f)}}}function jr(e,t,n){let r=[],i=n||mt.mix||sr,a=e.length-1;for(let n=0;n<a;n++){let a=i(e[n],e[n+1]);t&&(a=bt(Array.isArray(t)?t[n]||yt:t,a)),r.push(a)}return r}function Mr(e,t,{clamp:n=!0,ease:r,mixer:i}={}){let a=e.length;if(t.length,a===1)return()=>t[0];if(a===2&&t[0]===t[1])return()=>t[1];let o=e[0]===e[1];e[0]>e[a-1]&&(e=[...e].reverse(),t=[...t].reverse());let s=jr(t,r,i),c=s.length,l=n=>{if(o&&n<e[0])return t[0];let r=0;if(c>1)for(;r<e.length-2&&!(n<e[r+1]);r++);let i=xt(e[r],e[r+1],n);return s[r](i)};return n?t=>l(pt(e[0],e[a-1],t)):l}function Nr(e,t){let n=e[e.length-1];for(let r=1;r<=t;r++){let i=xt(0,t,r);e.push(F(n,1,i))}}function Pr(e){let t=[0];return Nr(t,e.length-1),t}function Fr(e,t){return e.map(e=>e*t)}function Ir(e,t){return e.map(()=>t||Ht).splice(0,e.length-1)}function Lr({duration:e=300,keyframes:t,times:n,ease:r=`easeInOut`}){let i=Ut(r)?r.map(Jt):Jt(r)||Ht,a={done:!1,value:t[0]};if(t.length===2&&!Array.isArray(i)&&(!n||n.length!==2||n[0]===0&&n[1]===1)){let[n,r]=t,o=n===r?void 0:(mt.mix||sr)(n,r);return{calculatedDuration:e,next:t=>(a.value=o?o(i(e>0?pt(0,1,t/e):1)):r,a.done=t>=e,a)}}let o=Mr(Fr(n&&n.length===t.length?n:Pr(t),e),t,{ease:Array.isArray(i)?i:Ir(t,i)});return{calculatedDuration:e,next:t=>(a.value=o(t),a.done=t>=e,a)}}var Rr=5;function zr(e,t,n){let r=Math.max(t-Rr,0);return wt(n-e(r),t-r)}function Br(e,t,n=0){return t<=0?n:e.velocity?e.velocity(t):zr(t=>e.next(t).value,t,e.next(t).value)}var Vr=e=>e!==null;function Hr(e,{repeat:t,repeatType:n=`loop`},r,i=1){let a=e.filter(Vr),o=i<0||t&&n!==`loop`&&t%2==1?0:a.length-1;return!o||r===void 0?a[o]:r}var Ur={decay:Ar,inertia:Ar,tween:Lr,keyframes:Lr,spring:kr};function Wr(e){typeof e.type==`string`&&(e.type=Ur[e.type])}function Gr(e,t){return{kind:e,animation:t,timestamp:j.now(),frameTimestamp:A.timestamp,frameIsProcessing:A.isProcessing}}function Kr(e,t,n){let r=globalThis.__MOTION_INSPECT__;if(r)try{r({...Gr(`animation-start`,e),options:n?{...t,...n}:t})}catch{}}function qr(e,t){let n=globalThis.__MOTION_INSPECT__;if(n)try{n({...Gr(`layout-animation-start`,e),node:t})}catch{}}var Jr=class{constructor(){this.isResolved=!1}get finished(){return this._finished||=this.isResolved?Promise.resolve():new Promise(e=>{this._resolve=e}),this._finished}updateFinished(){this._finished=this._resolve=void 0,this.isResolved=!1}notifyFinished(){this.isResolved=!0,this._resolve?.()}then(e,t){return this.finished.then(e,t)}},Yr=e=>e/100,Xr=class extends Jr{constructor(e){super(),this.state=`idle`,this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.delayState={done:!1,value:void 0},this.stop=()=>{let{motionValue:e}=this.options;e&&e.updatedAt!==j.now()&&this.tick(j.now()),this.isStopped=!0,this.state!==`idle`&&(this.teardown(),this.options.onStop?.())},this.options=e,this.initAnimation(),this.play(),e.autoplay===!1&&this.pause(),Kr(this,this.options)}initAnimation(){let{options:e}=this;Wr(e);let{type:t=Lr,repeat:n=0,repeatDelay:r=0,repeatType:i,velocity:a=0}=e,{keyframes:o}=e,s=t||Lr;s!==Lr&&typeof o[0]!=`number`&&(this.mixKeyframes=bt(Yr,sr(o[0],o[1])),o=[0,100]);let c=s(o===e.keyframes?e:{...e,keyframes:o});i===`mirror`&&(this.mirroredGenerator=s({...e,keyframes:[...o].reverse(),velocity:-a})),c.calculatedDuration===null&&(c.calculatedDuration=_r(c));let{calculatedDuration:l}=c;this.calculatedDuration=l,this.resolvedDuration=l+r,this.totalDuration=this.resolvedDuration*(n+1)-r,this.generator=c}updateTime(e){let t=Math.round(e-this.startTime)*this.playbackSpeed;this.currentTime=this.holdTime===null?t:this.holdTime}tick(e,t=!1){let{generator:n,totalDuration:r,mixKeyframes:i,mirroredGenerator:a,resolvedDuration:o,calculatedDuration:s}=this;if(this.startTime===null)return n.next(0);let{delay:c=0,keyframes:l,repeat:u,repeatType:d,repeatDelay:f,type:p,onUpdate:m,finalKeyframe:h}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,e):this.speed<0&&(this.startTime=Math.min(e-r/this.speed,this.startTime)),t?this.currentTime=e:this.updateTime(e);let g=this.currentTime-c*(this.playbackSpeed>=0?1:-1),_=this.playbackSpeed>=0?g<0:g>r;this.currentTime=Math.max(g,0),this.state===`finished`&&this.holdTime===null&&(this.currentTime=r);let v=this.currentTime,y=n;if(u){let e=Math.min(this.currentTime,r)/o,t=Math.floor(e),n=e%1;!n&&e>=1&&(n=1),n===1&&t--,t=Math.min(t,u+1),t%2&&(d===`reverse`?(n=1-n,f&&(n-=f/o)):d===`mirror`&&(y=a)),v=pt(0,1,n)*o}let b;_?(this.delayState.value=l[0],b=this.delayState):b=y.next(v),i&&!_&&(b.value=i(b.value));let{done:x}=b;!_&&s!==null&&(x=this.playbackSpeed>=0?this.currentTime>=r:this.currentTime<=0);let S=this.holdTime===null&&(this.state===`finished`||this.state===`running`&&x);return S&&p!==Ar&&(b.value=Hr(l,this.options,h,this.speed)),m&&m(b.value),S&&this.finish(),b}then(e,t){return this.finished.then(e,t)}get duration(){return Ct(this.calculatedDuration)}get iterationDuration(){let{delay:e=0}=this.options||{};return this.duration+Ct(e)}get time(){return Ct(this.currentTime)}set time(e){e=k(e),this.currentTime=e,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=e:this.driver&&(this.startTime=this.driver.now()-e/this.playbackSpeed),this.driver?this.driver.start(!1):(this.startTime=0,this.state=`paused`,this.holdTime=e,this.tick(e))}getGeneratorVelocity(){return Br(this.generator,this.currentTime,this.options.velocity)}get speed(){return this.playbackSpeed}set speed(e){let t=this.playbackSpeed!==e;t&&this.driver&&this.updateTime(j.now()),this.playbackSpeed=e,t&&this.driver&&(this.time=Ct(this.currentTime))}play(){if(this.isStopped)return;let{driver:e=mr,startTime:t}=this.options;this.driver||=e(e=>this.tick(e)),this.options.onPlay?.();let n=this.driver.now();this.state===`finished`?(this.updateFinished(),this.startTime=n):this.holdTime===null?this.startTime||=t??n:this.startTime=n-this.holdTime,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(j.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(),void 0)}sample(e){return this.startTime=0,this.tick(e,!0)}attachTimeline(e){return this.options.allowFlatten&&(this.options.type=`keyframes`,this.options.ease=`linear`,this.initAnimation()),this.driver?.stop(),e.observe(this)}},Zr=new Set([`brightness`,`contrast`,`saturate`,`opacity`]);function Qr(e){let[t,n]=e.slice(0,-1).split(`(`);if(t===`drop-shadow`)return e;let[r]=n.match(cn)||[];if(!r)return e;let i=n.replace(r,``),a=+!!Zr.has(t);return r!==n&&(a*=100),t+`(`+a+i+`)`}var $r=/\b([a-z-]*)\(.*?\)/gu,ei={...P,getAnimatableNone:e=>{let t=e.match($r);return t?t.map(Qr).join(` `):e}},ti={...P,getAnimatableNone:e=>{let t=P.parse(e);return P.createTransformer(e)(t.map(e=>typeof e==`number`?0:typeof e==`object`?{...e,alpha:1}:e))}},ni={...an,transform:Math.round},ri={rotate:yn,pathRotation:yn,rotateX:yn,rotateY:yn,rotateZ:yn,scale:sn,scaleX:sn,scaleY:sn,scaleZ:sn,skew:yn,skewX:yn,skewY:yn,distance:M,translateX:M,translateY:M,translateZ:M,x:M,y:M,z:M,perspective:M,transformPerspective:M,opacity:on,originX:Cn,originY:Cn,originZ:M},ii={borderWidth:M,borderTopWidth:M,borderRightWidth:M,borderBottomWidth:M,borderLeftWidth:M,borderRadius:M,borderTopLeftRadius:M,borderTopRightRadius:M,borderBottomRightRadius:M,borderBottomLeftRadius:M,width:M,maxWidth:M,height:M,maxHeight:M,top:M,right:M,bottom:M,left:M,inset:M,insetBlock:M,insetBlockStart:M,insetBlockEnd:M,insetInline:M,insetInlineStart:M,insetInlineEnd:M,padding:M,paddingTop:M,paddingRight:M,paddingBottom:M,paddingLeft:M,paddingBlock:M,paddingBlockStart:M,paddingBlockEnd:M,paddingInline:M,paddingInlineStart:M,paddingInlineEnd:M,margin:M,marginTop:M,marginRight:M,marginBottom:M,marginLeft:M,marginBlock:M,marginBlockStart:M,marginBlockEnd:M,marginInline:M,marginInlineStart:M,marginInlineEnd:M,fontSize:M,backgroundPositionX:M,backgroundPositionY:M,...ri,zIndex:ni,fillOpacity:on,strokeOpacity:on,numOctaves:ni},ai={...ii,color:N,backgroundColor:N,outlineColor:N,fill:N,stroke:N,borderColor:N,borderTopColor:N,borderRightColor:N,borderBottomColor:N,borderLeftColor:N,filter:ei,WebkitFilter:ei,mask:ti,WebkitMask:ti},oi=e=>ai[e],si=new Set([ei,ti]);function ci(e,t){let n=oi(e);return si.has(n)||(n=P),n.getAnimatableNone?n.getAnimatableNone(t):void 0}function li(e){for(let t=1;t<e.length;t++)e[t]??(e[t]=e[t-1])}var ui=e=>e*180/Math.PI,di=e=>pi(ui(Math.atan2(e[1],e[0]))),fi={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:e=>(Math.abs(e[0])+Math.abs(e[3]))/2,rotate:di,rotateZ:di,skewX:e=>ui(Math.atan(e[1])),skewY:e=>ui(Math.atan(e[2])),skew:e=>(Math.abs(e[1])+Math.abs(e[2]))/2},pi=e=>(e%=360,e<0&&(e+=360),e),mi=di,hi=e=>Math.sqrt(e[0]*e[0]+e[1]*e[1]),gi=e=>Math.sqrt(e[4]*e[4]+e[5]*e[5]),_i={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:hi,scaleY:gi,scale:e=>(hi(e)+gi(e))/2,rotateX:e=>pi(ui(Math.atan2(e[6],e[5]))),rotateY:e=>pi(ui(Math.atan2(-e[2],e[0]))),rotateZ:mi,rotate:mi,skewX:e=>ui(Math.atan(e[4])),skewY:e=>ui(Math.atan(e[1])),skew:e=>(Math.abs(e[1])+Math.abs(e[4]))/2};function vi(e){return+!!e.includes(`scale`)}function yi(e,t){if(!e||e===`none`)return vi(t);let n=e.match(/^matrix3d\(([-\d.e\s,]+)\)$/u),r,i;if(n)r=_i,i=n;else{let t=e.match(/^matrix\(([-\d.e\s,]+)\)$/u);r=fi,i=t}if(!i)return vi(t);let a=r[t],o=i[1].split(`,`).map(xi);return typeof a==`function`?a(o):o[a]}var bi=(e,t)=>{let{transform:n=`none`}=getComputedStyle(e);return yi(n,t)};function xi(e){return parseFloat(e.trim())}var Si=[`transformPerspective`,`x`,`y`,`z`,`translateX`,`translateY`,`translateZ`,`scale`,`scaleX`,`scaleY`,`rotate`,`rotateX`,`rotateY`,`rotateZ`,`skew`,`skewX`,`skewY`],Ci=new Set([...Si,`pathRotation`]),wi=e=>e===an||e===M,Ti=new Set([`x`,`y`,`z`]),Ei=Si.filter(e=>!Ti.has(e));function Di(e){let t=[];return Ei.forEach(n=>{let r=e.getValue(n);if(r!==void 0){let e=r.get(),i=+!!n.startsWith(`scale`);if(e===i)return;t.push([n,e]),r.set(i)}}),t}var Oi=new Set([`bottom`,`right`]);function ki(e,t,n,r,i,a){let o=parseFloat(e);if(!isNaN(o))return o;let{min:s,max:c}=t()[n],l=c-s;return a===`border-box`?l:l-parseFloat(r)-parseFloat(i)}var Ai={width:({width:e,paddingLeft:t=`0`,paddingRight:n=`0`,boxSizing:r},i)=>ki(e,i,`x`,t,n,r),height:({height:e,paddingTop:t=`0`,paddingBottom:n=`0`,boxSizing:r},i)=>ki(e,i,`y`,t,n,r),top:({top:e})=>parseFloat(e),left:({left:e})=>parseFloat(e),bottom:({top:e},t)=>{let{y:n}=t();return parseFloat(e)+(n.max-n.min)},right:({left:e},t)=>{let{x:n}=t();return parseFloat(e)+(n.max-n.min)},x:({transform:e})=>yi(e,`x`),y:({transform:e})=>yi(e,`y`)};Ai.translateX=Ai.x,Ai.translateY=Ai.y;var ji=new Set,Mi=!1,Ni=!1,Pi=!1;function Fi(){if(Ni){let e=[],t=new Set,n=new Set;ji.forEach(r=>{r.needsMeasurement&&(e.push(r),t.add(r.element),Oi.has(r.name)&&n.add(r.element))});let r=new Map;n.forEach(e=>{let t=Di(e);t.length&&(r.set(e,t),e.render())}),e.forEach(e=>e.measureInitialState()),t.forEach(e=>{e.render();let t=r.get(e);t&&t.forEach(([t,n])=>{e.getValue(t)?.set(n)})}),e.forEach(e=>e.measureEndState()),e.forEach(e=>{e.suspendedScrollY!==void 0&&window.scrollTo(0,e.suspendedScrollY)})}Ni=!1,Mi=!1,ji.forEach(e=>e.complete(Pi)),ji.clear()}function Ii(){ji.forEach(e=>{e.readKeyframes(),e.needsMeasurement&&(Ni=!0)})}function Li(){Pi=!0,Ii(),Fi(),Pi=!1}function Ri(e,t,n){if(typeof e==`string`){if(ht(e)||_t(e))return parseFloat(e);if(!P.test(e)&&P.test(n))return ci(t,n)}return e??void 0}var zi=class{constructor(e,t,n,r,i,a=!1){this.state=`pending`,this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...e],this.onComplete=t,this.name=n,this.motionValue=r,this.element=i,this.isAsync=a}scheduleResolve(){this.state=`scheduled`,this.isAsync?(ji.add(this),Mi||(Mi=!0,I.read(Ii),I.resolveKeyframes(Fi))):(this.readKeyframes(),this.complete())}readKeyframes(){let{unresolvedKeyframes:e,name:t,element:n,motionValue:r}=this;if(e[0]===null){let i=r?.get(),a=e[e.length-1];if(i!==void 0)e[0]=i;else if(n&&t){let r=Ri(n.readValue(t,a),t,a);r!==void 0&&(e[0]=r)}e[0]===void 0&&(e[0]=a),r&&i===void 0&&r.set(e[0])}li(e)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(e=!1){this.state=`complete`,this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,e),ji.delete(this)}cancel(){this.state===`scheduled`&&(ji.delete(this),this.state=`pending`)}resume(){this.state===`pending`&&this.scheduleResolve()}},Bi=e=>e.startsWith(`--`);function Vi(e,t,n){Bi(t)?e.style.setProperty(t,n):e.style[t]=n}var Hi={};function Ui(e,t){let n=vt(e);return()=>Hi[t]??n()}var Wi=Ui(()=>window.ScrollTimeline!==void 0,`scrollTimeline`),Gi=Ui(()=>{try{document.createElement(`div`).animate({opacity:0},{easing:`linear(0, 1)`})}catch{return!1}return!0},`linearEasing`),Ki=([e,t,n,r])=>`cubic-bezier(${e}, ${t}, ${n}, ${r})`,qi={linear:`linear`,ease:`ease`,easeIn:`ease-in`,easeOut:`ease-out`,easeInOut:`ease-in-out`,circIn:Ki([0,.65,.55,1]),circOut:Ki([.55,0,1,.45]),backIn:Ki([.31,.01,.66,-.59]),backOut:Ki([.33,1.53,.69,.99])};function Ji(e,t){if(e)return typeof e==`function`?Gi()?hr(e,t):`ease-out`:Gt(e)?Ki(e):Array.isArray(e)?e.map(e=>Ji(e,t)||qi.easeOut):qi[e]}function Yi(e,t,n,{delay:r=0,duration:i=300,repeat:a=0,repeatType:o=`loop`,ease:s=`easeOut`,times:c}={},l=void 0){let u={[t]:n};c&&(u.offset=c);let d=Ji(s,i);Array.isArray(d)&&(u.easing=d);let f={delay:r,duration:i,easing:Array.isArray(d)?`linear`:d,fill:`both`,iterations:a+1,direction:o===`reverse`?`alternate`:`normal`};return l&&(f.pseudoElement=l),e.animate(u,f)}function Xi(e){return typeof e==`function`&&`applyToOptions`in e}function Zi({type:e,...t}){return Xi(e)&&Gi()?e.applyToOptions(t):(t.duration??=300,t.ease??=`easeOut`,t)}var Qi=class extends Jr{constructor(e){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!e)return;let{element:t,name:n,keyframes:r,pseudoElement:i,allowFlatten:a=!1,finalKeyframe:o,onComplete:s}=e;this.isPseudoElement=!!i,this.allowFlatten=a,this.options=e,e.type;let c=Zi(e);this.animation=Yi(t,n,r,c,i),c.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!i){let e=Hr(r,this.options,o,this.speed);this.updateMotionValue&&this.updateMotionValue(e),Vi(t,n,e),this.animation.cancel()}s?.(),this.notifyFinished()},Kr(this,e,c)}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;let{state:e}=this;e!==`idle`&&e!==`finished`&&(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){let e=this.options?.element;!this.isPseudoElement&&e?.isConnected&&this.animation.commitStyles?.()}get duration(){let e=this.animation.effect?.getComputedTiming?.().duration||0;return Ct(Number(e))}get iterationDuration(){let{delay:e=0}=this.options||{};return this.duration+Ct(e)}get time(){return Ct(Number(this.animation.currentTime)||0)}set time(e){let t=this.finishedTime!==null;this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=k(e),t&&this.animation.pause()}get speed(){return this.animation.playbackRate}set speed(e){e<0&&(this.finishedTime=null),this.animation.playbackRate=e}get state(){return this.finishedTime===null?this.animation.playState:`finished`}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(e){this.manualStartTime=this.animation.startTime=e}attachTimeline({timeline:e,onAttach:t,observe:n}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:`linear`}),this.animation.onfinish=null,e&&Wi()?(this.animation.timeline=e,t?.(this.animation),yt):n(this)}},$i={anticipate:It,backInOut:Ft,circInOut:zt};function ea(e){return e in $i}function ta(e){typeof e.ease==`string`&&ea(e.ease)&&(e.ease=$i[e.ease])}var na=10,ra=class extends Qi{constructor(e){ta(e),Wr(e),super(e),e.startTime!==void 0&&e.autoplay!==!1&&(this.startTime=e.startTime),this.options=e}updateMotionValue(e){let{motionValue:t,onUpdate:n,onComplete:r,element:i,...a}=this.options;if(!t)return;if(e!==void 0){t.set(e);return}let o=new Xr({...a,autoplay:!1}),s=Math.max(na,j.now()-this.startTime),c=pt(0,na,s-na),l=o.sample(s).value,{name:u}=this.options;i&&u&&Vi(i,u,l),t.setWithVelocity(o.sample(Math.max(0,s-c)).value,l,c),o.stop()}},ia=(e,t)=>t!==`zIndex`&&!!(typeof e==`number`||Array.isArray(e)||typeof e==`string`&&(P.test(e)||e===`0`)&&!e.startsWith(`url(`));function aa(e){let t=e[0];if(e.length===1)return!0;for(let n=0;n<e.length;n++)if(e[n]!==t)return!0}function oa(e,t,n,r){let i=e[0];if(i===null)return!1;if(t===`display`||t===`visibility`)return!0;let a=e[e.length-1],o=ia(i,t),s=ia(a,t);return!o||!s?(o!==s&&`${t}${i}${a}${o?a:i}`,!1):aa(e)||(n===`spring`||Xi(n))&&r}function sa(e){e.duration=0,e.type=`keyframes`}var ca=new Set([`opacity`,`clipPath`,`filter`,`transform`,`backgroundColor`]),la=/^(?:oklch|oklab|lab|lch|color|color-mix|light-dark)\(/;function ua(e){for(let t=0;t<e.length;t++)if(typeof e[t]==`string`&&la.test(e[t]))return!0;return!1}var da=new Set([`color`,`backgroundColor`,`outlineColor`,`fill`,`stroke`,`borderColor`,`borderTopColor`,`borderRightColor`,`borderBottomColor`,`borderLeftColor`]),fa=vt(()=>Object.hasOwnProperty.call(Element.prototype,`animate`));function pa(e){let{motionValue:t,name:n,repeatDelay:r,repeatType:i,damping:a,type:o,keyframes:s}=e;if(!n||!(ca.has(n)||da.has(n)))return!1;let c=t?.owner?.current;if(!(c instanceof HTMLElement)&&!(c instanceof SVGElement))return!1;let{onUpdate:l,transformTemplate:u}=t.owner.getProps();return fa()&&(ca.has(n)||da.has(n)&&ua(s))&&(n!==`transform`||!u)&&!l&&!r&&i!==`mirror`&&a!==0&&o!==`inertia`}var ma=40,ha=class extends Jr{constructor(e){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=j.now();let{keyframes:t,name:n,motionValue:r,element:i}=e,a=e;a.autoplay??=!0,a.delay??=0,a.type??=`keyframes`,a.repeat??=0,a.repeatDelay??=0,a.repeatType??=`loop`;let o=i?.KeyframeResolver||zi;this.keyframeResolver=new o(t,(e,t,n)=>this.onKeyframesResolved(e,t,a,!n),n,r,i),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(e,t,n,r){this.keyframeResolver=void 0;let{name:i,type:a,velocity:o,delay:s,isHandoff:c,onUpdate:l}=n;this.resolvedAt=j.now();let u=!0;oa(e,i,a,o)||(u=!1,(mt.instantAnimations||!s)&&l?.(Hr(e,n,t)),e[0]=e[e.length-1],sa(n),n.repeat=0);let d=r?this.resolvedAt&&this.resolvedAt-this.createdAt>ma?this.resolvedAt:this.createdAt:void 0,{onComplete:f}=n;n.startTime??=d,n.finalKeyframe=t,n.keyframes=e,n.onComplete=()=>{f?.(),this.notifyFinished()};let p=u&&!c&&pa(n),m;if(p){n.element=n.motionValue?.owner?.current;try{m=new ra(n)}catch{m=new Xr(n)}}else m=new Xr(n);this.pendingTimeline&&=(this.stopTimeline=m.attachTimeline(this.pendingTimeline),void 0),this._animation=m}get finished(){return this._animation?this._animation.finished:super.finished}then(e,t){return this.finished.finally(e).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),Li()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(e){this.animation.time=e}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(e){this.animation.speed=e}get startTime(){return this.animation.startTime}attachTimeline(e){return this._animation?this.stopTimeline=this.animation.attachTimeline(e):this.pendingTimeline=e,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}},ga=class{constructor(e){this.stop=()=>this.runAll(`stop`),this.animations=e.filter(Boolean)}get finished(){return Promise.all(this.animations.map(e=>e.finished))}getAll(e){return this.animations[0][e]}setAll(e,t){for(let n=0;n<this.animations.length;n++)this.animations[n][e]=t}attachTimeline(e){let t=this.animations.map(t=>t.attachTimeline(e));return()=>{t.forEach((e,t)=>{e&&e(),this.animations[t].stop()})}}get time(){return this.getAll(`time`)}set time(e){this.setAll(`time`,e)}get speed(){return this.getAll(`speed`)}set speed(e){this.setAll(`speed`,e)}get state(){return this.getAll(`state`)}get startTime(){return this.getAll(`startTime`)}get duration(){return _a(this.animations,`duration`)}get iterationDuration(){return _a(this.animations,`iterationDuration`)}runAll(e){this.animations.forEach(t=>t[e]())}play(){this.runAll(`play`)}pause(){this.runAll(`pause`)}cancel(){this.runAll(`cancel`)}complete(){this.runAll(`complete`)}};function _a(e,t){let n=0;for(let r=0;r<e.length;r++){let i=e[r][t];i!==null&&i>n&&(n=i)}return n}var va=class extends ga{then(e,t){return this.finished.finally(e).then(()=>{})}};function ya(e,t,n,r=0,i=1){let a=Array.from(e).sort((e,t)=>e.sortNodePosition(t)).indexOf(t),o=e.size,s=(o-1)*r;return typeof n==`function`?n(a,o):i===1?a*r:s-a*r}var ba=30,xa=e=>!isNaN(parseFloat(e)),Sa={current:void 0},Ca=class{constructor(e,t={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=e=>{let t=j.now();if(this.updatedAt!==t&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(e),this.current!==this.prev&&(this.notifyChange(),this.dependents))for(let e of this.dependents)e.dirty()},this.hasAnimated=!1,this.setCurrent(e),this.owner=t.owner}setCurrent(e){this.current=e,this.updatedAt=j.now(),this.canTrackVelocity===null&&e!==void 0&&(this.canTrackVelocity=xa(this.current))}setPrevFrameValue(e=this.current){this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt}onChange(e){return this.on(`change`,e)}on(e,t){var n;return e===`change`?this.onChangeSubscribe(t):((n=this.events)[e]||(n[e]=new St)).add(t)}onChangeSubscribe(e){let{events:t}=this;return!t.change&&!this.changeSubscriber?this.changeSubscriber=e:(t.change||(t.change=new St,t.change.add(this.changeSubscriber),this.changeSubscriber=void 0),t.change.add(e)),()=>{this.changeSubscriber===e?this.changeSubscriber=void 0:t.change?.remove(e),this.stopIfUnobserved()}}stopIfUnobserved(){I.read(()=>{!this.changeSubscriber&&!this.events.change?.getSize()&&this.stop()})}clearListeners(){this.changeSubscriber=void 0;for(let e in this.events)this.events[e].clear()}attach(e,t){this.passiveEffect=e,this.stopPassiveEffect=t}set(e){this.passiveEffect?this.passiveEffect(e,this.updateAndNotify):this.updateAndNotify(e)}setWithVelocity(e,t,n){this.set(t),this.prev=void 0,this.prevFrameValue=e,this.prevUpdatedAt=this.updatedAt-n}jump(e,t=!0){this.updateAndNotify(e),this.prev=e,this.prevUpdatedAt=this.prevFrameValue=void 0,t&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.notifyChange()}notifyChange(){let{current:e,changeSubscriber:t}=this;t?t(e):this.events.change?.notify(e)}addDependent(e){this.dependents||=new Set,this.dependents.add(e)}removeDependent(e){this.dependents&&this.dependents.delete(e)}get(){return Sa.current&&Sa.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){let e=j.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||e-this.updatedAt>ba)return 0;let t=Math.min(this.updatedAt-this.prevUpdatedAt,ba);return wt(parseFloat(this.current)-parseFloat(this.prevFrameValue),t)}start(e){return this.stop(),new Promise(t=>{this.hasAnimated=!0;let n=!1,r;r=e(()=>{n=!0,this.events.animationComplete?.notify(),this.animation===r&&this.clearAnimation(),t()}),n||(this.animation=r),this.events.animationStart?.notify()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){this.animation=void 0}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}};function wa(e,t){return new Ca(e,t)}function Ta(e,t){if(e?.inherit&&t){let{inherit:n,...r}=e;return{...t,...r}}return e}function Ea(e,t){let n=e?.[t]??e?.default??e;return n===e?n:Ta(n,e)}var Da={type:`spring`,stiffness:500,damping:25,restSpeed:10},Oa=e=>({type:`spring`,stiffness:550,damping:e===0?2*Math.sqrt(550):30,restSpeed:10}),ka={type:`keyframes`,duration:.8},Aa={type:`keyframes`,ease:[.25,.1,.35,1],duration:.3},ja=(e,{keyframes:t})=>t.length>2?ka:Ci.has(e)?e.startsWith(`scale`)?Oa(t[1]):Da:Aa,Ma=new Set([`when`,`delay`,`delayChildren`,`staggerChildren`,`staggerDirection`,`repeat`,`repeatType`,`repeatDelay`,`from`,`elapsed`]);function Na(e){for(let t in e)if(!Ma.has(t))return!0;return!1}var Pa=(e,t,n,r={},i,a)=>o=>{let s=Ea(r,e)||{},c=s.delay||r.delay||0,{elapsed:l=0}=r;l-=k(c);let u={keyframes:Array.isArray(n)?n:[null,n],ease:`easeOut`,velocity:t.getVelocity(),...s,delay:-l,onUpdate:e=>{t.set(e),s.onUpdate&&s.onUpdate(e)},onComplete:()=>{o(),s.onComplete&&s.onComplete()},name:e,motionValue:t,element:a?void 0:i};Na(s)||Object.assign(u,ja(e,u)),u.duration&&=k(u.duration),u.repeatDelay&&=k(u.repeatDelay),u.from!==void 0&&(u.keyframes[0]=u.from);let d=!1;if((u.type===!1||u.duration===0&&!u.repeatDelay)&&(sa(u),u.delay===0&&(d=!0)),(mt.instantAnimations||mt.skipAnimations||i?.shouldSkipAnimations||s.skipAnimations)&&(d=!0,sa(u),u.delay=0),u.allowFlatten=!s.type&&!s.ease,d&&!a&&t.get()!==void 0){let e=Hr(u.keyframes,s);if(e!==void 0){I.update(()=>{u.onUpdate(e),u.onComplete()});return}}return s.isSync?new Xr(u):new ha(u)},Fa=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function Ia(e){let t=Fa.exec(e);if(!t)return[,];let[,n,r,i]=t;return[`--${n??r}`,i]}function La(e,t,n=1){`${e}`;let[r,i]=Ia(e);if(!r)return;let a=window.getComputedStyle(t).getPropertyValue(r);if(a){let e=a.trim();return ht(e)?parseFloat(e):e}return tn(i)?La(i,t,n+1):i}function Ra(e){let t=[{},{}];return e?.values.forEach((e,n)=>{t[0][n]=e.get(),t[1][n]=e.getVelocity()}),t}function za(e,t,n,r){let i=t=>typeof t==`function`?t(n===void 0?e.custom:n,...Ra(r)):t;return t=i(t),typeof t==`string`&&(t=e.variants&&e.variants[t]),i(t)}function Ba(e,t,n){return za(e.getProps(),t,n,e)}var Va=(e,t)=>t===`exit`?e.presenceContext?.custom:void 0,Ha=new Set([`width`,`height`,`top`,`left`,`right`,`bottom`,...Si]),Ua=e=>Array.isArray(e);function Wa(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,wa(n))}function Ga(e){return Ua(e)?e[e.length-1]||0:e}function Ka(e,t){let{transitionEnd:n={},transition:r={},...i}=Ba(e,t)||{};i={...i,...n};for(let t in i)Wa(e,t,Ga(i[t]))}var R=e=>!!(e&&e.getVelocity);function qa(e){return!!(R(e)&&e.add)}function Ja(e,t){let n=e.getValue(`willChange`);if(qa(n))return n.add(t);if(!n&&mt.WillChange){let n=new mt.WillChange(`auto`);e.addValue(`willChange`,n),n.add(t)}}function Ya(e){return e.replace(/([A-Z])/g,e=>`-${e.toLowerCase()}`)}var Xa=`data-`+Ya(`framerAppearId`);function Za(e){return e.props[Xa]}var Qa=typeof window<`u`;function $a({protectedKeys:e,needsAnimating:t},n){let r=n in e&&!t[n];return t[n]=!1,r}function eo(e,t,{delay:n=0,transitionOverride:r,type:i}={}){let{transition:a,transitionEnd:o,...s}=t,c=e.getDefaultTransition();a=a?Ta(a,c):c;let l=a?.reduceMotion,u=a?.skipAnimations;r&&(a=r);let d=[],f=i&&e.animationState?.getState()[i],p=a?.path;p&&p.animateVisualElement(e,s,a,n,d);for(let t in s){let r=e.getValue(t,e.latestValues[t]??null),i=s[t];if(i===void 0||f&&$a(f,t))continue;let o={delay:n,...Ea(a||{},t)};u&&(o.skipAnimations=!0);let c=r.get();if(c!==void 0&&!r.isAnimating()&&!Array.isArray(i)&&i===c&&!o.velocity){I.update(()=>r.set(i));continue}let p=!1;if(Qa&&window.MotionHandoffAnimation){let n=Za(e);if(n){let e=window.MotionHandoffAnimation(n,t,I);e!==null&&(o.startTime=e,p=!0)}}Ja(e,t);let m=l??e.shouldReduceMotion;r.start(Pa(t,r,i,m&&Ha.has(t)?{type:!1}:o,e,p));let h=r.animation;h&&d.push(h)}if(o){let t=()=>I.update(()=>{o&&Ka(e,o)});d.length?Promise.all(d).then(t):t()}return d}function to(e,t,n={}){let r=Ba(e,t,Va(e,n.type)),i=n.transitionOverride||(r?.transition??(e.getDefaultTransition()||{})),a=()=>Promise.all(r?eo(e,r,n):[]),o=(r=0)=>{let{variantChildren:a}=e,{delayChildren:o=0,staggerChildren:s,staggerDirection:c}=i,l=[];return a?.forEach(e=>{e.notify(`AnimationStart`,t),l.push(to(e,t,{...n,delay:r+(typeof o==`function`?0:o)+ya(a,e,o,s,c)}).then(()=>e.notify(`AnimationComplete`,t)))}),Promise.all(l)},{when:s}=i;return s?s===`beforeChildren`?a().then(()=>o()):o().then(a):Promise.all([a(),o(n.delay)])}function no(e,t,n={}){return e.notify(`AnimationStart`,t),(Array.isArray(t)?Promise.all(t.map(t=>to(e,t,n))):typeof t==`string`?to(e,t,n):Promise.all(eo(e,Ba(e,t,n.custom),n))).then(()=>{e.notify(`AnimationComplete`,t)})}var ro={test:e=>e===`auto`,parse:e=>e},io=e=>t=>t.test(e),ao=[an,M,bn,yn,Sn,xn,ro],oo=e=>ao.find(io(e));function so(e){return typeof e==`number`?e===0:e===null||e===`none`||e===`0`||_t(e)}var co=new Set([`auto`,`none`,`0`]);function lo(e,t,n){let r=0,i;for(;r<e.length&&!i;){let t=e[r];typeof t==`string`&&!co.has(t)&&Fn(t)&&(i=e[r]),r++}if(i&&n)for(let r of t)e[r]!==i&&(e[r]=ci(n,i))}var uo=class extends zi{constructor(e,t,n,r,i){super(e,t,n,r,i,!0)}readKeyframes(){let{unresolvedKeyframes:e,element:t,name:n}=this;if(!t||!t.current)return;super.readKeyframes();for(let n=0;n<e.length;n++){let r=e[n];if(typeof r==`string`&&(r=r.trim(),tn(r))){let i=La(r,t.current);i!==void 0&&(e[n]=i),n===e.length-1&&(this.finalKeyframe=r)}}if(this.resolveNoneKeyframes(),!Ha.has(n)||e.length!==2)return;let[r,i]=e;if(typeof r==`number`&&typeof i==`number`)return;let a=oo(r),o=oo(i);if(rn(r)!==rn(i)&&Ai[n]){this.needsMeasurement=!0;return}if(a!==o){if(wi(a)&&wi(o))for(let t=0;t<e.length;t++){let n=e[t];typeof n==`string`&&(e[t]=parseFloat(n))}else Ai[n]&&(this.needsMeasurement=!0)}}resolveNoneKeyframes(){let{unresolvedKeyframes:e,name:t}=this,n=[];for(let t=0;t<e.length;t++)(e[t]===null||so(e[t]))&&n.push(t);n.length&&lo(e,n,t)}measure(){let{element:e,name:t}=this;return Ai[t](window.getComputedStyle(e.current),()=>e.measureViewportBox())}measureInitialState(){let{element:e,unresolvedKeyframes:t,name:n}=this;if(!e||!e.current)return;n===`height`&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=this.measure(),t[0]=this.measuredOrigin;let r=t[t.length-1];r!==void 0&&this.motionValue?.jump(r,!1)}measureEndState(){let{element:e,unresolvedKeyframes:t}=this;if(!e||!e.current)return;this.motionValue?.jump(this.measuredOrigin,!1);let n=t.length-1,r=t[n];t[n]=this.measure(),r!==null&&this.finalKeyframe===void 0&&(this.finalKeyframe=r),this.removedTransforms?.length&&this.removedTransforms.forEach(([t,n])=>{e.getValue(t).set(n)}),this.resolveNoneKeyframes()}},fo=[`borderTopLeftRadius`,`borderTopRightRadius`,`borderBottomRightRadius`,`borderBottomLeftRadius`],po=[];function mo(e){typeof e.test==`function`&&e.read,ho(e),po.unshift(e)}function ho(e){ft(po,e)}function go(e){return po.find(t=>t.test(e))}function _o(e,t,n={},r){let i=[],{velocity:a}=n,o=n.reduceMotion??r?.shouldReduceMotion;for(let s in t){if(s===`transition`||s===`transitionEnd`)continue;let c=t[s];if(c===void 0)continue;let l=e(s),u=l.get();if(u!==void 0&&!l.isAnimating()&&!Array.isArray(c)&&c===u&&!a){I.update(()=>l.set(c));continue}l.start(Pa(s,l,c,o&&Ha.has(s)?{type:!1}:n,r)),l.animation&&i.push(l.animation)}let{transitionEnd:s}=t;if(s){let t=()=>I.update(()=>{for(let t in s)e(t).set(s[t])});i.length?Promise.all(i).then(t):t()}return i}function vo(e,t,n,r,i){return _o(r=>{let a=e.get(t,r);if(!a){let o;if(!i){let i=n[r];o=yo(i)??e.read(t,r,i),`${r}`}a=wa(o,{owner:i}),e(t,{[r]:a})}return a},n,r,i)}function yo(e){let t=Array.isArray(e)?e[0]:void 0;return t===null?void 0:t}function bo(e){return gt(e)&&`offsetHeight`in e&&!(`ownerSVGElement`in e)}function xo(e){return gt(e)&&`ownerSVGElement`in e}var So=(e,t)=>t&&typeof e==`number`?t.transform(e):e;function Co(e,t,n){if(e==null)return[];if(e instanceof EventTarget)return[e];if(typeof e==`string`){let r=document;t&&(r=t.current);let i=n?.[e]??r.querySelectorAll(e);return i?Array.from(i):[]}return Array.from(e).filter(e=>e!=null)}var wo=class{constructor(e=I.render){this.step=e,this.values=new Map,this.pending=[],this.numPending=0,this.flush=()=>{let{pending:e,numPending:t}=this;this.numPending=0;for(let n=0;n<t;n++)e[n]()}}set(e,t,n,r){if(this.values.get(e)?.onRemove(),r)for(let e of this.values.values())e.value===r&&(n=e.render);let i=()=>n&&this.schedule(n);t.get()!==void 0&&i();let a=t.on(`change`,i),o=()=>{a(),n&&!r&&this.cancel(n),this.values.get(e)?.onRemove===o&&this.values.delete(e)};return this.values.set(e,{value:t,render:r?void 0:n,onRemove:o}),o}get(e){return this.values.get(e)?.value}release(){let e=new Map;return this.values.forEach((t,n)=>{e.set(n,t.value),t.onRemove()}),this.transformKeys=this.transformValues=void 0,e}schedule(e){let{pending:t,numPending:n}=this;for(let r=0;r<n;r++)if(t[r]===e)return;n||this.step(this.flush),t[this.numPending++]=e}cancel(e){let{pending:t}=this;for(let n=0;n<this.numPending;n++)if(t[n]===e){t[n]=t[--this.numPending];return}}};function To(e,{step:t,...n}={}){let r=new WeakMap;return Object.assign((n,i)=>{let a=r.get(n)??new wo(t);r.set(n,a);let o=[];for(let t in i){let r=i[t],s=e(n,a,t,r);o.push(s)}return()=>{for(let e of o)e()}},n,{get:(e,t)=>r.get(e)?.get(t),flush:e=>r.get(e)?.flush(),state:e=>r.get(e)})}var Eo={x:`translateX`,y:`translateY`,z:`translateZ`,transformPerspective:`perspective`},Do={};function Oo(e){let t=``,{transformKeys:n=[],transformValues:r={}}=e;for(let e=0;e<n.length;e++){let i=n[e],a=r[i].get();a!==void 0&&(typeof a==`number`?a:parseFloat(a))!==+!!i.startsWith(`scale`)&&(t+=(t&&` `)+(Do[i]||(Do[i]=(Eo[i]||i)+`(`))+So(a,ri[i])+`)`)}let i=e.get(`pathRotation`)?.get();return i&&(t+=(t&&` `)+`rotate(`+So(i,ri.pathRotation)+`)`),t||`none`}var ko=new Set([`originX`,`originY`,`originZ`]),Ao=(e,t)=>So(e.get(t)?.get(),ii[t]),jo=(e,t,n,r)=>{let i,a;if(Ci.has(n)){if(n!==`pathRotation`){let e=t.transformKeys??=[];(t.transformValues??={})[n]=r,e.includes(n)||(e.push(n),e.sort((e,t)=>Si.indexOf(e)-Si.indexOf(t)))}t.get(`transform`)||(!bo(e)&&!t.get(`transformBox`)&&jo(e,t,`transformBox`,new Ca(`fill-box`)),t.set(`transform`,new Ca(`none`),()=>{e.style.transform=Oo(t)})),a=t.get(`transform`)}else ko.has(n)?(t.get(`transformOrigin`)||t.set(`transformOrigin`,new Ca(``),()=>{let n=Ao(t,`originX`)??`50%`,r=Ao(t,`originY`)??`50%`,i=Ao(t,`originZ`)??0;e.style.transformOrigin=`${n} ${r} ${i}`}),a=t.get(`transformOrigin`)):i=Bi(n)?()=>{e.style.setProperty(n,r.get())}:()=>{e.style[n]=So(r.get(),ii[n])};return t.set(n,r,i,a)},Mo=e=>bo(e)||xo(e),No=(e,t)=>{if(Ci.has(t))return bi(e,t);let n=getComputedStyle(e),r=Bi(t)?n.getPropertyValue(t):n[t];return typeof r==`string`&&r.trim()||0},Po=To(jo,{test:Mo,read:No}),Fo={x:`translateX`,y:`translateY`,z:`translateZ`,transformPerspective:`perspective`},Io=Si.length;function Lo(e,t,n){let r=``,i=!0;for(let a=0;a<Io;a++){let o=Si[a],s=e[o];if(s===void 0)continue;let c=!0;if(typeof s==`number`)c=s===+!!o.startsWith(`scale`);else{let e=parseFloat(s);c=o.startsWith(`scale`)?e===1:e===0}if(!c||n){let e=So(s,ii[o]);if(!c){i=!1;let t=Fo[o]||o;r+=`${t}(${e}) `}n&&(t[o]=e)}}let a=e.pathRotation;return a&&(i=!1,r+=`rotate(${So(a,ii.pathRotation)}) `),r=r.trim(),n?r=n(t,i?``:r):i&&(r=`none`),r}function Ro(e,t,n){let{style:r,vars:i,transformOrigin:a}=e,o=!1,s=!1;for(let e in t){let n=t[e];if(Ci.has(e)){o=!0;continue}if($t(e)){i[e]=n;continue}{let t=So(n,ii[e]);e.startsWith(`origin`)?(s=!0,a[e]=t):r[e]=t}}if(t.transform||(o||n?r.transform=Lo(t,e.transform,n):r.transform&&=`none`),s){let{originX:e=`50%`,originY:t=`50%`,originZ:n=0}=a;r.transformOrigin=`${e} ${t} ${n}`}}var zo={offset:`stroke-dashoffset`,array:`stroke-dasharray`},Bo={offset:`strokeDashoffset`,array:`strokeDasharray`};function Vo(e,t,n=1,r=0,i=!0){e.pathLength=1;let a=i?zo:Bo;e[a.offset]=`${-r}`,e[a.array]=`${t} ${n}`}var Ho=[`transform`,`opacity`,`offsetDistance`,`offsetPath`,`offsetRotate`,`offsetAnchor`];function Uo(e,{attrX:t,attrY:n,attrScale:r,pathLength:i,pathSpacing:a=1,pathOffset:o=0,...s},c,l,u){if(Ro(e,s,l),c){e.style.viewBox&&(e.attrs.viewBox=e.style.viewBox);return}e.attrs=e.style,e.style={};let{attrs:d,style:f}=e;for(let e of Ho)d[e]!==void 0&&(f[e]=d[e],delete d[e]);(f.transform||d.transformOrigin)&&(f.transformOrigin=d.transformOrigin??`50% 50%`,delete d.transformOrigin),f.transform&&(f.transformBox=u?.transformBox??`fill-box`,delete d.transformBox),t!==void 0&&(d.x=t),n!==void 0&&(d.y=n),r!==void 0&&(d.scale=r),i!==void 0&&Vo(d,i,a,o,!1)}function Wo(e,t){if(!(t in e))return!1;let n=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e),t)||Object.getOwnPropertyDescriptor(e,t);return n&&typeof n.set==`function`}var Go=(e,t,n,r,i=n)=>{let a=Wo(e,i);!a&&(i.startsWith(`data`)||i.startsWith(`aria`))&&(i=Ya(i));let o=ii[n]||ii[i],s=a?()=>{e[i]=So(r.get(),ii[n])}:()=>{let t=So(r.get(),o);t==null?e.removeAttribute(i):e.setAttribute(i,String(t))};return t.set(n,r,s)};function Ko(e,t,n,r){return I.render(()=>e.setAttribute(`pathLength`,`1`)),n===`pathOffset`?t.set(n,r,()=>{let t=r.get();e.setAttribute(`stroke-dashoffset`,`${-t}`)}):(t.get(`stroke-dasharray`)||t.set(`stroke-dasharray`,new Ca(`1 1`),()=>{let n=t.get(`pathLength`)?.get()??1,r=t.get(`pathSpacing`)?.get();e.setAttribute(`stroke-dasharray`,`${n} ${r??1-Number(n)}`)}),t.set(n,r,void 0,t.get(`stroke-dasharray`)))}var qo=To((e,t,n,r)=>n.startsWith(`path`)?Ko(e,t,n,r):n.startsWith(`attr`)?Go(e,t,n,r,Jo(n)):(Ci.has(n)||ko.has(n)||Bi(n)||n in e.style?jo:Go)(e,t,n,r),{test:xo,read:(e,t)=>Ci.has(t)?ii[t]?.default||0:Bi(t)||Ho.includes(t)?No(e,t)||e.getAttribute(Ya(t))||0:(t=Jo(t),e.getAttribute(Ya(t))??e.getAttribute(t)??void 0)});function Jo(e){return e.replace(/^attr([A-Z])/,(e,t)=>t.toLowerCase())}function Yo({top:e,left:t,right:n,bottom:r}){return{x:{min:t,max:n},y:{min:e,max:r}}}function Xo({x:e,y:t}){return{top:t.min,right:e.max,bottom:t.max,left:e.min}}function Zo(e,t){if(!t)return e;let n=t({x:e.left,y:e.top}),r=t({x:e.right,y:e.bottom});return{top:n.y,left:n.x,bottom:r.y,right:r.x}}function Qo(e){return e===void 0||e===1}function $o({scale:e,scaleX:t,scaleY:n}){return!Qo(e)||!Qo(t)||!Qo(n)}function es(e){return $o(e)||ts(e)||e.z||e.rotate||e.rotateX||e.rotateY||e.skewX||e.skewY}function ts(e){return ns(e.x)||ns(e.y)}function ns(e){return e&&e!==`0%`}function rs(e,t,n){return n+t*(e-n)}function is(e,t,n,r,i){return i!==void 0&&(e=rs(e,i,r)),rs(e,n,r)+t}function as(e,t=0,n=1,r,i){e.min=is(e.min,t,n,r,i),e.max=is(e.max,t,n,r,i)}function os(e,{x:t,y:n}){as(e.x,t.translate,t.scale,t.originPoint),as(e.y,n.translate,n.scale,n.originPoint)}var ss=.999999999999,cs=1.0000000000001;function ls(e,t,n,r=!1){let i=n.length;if(!i)return;t.x=t.y=1;let a,o;for(let s=0;s<i;s++){a=n[s],o=a.projectionDelta;let{visualElement:i}=a.options;i&&i.props.style&&i.props.style.display===`contents`||(r&&a.options.layoutScroll&&a.scroll&&a!==a.root&&(us(e.x,-a.scroll.offset.x),us(e.y,-a.scroll.offset.y)),o&&(t.x*=o.x.scale,t.y*=o.y.scale,os(e,o)),r&&es(a.latestValues)&&ps(e,a.latestValues,a.layout?.layoutBox))}t.x<cs&&t.x>ss&&(t.x=1),t.y<cs&&t.y>ss&&(t.y=1)}function us(e,t){e.min+=t,e.max+=t}function ds(e,t,n,r,i=.5){as(e,t,n,F(e.min,e.max,i),r)}function fs(e,t){return typeof e==`string`?parseFloat(e)/100*(t.max-t.min):e}function ps(e,t,n){let r=n??e;ds(e.x,fs(t.x,r.x),t.scaleX,t.scale,t.originX),ds(e.y,fs(t.y,r.y),t.scaleY,t.scale,t.originY)}function ms(e,t){return Yo(Zo(e.getBoundingClientRect(),t))}function hs(e,t,n){let r=ms(e,n),{scroll:i}=t;return i&&(us(r.x,i.offset.x),us(r.y,i.offset.y)),r}var gs={},_s=e=>xo(e)?qo:Po,vs=class{constructor(e,t){this.effect=e,this.current=t,this.KeyframeResolver=uo}getValue(e){return this.effect.get(this.current,e)}readValue(e,t){return this.effect.read(this.current,e,t)}render(){this.effect.flush(this.current)}measureViewportBox(){return ms(this.current)}getProps(){return gs}};function ys(e,t,n,r){if(r)return _o(e=>r.getValue(e,null),t,n,r);let i=_s(e);return vo(i,e,t,n,new vs(i,e))}var bs=To((e,t,n,r)=>t.set(n,r,()=>{e[n]=r.get()}),{test:e=>gt(e),read:(e,t)=>{let n=e[t];return typeof n==`string`||typeof n==`number`?n:void 0}}),{schedule:xs,cancel:Ss}=dr(queueMicrotask,!1),Cs={x:!1,y:!1};function ws(){return Cs.x||Cs.y}function Ts(e){return e===`x`||e===`y`?Cs[e]?null:(Cs[e]=!0,()=>{Cs[e]=!1}):Cs.x||Cs.y?null:(Cs.x=Cs.y=!0,()=>{Cs.x=Cs.y=!1})}function Es(e,t){let n=Co(e),r=new AbortController;return[n,{passive:!0,...t,signal:r.signal},()=>r.abort()]}function Ds(e){return!(e.pointerType===`touch`||ws())}function Os(e,t,n={}){let[r,i,a]=Es(e,n);return r.forEach(e=>{let n=!1,r=!1,a,o=()=>{e.removeEventListener(`pointerleave`,u)},s=e=>{a&&=(a(e),void 0),o()},c=e=>{n=!1,window.removeEventListener(`pointerup`,c),window.removeEventListener(`pointercancel`,c),r&&(r=!1,s(e))},l=()=>{n=!0,window.addEventListener(`pointerup`,c,i),window.addEventListener(`pointercancel`,c,i)},u=e=>{if(e.pointerType!==`touch`){if(n){r=!0;return}s(e)}};e.addEventListener(`pointerenter`,n=>{if(!Ds(n))return;r=!1;let o=t(e,n);typeof o==`function`&&(a=o,e.addEventListener(`pointerleave`,u,i))},i),e.addEventListener(`pointerdown`,l,i)}),a}var ks=(e,t)=>t?e===t||ks(e,t.parentElement):!1,As=e=>e.pointerType===`mouse`?typeof e.button!=`number`||e.button<=0:e.isPrimary!==!1,js=new Set([`BUTTON`,`INPUT`,`SELECT`,`TEXTAREA`,`A`]);function Ms(e){return js.has(e.tagName)||e.isContentEditable===!0}var Ns=new Set([`INPUT`,`SELECT`,`TEXTAREA`]);function Ps(e){return Ns.has(e.tagName)||e.isContentEditable===!0}var Fs=new WeakSet;function Is(e){return t=>{t.key===`Enter`&&e(t)}}function Ls(e,t){e.dispatchEvent(new PointerEvent(`pointer`+t,{isPrimary:!0,bubbles:!0}))}var Rs=(e,t)=>{let n=e.currentTarget;if(!n)return;let r=Is(()=>{if(Fs.has(n))return;Ls(n,`down`);let e=Is(()=>{Ls(n,`up`)});n.addEventListener(`keyup`,e,t),n.addEventListener(`blur`,()=>Ls(n,`cancel`),t)});n.addEventListener(`keydown`,r,t),n.addEventListener(`blur`,()=>n.removeEventListener(`keydown`,r),t)};function zs(e){return As(e)&&!ws()}var Bs=new WeakSet;function Vs(e,t,n={}){let[r,i,a]=Es(e,n),o=e=>{let r=e.currentTarget;if(!zs(e)||Bs.has(e))return;Fs.add(r),n.stopPropagation&&Bs.add(e);let a=t(r,e),o={...i,capture:!0},s=(e,t)=>{window.removeEventListener(`pointerup`,c,o),window.removeEventListener(`pointercancel`,l,o),Fs.has(r)&&Fs.delete(r),zs(e)&&typeof a==`function`&&a(e,{success:t})},c=e=>{s(e,r===window||r===document||n.useGlobalTarget||ks(r,e.target))},l=e=>{s(e,!1)};window.addEventListener(`pointerup`,c,o),window.addEventListener(`pointercancel`,l,o)};return r.forEach(e=>{(n.useGlobalTarget?window:e).addEventListener(`pointerdown`,o,i),bo(e)&&(e.addEventListener(`focus`,e=>Rs(e,i)),!Ms(e)&&!e.hasAttribute(`tabindex`)&&(e.tabIndex=0))}),a}var Hs=new WeakMap,Us,Ws=(e,t,n)=>(r,i)=>i&&i[0]?i[0][e+`Size`]:xo(r)&&`getBBox`in r?r.getBBox()[t]:r[n],Gs=Ws(`inline`,`width`,`offsetWidth`),Ks=Ws(`block`,`height`,`offsetHeight`);function qs({target:e,borderBoxSize:t}){Hs.get(e)?.forEach(n=>{n(e,{get width(){return Gs(e,t)},get height(){return Ks(e,t)}})})}function Js(e){e.forEach(qs)}function Ys(){typeof ResizeObserver<`u`&&(Us=new ResizeObserver(Js))}function Xs(e,t){Us||Ys();let n=Co(e);return n.forEach(e=>{let n=Hs.get(e);n||(n=new Set,Hs.set(e,n)),n.add(t),Us?.observe(e)}),()=>{n.forEach(e=>{let n=Hs.get(e);n?.delete(t),n?.size||Us?.unobserve(e)})}}var Zs=new Set,Qs;function $s(){Qs=()=>{let e={get width(){return window.innerWidth},get height(){return window.innerHeight}};Zs.forEach(t=>t(e))},window.addEventListener(`resize`,Qs)}function ec(e){return Zs.add(e),Qs||$s(),()=>{Zs.delete(e),!Zs.size&&typeof Qs==`function`&&(window.removeEventListener(`resize`,Qs),Qs=void 0)}}function tc(e,t){return typeof e==`function`?ec(e):Xs(e,t)}var nc={value:null,addProjectionMetrics:null};function rc(e){return xo(e)&&e.tagName===`svg`}var ic=e=>typeof e==`number`?e:parseFloat(e),ac=()=>({translate:0,scale:1,origin:0,originPoint:0}),oc=()=>({x:ac(),y:ac()}),sc=()=>({min:0,max:0}),z=()=>({x:sc(),y:sc()}),cc=new WeakMap;function lc(e){return typeof e==`object`&&!!e&&typeof e.start==`function`}function uc(e){return typeof e==`string`||Array.isArray(e)}var dc=[`animate`,`whileInView`,`whileFocus`,`whileHover`,`whileTap`,`whileDrag`,`exit`],fc=[`initial`,...dc];function pc(e){if(lc(e.animate))return!0;for(let t=0;t<fc.length;t++)if(uc(e[fc[t]]))return!0;return!1}function mc(e){return!!(pc(e)||e.variants)}function hc(e,t,n){for(let r in t){let i=t[r],a=n[r];if(R(i))e.addValue(r,i);else if(R(a))e.addValue(r,wa(i,{owner:e}));else if(a!==i){if(e.hasValue(r)){let t=e.getValue(r);t.liveStyle===!0?t.jump(i):t.hasAnimated||t.set(i)}else{let t=e.getStaticValue(r);e.addValue(r,wa(t===void 0?i:t,{owner:e}))}}}for(let r in n)t[r]===void 0&&e.removeValue(r);return t}var gc={current:null},_c={current:!1},vc=typeof window<`u`;function yc(){if(_c.current=!0,vc){if(window.matchMedia){let e=window.matchMedia(`(prefers-reduced-motion)`),t=()=>gc.current=e.matches;e.addEventListener(`change`,t),t()}else gc.current=!1}}var bc=[`AnimationStart`,`AnimationComplete`,`Update`,`BeforeLayoutMeasure`,`LayoutMeasure`,`LayoutAnimationStart`,`LayoutAnimationComplete`],xc={};function Sc(e){xc=e}function Cc(){return xc}var wc=class{scrapeMotionValuesFromProps(e,t,n){return{}}constructor({parent:e,props:t,presenceContext:n,reducedMotionConfig:r,skipAnimations:i,blockInitialAnimation:a,visualState:o},s={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.shouldSkipAnimations=!1,this.values=new Map,this.KeyframeResolver=zi,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.hasBeenMounted=!1,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=()=>{let e=j.now();this.renderScheduledAt<e&&(this.renderScheduledAt=e,I.render(this.render,!1,!0))};let{latestValues:c,renderState:l}=o;this.latestValues=c,this.baseTarget={...c},this.initialValues=t.initial?{...c}:{},this.renderState=l,this.parent=e,this.props=t,this.presenceContext=n,this.depth=e?e.depth+1:0,this.reducedMotionConfig=r,this.skipAnimationsConfig=i,this.options=s,this.blockInitialAnimation=!!a,this.isControllingVariants=pc(t),this.isVariantNode=mc(t),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(e&&e.current);let{willChange:u,...d}=this.scrapeMotionValuesFromProps(t,{},this);for(let e in d){let t=d[e];c[e]!==void 0&&R(t)&&t.set(c[e])}}mount(e){if(this.hasBeenMounted)for(let e in this.initialValues)this.values.get(e)?.jump(this.initialValues[e]),this.latestValues[e]=this.initialValues[e];if(this.current=e,cc.set(e,this),this.projection&&!this.projection.instance&&this.projection.mount(e),this.isVariantNode&&!this.isControllingVariants){let e=this;do e=e.props.inherit!==!1&&e.parent;while(e&&!e.isVariantNode);if(e){let{variantChildren:t}=e;t.add(this),this.removeFromVariantTree=()=>t.delete(this)}}this.values.forEach((e,t)=>this.bindToMotionValue(t,e)),this.reducedMotionConfig===`never`?this.shouldReduceMotion=!1:this.reducedMotionConfig===`always`?this.shouldReduceMotion=!0:(_c.current||yc(),this.shouldReduceMotion=gc.current),this.shouldSkipAnimations=this.skipAnimationsConfig??!1,this.parent?.addChild(this),this.update(this.props,this.presenceContext),this.hasBeenMounted=!0}unmount(){this.projection&&this.projection.unmount(),fr(this.notifyUpdate),fr(this.render),this.valueSubscriptions.forEach(e=>e()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(let e in this.events)this.events[e].clear();for(let e in this.features){let t=this.features[e];t&&(t.unmount(),t.isMounted=!1)}this.current=null}addChild(e){this.children.add(e),this.enteringChildren??=new Set,this.enteringChildren.add(e)}removeChild(e){this.children.delete(e),this.enteringChildren&&this.enteringChildren.delete(e)}bindToMotionValue(e,t){if(this.valueSubscriptions.has(e)&&this.valueSubscriptions.get(e)(),t.accelerate&&ca.has(e)&&this.current instanceof HTMLElement){let{factory:n,keyframes:r,times:i,ease:a,duration:o}=t.accelerate,s=new Qi({element:this.current,name:e,keyframes:r,times:i,ease:a,duration:k(o)}),c=n(s);this.valueSubscriptions.set(e,()=>{c(),s.cancel()});return}let n=Ci.has(e);n&&this.onBindTransform&&this.onBindTransform();let r=t.on(`change`,t=>{this.latestValues[e]=t,this.props.onUpdate&&I.preRender(this.notifyUpdate),n&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()}),i;typeof window<`u`&&window.MotionCheckAppearSync&&(i=window.MotionCheckAppearSync(this,e,t)),this.valueSubscriptions.set(e,()=>{r(),i&&i()})}sortNodePosition(e){return!this.current||!e.current||!this.sortInstanceNodePosition||this.type!==e.type?0:this.sortInstanceNodePosition(this.current,e.current)}updateFeatures(){let e=`animation`;for(e in xc){let t=xc[e];if(!t)continue;let{isEnabled:n,Feature:r}=t;if(!this.features[e]&&r&&n(this.props)&&(this.features[e]=new r(this)),this.features[e]){let t=this.features[e];t.isMounted?t.update():(t.mount(),t.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):z()}getStaticValue(e){return this.latestValues[e]}setStaticValue(e,t){this.latestValues[e]=t}update(e,t){(e.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=e,this.prevPresenceContext=this.presenceContext,this.presenceContext=t;for(let t=0;t<bc.length;t++){let n=bc[t];this.propEventSubscriptions[n]&&(this.propEventSubscriptions[n](),delete this.propEventSubscriptions[n]);let r=e[`on`+n];r&&(this.propEventSubscriptions[n]=this.on(n,r))}this.prevMotionValues=hc(this,this.scrapeMotionValuesFromProps(e,this.prevProps||{},this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(e){return this.props.variants?this.props.variants[e]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}addValue(e,t){let n=this.values.get(e);if(t!==n){n&&this.removeValue(e),this.bindToMotionValue(e,t),this.values.set(e,t);let r=t.get();r!==void 0&&(this.latestValues[e]=r)}}removeValue(e){this.values.delete(e);let t=this.valueSubscriptions.get(e);t&&(t(),this.valueSubscriptions.delete(e)),delete this.latestValues[e],this.removeValueFromRenderState(e,this.renderState)}hasValue(e){return this.values.has(e)}getValue(e,t){if(this.props.values&&this.props.values[e])return this.props.values[e];let n=this.values.get(e);return n===void 0&&t!==void 0&&(n=wa(t??this.getDefaultValue?.(e),{owner:this}),this.addValue(e,n)),n}readValue(e,t){let n=this.latestValues[e]!==void 0||!this.current?this.latestValues[e]:this.getBaseTargetFromProps(this.props,e)??this.readValueFromInstance(this.current,e,this.options);return n!=null&&(typeof n==`string`&&(ht(n)||_t(n))?n=parseFloat(n):typeof n!=`number`&&!P.test(n)&&P.test(t)&&(n=ci(e,t)),this.setBaseTarget(e,R(n)?n.get():n)),R(n)?n.get():n}setBaseTarget(e,t){this.baseTarget[e]=t}on(e,t){return this.events[e]||(this.events[e]=new St),this.events[e].add(t)}notify(e,...t){this.events[e]&&this.events[e].notify(...t)}scheduleRenderMicrotask(){xs.render(this.render)}},Tc=class extends wc{constructor(){super(...arguments),this.KeyframeResolver=uo}sortInstanceNodePosition(e,t){return e.compareDocumentPosition(t)&2?1:-1}getBaseTargetFromProps(e,t){let n=e.style;return n?n[t]:void 0}removeValueFromRenderState(e,{vars:t,style:n}){delete t[e],delete n[e]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);let{children:e}=this.props;R(e)&&(this.childSubscription=e.on(`change`,e=>{this.current&&(this.current.textContent=`${e}`)}))}},Ec=class{constructor(e){this.isMounted=!1,this.node=e}update(){}};function Dc(e,{style:t,vars:n},r,i){let a=e.style,o;for(o in t)a[o]=t[o];for(o in i?.applyProjectionStyles(a,r),n)a.setProperty(o,n[o])}var Oc={};function kc(e,{layout:t,layoutId:n}){return Ci.has(e)||e.startsWith(`origin`)||(t||n!==void 0)&&(!!Oc[e]||e===`opacity`)}function Ac(e,t,n){let r=e.style,i=t?.style,a={};if(!r)return a;for(let t in r)(R(r[t])||i&&R(i[t])||kc(t,e)||n?.getValue(t)?.liveStyle!==void 0)&&(a[t]=r[t]);return a}function jc(e){return window.getComputedStyle(e)}var Mc=class extends Tc{constructor(){super(...arguments),this.type=`html`,this.renderInstance=Dc}mount(e){e.style,super.mount(e)}readValueFromInstance(e,t){if(Ci.has(t))return this.projection?.isProjecting?vi(t):bi(e,t);{let n=jc(e),r=($t(t)?n.getPropertyValue(t):n[t])||0;return typeof r==`string`?r.trim():r}}measureInstanceViewportBox(e,{transformPagePoint:t}){return ms(e,t)}build(e,t,n){Ro(e,t,n.transformTemplate)}scrapeMotionValuesFromProps(e,t,n){return Ac(e,t,n)}},Nc=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`]),Pc=e=>typeof e==`string`&&e.toLowerCase()===`svg`;function Fc(e,t,n,r){Dc(e,t,void 0,r);for(let n in t.attrs)e.setAttribute(Nc.has(n)?n:Ya(n),t.attrs[n])}function Ic(e,t,n){let r=Ac(e,t,n);for(let n in e)if(R(e[n])||R(t[n])){let t=Si.indexOf(n)===-1?n:`attr`+n.charAt(0).toUpperCase()+n.substring(1);r[t]=e[n]}return r}var Lc=class extends Tc{constructor(){super(...arguments),this.type=`svg`,this.isSVGTag=!1,this.measureInstanceViewportBox=z}getBaseTargetFromProps(e,t){return Ci.has(t)?super.getBaseTargetFromProps(e,t)??vi(t):e[t]}getDefaultValue(e){return Ci.has(e)?this.latestValues[e]??vi(e):void 0}readValueFromInstance(e,t){if(Ci.has(t)){let e=oi(t);return e&&e.default||0}if(Ho.includes(t)){let n=getComputedStyle(e)[t];if(typeof n==`string`&&n)return n.trim()}return t=Nc.has(t)?t:Ya(t),e.getAttribute(t)}scrapeMotionValuesFromProps(e,t,n){return Ic(e,t,n)}build(e,t,n){Uo(e,t,this.isSVGTag,n.transformTemplate,n.style)}renderInstance(e,t,n,r){Fc(e,t,n,r)}mount(e){this.isSVGTag=Pc(e.tagName),super.mount(e)}};function Rc(e,t){if(!Array.isArray(t))return!1;let n=t.length;if(n!==e.length)return!1;for(let r=0;r<n;r++)if(t[r]!==e[r])return!1;return!0}var zc=[...dc].reverse();function Bc(e){let t=t=>Promise.all(t.map(({animation:t,options:n})=>no(e,t,n))),n=Hc(),r=!0,i=!1;function a(a){let{props:o,parent:s,manuallyAnimateOnMount:c}=e,l=r||i,u=[],d=new Set,f={},p=1/0,m=e;do m=m.props.inherit!==!1&&m.parent;while(m&&!m.isControllingVariants);if(zc.forEach((t,r)=>{let i=n[t],h=o[t],g=m&&m.props[t],_=h===void 0?uc(g)||g===!1?g:void 0:h,v=uc(_),y=t===a?i.isActive:null;y===!1&&(p=r);let b=v&&h===void 0&&!(l&&c);if(i.protectedKeys={...f},!i.isActive&&y===null||!_&&!i.prevProp||lc(_)||typeof _==`boolean`)return;if(t===`exit`&&i.isActive&&y!==!0){f={...f,...i.prevResolvedValues};return}let x=Vc(i.prevProp,_),S=x||v&&(y&&!b||r>p),C=!1,w=Array.isArray(_)?_:[_],T={};if(y!==!1)for(let n of w){let{transition:r,transitionEnd:i,...a}=Ba(e,n,Va(e,t))||{};T={...T,...a,...i}}let{prevResolvedValues:ee}=i;for(let t in{...ee,...T}){if(t in f)continue;let n=T[t],r=ee[t],a=Array.isArray(n)&&Array.isArray(r)?!Rc(n,r)||x:n!==r;if(a&&n==null)d.add(t);else if(a||n!==void 0&&d.has(t)){S=!0,d.delete(t)&&(C=!0),i.needsAnimating[t]=!0;let n=e.getValue(t);n&&(n.liveStyle=!1)}else i.protectedKeys[t]=!0}if(i.prevProp=_,i.prevResolvedValues=T,i.isActive&&(f={...f,...T}),S&&(!(b&&x)||C))for(let n of w){let r={type:t};if(typeof n==`string`&&l&&c&&s?.enteringChildren){let t=Ba(s,n)?.transition?.delayChildren;r.delay=ya(s.enteringChildren,e,t)}u.push({animation:n,options:r})}}),d.size){let{initial:t}=o,n={},r=typeof t!=`boolean`&&Ba(e,Array.isArray(t)?t[0]:t,e.presenceContext?.custom);r&&r.transition&&(n.transition=r.transition),d.forEach(i=>{let a=e.getValue(i);a&&(a.liveStyle=!0);let s=r&&!Array.isArray(t)?r[i]:void 0,c=e.getBaseTargetFromProps(o,i);n[i]=(s===void 0?c!==void 0&&!R(c)?c:e.initialValues[i]===void 0?e.baseTarget[i]:void 0:s)??null}),u.push({animation:n})}let h=l&&e.blockInitialAnimation||r&&!c&&(o.initial===!1||o.initial===o.animate);return r=i=!1,!h&&u.length?t(u):Promise.resolve()}function o(t,r){if(n[t].isActive===r)return Promise.resolve();e.variantChildren?.forEach(e=>e.animationState?.setActive(t,r)),n[t].isActive=r;let i=a(t);for(let e in n)n[e].protectedKeys={};return i}return{animateChanges:a,setActive:o,setAnimateFunction:n=>{t=n(e)},getState:()=>n,reset:()=>{n=Hc(),i=!0}}}function Vc(e,t){return typeof t==`string`?t!==e:Array.isArray(t)?!Rc(t,e):!1}function Hc(){let e={};for(let t of dc)e[t]={isActive:t===`animate`,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}};return e}function Uc(e,t){e.min=t.min,e.max=t.max}function Wc(e,t){Uc(e.x,t.x),Uc(e.y,t.y)}function Gc(e,t){e.translate=t.translate,e.scale=t.scale,e.originPoint=t.originPoint,e.origin=t.origin}var Kc=.9999,qc=1.0001,Jc=-.01,Yc=.01;function B(e){return e.max-e.min}function Xc(e,t,n){return Math.abs(e-t)<=n}function Zc(e,t,n,r=.5){e.origin=r,e.originPoint=F(t.min,t.max,e.origin),e.scale=B(n)/B(t),e.translate=F(n.min,n.max,e.origin)-e.originPoint,(e.scale>=Kc&&e.scale<=qc||isNaN(e.scale))&&(e.scale=1),(e.translate>=Jc&&e.translate<=Yc||isNaN(e.translate))&&(e.translate=0)}function Qc(e,t,n,r){Zc(e.x,t.x,n.x,r?r.originX:void 0),Zc(e.y,t.y,n.y,r?r.originY:void 0)}function $c(e,t,n,r=0){e.min=(r?F(n.min,n.max,r):n.min)+t.min,e.max=e.min+B(t)}function el(e,t,n,r){$c(e.x,t.x,n.x,r?.x),$c(e.y,t.y,n.y,r?.y)}function tl(e,t,n,r=0){let i=r?F(n.min,n.max,r):n.min;e.min=t.min-i,e.max=e.min+B(t)}function nl(e,t,n,r){tl(e.x,t.x,n.x,r?.x),tl(e.y,t.y,n.y,r?.y)}function rl(e,t,n,r,i){return e-=t,e=rs(e,1/n,r),i!==void 0&&(e=rs(e,1/i,r)),e}function il(e,t=0,n=1,r=.5,i,a=e,o=e){if(bn.test(t)&&(t=parseFloat(t),t=F(o.min,o.max,t/100)-o.min),typeof t!=`number`)return;let s=F(a.min,a.max,r);e===a&&(s-=t),e.min=rl(e.min,t,n,s,i),e.max=rl(e.max,t,n,s,i)}function al(e,t,[n,r,i],a,o){il(e,t[n],t[r],t[i],t.scale,a,o)}var ol=[`x`,`scaleX`,`originX`],sl=[`y`,`scaleY`,`originY`];function cl(e,t,n,r){al(e.x,t,ol,n?n.x:void 0,r?r.x:void 0),al(e.y,t,sl,n?n.y:void 0,r?r.y:void 0)}function ll(e){return e.translate===0&&e.scale===1}function ul(e){return ll(e.x)&&ll(e.y)}function dl(e,t){return e.min===t.min&&e.max===t.max}function fl(e,t){return dl(e.x,t.x)&&dl(e.y,t.y)}function pl(e,t){return Math.round(e.min)===Math.round(t.min)&&Math.round(e.max)===Math.round(t.max)}function ml(e,t){return pl(e.x,t.x)&&pl(e.y,t.y)}function hl(e){return B(e.x)/B(e.y)}function gl(e,t){return e.translate===t.translate&&e.scale===t.scale&&e.originPoint===t.originPoint}function _l(e){return[e(`x`),e(`y`)]}function vl(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}var yl={correct:(e,t)=>{if(!t.target)return e;if(typeof e==`string`){if(M.test(e))e=parseFloat(e);else return e}return`${vl(e,t.target.x)}% ${vl(e,t.target.y)}%`}},bl={correct:(e,{treeScale:t,projectionDelta:n})=>{let r=e,i=P.parse(e);if(i.length>5)return r;let a=P.createTransformer(e),o=typeof i[0]==`number`?0:1,s=n.x.scale*t.x,c=n.y.scale*t.y;i[0+o]/=s,i[1+o]/=c;let l=F(s,c,.5);return typeof i[2+o]==`number`&&(i[2+o]/=l),typeof i[3+o]==`number`&&(i[3+o]/=l),a(i)}};function xl(e,t,n){let r=``,i=e.x.translate/t.x,a=e.y.translate/t.y,o=n?.z||0;if((i||a||o)&&(r=`translate3d(${i}px, ${a}px, ${o}px) `),(t.x!==1||t.y!==1)&&(r+=`scale(${1/t.x}, ${1/t.y}) `),n){let{transformPerspective:e,rotate:t,pathRotation:i,rotateX:a,rotateY:o,skewX:s,skewY:c}=n;e&&(r=`perspective(${e}px) ${r}`),t&&(r+=`rotate(${t}deg) `),i&&(r+=`rotate(${i}deg) `),a&&(r+=`rotateX(${a}deg) `),o&&(r+=`rotateY(${o}deg) `),s&&(r+=`skewX(${s}deg) `),c&&(r+=`skewY(${c}deg) `)}let s=e.x.scale*t.x,c=e.y.scale*t.y;return(s!==1||c!==1)&&(r+=`scale(${s}, ${c})`),r||`none`}var Sl=fo.length,Cl=e=>typeof e==`number`||M.test(e);function wl(e,t,n,r,i,a){i?(e.opacity=F(0,n.opacity??1,El(r)),e.opacityExit=F(t.opacity??1,0,Dl(r))):a&&(e.opacity=F(t.opacity??1,n.opacity??1,r));for(let i=0;i<Sl;i++){let a=fo[i],o=Tl(t,a),s=Tl(n,a);(o!==void 0||s!==void 0)&&(o||=0,s||=0,o===0||s===0||Cl(o)===Cl(s)?(e[a]=Math.max(F(ic(o),ic(s),r),0),(bn.test(s)||bn.test(o))&&(e[a]+=`%`)):e[a]=s)}(t.rotate||n.rotate)&&(e.rotate=F(t.rotate||0,n.rotate||0,r))}function Tl(e,t){return e[t]===void 0?e.borderRadius:e[t]}var El=Ol(0,.5,Rt),Dl=Ol(.5,.95,yt);function Ol(e,t,n){return r=>r<e?0:r>t?1:n(xt(e,t,r))}function kl(e,t,n){let r=R(e)?e:wa(e);return r.start(Pa(``,r,t,n)),r.animation}function Al(e,t,n,r={passive:!0}){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}var jl=(e,t)=>e.depth-t.depth,Ml=class{constructor(){this.children=[],this.isDirty=!1}add(e){dt(this.children,e),this.isDirty=!0}remove(e){ft(this.children,e),this.isDirty=!0}forEach(e){this.isDirty&&this.children.sort(jl),this.isDirty=!1,this.children.forEach(e)}};function Nl(e,t){let n=j.now(),r=({timestamp:i})=>{let a=i-n;a>=t&&(fr(r),e(a-t))};return I.setup(r,!0),()=>fr(r)}function Pl(e){return R(e)?e.get():e}var Fl=class{constructor(){this.members=[]}add(e){dt(this.members,e);for(let t=this.members.length-1;t>=0;t--){let n=this.members[t];if(n===e||n===this.lead||n===this.prevLead)continue;let r=n.instance;(!r||r.isConnected===!1)&&!n.snapshot&&(ft(this.members,n),n.unmount())}e.scheduleRender()}remove(e){if(ft(this.members,e),e===this.prevLead&&(this.prevLead=void 0),e===this.lead){let e=this.members[this.members.length-1];e&&this.promote(e)}}relegate(e){for(let t=this.members.indexOf(e)-1;t>=0;t--){let e=this.members[t];if(e.isPresent!==!1&&e.instance?.isConnected!==!1)return this.promote(e),!0}return!1}promote(e,t){let n=this.lead;if(e!==n&&(this.prevLead=n,this.lead=e,e.show(),n)){n.updateSnapshot(),e.scheduleRender();let{layoutDependency:r}=n.options,{layoutDependency:i}=e.options;(r===void 0||r!==i)&&(e.resumeFrom=n,t&&(n.preserveOpacity=!0),n.snapshot&&(e.snapshot=n.snapshot,e.snapshot.latestValues=n.animationValues||n.latestValues),e.root?.isUpdating&&(e.isLayoutDirty=!0)),e.options.crossfade===!1&&n.hide()}}exitAnimationComplete(){this.members.forEach(e=>{e.options.onExitComplete?.(),e.resumingFrom?.options.onExitComplete?.()})}scheduleRender(){this.members.forEach(e=>e.instance&&e.scheduleRender(!1))}removeLeadSnapshot(){this.lead?.snapshot&&(this.lead.snapshot=void 0)}},Il={borderRadius:{...yl,applyTo:[...fo]},borderTopLeftRadius:yl,borderTopRightRadius:yl,borderBottomLeftRadius:yl,borderBottomRightRadius:yl,boxShadow:bl},Ll={hasAnimatedSinceResize:!0,hasEverUpdated:!1};Object.assign(Oc,{...Il,...Oc});var Rl={nodes:0,calculatedTargetDeltas:0,calculatedProjections:0},zl=[``,`X`,`Y`,`Z`],Bl=1e3,Vl=0;function Hl(e,t,n,r){let{latestValues:i}=t;i[e]&&(n[e]=i[e],t.setStaticValue(e,0),r&&(r[e]=0))}function Ul(e){if(e.hasCheckedOptimisedAppear=!0,e.root===e)return;let{visualElement:t}=e.options;if(!t)return;let n=Za(t);if(window.MotionHasOptimisedAnimation(n,`transform`)){let{layout:t,layoutId:r}=e.options;window.MotionCancelOptimisedAnimation(n,`transform`,I,!(t||r))}let{parent:r}=e;r&&!r.hasCheckedOptimisedAppear&&Ul(r)}function Wl({attachResizeListener:e,defaultParent:t,measureScroll:n,checkIsScrollRoot:r,resetTransform:i}){return class{constructor(e={},n=t?.()){this.id=Vl++,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.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,nc.value&&(Rl.nodes=Rl.calculatedTargetDeltas=Rl.calculatedProjections=0),this.nodes.forEach(ql),this.nodes.forEach(ru),this.nodes.forEach(iu),this.nodes.forEach(Jl),nc.addProjectionMetrics&&nc.addProjectionMetrics(Rl)},this.resolvedRelativeTargetAt=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=e,this.root=n?n.root||n:this,this.path=n?[...n.path,n]:[],this.parent=n,this.depth=n?n.depth+1:0;for(let e=0;e<this.path.length;e++)this.path[e].shouldResetTransform=!0;this.root===this&&(this.nodes=new Ml)}addEventListener(e,t){return this.eventHandlers.has(e)||this.eventHandlers.set(e,new St),this.eventHandlers.get(e).add(t)}notifyListeners(e,...t){let n=this.eventHandlers.get(e);n&&n.notify(...t)}hasListeners(e){return this.eventHandlers.has(e)}mount(t){if(this.instance)return;this.isSVG=xo(t)&&!rc(t),this.instance=t;let{layoutId:n,layout:r,visualElement:i}=this.options;if(i&&!i.current&&i.mount(t),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),this.root.hasTreeAnimated&&(r||n)&&(this.isLayoutDirty=!0),e){let n,r=0,i=()=>this.root.updateBlockedByResize=!1;I.read(()=>{r=window.innerWidth}),e(t,()=>{let e=window.innerWidth;e!==r&&(r=e,this.root.updateBlockedByResize=!0,n&&n(),n=Nl(i,250),Ll.hasAnimatedSinceResize&&(Ll.hasAnimatedSinceResize=!1,this.nodes.forEach(nu)))})}n&&this.root.registerSharedNode(n,this),this.options.animate!==!1&&i&&(n||r)&&this.addEventListener(`didUpdate`,({delta:e,hasLayoutChanged:t,hasRelativeLayoutChanged:n,layout:r})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}let a=this.options.transition||i.getDefaultTransition()||du,{onLayoutAnimationStart:o,onLayoutAnimationComplete:s}=i.getProps(),c=!this.targetLayout||!ml(this.targetLayout,r),l=!t&&n;if(this.options.layoutRoot||this.resumeFrom||l||t&&(c||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);let t={...Ea(a,`layout`),onPlay:o,onComplete:s};(i.shouldReduceMotion||this.options.layoutRoot)&&(t.delay=0,t.type=!1),this.startAnimation(t),this.setAnimationOrigin(e,l,t.path)}else t||nu(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=r})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);let e=this.getStack();e&&e.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),fr(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(au),this.animationId++)}getTransformTemplate(){let{visualElement:e}=this.options;return e&&e.getProps().transformTemplate}willUpdate(e=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&Ul(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let e=0;e<this.path.length;e++){let t=this.path[e];t.shouldResetTransform=!0,(typeof t.latestValues.x==`string`||typeof t.latestValues.y==`string`)&&(t.isLayoutDirty=!0),t.updateScroll(`snapshot`),t.options.layoutRoot&&t.willUpdate(!1)}let{layoutId:t,layout:n}=this.options;if(t===void 0&&!n)return;let r=this.getTransformTemplate();this.prevTransformTemplateValue=r?r(this.latestValues,``):void 0,this.updateSnapshot(),e&&this.notifyListeners(`willUpdate`)}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){let e=this.updateBlockedByResize;this.unblockUpdate(),this.updateBlockedByResize=!1,this.clearAllSnapshots(),e&&this.nodes.forEach(Zl),this.nodes.forEach(Xl);return}if(this.animationId<=this.animationCommitId){this.nodes.forEach(Ql);return}this.animationCommitId=this.animationId,this.isUpdating?(this.isUpdating=!1,this.nodes.forEach($l),this.nodes.forEach(eu),this.nodes.forEach(tu),this.nodes.forEach(Gl),this.nodes.forEach(Kl)):this.nodes.forEach(Ql),this.clearAllSnapshots();let e=j.now();A.delta=pt(0,1e3/60,e-A.timestamp),A.timestamp=e,A.isProcessing=!0,pr.update.process(A),pr.preRender.process(A),pr.render.process(A),A.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,xs.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(Yl),this.sharedNodes.forEach(ou)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,I.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){I.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){!this.snapshot&&this.instance&&(this.snapshot=this.measure(),this.snapshot&&!B(this.snapshot.measuredBox.x)&&!B(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 e=0;e<this.path.length;e++)this.path[e].updateScroll();let e=this.layout;this.layout=this.measure(!1),this.layoutCorrected||=z(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners(`measure`,this.layout.layoutBox);let{visualElement:t}=this.options;t&&t.notify(`LayoutMeasure`,this.layout.layoutBox,e?e.layoutBox:void 0)}updateScroll(e=`measure`){let t=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===e&&(t=!1),t&&this.instance){let t=r(this.instance);this.scroll={animationId:this.root.animationId,phase:e,isRoot:t,offset:n(this.instance),wasRoot:this.scroll?this.scroll.isRoot:t}}}resetTransform(){if(!i)return;let e=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,t=this.projectionDelta&&!ul(this.projectionDelta),n=this.getTransformTemplate(),r=n?n(this.latestValues,``):void 0,a=r!==this.prevTransformTemplateValue;e&&this.instance&&(t||es(this.latestValues)||a)&&(i(this.instance,r),this.shouldResetTransform=!1,this.scheduleRender())}measure(e=!0){let t=this.measurePageBox(),n=this.removeElementScroll(t);return e&&(n=this.removeTransform(n)),hu(n),{animationId:this.root.animationId,measuredBox:t,layoutBox:n,latestValues:{},source:this.id}}measurePageBox(){let{visualElement:e}=this.options;if(!e)return z();let t=e.measureViewportBox();if(!(this.scroll?.wasRoot||this.path.some(_u))){let{scroll:e}=this.root;e&&(us(t.x,e.offset.x),us(t.y,e.offset.y))}return t}removeElementScroll(e){let t=z();if(Wc(t,e),this.scroll?.wasRoot)return t;for(let n=0;n<this.path.length;n++){let r=this.path[n],{scroll:i,options:a}=r;r!==this.root&&i&&a.layoutScroll&&(i.wasRoot&&Wc(t,e),us(t.x,i.offset.x),us(t.y,i.offset.y))}return t}applyTransform(e,t=!1,n){let r=n||z();Wc(r,e);for(let e=0;e<this.path.length;e++){let n=this.path[e];!t&&n.options.layoutScroll&&n.scroll&&n!==n.root&&(us(r.x,-n.scroll.offset.x),us(r.y,-n.scroll.offset.y)),es(n.latestValues)&&ps(r,n.latestValues,n.layout?.layoutBox)}return es(this.latestValues)&&ps(r,this.latestValues,this.layout?.layoutBox),r}removeTransform(e){let t=z();Wc(t,e);for(let e=0;e<this.path.length;e++){let n=this.path[e];if(!es(n.latestValues))continue;let r;n.instance&&($o(n.latestValues)&&n.updateSnapshot(),r=z(),Wc(r,n.measurePageBox())),cl(t,n.latestValues,n.snapshot?.layoutBox,r)}return es(this.latestValues)&&cl(t,this.latestValues),t}setTargetDelta(e){this.targetDelta=e,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(e){this.options={...this.options,...e,crossfade:e.crossfade===void 0||e.crossfade}}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!==A.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(e=!1){let t=this.getLead();this.isProjectionDirty||=t.isProjectionDirty,this.isTransformDirty||=t.isTransformDirty,this.isSharedProjectionDirty||=t.isSharedProjectionDirty;let n=!!this.resumingFrom||this!==t;if(!(e||n&&this.isSharedProjectionDirty||this.isProjectionDirty||this.parent?.isProjectionDirty||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;let{layout:r,layoutId:i}=this.options;if(!this.layout||!(r||i))return;this.resolvedRelativeTargetAt=A.timestamp;let a=this.getClosestProjectingParent();!this.targetDelta&&!this.relativeTarget&&(this.options.layoutAnchor!==!1&&a&&a.layout?this.createRelativeTarget(a,this.layout.layoutBox,a.layout.layoutBox):this.removeRelativeTarget()),(this.relativeTarget||this.targetDelta)&&(this.target||(this.target=z(),this.targetWithTransforms=z()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),el(this.target,this.relativeTarget,this.relativeParent.target,this.options.layoutAnchor||void 0)):this.targetDelta?(this.resumingFrom?this.applyTransform(this.layout.layoutBox,!1,this.target):Wc(this.target,this.layout.layoutBox),os(this.target,this.targetDelta)):Wc(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget&&(this.attemptToResolveRelativeTarget=!1,this.options.layoutAnchor!==!1&&a&&!!a.resumingFrom==!!this.resumingFrom&&!a.options.layoutScroll&&a.target&&this.animationProgress!==1?this.createRelativeTarget(a,this.target,a.target):this.relativeParent=this.relativeTarget=void 0),nc.value&&Rl.calculatedTargetDeltas++)}getClosestProjectingParent(){if(!(!this.parent||$o(this.parent.latestValues)||ts(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}createRelativeTarget(e,t,n){this.relativeParent=e,this.forceRelativeParentToResolveTarget(),this.relativeTarget=z(),this.relativeTargetOrigin=z(),nl(this.relativeTargetOrigin,t,n,this.options.layoutAnchor||void 0),Wc(this.relativeTarget,this.relativeTargetOrigin)}removeRelativeTarget(){this.relativeParent=this.relativeTarget=void 0}calcProjection(){let e=this.getLead(),t=!!this.resumingFrom||this!==e,n=!0;if((this.isProjectionDirty||this.parent?.isProjectionDirty)&&(n=!1),t&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(n=!1),this.resolvedRelativeTargetAt===A.timestamp&&(n=!1),n)return;let{layout:r,layoutId:i}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(r||i))return;Wc(this.layoutCorrected,this.layout.layoutBox);let a=this.treeScale.x,o=this.treeScale.y;ls(this.layoutCorrected,this.treeScale,this.path,t),e.layout&&!e.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(e.target=e.layout.layoutBox,e.targetWithTransforms=z());let{target:s}=e;if(!s){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}!this.projectionDelta||!this.prevProjectionDelta?this.createProjectionDeltas():(Gc(this.prevProjectionDelta.x,this.projectionDelta.x),Gc(this.prevProjectionDelta.y,this.projectionDelta.y)),Qc(this.projectionDelta,this.layoutCorrected,s,this.latestValues),(this.treeScale.x!==a||this.treeScale.y!==o||!gl(this.projectionDelta.x,this.prevProjectionDelta.x)||!gl(this.projectionDelta.y,this.prevProjectionDelta.y))&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners(`projectionUpdate`,s)),nc.value&&Rl.calculatedProjections++}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(e=!0){if(this.options.visualElement?.scheduleRender(),e){let e=this.getStack();e&&e.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=oc(),this.projectionDelta=oc(),this.projectionDeltaWithTransform=oc()}setAnimationOrigin(e,t=!1,n){let r=this.snapshot,i=r?r.latestValues:{},a={...this.latestValues},o=oc();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!t;let s=z(),c=(r?r.source:void 0)!==(this.layout?this.layout.source:void 0),l=this.getStack(),u=!l||l.members.length<=1,d=!(!c||u||this.options.crossfade!==!0||this.path.some(uu));this.animationProgress=0;let f,p=n?.interpolateProjection(e);this.mixTargetDelta=t=>{let n=t/1e3,r=p?.(n);r?(o.x.translate=r.x,o.x.scale=F(e.x.scale,1,n),o.x.origin=e.x.origin,o.x.originPoint=e.x.originPoint,o.y.translate=r.y,o.y.scale=F(e.y.scale,1,n),o.y.origin=e.y.origin,o.y.originPoint=e.y.originPoint):(su(o.x,e.x,n),su(o.y,e.y,n)),this.setTargetDelta(o),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(nl(s,this.layout.layoutBox,this.relativeParent.layout.layoutBox,this.options.layoutAnchor||void 0),lu(this.relativeTarget,this.relativeTargetOrigin,s,n),f&&fl(this.relativeTarget,f)&&(this.isProjectionDirty=!1),f||=z(),Wc(f,this.relativeTarget)),c&&(this.animationValues=a,wl(a,i,this.latestValues,n,d,u)),r&&r.rotate!==void 0&&(this.animationValues||=a,this.animationValues.pathRotation=r.rotate),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=n},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(e){this.notifyListeners(`animationStart`),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&=(fr(this.pendingAnimation),void 0),this.pendingAnimation=I.update(()=>{Ll.hasAnimatedSinceResize=!0,this.motionValue||=wa(0),this.motionValue.jump(0,!1),this.currentAnimation=kl(this.motionValue,[0,1e3],{...e,velocity:0,isSync:!0,onUpdate:t=>{this.mixTargetDelta(t),e.onUpdate&&e.onUpdate(t)},onComplete:()=>{e.onComplete&&e.onComplete(),this.completeAnimation()}}),qr(this.currentAnimation,this),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);let e=this.getStack();e&&e.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners(`animationComplete`)}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(Bl),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){let e=this.getLead(),{targetWithTransforms:t,layout:n,latestValues:r}=e,{target:i}=e;if(t&&i&&n){if(this!==e&&this.layout&&n&&gu(this.options.animationType,this.layout.layoutBox,n.layoutBox)){i=this.target||z();let t=B(this.layout.layoutBox.x);i.x.min=e.target.x.min,i.x.max=i.x.min+t;let n=B(this.layout.layoutBox.y);i.y.min=e.target.y.min,i.y.max=i.y.min+n}Wc(t,i),ps(t,r),Qc(this.projectionDeltaWithTransform,this.layoutCorrected,t,r)}}registerSharedNode(e,t){this.sharedNodes.has(e)||this.sharedNodes.set(e,new Fl),this.sharedNodes.get(e).add(t);let n=t.options.initialPromotionConfig;t.promote({transition:n?n.transition:void 0,preserveFollowOpacity:n&&n.shouldPreserveFollowOpacity?n.shouldPreserveFollowOpacity(t):void 0})}isLead(){let e=this.getStack();return!e||e.lead===this}getLead(){let{layoutId:e}=this.options;return e&&this.getStack()?.lead||this}getPrevLead(){let{layoutId:e}=this.options;return e?this.getStack()?.prevLead:void 0}getStack(){let{layoutId:e}=this.options;if(e)return this.root.sharedNodes.get(e)}promote({needsReset:e,transition:t,preserveFollowOpacity:n}={}){let r=this.getStack();r&&r.promote(this,n),e&&(this.projectionDelta=void 0,this.needsReset=!0),t&&this.setOptions({transition:t})}relegate(){let e=this.getStack();return e?e.relegate(this):!1}resetSkewAndRotation(){let{visualElement:e}=this.options;if(!e)return;let t=!1,{latestValues:n}=e;if((n.z||n.rotate||n.rotateX||n.rotateY||n.rotateZ||n.skewX||n.skewY)&&(t=!0),!t)return;let r={};n.z&&Hl(`z`,e,r,this.animationValues);for(let t=0;t<zl.length;t++)Hl(`rotate${zl[t]}`,e,r,this.animationValues),Hl(`skew${zl[t]}`,e,r,this.animationValues);e.render();for(let t in r)e.setStaticValue(t,r[t]),this.animationValues&&(this.animationValues[t]=r[t]);e.scheduleRender()}applyProjectionStyles(e,t){if(!this.instance||this.isSVG)return;if(!this.isVisible){e.visibility=`hidden`;return}let n=this.getTransformTemplate();if(this.needsReset){this.needsReset=!1,e.visibility=``,e.opacity=``,e.pointerEvents=Pl(t?.pointerEvents)||``,e.transform=n?n(this.latestValues,``):`none`;return}let r=this.getLead();if(!this.projectionDelta||!this.layout||!r.target){this.options.layoutId&&(e.opacity=this.latestValues.opacity===void 0?1:this.latestValues.opacity,e.pointerEvents=Pl(t?.pointerEvents)||``),this.hasProjected&&!es(this.latestValues)&&(e.transform=n?n({},``):`none`,this.hasProjected=!1);return}e.visibility=``;let i=r.animationValues||r.latestValues;this.applyTransformsToTarget();let a=xl(this.projectionDeltaWithTransform,this.treeScale,i);n&&(a=n(i,a)),e.transform=a;let{x:o,y:s}=this.projectionDelta;e.transformOrigin=`${o.origin*100}% ${s.origin*100}% 0`,e.opacity=r.animationValues?r===this?i.opacity??this.latestValues.opacity??1:this.preserveOpacity?this.latestValues.opacity:i.opacityExit:r===this?i.opacity===void 0?``:i.opacity:i.opacityExit===void 0?0:i.opacityExit;for(let t in Oc){if(i[t]===void 0)continue;let{correct:n,applyTo:o,isCSSVariable:s}=Oc[t],c=a===`none`?i[t]:n(i[t],r);if(o){let t=o.length;for(let n=0;n<t;n++)e[o[n]]=c}else s?this.options.visualElement.renderState.vars[t]=c:e[t]=c}this.options.layoutId&&(e.pointerEvents=r===this?Pl(t?.pointerEvents)||``:`none`)}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(e=>e.currentAnimation?.stop()),this.root.nodes.forEach(Xl),this.root.sharedNodes.clear()}}}function Gl(e){e.updateLayout()}function Kl(e){let t=e.resumeFrom?.snapshot||e.snapshot;if(e.isLead()&&e.layout&&t&&e.hasListeners(`didUpdate`)){let{layoutBox:n,measuredBox:r}=e.layout,{animationType:i}=e.options,a=t.source!==e.layout.source;if(i===`size`)_l(e=>{let r=a?t.measuredBox[e]:t.layoutBox[e],i=B(r);r.min=n[e].min,r.max=r.min+i});else if(i===`x`||i===`y`){let e=i===`x`?`y`:`x`;Uc(a?t.measuredBox[e]:t.layoutBox[e],n[e])}else gu(i,t.layoutBox,n)&&_l(r=>{let i=a?t.measuredBox[r]:t.layoutBox[r],o=B(n[r]);i.max=i.min+o,e.relativeTarget&&!e.currentAnimation&&(e.isProjectionDirty=!0,e.relativeTarget[r].max=e.relativeTarget[r].min+o)});let o=oc();Qc(o,n,t.layoutBox);let s=oc();a?Qc(s,e.applyTransform(r,!0),t.measuredBox):Qc(s,n,t.layoutBox);let c=!ul(o),l=!1;if(!e.resumeFrom){let r=e.getClosestProjectingParent();if(r&&!r.resumeFrom){let{snapshot:i,layout:a}=r;if(i&&a){let o=e.options.layoutAnchor||void 0,s=z();nl(s,t.layoutBox,i.layoutBox,o);let c=z();nl(c,n,a.layoutBox,o),ml(s,c)||(l=!0),r.options.layoutRoot&&(e.relativeTarget=c,e.relativeTargetOrigin=s,e.relativeParent=r)}}}e.notifyListeners(`didUpdate`,{layout:n,snapshot:t,delta:s,layoutDelta:o,hasLayoutChanged:c,hasRelativeLayoutChanged:l})}else if(e.isLead()){let{onExitComplete:t}=e.options;t&&t()}e.options.transition=void 0}function ql(e){nc.value&&Rl.nodes++,e.parent&&(e.isProjecting()||(e.isProjectionDirty=e.parent.isProjectionDirty),e.isSharedProjectionDirty||=!!(e.isProjectionDirty||e.parent.isProjectionDirty||e.parent.isSharedProjectionDirty),e.isTransformDirty||=e.parent.isTransformDirty)}function Jl(e){e.isProjectionDirty=e.isSharedProjectionDirty=e.isTransformDirty=!1}function Yl(e){e.clearSnapshot()}function Xl(e){e.clearMeasurements()}function Zl(e){e.isLayoutDirty=!0,e.updateLayout()}function Ql(e){e.isLayoutDirty=!1}function $l(e){e.isAnimationBlocked&&e.layout&&!e.isLayoutDirty&&(e.snapshot=e.layout,e.isLayoutDirty=!0)}function eu(e){e.relativeTarget&&e.relativeParent?.isLayoutDirty&&(e.currentAnimation?e.isLayoutDirty=!0:(e.targetDelta=void 0,e.removeRelativeTarget()))}function tu(e){let{visualElement:t}=e.options;t&&t.getProps().onBeforeLayoutMeasure&&t.notify(`BeforeLayoutMeasure`),e.resetTransform()}function nu(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.target=void 0,e.isProjectionDirty=!0}function ru(e){e.resolveTargetDelta()}function iu(e){e.calcProjection()}function au(e){e.resetSkewAndRotation()}function ou(e){e.removeLeadSnapshot()}function su(e,t,n){e.translate=F(t.translate,0,n),e.scale=F(t.scale,1,n),e.origin=t.origin,e.originPoint=t.originPoint}function cu(e,t,n,r){e.min=F(t.min,n.min,r),e.max=F(t.max,n.max,r)}function lu(e,t,n,r){cu(e.x,t.x,n.x,r),cu(e.y,t.y,n.y,r)}function uu(e){return e.animationValues&&e.animationValues.opacityExit!==void 0}var du={duration:.45,ease:[.4,0,.1,1]},fu=e=>typeof navigator<`u`&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(e),pu=fu(`applewebkit/`)&&!fu(`chrome/`)?Math.round:yt;function mu(e){e.min=pu(e.min),e.max=pu(e.max)}function hu(e){mu(e.x),mu(e.y)}function gu(e,t,n){return e===`position`||e===`preserve-aspect`&&!Xc(hl(t),hl(n),.2)}function _u(e){return e!==e.root&&e.scroll?.wasRoot}var vu=Wl({attachResizeListener:(e,t)=>Al(e,`resize`,t),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body?.scrollLeft||0,y:document.documentElement.scrollTop||document.body?.scrollTop||0}),checkIsScrollRoot:()=>!0}),yu=e=>!e.isLayoutDirty&&e.willUpdate(!1);function bu(){let e=new Set,t=new WeakMap,n=()=>e.forEach(yu);return{add:r=>{e.add(r),t.set(r,r.addEventListener(`willUpdate`,n))},remove:r=>{e.delete(r);let i=t.get(r);i&&(i(),t.delete(r)),n()},dirty:n}}var xu={current:void 0},Su=Wl({measureScroll:e=>({x:e.scrollLeft,y:e.scrollTop}),defaultParent:()=>{if(!xu.current){let e=new vu({});e.mount(window),e.setOptions({layoutScroll:!0}),xu.current=e}return xu.current},resetTransform:(e,t)=>{e.style.transform=t===void 0?`none`:t},checkIsScrollRoot:e=>window.getComputedStyle(e).position===`fixed`}),Cu=(0,m.createContext)({transformPagePoint:e=>e,isStatic:!1,reducedMotion:`never`});function wu(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}function Tu(...e){return t=>{let n=!1,r=e.map(e=>{let r=wu(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():wu(e[t],null)}}}}function Eu(...e){return m.useCallback(Tu(...e),e)}var Du=class extends m.Component{getSnapshotBeforeUpdate(e){let t=this.props.childRef.current;if(bo(t)&&e.isPresent&&!this.props.isPresent&&this.props.pop!==!1){let e=t.offsetParent,n=bo(e)&&e.offsetWidth||0,r=bo(e)&&e.offsetHeight||0,i=getComputedStyle(t),a=this.props.sizeRef.current;a.height=parseFloat(i.height),a.width=parseFloat(i.width),a.top=t.offsetTop,a.left=t.offsetLeft,a.right=n-a.width-a.left,a.bottom=r-a.height-a.top,a.direction=i.direction}return null}componentDidUpdate(){}render(){return this.props.children}};function Ou({children:e,isPresent:t,anchorX:n,anchorY:r,root:i,pop:a}){let o=(0,m.useId)(),s=(0,m.useRef)(null),c=(0,m.useRef)({width:0,height:0,top:0,left:0,right:0,bottom:0,direction:`ltr`}),{nonce:l}=(0,m.useContext)(Cu),u=Eu(s,a===!1?void 0:e.props?.ref??e?.ref);return(0,m.useInsertionEffect)(()=>{let{width:e,height:u,top:d,left:f,right:p,bottom:m,direction:h}=c.current;if(t||a===!1||!s.current||!e||!u)return;let g=h===`rtl`,_=n===`left`?g?`right: ${p}`:`left: ${f}`:g?`left: ${f}`:`right: ${p}`,v=r===`bottom`?`bottom: ${m}`:`top: ${d}`;s.current.dataset.motionPopId=o;let y=document.createElement(`style`);l&&(y.nonce=l);let b=i??document.head;return b.appendChild(y),y.sheet&&y.sheet.insertRule(`
|
|
2
|
+
[data-motion-pop-id="${o}"] {
|
|
3
|
+
position: absolute !important;
|
|
4
|
+
width: ${e}px !important;
|
|
5
|
+
height: ${u}px !important;
|
|
6
|
+
${_}px !important;
|
|
7
|
+
${v}px !important;
|
|
8
|
+
}
|
|
9
|
+
`),()=>{s.current?.removeAttribute(`data-motion-pop-id`),b.contains(y)&&b.removeChild(y)}},[t]),(0,h.jsx)(Du,{isPresent:t,childRef:s,sizeRef:c,pop:a,children:a===!1?e:m.cloneElement(e,{ref:u})})}var ku=({children:e,initial:t,isPresent:n,onExitComplete:r,custom:i,presenceAffectsLayout:a,mode:o,anchorX:s,anchorY:c,root:l})=>{let u=ct(Au),d=(0,m.useId)(),f=(0,m.useRef)(n),p=(0,m.useRef)(r);lt(()=>{f.current=n,p.current=r});let g=!0,_=(0,m.useMemo)(()=>(g=!1,{id:d,initial:t,isPresent:n,custom:i,onExitComplete:e=>{u.set(e,!0);for(let e of u.values())if(!e)return;r&&r()},register:e=>(u.set(e,!1),()=>{u.delete(e),!f.current&&!u.size&&p.current?.()})}),[n,u,r]);return a&&g&&(_={..._}),(0,m.useMemo)(()=>{u.forEach((e,t)=>u.set(t,!1))},[n]),m.useEffect(()=>{!n&&!u.size&&r&&r()},[n]),e=(0,h.jsx)(Ou,{pop:o===`popLayout`,isPresent:n,anchorX:s,anchorY:c,root:l,children:e}),(0,h.jsx)(ut.Provider,{value:_,children:e})};function Au(){return new Map}function ju(e=!0){let t=(0,m.useContext)(ut);if(t===null)return[!0,null];let{isPresent:n,onExitComplete:r,register:i}=t,a=(0,m.useId)();(0,m.useEffect)(()=>{if(e)return i(a)},[e]);let o=(0,m.useCallback)(()=>e&&r&&r(a),[a,r,e]);return!n&&r?[!1,o]:[!0]}function Mu(){return Nu((0,m.useContext)(ut))}function Nu(e){return e===null||e.isPresent}var Pu=e=>e.key||``;function Fu(e){let t=[];return m.Children.forEach(e,e=>{(0,m.isValidElement)(e)&&t.push(e)}),t}var V=({children:e,custom:t,initial:n=!0,onExitComplete:r,presenceAffectsLayout:i=!0,mode:a=`sync`,propagate:o=!1,anchorX:s=`left`,anchorY:c=`top`,root:l})=>{let[u,d]=ju(o),f=(0,m.useMemo)(()=>Fu(e),[e]),p=o&&!u?[]:f.map(Pu),g=(0,m.useRef)(!0),_=ct(()=>new Map),v=(0,m.useRef)(new Set),[y,b]=(0,m.useState)(f),[x,S]=(0,m.useState)(f);lt(()=>{o&&!u&&!x.length&&d?.()},[u,o,x.length,d]),lt(()=>{g.current=!1;for(let e=0;e<x.length;e++){let t=Pu(x[e]);p.includes(t)?(_.delete(t),v.current.delete(t)):_.get(t)!==!0&&_.set(t,!1)}},[x,p.length,p.join(`-`)]);let C=[];if(f!==y){let e=[...f],t=0;for(let n of x){let r=p.indexOf(Pu(n));r===-1?(e.splice(t++,0,n),C.push(n)):t=r+C.length+1}return C.every(e=>_.get(Pu(e)))?e=f:a===`wait`&&(e=C),S(Fu(e)),b(f),null}let{forceRender:w}=(0,m.useContext)(st);return(0,h.jsx)(h.Fragment,{children:x.map(e=>{let m=Pu(e),y=o&&!u?!1:f===x||p.includes(m);return(0,h.jsx)(ku,{isPresent:y,initial:!g.current||n?void 0:!1,custom:t,presenceAffectsLayout:i,mode:a,root:l,onExitComplete:y?void 0:()=>{if(v.current.has(m))return;if(_.has(m))v.current.add(m),_.set(m,!0);else return;let e=!0;_.forEach(t=>{t||(e=!1)}),e&&(w?.(),b([]),o&&d?.(),r&&r())},anchorX:s,anchorY:c,children:e},m)})})},Iu=(0,m.createContext)(null);function Lu(){let e=(0,m.useRef)(!1);return lt(()=>(e.current=!0,()=>{e.current=!1}),[]),e}function Ru(){let e=Lu(),[t,n]=(0,m.useState)(0),r=(0,m.useCallback)(()=>{e.current&&n(t+1)},[t]);return[(0,m.useCallback)(()=>I.postRender(r),[r]),t]}var zu=e=>e===!0,Bu=e=>zu(e===!0)||e===`id`,Vu=({children:e,id:t,inherit:n=!0})=>{let r=(0,m.useContext)(st),i=(0,m.useContext)(Iu),[a,o]=Ru(),s=(0,m.useRef)(null),c=r.id||i;s.current===null&&(Bu(n)&&c&&(t=t?c+`-`+t:c),s.current={id:t,group:zu(n)&&r.group||bu()});let l=(0,m.useMemo)(()=>({...s.current,forceRender:a}),[o]);return(0,h.jsx)(st.Provider,{value:l,children:e})},Hu=(0,m.createContext)({strict:!1}),Uu={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`]},Wu=!1;function Gu(){if(Wu)return;let e={};for(let t in Uu)e[t]={isEnabled:e=>Uu[t].some(t=>!!e[t])};Sc(e),Wu=!0}function Ku(){return Gu(),Cc()}function qu(e){let t=Ku();for(let n in e)t[n]={...t[n],...e[n]};Sc(t)}var Ju=(0,m.createContext)({});function Yu(e,t){if(pc(e)){let{initial:t,animate:n}=e;return{initial:t===!1||uc(t)?t:void 0,animate:uc(n)?n:void 0}}return e.inherit===!1?{}:t}function Xu(e){let{initial:t,animate:n}=Yu(e,(0,m.useContext)(Ju));return(0,m.useMemo)(()=>({initial:t,animate:n}),[Zu(t),Zu(n)])}function Zu(e){return Array.isArray(e)?e.join(` `):e}var Qu=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function $u(e,t,n){for(let r in t)!R(t[r])&&!kc(r,n)&&(e[r]=t[r])}function ed({transformTemplate:e},t){return(0,m.useMemo)(()=>{let n=Qu();return Ro(n,t,e),Object.assign({},n.vars,n.style)},[t])}function td(e,t){let n=e.style||{},r={};return $u(r,n,e),Object.assign(r,ed(e,t)),r}function nd(e,t){let n={},r=td(e,t);return e.drag&&e.dragListener!==!1&&(n.draggable=!1,r.userSelect=r.WebkitUserSelect=r.WebkitTouchCallout=`none`,r.touchAction=e.drag===!0?`none`:`pan-${e.drag===`x`?`y`:`x`}`),e.tabIndex===void 0&&(e.onTap||e.onTapStart||e.whileTap)&&(n.tabIndex=0),n.style=r,n}var rd=()=>({...Qu(),attrs:{}});function id(e,t,n,r){let i=(0,m.useMemo)(()=>{let n=rd();return Uo(n,t,Pc(r),e.transformTemplate,e.style),{...n.attrs,style:{...n.style}}},[t]);if(e.style){let t={};$u(t,e.style,e),i.style={...t,...i.style}}return i}var ad=new Set(`animate.exit.variants.initial.style.values.transition.transformTemplate.custom.inherit.onBeforeLayoutMeasure.onAnimationStart.onAnimationComplete.onUpdate.onDragStart.onDrag.onDragEnd.onMeasureDragConstraints.onDirectionLock.onDragTransitionEnd._dragX._dragY.onHoverStart.onHoverEnd.onViewportEnter.onViewportLeave.globalTapTarget.propagate.ignoreStrict.viewport`.split(`.`));function od(e){return e.startsWith(`while`)||e.startsWith(`drag`)&&e!==`draggable`||e.startsWith(`layout`)||e.startsWith(`onTap`)||e.startsWith(`onPan`)||e.startsWith(`onLayout`)||ad.has(e)}function sd(e,t){return e.startsWith(`on`)?!od(e):t?.(e)??!od(e)}function cd(e,t,n,r){let i={};for(let a in e)(a!==`values`||typeof e.values!=`object`)&&(R(e[a])||(sd(a,r)||n===!0&&od(a)||!t&&!od(a)||e.draggable&&a.startsWith(`onDrag`))&&(i[a]=e[a]));return i}var ld=[`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 ud(e){return typeof e!=`string`||e.includes(`-`)?!1:!!(ld.indexOf(e)>-1||/[A-Z]/u.test(e))}function dd(e,t,n,{latestValues:r},i,a=!1,o,s){let c=(o??ud(e)?id:nd)(t,r,i,e),l=cd(t,typeof e==`string`,a,s),u=e===m.Fragment?{}:{...l,...c,ref:n},{children:d}=t,f=(0,m.useMemo)(()=>R(d)?d.get():d,[d]);return(0,m.createElement)(e,{...u,children:f})}function fd({scrapeMotionValuesFromProps:e,createRenderState:t},n,r,i){return{latestValues:pd(n,r,i,e),renderState:t()}}function pd(e,t,n,r){let i={},a=r(e,{});for(let e in a)i[e]=Pl(a[e]);let{initial:o,animate:s}=e,c=pc(e),l=mc(e);t&&l&&!c&&e.inherit!==!1&&(o===void 0&&(o=t.initial),s===void 0&&(s=t.animate));let u=n?n.initial===!1:!1;u||=o===!1;let d=u?s:o;if(d&&typeof d!=`boolean`&&!lc(d)){let t=Array.isArray(d)?d:[d];for(let n=0;n<t.length;n++){let r=za(e,t[n]);if(r){let{transitionEnd:e,transition:t,...n}=r;for(let e in n){let t=n[e];if(Array.isArray(t)){let e=u?t.length-1:0;t=t[e]}t!==null&&(i[e]=t)}for(let t in e)i[t]=e[t]}}}return i}var md=e=>(t,n)=>{let r=(0,m.useContext)(Ju),i=(0,m.useContext)(ut),a=()=>fd(e,t,r,i);return n?a():ct(a)},hd=md({scrapeMotionValuesFromProps:Ac,createRenderState:Qu}),gd=md({scrapeMotionValuesFromProps:Ic,createRenderState:rd}),_d=Symbol.for(`motionComponentSymbol`);function vd(e,t,n){let r=(0,m.useRef)(n);(0,m.useInsertionEffect)(()=>{r.current=n});let i=(0,m.useRef)(null);return(0,m.useCallback)(n=>{n&&e.onMount?.(n),t&&(n?t.mount(n):t.unmount());let a=r.current;if(typeof a==`function`){if(n){let e=a(n);typeof e==`function`&&(i.current=e)}else i.current?(i.current(),i.current=null):a(n)}else a&&(a.current=n)},[t])}var yd=(0,m.createContext)({});function bd(e){return e&&typeof e==`object`&&Object.prototype.hasOwnProperty.call(e,`current`)}function xd(e,t,n,r,i,a){let{visualElement:o}=(0,m.useContext)(Ju),s=(0,m.useContext)(Hu),c=(0,m.useContext)(ut),l=(0,m.useContext)(Cu),u=l.reducedMotion,d=l.skipAnimations,f=(0,m.useRef)(null),p=(0,m.useRef)(!1);r||=s.renderer,!f.current&&r&&(f.current=r(e,{visualState:t,parent:o,props:n,presenceContext:c,blockInitialAnimation:c?c.initial===!1:!1,reducedMotionConfig:u,skipAnimations:d,isSVG:a}),p.current&&f.current&&(f.current.manuallyAnimateOnMount=!0));let h=f.current,g=(0,m.useContext)(yd);h&&!h.projection&&i&&(h.type===`html`||h.type===`svg`)&&Sd(f.current,n,i,g);let _=(0,m.useRef)(!1);(0,m.useInsertionEffect)(()=>{h&&_.current&&h.update(n,c)});let v=n[Xa],y=(0,m.useRef)(!!v&&typeof window<`u`&&!window.MotionHandoffIsComplete?.(v)&&window.MotionHasOptimisedAnimation?.(v));return lt(()=>{p.current&&h&&(h.animationState?.animateChanges(),h.enteringChildren=void 0)},[]),lt(()=>{p.current=!0,h&&(_.current=!0,window.MotionIsMounted=!0,h.updateFeatures(),h.scheduleRenderMicrotask(),y.current&&h.animationState&&h.animationState.animateChanges())}),(0,m.useEffect)(()=>{h&&(!y.current&&h.animationState&&h.animationState.animateChanges(),y.current&&=(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(v)}),!1),h.enteringChildren=void 0)}),h}function Sd(e,t,n,r){let{layoutId:i,layout:a,drag:o,dragConstraints:s,layoutScroll:c,layoutRoot:l,layoutAnchor:u,layoutCrossfade:d}=t;e.projection=new n(e.latestValues,t[`data-framer-portal-id`]?void 0:Cd(e.parent)),e.projection.setOptions({layoutId:i,layout:a,alwaysMeasureLayout:!!o||s&&bd(s),visualElement:e,animationType:typeof a==`string`?a:`both`,initialPromotionConfig:r,crossfade:d,layoutScroll:c,layoutRoot:l,layoutAnchor:u})}function Cd(e){if(e)return e.options.allowProjection===!1?Cd(e.parent):e.projection}function wd(e,{forwardMotionProps:t=!1,type:n}={},r,i){r&&qu(r);let a=n?n===`svg`:ud(e),o=a?gd:hd;function s(n,s){let c,l={...(0,m.useContext)(Cu),...n,layoutId:Td(n)},{isStatic:u,isValidProp:d}=l,f=Xu(n),p=o(n,u);if(!u&&typeof window<`u`){Ed(l,r);let t=Dd(l);c=t.MeasureLayout,f.visualElement=xd(e,p,l,i,t.ProjectionNode,a)}return(0,h.jsxs)(Ju.Provider,{value:f,children:[c&&f.visualElement?(0,h.jsx)(c,{visualElement:f.visualElement,...l}):null,dd(e,n,vd(p,f.visualElement,s),p,u,t,a,d)]})}s.displayName=`motion.${typeof e==`string`?e:`create(${e.displayName??e.name??``})`}`;let c=(0,m.forwardRef)(s);return c[_d]=e,c}function Td({layoutId:e}){let t=(0,m.useContext)(st).id;return t&&e!==void 0?t+`-`+e:e}function Ed(e,t){(0,m.useContext)(Hu).strict}function Dd(e){let{drag:t,layout:n}=Ku();if(!t&&!n)return{};let r={...t,...n};return{MeasureLayout:t?.isEnabled(e)||n?.isEnabled(e)?r.MeasureLayout:void 0,ProjectionNode:r.ProjectionNode}}function Od(e,t){if(typeof Proxy>`u`)return wd;let n=new Map,r=(n,r)=>wd(n,r,e,t);return new Proxy((e,t)=>r(e,t),{get:(i,a)=>a===`create`?r:(n.has(a)||n.set(a,wd(a,void 0,e,t)),n.get(a))})}var kd=(e,t)=>t.isSVG??ud(e)?new Lc(t):new Mc(t,{allowProjection:e!==m.Fragment}),Ad=class extends Ec{constructor(e){super(e),e.animationState||=Bc(e)}updateAnimationControlsSubscription(){let{animate:e}=this.node.getProps();lc(e)&&(this.unmountControls=e.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){let{animate:e}=this.node.getProps(),{animate:t}=this.node.prevProps||{};e!==t&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}},jd=0,Md={animation:{Feature:Ad},exit:{Feature:class extends Ec{constructor(){super(...arguments),this.id=jd++}update(){let{presenceContext:e,prevPresenceContext:t,animationState:n}=this.node;if(!e||!n)return;let{isPresent:r,onExitComplete:i}=e,a=t?.isPresent;if(r===a)return;if(r&&a===!1){if(this.exit===!0){let{initial:e}=this.node.getProps();if(e&&!Array.isArray(e)){let{transition:t,transitionEnd:n,...r}=Ba(this.node,e)||{};for(let e in r)this.node.getValue(e)?.jump(r[e])}this.node.blockInitialAnimation=!1,n.reset(),n.animateChanges()}else n.setActive(`exit`,!1);this.exit=void 0;return}let o=this.exit=n.setActive(`exit`,!r);i&&!r&&o.then(()=>{this.exit===o&&(this.exit=!0,i(this.id))})}mount(){let{register:e,onExitComplete:t}=this.node.presenceContext||{};t&&t(this.id),e&&(this.unmount=e(this.id))}unmount(){}}}};function Nd(e){return{point:{x:e.pageX,y:e.pageY}}}var Pd=e=>t=>As(t)&&e(t,Nd(t));function Fd(e,t,n,r){return Al(e,t,Pd(n),r)}var Id=({current:e})=>e?e.ownerDocument.defaultView:null,Ld=(e,t)=>Math.abs(e-t);function Rd(e,t){let n=Ld(e.x,t.x),r=Ld(e.y,t.y);return Math.sqrt(n**2+r**2)}var zd=new Set([`auto`,`scroll`]),Bd=class{constructor(e,t,{transformPagePoint:n,contextWindow:r=window,dragSnapToOrigin:i=!1,distanceThreshold:a=3,element:o}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.lastRawMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=e=>{this.handleScroll(e.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;this.hasPendingMove=!1,this.lastRawMoveEventInfo&&(this.lastMoveEventInfo=Vd(this.lastRawMoveEventInfo,this.transformPagePoint));let e=Ud(this.lastMoveEventInfo,this.history),t=this.startEvent!==null,n=Rd(e.offset,{x:0,y:0})>=this.distanceThreshold;if(!t&&!n)return;let{point:r}=e;this.history.push({...r,timestamp:j.now()});let{onStart:i,onMove:a}=this.handlers;t||(i&&i(this.lastMoveEvent,e),this.startEvent=this.lastMoveEvent),a&&a(this.lastMoveEvent,e)},this.handlePointerMove=(e,t)=>{this.lastMoveEvent=e,this.lastRawMoveEventInfo=t,this.lastMoveEventInfo=Vd(t,this.transformPagePoint),this.hasPendingMove=!0,I.update(this.updatePoint,!0)},this.handlePointerUp=(e,t)=>{this.hasPendingMove&&this.updatePoint(),this.end();let{onEnd:n,onSessionEnd:r,resumeAnimation:i}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&i&&i(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;let a=Ud(e.type===`pointercancel`?this.lastMoveEventInfo:Vd(t,this.transformPagePoint),this.history);this.startEvent&&n&&n(e,a),r&&r(e,a)},!As(e))return;this.dragSnapToOrigin=i,this.handlers=t,this.transformPagePoint=n,this.distanceThreshold=a,this.contextWindow=r||window;let s=Vd(Nd(e),this.transformPagePoint),{point:c}=s,{timestamp:l}=A;this.history=[{...c,timestamp:l}];let{onSessionStart:u}=t;u&&u(e,Ud(s,this.history));let d={passive:!0,capture:!0};this.removeListeners=bt(Fd(this.contextWindow,`pointermove`,this.handlePointerMove,d),Fd(this.contextWindow,`pointerup`,this.handlePointerUp,d),Fd(this.contextWindow,`pointercancel`,this.handlePointerUp,d)),o&&this.startScrollTracking(o)}startScrollTracking(e){let t=e.parentElement;for(;t;){let e=getComputedStyle(t);(zd.has(e.overflowX)||zd.has(e.overflowY))&&this.scrollPositions.set(t,{x:t.scrollLeft,y:t.scrollTop}),t=t.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener(`scroll`,this.onElementScroll,{capture:!0}),window.addEventListener(`scroll`,this.onWindowScroll),this.removeScrollListeners=()=>{window.removeEventListener(`scroll`,this.onElementScroll,{capture:!0}),window.removeEventListener(`scroll`,this.onWindowScroll)}}handleScroll(e){let t=this.scrollPositions.get(e);if(!t)return;let n=e===window,r=n?{x:window.scrollX,y:window.scrollY}:{x:e.scrollLeft,y:e.scrollTop},i={x:r.x-t.x,y:r.y-t.y};(i.x!==0||i.y!==0)&&(n?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=i.x,this.lastMoveEventInfo.point.y+=i.y):this.history.length>0&&(this.history[0].x-=i.x,this.history[0].y-=i.y),this.scrollPositions.set(e,r),I.update(this.updatePoint,!0))}updateHandlers(e){this.handlers=e}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),fr(this.updatePoint)}};function Vd(e,t){return t?{point:t(e.point)}:e}function Hd(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Ud({point:e},t){return{point:e,delta:Hd(e,Gd(t)),offset:Hd(e,Wd(t)),velocity:Kd(t,.1)}}function Wd(e){return e[0]}function Gd(e){return e[e.length-1]}function Kd(e,t){if(e.length<2)return{x:0,y:0};let n=e.length-1,r=null,i=Gd(e);for(;n>=0&&(r=e[n],!(i.timestamp-r.timestamp>k(t)));)n--;if(!r)return{x:0,y:0};r===e[0]&&e.length>2&&i.timestamp-r.timestamp>k(t)*2&&(r=e[1]);let a=Ct(i.timestamp-r.timestamp);if(a===0)return{x:0,y:0};let o={x:(i.x-r.x)/a,y:(i.y-r.y)/a};return o.x===1/0&&(o.x=0),o.y===1/0&&(o.y=0),o}function qd(e,{min:t,max:n},r){return t!==void 0&&e<t?e=r?F(t,e,r.min):Math.max(e,t):n!==void 0&&e>n&&(e=r?F(n,e,r.max):Math.min(e,n)),e}function Jd(e,t,n){return{min:t===void 0?void 0:e.min+t,max:n===void 0?void 0:e.max+n-(e.max-e.min)}}function Yd(e,{top:t,left:n,bottom:r,right:i}){return{x:Jd(e.x,n,i),y:Jd(e.y,t,r)}}function Xd(e,t){let n=t.min-e.min,r=t.max-e.max;return t.max-t.min<e.max-e.min&&([n,r]=[r,n]),{min:n,max:r}}function Zd(e,t){return{x:Xd(e.x,t.x),y:Xd(e.y,t.y)}}function Qd(e,t){let n=.5,r=B(e),i=B(t);return i>r?n=xt(t.min,t.max-r,e.min):r>i&&(n=xt(e.min,e.max-i,t.min)),pt(0,1,n)}function $d(e,t){let n={};return t.min!==void 0&&(n.min=t.min-e.min),t.max!==void 0&&(n.max=t.max-e.min),n}var ef=.35;function tf(e=ef){return e===!1?e=0:e===!0&&(e=ef),{x:nf(e,`left`,`right`),y:nf(e,`top`,`bottom`)}}function nf(e,t,n){return{min:rf(e,t),max:rf(e,n)}}function rf(e,t){return typeof e==`number`?e:e[t]||0}var af=new WeakMap,of=class{constructor(e){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=z(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=e}start(e,{snapToCursor:t=!1,distanceThreshold:n}={}){let{presenceContext:r}=this.visualElement;if(r&&r.isPresent===!1)return;let i=e=>{t&&this.snapToCursor(e),this.stopAnimation()},a=(e,t)=>{let{drag:n,dragPropagation:r,onDragStart:i}=this.getProps();if(n&&!r&&(this.openDragLock&&this.openDragLock(),this.openDragLock=Ts(n),!this.openDragLock))return;this.latestPointerEvent=e,this.latestPanInfo=t,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),_l(e=>{let t=this.getAxisMotionValue(e).get()||0;if(bn.test(t)){let{projection:n}=this.visualElement;if(n&&n.layout){let r=n.layout.layoutBox[e];r&&(t=B(r)*(parseFloat(t)/100))}}this.originPoint[e]=t}),i&&I.update(()=>i(e,t),!1,!0),Ja(this.visualElement,`transform`);let{animationState:a}=this.visualElement;a&&a.setActive(`whileDrag`,!0)},o=(e,t)=>{this.latestPointerEvent=e,this.latestPanInfo=t;let{dragPropagation:n,dragDirectionLock:r,onDirectionLock:i,onDrag:a}=this.getProps();if(!n&&!this.openDragLock)return;let{offset:o}=t;if(r&&this.currentDirection===null){this.currentDirection=uf(o),this.currentDirection!==null&&i&&i(this.currentDirection);return}this.updateAxis(`x`,t.point,o),this.updateAxis(`y`,t.point,o),this.visualElement.render(),a&&I.update(()=>a(e,t),!1,!0)},s=(e,t)=>{this.latestPointerEvent=e,this.latestPanInfo=t,this.stop(e,t),this.latestPointerEvent=null,this.latestPanInfo=null},c=()=>{let{dragSnapToOrigin:e}=this.getProps();(e||this.constraints)&&this.startAnimation({x:0,y:0})},{dragSnapToOrigin:l}=this.getProps();this.panSession=new Bd(e,{onSessionStart:i,onStart:a,onMove:o,onSessionEnd:s,resumeAnimation:c},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:l,distanceThreshold:n,contextWindow:Id(this.visualElement),element:this.visualElement.current})}stop(e,t){let n=e||this.latestPointerEvent,r=t||this.latestPanInfo,i=this.isDragging;if(this.cancel(),!i||!r||!n)return;let{velocity:a}=r;this.startAnimation(a);let{onDragEnd:o}=this.getProps();o&&I.postRender(()=>o(n,r))}cancel(){this.isDragging=!1;let{projection:e,animationState:t}=this.visualElement;e&&(e.isAnimationBlocked=!1),this.endPanSession();let{dragPropagation:n}=this.getProps();!n&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),t&&t.setActive(`whileDrag`,!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(e,t,n){let{drag:r}=this.getProps();if(!n||!lf(e,r,this.currentDirection))return;let i=this.getAxisMotionValue(e),a=this.originPoint[e]+n[e];this.constraints&&this.constraints[e]&&(a=qd(a,this.constraints[e],this.elastic[e])),i.set(a)}resolveConstraints(){let{dragConstraints:e,dragElastic:t}=this.getProps(),n=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,r=this.constraints;e&&bd(e)?this.constraints||=this.resolveRefConstraints():this.constraints=e&&n?Yd(n.layoutBox,e):!1,this.elastic=tf(t),r!==this.constraints&&!bd(e)&&n&&this.constraints&&!this.hasMutatedConstraints&&_l(e=>{this.constraints!==!1&&this.getAxisMotionValue(e)&&(this.constraints[e]=$d(n.layoutBox[e],this.constraints[e]))})}resolveRefConstraints(){let{dragConstraints:e,onMeasureDragConstraints:t}=this.getProps();if(!e||!bd(e))return!1;let n=e.current,{projection:r}=this.visualElement;if(!r||!r.layout)return!1;r.root&&(r.root.scroll=void 0,r.root.updateScroll());let i=hs(n,r.root,this.visualElement.getTransformPagePoint()),a=Zd(r.layout.layoutBox,i);if(t){let e=t(Xo(a));this.hasMutatedConstraints=!!e,e&&(a=Yo(e))}return a}startAnimation(e){let{drag:t,dragMomentum:n,dragElastic:r,dragTransition:i,dragSnapToOrigin:a,onDragTransitionEnd:o}=this.getProps(),s=this.constraints||{},c=_l(o=>{if(!lf(o,t,this.currentDirection))return;let c=s&&s[o]||{};(a===!0||a===o)&&(c={min:0,max:0});let l=r?200:1e6,u=r?40:1e7,d={type:`inertia`,velocity:n?e[o]:0,bounceStiffness:l,bounceDamping:u,timeConstant:750,restDelta:1,restSpeed:10,...i,...c};return this.startAxisValueAnimation(o,d)});return Promise.all(c).then(o)}startAxisValueAnimation(e,t){let n=this.getAxisMotionValue(e);return Ja(this.visualElement,e),n.start(Pa(e,n,0,t,this.visualElement,!1))}stopAnimation(){_l(e=>this.getAxisMotionValue(e).stop())}getAxisMotionValue(e){let t=`_drag${e.toUpperCase()}`;return this.visualElement.getProps()[t]||this.visualElement.getValue(e,this.visualElement.latestValues[e]??0)}snapToCursor({clientX:e,clientY:t}){let{drag:n}=this.getProps(),r={x:e,y:t},i=this.visualElement.getTransformPagePoint()?.(r)||r,a=this.visualElement.measureViewportBox();_l(e=>{if(!lf(e,n,this.currentDirection))return;let t=this.getAxisMotionValue(e),{min:r,max:o}=a[e];t.set((t.get()||0)+i[e]-F(r,o,.5))})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;let{drag:e,dragConstraints:t}=this.getProps(),{projection:n}=this.visualElement;if(!bd(t)||!n||!this.constraints)return;this.stopAnimation();let r=this.constraints,i={x:0,y:0};_l(e=>{let t=this.getAxisMotionValue(e).get();i[e]=Qd({min:t,max:t},r[e])});let{transformTemplate:a}=this.visualElement.getProps();this.visualElement.current.style.transform=a?a({},``):`none`,n.root&&n.root.updateScroll(),n.updateLayout(),this.constraints=!1,this.resolveConstraints(),_l(t=>{let n=this.getAxisMotionValue(t);if(!lf(t,e,null)||!n.get())return;let{min:r,max:a}=this.constraints[t];n.set(F(r,a,i[t]))}),this.visualElement.render()}addListeners(){if(!this.visualElement.current)return;af.set(this.visualElement,this);let e=this.visualElement.current,t=Fd(e,`pointerdown`,t=>{let{drag:n,dragListener:r=!0}=this.getProps(),i=t.target,a=i!==e&&Ps(i);n&&r&&!a&&this.start(t)}),n,r=()=>{let{dragConstraints:t}=this.getProps();bd(t)&&t.current&&(this.constraints=this.resolveRefConstraints(),n||=cf(e,t.current,()=>this.scalePositionWithinConstraints()))},{projection:i}=this.visualElement,a=i.addEventListener(`measure`,r);i&&!i.layout&&(i.root&&i.root.updateScroll(),i.updateLayout()),I.read(r);let o=Al(window,`resize`,()=>this.scalePositionWithinConstraints()),s=i.addEventListener(`didUpdate`,(({delta:e,hasLayoutChanged:t})=>{this.isDragging&&t&&(_l(t=>{let n=this.getAxisMotionValue(t);n&&(this.originPoint[t]+=e[t].translate,n.set(n.get()+e[t].translate))}),this.visualElement.render())}));return()=>{o(),t(),a(),s&&s(),n&&n()}}getProps(){let e=this.visualElement.getProps(),{drag:t=!1,dragDirectionLock:n=!1,dragPropagation:r=!1,dragConstraints:i=!1,dragElastic:a=ef,dragMomentum:o=!0}=e;return{...e,drag:t,dragDirectionLock:n,dragPropagation:r,dragConstraints:i,dragElastic:a,dragMomentum:o}}};function sf(e){let t=!0;return()=>{if(t){t=!1;return}e()}}function cf(e,t,n){let r=tc(e,sf(n)),i=tc(t,sf(n));return()=>{r(),i()}}function lf(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}function uf(e,t=10){let n=null;return Math.abs(e.y)>t?n=`y`:Math.abs(e.x)>t&&(n=`x`),n}var df=class extends Ec{constructor(e){super(e),this.removeGroupControls=yt,this.removeListeners=yt,this.controls=new of(e)}mount(){let{dragControls:e}=this.node.getProps();e&&(this.removeGroupControls=e.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||yt}update(){let{dragControls:e}=this.node.getProps(),{dragControls:t}=this.node.prevProps||{};e!==t&&(this.removeGroupControls(),e&&(this.removeGroupControls=e.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.isDragging||this.controls.endPanSession()}},ff=e=>(t,n)=>{e&&I.update(()=>e(t,n),!1,!0)},pf=class extends Ec{constructor(){super(...arguments),this.removePointerDownListener=yt}onPointerDown(e){this.session=new Bd(e,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:Id(this.node)})}createPanHandlers(){let{onPanSessionStart:e,onPanStart:t,onPan:n,onPanEnd:r}=this.node.getProps();return{onSessionStart:ff(e),onStart:ff(t),onMove:ff(n),onEnd:(e,t)=>{delete this.session,r&&I.postRender(()=>r(e,t))}}}mount(){this.removePointerDownListener=Fd(this.node.current,`pointerdown`,e=>this.onPointerDown(e))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}},mf=!1,hf=class extends m.Component{componentDidMount(){let{visualElement:e,layoutGroup:t,switchLayoutGroup:n,layoutId:r}=this.props,{projection:i}=e;i&&(t.group&&t.group.add(i),n&&n.register&&r&&n.register(i),mf&&i.root.didUpdate(),i.addEventListener(`animationComplete`,()=>{this.safeToRemove()}),i.setOptions({...i.options,layoutDependency:this.props.layoutDependency,onExitComplete:()=>this.safeToRemove()})),Ll.hasEverUpdated=!0}getSnapshotBeforeUpdate(e){let{layoutDependency:t,visualElement:n,drag:r,isPresent:i}=this.props,{projection:a}=n;return a?(a.isPresent=i,e.layoutDependency!==t&&a.setOptions({...a.options,layoutDependency:t}),mf=!0,r||e.layoutDependency!==t||t===void 0||e.isPresent!==i?a.willUpdate():this.safeToRemove(),e.isPresent!==i&&(i?a.promote():a.relegate()||I.postRender(()=>{let e=a.getStack();(!e||!e.members.length)&&this.safeToRemove()})),null):null}componentDidUpdate(){let{visualElement:e,layoutAnchor:t}=this.props,{projection:n}=e;n&&(n.options.layoutAnchor=t,n.root.didUpdate(),xs.postRender(()=>{!n.currentAnimation&&n.isLead()&&this.safeToRemove()}))}componentWillUnmount(){let{visualElement:e,layoutGroup:t,switchLayoutGroup:n}=this.props,{projection:r}=e;mf=!0,r&&(r.scheduleCheckAfterUnmount(),t&&t.group&&t.group.remove(r),n&&n.deregister&&n.deregister(r))}safeToRemove(){let{safeToRemove:e}=this.props;e&&e()}render(){return null}};function gf(e){let[t,n]=ju(),r=(0,m.useContext)(st);return(0,h.jsx)(hf,{...e,layoutGroup:r,switchLayoutGroup:(0,m.useContext)(yd),isPresent:t,safeToRemove:n})}var _f={pan:{Feature:pf},drag:{Feature:df,ProjectionNode:Su,MeasureLayout:gf}};function vf(e,t,n){let{props:r}=e;e.animationState&&r.whileHover&&e.animationState.setActive(`whileHover`,n===`Start`);let i=r[`onHover`+n];i&&I.postRender(()=>i(t,Nd(t)))}var yf=class extends Ec{mount(){let{current:e}=this.node;e&&(this.unmount=Os(e,(e,t)=>(vf(this.node,t,`Start`),e=>vf(this.node,e,`End`))))}unmount(){}},bf=class extends Ec{constructor(){super(...arguments),this.isActive=!1}onFocus(){let e=!1;try{e=this.node.current.matches(`:focus-visible`)}catch{e=!0}e&&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=bt(Al(this.node.current,`focus`,()=>this.onFocus()),Al(this.node.current,`blur`,()=>this.onBlur()))}unmount(){}};function xf(e,t,n){let{props:r}=e;if(e.current instanceof HTMLButtonElement&&e.current.disabled)return;e.animationState&&r.whileTap&&e.animationState.setActive(`whileTap`,n===`Start`);let i=r[`onTap`+(n===`End`?``:n)];i&&I.postRender(()=>i(t,Nd(t)))}var Sf=class extends Ec{mount(){let{current:e}=this.node;if(!e)return;let{globalTapTarget:t,propagate:n}=this.node.props;this.unmount=Vs(e,(e,t)=>(xf(this.node,t,`Start`),(e,{success:t})=>xf(this.node,e,t?`End`:`Cancel`)),{useGlobalTarget:t,stopPropagation:n?.tap===!1})}unmount(){}},Cf=new WeakMap,wf=new WeakMap,Tf=e=>{let t=Cf.get(e.target);t&&t(e)},Ef=e=>{e.forEach(Tf)};function Df({root:e,...t}){let n=e||document;wf.has(n)||wf.set(n,{});let r=wf.get(n),i=JSON.stringify(t);return r[i]||(r[i]=new IntersectionObserver(Ef,{root:e,...t})),r[i]}function Of(e,t,n){let r=Df(t);return Cf.set(e,n),r.observe(e),()=>{Cf.delete(e),r.unobserve(e)}}var kf={some:0,all:1},Af=class extends Ec{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.stopObserver?.();let{viewport:e={}}=this.node.getProps(),{root:t,margin:n,amount:r=`some`,once:i}=e,a={root:t?t.current:void 0,rootMargin:n,threshold:typeof r==`number`?r:kf[r]},o=e=>{let{isIntersecting:t}=e;if(this.isInView===t||(this.isInView=t,i&&!t&&this.hasEnteredView))return;t&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive(`whileInView`,t);let{onViewportEnter:n,onViewportLeave:r}=this.node.getProps(),a=t?n:r;a&&a(e)};this.stopObserver=Of(this.node.current,a,o)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>`u`)return;let{props:e,prevProps:t}=this.node;[`amount`,`margin`,`root`].some(jf(e,t))&&this.startObserver()}unmount(){this.stopObserver?.(),this.hasEnteredView=!1,this.isInView=!1}};function jf({viewport:e={}},{viewport:t={}}={}){return n=>e[n]!==t[n]}var Mf={inView:{Feature:Af},tap:{Feature:Sf},focus:{Feature:bf},hover:{Feature:yf}},Nf={layout:{ProjectionNode:Su,MeasureLayout:gf}},Pf=Od({...Md,...Mf,..._f,...Nf},kd);function Ff(e){let t=ct(()=>wa(e)),{isStatic:n}=(0,m.useContext)(Cu);if(n){let[,n]=(0,m.useState)(e);(0,m.useEffect)(()=>t.on(`change`,n),[])}return t}function H(){!_c.current&&yc();let[e]=(0,m.useState)(gc.current);return e}function If(e){return typeof e==`object`&&!Array.isArray(e)}function Lf(e,t,n,r){return e==null?[]:typeof e==`string`&&If(t)?Co(e,n,r):e instanceof NodeList?Array.from(e):Array.isArray(e)?e.filter(e=>e!=null):[e]}function Rf(e,t,n){return e*(t+1)+n*t}function zf(e,t,n,r){return typeof t==`number`?t:t.startsWith(`-`)||t.startsWith(`+`)?Math.max(0,e+parseFloat(t)):t===`<`?n:t.startsWith(`<`)?Math.max(0,n+parseFloat(t.slice(1))):r.get(t)??e}function Bf(e,t,n){for(let r=0;r<e.length;r++){let i=e[r];i.at>t&&i.at<n&&(ft(e,i),r--)}}function Vf(e,t,n,r,i,a){Bf(e,i,a);for(let o=0;o<t.length;o++)e.push({value:t[o],at:F(i,a,r[o]),easing:Wt(n,o)})}function Hf(e,t,n=0){let r=t+1+t*n;for(let t=0;t<e.length;t++)e[t]=e[t]/r}function Uf(e,t){return e.at===t.at?e.value===null?1:t.value===null?-1:0:e.at-t.at}var Wf=`easeInOut`,Gf=20;function Kf(e,{defaultTransition:t={},...n}={},r,i){let a=t.duration||.3,o=new Map,s=new Map,c={},l=new Map,u=0,d=0,f=0;for(let n=0;n<e.length;n++){let o=e[n];if(typeof o==`string`){l.set(o,d);continue}if(!Array.isArray(o)){l.set(o.name,zf(d,o.at,u,l));continue}let[p,m,h={}]=o;h.at!==void 0&&(d=zf(d,h.at,u,l));let g=0,_=(e,n,r,o=0,s=0)=>{let c=Yf(e),{delay:l=0,times:u=Pr(c),type:p=t.type||`keyframes`,repeat:m,repeatType:h,repeatDelay:_=0,...v}=n,{ease:y=t.ease||`easeOut`,duration:b}=n,x=typeof l==`function`?l(o,s):l,S=c.length,C=Xi(p)?p:i?.[p||`keyframes`];if(S<=2&&C){let e=100;if(S===2&&Qf(c)){let t=c[1]-c[0];e=Math.abs(t)}let n={...t,...v};b!==void 0&&(n.duration=k(b));let r=vr(n,e,C);y=r.ease,b=r.duration}b??=a;let w=d+x;u.length===1&&u[0]===0&&(u[1]=1);let T=u.length-c.length;if(T>0&&Nr(u,T),c.length===1&&c.unshift(null),m&&`${m}${Gf}`,m&&m<Gf){let e=b>0?_/b:0;b=Rf(b,m,_);let t=[...c],n=[...u];y=Array.isArray(y)?[...y]:[y];let r=[...y],i=h===`reverse`||h===`mirror`,a=t,o=r;i&&(a=[...t].reverse(),h===`reverse`&&(o=[...r].reverse().map(e=>typeof e==`function`?Mt(e):e)));for(let s=0;s<m;s++){let l=i&&s%2==0,d=l?a:t,f=l?o:r,p=(s+1)*(1+e);e>0&&(c.push(c[c.length-1]),u.push(p),y.push(`linear`)),c.push(...d);for(let e=0;e<d.length;e++)u.push(n[e]+p),y.push(e===0?`linear`:Wt(f,e-1))}Hf(u,m,e)}let ee=w+b;Vf(r,c,y,u,w,ee),g=Math.max(x+b,g),f=Math.max(ee,f)};if(R(p)){let e=qf(p,s);_(m,h,Jf(`default`,e))}else{let e=Lf(p,m,r,c),t=e.length;for(let n=0;n<t;n++){m=m,h=h;let r=e[n],i=qf(r,s);for(let e in m)_(m[e],Xf(h,e),Jf(e,i),n,t)}}u=d,d+=g}return s.forEach((e,r)=>{for(let i in e){let a=e[i];a.sort(Uf);let s=[],c=[],l=[];for(let e=0;e<a.length;e++){let{at:t,value:n,easing:r}=a[e];s.push(n),c.push(xt(0,f,t)),l.push(r||`easeOut`)}c[0]!==0&&(c.unshift(0),s.unshift(s[0]),l.unshift(Wf)),c[c.length-1]!==1&&(c.push(1),s.push(null)),o.has(r)||o.set(r,{keyframes:{},transition:{}});let u=o.get(r);u.keyframes[i]=s;let{type:d,...p}=t;u.transition[i]={...p,duration:f,ease:l,times:c,...n}}}),o}function qf(e,t){return!t.has(e)&&t.set(e,{}),t.get(e)}function Jf(e,t){return t[e]||(t[e]=[]),t[e]}function Yf(e){return Array.isArray(e)?e:[e]}function Xf(e,t){return e&&e[t]?{...e,...e[t]}:{...e}}var Zf=e=>typeof e==`number`,Qf=e=>e.every(Zf);function $f(e,t){return R(e)||typeof e==`number`||typeof e==`string`&&!If(t)}function ep(e,t,n,r){let i=[];if($f(e,t))i.push(kl(e,If(t)&&t.default||t,n&&(n.default||n)));else{if(e==null)return i;let a=Lf(e,t,r),o=a.length;for(let e=0;e<o;e++){let r=a[e],s={...n};`delay`in s&&typeof s.delay==`function`&&(s.delay=s.delay(e,o)),r instanceof Element?i.push(...ys(r,t,s,cc.get(r))):i.push(...vo(go(r)??bs,r,t,s))}}return i}function tp(e,t,n){let r=[];return Kf(e.map(e=>{if(Array.isArray(e)&&typeof e[0]==`function`){let t=e[0],n=wa(0);return n.on(`change`,t),e.length===1?[n,[0,1]]:e.length===2?[n,[0,1],e[1]]:[n,e[1],e[2]]}return e}),t,n,{spring:kr}).forEach(({keyframes:e,transition:t},n)=>{r.push(...ep(n,e,t))}),r}function np(e){return Array.isArray(e)&&e.some(Array.isArray)}function rp(e={}){let{scope:t,reduceMotion:n,skipAnimations:r}=e;function i(e,i,a){let o=[],s,c={};if(n!==void 0&&(c.reduceMotion=n),r!==void 0&&(c.skipAnimations=r),np(e)){let{onComplete:n,...r}=i||{};typeof n==`function`&&(s=n),o=tp(e,{...c,...r},t)}else{let{onComplete:n,...r}=a||{};typeof n==`function`&&(s=n),o=ep(e,i,{...c,...r},t)}let l=new va(o);return s&&l.finished.then(s),t&&(t.animations.push(l),l.finished.then(()=>{ft(t.animations,l)})),l}return i}var ip=Object.assign(rp(),{addEffect:mo,removeEffect:ho}),U=Pf,ap=o((e=>{var t=d();function n(e){var t=`https://react.dev/errors/`+e;if(1<arguments.length){t+=`?args[]=`+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+=`&args[]=`+encodeURIComponent(arguments[n])}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 r(){}var i={d:{f:r,r:function(){throw Error(n(522))},D:r,C:r,L:r,m:r,X:r,S:r,M:r},p:0,findDOMNode:null},a=Symbol.for(`react.portal`),o=Symbol.for(`react.recoverable`),s=Symbol.for(`react.optimistic_key`);function c(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:a,key:r==null?null:r===s?s:``+r,children:e,containerInfo:t,implementation:n}}var l=t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function u(e,t){if(e===`font`)return``;if(typeof t==`string`)return t===`use-credentials`?t:``}e.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=i,e.browser=function(e){return{$$typeof:o,_reason:e}},e.createPortal=function(e,t){var r=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!t||t.nodeType!==1&&t.nodeType!==9&&t.nodeType!==11)throw Error(n(299));return c(e,t,null,r)},e.flushSync=function(e){var t=l.T,n=i.p;try{if(l.T=null,i.p=2,e)return e()}finally{l.T=t,i.p=n,i.d.f()}},e.preconnect=function(e,t){typeof e==`string`&&(t?(t=t.crossOrigin,t=typeof t==`string`?t===`use-credentials`?t:``:void 0):t=null,i.d.C(e,t))},e.prefetchDNS=function(e){typeof e==`string`&&i.d.D(e)},e.preinit=function(e,t){if(typeof e==`string`&&t&&typeof t.as==`string`){var n=t.as,r=u(n,t.crossOrigin),a=typeof t.integrity==`string`?t.integrity:void 0,o=typeof t.fetchPriority==`string`?t.fetchPriority:void 0;n===`style`?i.d.S(e,typeof t.precedence==`string`?t.precedence:void 0,{crossOrigin:r,integrity:a,fetchPriority:o}):n===`script`&&i.d.X(e,{crossOrigin:r,integrity:a,fetchPriority:o,nonce:typeof t.nonce==`string`?t.nonce:void 0})}},e.preinitModule=function(e,t){if(typeof e==`string`){if(typeof t==`object`&&t){if(t.as==null||t.as===`script`){var n=u(t.as,t.crossOrigin);i.d.M(e,{crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}}else t??i.d.M(e)}},e.preload=function(e,t){if(typeof e==`string`&&typeof t==`object`&&t&&typeof t.as==`string`){var n=t.as,r=u(n,t.crossOrigin);i.d.L(e,n,{crossOrigin:r,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,type:typeof t.type==`string`?t.type:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0,referrerPolicy:typeof t.referrerPolicy==`string`?t.referrerPolicy:void 0,imageSrcSet:typeof t.imageSrcSet==`string`?t.imageSrcSet:void 0,imageSizes:typeof t.imageSizes==`string`?t.imageSizes:void 0,media:typeof t.media==`string`?t.media:void 0})}},e.preloadModule=function(e,t){if(typeof e==`string`){if(t){var n=u(t.as,t.crossOrigin);i.d.m(e,{as:typeof t.as==`string`&&t.as!==`script`?t.as:void 0,crossOrigin:n,integrity:typeof t.integrity==`string`?t.integrity:void 0,nonce:typeof t.nonce==`string`?t.nonce:void 0,fetchPriority:typeof t.fetchPriority==`string`?t.fetchPriority:void 0})}else i.d.m(e)}},e.requestFormReset=function(e){i.d.r(e)},e.unstable_batchedUpdates=function(e,t){return e(t)},e.useFormState=function(e,t,n){return l.H.useFormState(e,t,n)},e.useFormStatus=function(){return l.H.useHostTransitionStatus()},e.version=`19.3.0`})),op=o(((e,t)=>{function n(){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<`u`&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE==`function`)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=ap()})),sp=[`none`,`requests`,`tokens`,`cost`,`quota`,`alerts`],cp=[`overview`,`cost`,`chart`,`topModel`,`compareYesterday`,`cacheHitRate`,`quota`,`clients`];function lp(){return typeof window>`u`?void 0:window.__ASTRA__}function up(e=lp()){return e?.shell===`desktop`?`desktop`:`web`}function dp(e=lp(),t=globalThis.navigator){if(e?.platform)return e.platform;let n=`${t?.userAgent??``} ${t?.platform??``}`.toLowerCase();return n.includes(`mac`)?`darwin`:n.includes(`win`)?`win32`:n.includes(`linux`)?`linux`:`other`}function fp(e=globalThis.navigator){let t=e?.userAgent??``;return/Chrome\/|Electron\//.test(t)}var pp=up(),mp=dp(),hp=pp===`desktop`,gp=mp===`darwin`;function _p(e=hp,t=mp){return e&&t===`darwin`?78:68}function vp(e=document.documentElement){e.dataset.shell=pp,e.dataset.platform=mp,fp()&&e.classList.add(`refract`)}var yp=gp?`⌘`:`Ctrl+`,bp=class extends Error{status;details;constructor(e,t,n){super(e),this.status=t,this.details=n,this.name=`ApiError`}get isNetwork(){return this.status===0}};function xp(){return lp()?.apiBase.replace(/\/+$/,``)??``}async function W(e,t,n,r){let i={Accept:`application/json`};e!==`GET`&&(i[`X-Astra-Admin`]=`1`),n!==void 0&&(i[`Content-Type`]=`application/json`);let a;try{a=await fetch(xp()+t,{method:e,headers:i,body:n===void 0?void 0:JSON.stringify(n),credentials:`include`,signal:r})}catch(e){throw e?.name===`AbortError`?e:new bp(e?.message||`Network error`,0)}if(a.status===204)return;let o=await a.text(),s;if(o)try{s=JSON.parse(o)}catch{s=o}if(!a.ok){let e=s&&typeof s==`object`?s:{};throw new bp(e.error||typeof s==`string`&&s||`HTTP ${a.status}`,a.status,e.details)}return s}async function Sp(e,t){let n;try{n=await fetch(xp()+e,{headers:{Accept:`text/plain`},credentials:`include`,signal:t})}catch(e){throw e?.name===`AbortError`?e:new bp(e?.message||`Network error`,0)}let r=await n.text();if(!n.ok){let e=r;try{e=JSON.parse(r).error||r}catch{}throw new bp(e||`HTTP ${n.status}`,n.status)}return r}function G(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!=null&&r!==``&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}var K=encodeURIComponent;function Cp(){let e=``;return t=>{e+=t;let n=[];for(;;){let t=/\r\n\r\n|\n\n|\r\r/.exec(e);if(!t)return n;let r=e.slice(0,t.index);e=e.slice(t.index+t[0].length);let i=``,a=[];for(let e of r.split(/\r\n|\n|\r/)){if(e.startsWith(`:`))continue;let t=e.indexOf(`:`),n=t<0?e:e.slice(0,t),r=t<0?``:e.slice(t+1);r.startsWith(` `)&&(r=r.slice(1)),n===`event`?i=r:n===`data`&&a.push(r)}if(a.length===0)continue;let o=a.join(`
|
|
10
|
+
`),s=o;try{s=JSON.parse(o)}catch{}n.push({event:i,data:s})}}}async function wp(e,t,n,r){return Ep(`POST`,e,t,n,r)}async function Tp(e,t,n,r){return Ep(`GET`,e,void 0,t,n,r)}async function Ep(e,t,n,r,i,a){let o;try{o=await fetch(xp()+t,{method:e,headers:e===`POST`?{Accept:`text/event-stream`,"Content-Type":`application/json`,"X-Astra-Admin":`1`}:{Accept:`text/event-stream`},body:e===`POST`?JSON.stringify(n):void 0,credentials:`include`,signal:i})}catch(e){throw e?.name===`AbortError`?e:new bp(e?.message||`Network error`,0)}if(!o.ok||!o.body){let e=await o.text().catch(()=>``),t;if(e)try{t=JSON.parse(e)}catch{t=e}let n=t&&typeof t==`object`?t:{};throw new bp(n.error||typeof t==`string`&&t||`HTTP ${o.status}`,o.status,n.details)}a?.();let s=o.body.getReader(),c=new TextDecoder,l=Cp();for(;;){let{done:e,value:t}=await s.read();if(e)break;for(let e of l(c.decode(t,{stream:!0})))r(e)}for(let e of l(c.decode()))r(e)}var q={health:[`health`],version:[`version`],auth:[`auth`],settings:[`settings`],tunnel:[`tunnel`],listen:[`listen`],autostart:[`autostart`],update:[`update`],models:(e,t)=>[`models`,e??``,t??``],model:e=>[`model`,e],priceKeys:[`price-keys`],templates:[`provider-templates`],quotaTemplates:[`provider-quota-templates`],providers:[`providers`],importSources:[`import-sources`],provider:e=>[`provider`,e],providerModels:e=>[`provider-models`,e],remoteModels:e=>[`remote-models`,e],templateUpdate:e=>[`template-update`,e],clients:[`clients`],claudeDirect:[`claude-direct`],claudeDirectRequests:e=>[`claude-direct-requests`,e],tokens:[`tokens`],webhooks:[`webhooks`],webhookDeliveries:e=>[`webhook-deliveries`,e],alertEvents:[`alert-events`],alertRules:[`alert-rules`],alertStates:[`alert-states`],clientModels:e=>[`client-models`,e],backups:e=>[`backups`,e],clientInstallJob:e=>[`client-install-job`,e],privacy:[`privacy`],smartRouting:[`smart-routing`],routingModels:[`routing-models`],privacyEvents:e=>[`privacy-events`,e],privacyEventStats:(...e)=>[`privacy-event-stats`,...e],providerAccounts:e=>[`provider-accounts`,e],providerUsage:e=>[`provider-usage`,e],subscriptionPolicy:e=>[`subscription-policy`,e],localCodexLogin:[`local-codex-login`],localCopilotLogin:[`local-copilot-login`],plugins:[`plugins`],pluginJob:e=>[`plugin-job`,e],pluginHost:[`plugin-host`],pluginMarket:[`plugin-market`],pluginSearch:e=>[`plugin-search`,e],pluginMethods:e=>[`plugin-methods`,e],pluginSignIn:(e,t)=>[`plugin-sign-in`,e,t],pluginUsage:(e,t)=>[`plugin-usage`,e,t],pluginCheckin:e=>[`plugin-checkin`,e],magpieImport:[`magpie-import`],accountImportInfo:e=>[`account-import-info`,e],resetCredits:e=>[`reset-credits`,e],requests:e=>[`requests`,e],request:e=>[`request`,e],stats:(e,...t)=>[`stats`,e,...t],traceTopology:e=>[`traces`,`topology`,e],traceSessions:(e,t)=>[`traces`,`sessions`,e,t??``],traceSession:(e,t)=>[`traces`,`session`,e,t??``],traceRequest:e=>[`traces`,`request`,e],traceActivity:e=>[`traces`,`activity`,e]},Dp=()=>D({queryKey:q.health,queryFn:({signal:e})=>W(`GET`,`/api/health`,void 0,e),refetchInterval:5e3,retry:!1}),Op=()=>D({queryKey:q.version,queryFn:()=>W(`GET`,`/api/version`),staleTime:1/0}),kp=()=>D({queryKey:q.auth,queryFn:()=>W(`GET`,`/api/auth/status`),retry:!1});function Ap(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/auth/login`,{password:e}),onSuccess:()=>e.invalidateQueries()})}function jp(){let e=_();return O({mutationFn:()=>W(`POST`,`/api/auth/logout`),onSuccess:()=>e.invalidateQueries({queryKey:q.auth})})}var Mp=()=>D({queryKey:q.settings,queryFn:()=>W(`GET`,`/api/settings`)});function Np(){let e=_();return O({mutationFn:e=>W(`PATCH`,`/api/settings`,e),onSuccess:t=>e.setQueryData(q.settings,t)})}function Pp(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/auth/password`,{password:e}),onSuccess:()=>Promise.all([e.invalidateQueries({queryKey:q.tunnel}),e.invalidateQueries({queryKey:q.listen})])})}var Fp=()=>D({queryKey:q.listen,queryFn:()=>W(`GET`,`/api/server/listen`)});function Ip(){let e=_();return O({mutationFn:e=>W(`PUT`,`/api/server/listen`,{host:e}),onSuccess:t=>e.setQueryData(q.listen,t)})}var Lp=()=>D({queryKey:q.autostart,queryFn:()=>W(`GET`,`/api/server/autostart`)});function Rp(){let e=_();return O({mutationFn:e=>W(`PUT`,`/api/server/autostart`,{enabled:e}),onSuccess:t=>e.setQueryData(q.autostart,t)})}var zp=[`downloading`,`starting`,`reconnecting`],Bp=(e=!0)=>D({queryKey:q.tunnel,queryFn:({signal:e})=>W(`GET`,`/api/tunnel`,void 0,e),enabled:e,refetchInterval:e=>{let t=e.state.data;return t&&zp.includes(t.state)?1500:t?.enabled?15e3:6e4}});function Vp(){let e=_();return O({mutationFn:e=>W(`PUT`,`/api/tunnel`,e),onSuccess:t=>e.setQueryData(q.tunnel,t)})}function Hp(){return O({mutationFn:()=>W(`POST`,`/api/tunnel/cloudflared/detect`)})}function Up(){let e=_();return O({mutationFn:e=>W(`POST`,e?`/api/tunnel/start`:`/api/tunnel/stop`),onSuccess:t=>e.setQueryData(q.tunnel,t)})}var Wp=()=>D({queryKey:q.update,queryFn:({signal:e})=>W(`GET`,`/api/update/status`,void 0,e),refetchInterval:3e5});function Gp(){let e=_();return O({mutationFn:()=>W(`POST`,`/api/update/check`),onSuccess:t=>e.setQueryData(q.update,t)})}var Kp=(e,t)=>D({queryKey:q.models(e,t),queryFn:()=>W(`GET`,`/api/models${G({search:e,vendor:t})}`),placeholderData:e=>e}),qp=e=>D({queryKey:q.model(e??``),queryFn:()=>W(`GET`,`/api/models/${K(e)}`),enabled:!!e}),Jp=()=>D({queryKey:q.priceKeys,queryFn:()=>W(`GET`,`/api/price-keys`)});function Yp(e,t){e.invalidateQueries({queryKey:[`models`]}),e.invalidateQueries({queryKey:t?q.model(t):[`model`]}),e.invalidateQueries({queryKey:q.priceKeys}),e.invalidateQueries({queryKey:[`provider-models`]}),e.invalidateQueries({queryKey:[`client-models`]}),e.invalidateQueries({queryKey:[`remote-models`]})}function Xp(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/models`,e),onSuccess:t=>Yp(e,t.id)})}function Zp(e){let t=_();return O({mutationFn:t=>W(`PUT`,`/api/models/${K(e)}`,t),onSuccess:()=>Yp(t,e)})}function Qp(){let e=_();return O({mutationFn:e=>W(`DELETE`,`/api/models/${K(e)}`),onSuccess:()=>Yp(e)})}function $p(e){let t=_();return O({mutationFn:t=>W(`POST`,`/api/models/${K(e)}/reset-field`,{field:t}),onSuccess:()=>Yp(t,e)})}function em(e){let t=_();return O({mutationFn:t=>W(`PUT`,`/api/models/${K(e)}/prices/${K(t.priceKey)}`,{upstreamModelId:t.upstreamModelId??null,pricing:t.pricing}),onSuccess:()=>Yp(t,e)})}function tm(e){let t=_();return O({mutationFn:t=>W(`DELETE`,`/api/models/${K(e)}/prices/${K(t)}`),onSuccess:()=>Yp(t,e)})}var nm=()=>O({mutationFn:()=>W(`POST`,`/api/models/sync/preview`)});function rm(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/models/sync/apply`,{changeIds:e}),onSuccess:()=>Yp(e)})}var im=()=>O({mutationFn:e=>W(`POST`,`/api/billing/simulate`,e)}),am=()=>D({queryKey:q.templates,queryFn:()=>W(`GET`,`/api/provider-templates`),staleTime:3e5}),om=()=>D({queryKey:q.providers,queryFn:()=>W(`GET`,`/api/providers`)}),sm=e=>D({queryKey:q.provider(e??``),queryFn:()=>W(`GET`,`/api/providers/${K(e)}`),enabled:!!e});function cm(e,t){e.invalidateQueries({queryKey:q.providers}),e.invalidateQueries({queryKey:t?q.provider(t):[`provider`]}),e.invalidateQueries({queryKey:q.clients}),e.invalidateQueries({queryKey:[`client-models`]})}var lm=e=>D({queryKey:q.importSources,queryFn:()=>W(`GET`,`/api/providers/import/sources`),enabled:e,staleTime:0,gcTime:0});function um(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/providers/import`,e),onSuccess:()=>{cm(e),e.invalidateQueries({queryKey:q.importSources})}})}function dm(){return O({mutationFn:e=>W(`POST`,`/api/providers/backup/export`,e)})}function fm(){return O({mutationFn:e=>W(`POST`,`/api/providers/backup/preview`,e)})}function pm(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/providers/backup/import`,e),onSuccess:()=>cm(e)})}var mm=()=>D({queryKey:[`webdav-backup`],queryFn:()=>W(`GET`,`/api/backup/webdav`)});function hm(){let e=_();return O({mutationFn:e=>W(`PUT`,`/api/backup/webdav`,e),onSuccess:()=>void e.invalidateQueries({queryKey:[`webdav-backup`]})})}function gm(){let e=_();return O({mutationFn:()=>W(`DELETE`,`/api/backup/webdav`),onSuccess:()=>void e.invalidateQueries({queryKey:[`webdav-backup`]})})}var _m=()=>O({mutationFn:()=>W(`POST`,`/api/backup/webdav/test`)}),vm=()=>O({mutationFn:e=>W(`POST`,`/api/backup/webdav/upload`,e)}),ym=()=>O({mutationFn:()=>W(`POST`,`/api/backup/webdav/restore`)});function bm(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/providers`,e),onSuccess:t=>cm(e,t.id)})}function xm(e){let t=_();return O({mutationFn:t=>W(`PATCH`,`/api/providers/${K(e)}`,t),onSuccess:n=>{t.setQueryData(q.provider(e),n),cm(t,e),t.invalidateQueries({queryKey:q.providerModels(e)}),t.invalidateQueries({queryKey:q.remoteModels(e)})}})}function Sm(e){let t=_();return O({mutationFn:t=>W(`PUT`,`/api/providers/${K(e)}/model-map`,{map:t}),onSuccess:n=>{t.setQueryData(q.provider(e),n),cm(t,e)}})}function Cm(){let e=_();return O({mutationFn:e=>W(`DELETE`,`/api/providers/${K(e)}`),onSuccess:()=>cm(e)})}var wm=()=>D({queryKey:q.quotaTemplates,queryFn:()=>W(`GET`,`/api/provider-quota/templates`),staleTime:1/0});function Tm(e,t,n){let r=e=>e.id===t?{...e,quotaConfig:n.config,quota:n.snapshot??null,quotaCheckedAtUtc:n.checkedAtUtc??null}:e;e.setQueryData(q.provider(t),e=>e&&r(e)),e.setQueryData(q.providers,e=>e?.map(r))}function Em(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/providers/${K(e)}/quota`),onSuccess:(t,n)=>Tm(e,n,t),onError:(t,n)=>void e.invalidateQueries({queryKey:q.provider(n)})})}function Dm(e){let t=_();return O({mutationFn:t=>W(`PUT`,`/api/providers/${K(e)}/quota/config`,t),onSuccess:n=>Tm(t,e,n)})}var Om=e=>O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/quota/test`,t)});function km(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/providers/${K(e)}/duplicate`),onSuccess:()=>cm(e)})}function Am(e,t,n,r){return wp(`/api/providers/${K(e)}/test`,t,n,r)}var jm=(e,t)=>D({queryKey:q.remoteModels(e),queryFn:()=>W(`GET`,`/api/providers/${K(e)}/remote-models`),enabled:t,retry:!1}),Mm=(e,t)=>D({queryKey:q.templateUpdate(e),queryFn:()=>W(`GET`,`/api/providers/${K(e)}/template-update`),enabled:t});function Nm(e){let t=_();return O({mutationFn:()=>W(`POST`,`/api/providers/${K(e)}/template-update`),onSuccess:()=>{cm(t,e),t.invalidateQueries({queryKey:q.providerModels(e)}),t.invalidateQueries({queryKey:q.remoteModels(e)}),t.invalidateQueries({queryKey:q.templateUpdate(e)})}})}function Pm(e){let t=_();return O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/template-switch`,t),onSuccess:n=>{t.setQueryData(q.provider(e),n),cm(t,e),t.invalidateQueries({queryKey:q.providerModels(e)}),t.invalidateQueries({queryKey:q.remoteModels(e)}),t.invalidateQueries({queryKey:q.templateUpdate(e)})}})}var Fm=e=>D({queryKey:q.providerModels(e??``),queryFn:()=>W(`GET`,`/api/providers/${K(e)}/models`),enabled:!!e});function Im(e,t){e.invalidateQueries({queryKey:q.providerModels(t)}),e.invalidateQueries({queryKey:q.remoteModels(t)}),e.invalidateQueries({queryKey:[`model`]}),cm(e,t)}function Lm(e){let t=_();return O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/models`,{modelIds:t}),onSuccess:()=>Im(t,e)})}function Rm(e){let t=_();return O({mutationFn:t=>{let{pmId:n,...r}=t;return W(`PATCH`,`/api/providers/${K(e)}/models/${n}`,r)},onSuccess:()=>Im(t,e)})}function zm(e){let t=_();return O({mutationFn:t=>W(`DELETE`,`/api/providers/${K(e)}/models/${t}`),onSuccess:()=>Im(t,e)})}function Bm(e){let t=_();return O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/models/delete`,{ids:t}),onSuccess:()=>Im(t,e)})}var Vm=()=>D({queryKey:q.privacy,queryFn:()=>W(`GET`,`/api/privacy`)});function Hm(){let e=_();return O({mutationFn:e=>W(`PUT`,`/api/privacy`,e),onSuccess:t=>e.setQueryData(q.privacy,e=>e&&{...e,settings:t})})}var Um=()=>O({mutationFn:e=>W(`POST`,`/api/privacy/dry-run`,e)}),Wm=(e,t)=>D({queryKey:q.privacyEvents(e),queryFn:()=>W(`GET`,`/api/privacy/events${G({...e})}`),placeholderData:e=>e,refetchInterval:t?5e3:!1}),Gm=e=>D({queryKey:q.privacyEventStats(e),queryFn:()=>W(`GET`,`/api/privacy/events/stats${G({range:e})}`),refetchInterval:15e3,placeholderData:e=>e});function Km(){let e=_();return O({mutationFn:()=>W(`DELETE`,`/api/privacy/events`),onSuccess:()=>{e.invalidateQueries({queryKey:[`privacy-events`]}),e.invalidateQueries({queryKey:[`privacy-event-stats`]}),e.invalidateQueries({queryKey:[`requests`]})}})}var qm=(e,t=!0)=>D({queryKey:q.providerAccounts(e??``),queryFn:()=>W(`GET`,`/api/providers/${K(e)}/accounts`),enabled:!!e&&t}),Jm=(e,t=!0)=>D({queryKey:q.providerUsage(e??``),queryFn:({signal:t})=>W(`GET`,`/api/providers/${K(e)}/usage`,void 0,t),enabled:!!e&&t,refetchInterval:5e3});function Ym(e,t){e.invalidateQueries({queryKey:q.providerAccounts(t)}),e.invalidateQueries({queryKey:q.providerUsage(t)})}function Xm(e){let t=_();return O({mutationFn:e=>W(`POST`,`/api/provider-accounts/${K(e)}/refresh`),onSuccess:()=>Ym(t,e)})}function Zm(e){let t=_();return O({mutationFn:e=>W(`POST`,`/api/provider-accounts/${K(e)}/quota`),onSuccess:()=>Ym(t,e)})}function Qm(e,t){let n=_();return O({mutationFn:t,onSuccess:t=>{n.setQueryData(q.providerAccounts(e),t),n.invalidateQueries({queryKey:q.providerUsage(e)})}})}var $m=e=>Qm(e,e=>W(`POST`,`/api/provider-accounts/${K(e)}/activate`)),eh=e=>Qm(e,({id:e,...t})=>W(`PATCH`,`/api/provider-accounts/${K(e)}`,t)),th=e=>Qm(e,t=>W(`PUT`,`/api/providers/${K(e)}/accounts/order`,{ids:t})),nh=(e,t=!0)=>D({queryKey:q.subscriptionPolicy(e),queryFn:()=>W(`GET`,`/api/providers/${K(e)}/subscription-policy`),enabled:t});function rh(e){let t=_();return O({mutationFn:t=>W(`PUT`,`/api/providers/${K(e)}/subscription-policy`,t),onSuccess:n=>{t.setQueryData(q.subscriptionPolicy(e),n),t.invalidateQueries({queryKey:q.provider(e)})}})}function ih(e){let t=_();return O({mutationFn:e=>W(`DELETE`,`/api/provider-accounts/${K(e)}`),onSuccess:()=>Ym(t,e)})}var ah=e=>O({mutationFn:(t={})=>W(`POST`,`/api/providers/${K(e)}/accounts/login`,{accountId:t.accountId||void 0,httpProxy:t.httpProxy?.trim()||void 0})}),oh=e=>O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/accounts/login/${K(t)}/poll`)}),sh=(e=!0)=>D({queryKey:q.localCodexLogin,queryFn:()=>W(`GET`,`/api/subscription/codex/local-login`),enabled:e,retry:!1});function ch(e){let t=_();return O({mutationFn:()=>W(`POST`,`/api/providers/${K(e)}/accounts/import-codex`,{}),onSuccess:()=>Ym(t,e)})}var lh=e=>O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/accounts/login/${K(t.state)}/complete`,{code:t.code})}),uh=(e=!0)=>D({queryKey:q.localCopilotLogin,queryFn:()=>W(`GET`,`/api/subscription/copilot/local-login`),enabled:e,retry:!1});function dh(e){let t=_();return O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/accounts/import-copilot`,{token:t&&t.trim().length>0?t.trim():null}),onSuccess:(n,r)=>{Ym(t,e),t.invalidateQueries({queryKey:q.localCopilotLogin})}})}var fh=(e,t=!0)=>D({queryKey:q.accountImportInfo(e),queryFn:()=>W(`GET`,`/api/providers/${K(e)}/accounts/import-info`),enabled:t,staleTime:1/0});function ph(e){let t=_();return O({mutationFn:t=>W(`POST`,`/api/providers/${K(e)}/accounts/import`,t),onSuccess:(n,r)=>{r.dryRun||Ym(t,e)}})}function mh(e){return O({mutationFn:()=>W(`POST`,`/api/providers/${K(e)}/accounts/export`,{})})}var hh=(e,t=!0)=>D({queryKey:q.resetCredits(e??``),queryFn:()=>W(`GET`,`/api/provider-accounts/${K(e)}/reset-credits`),enabled:!!e&&t,retry:!1});function gh(e){let t=_();return O({mutationFn:e=>W(`POST`,`/api/provider-accounts/${K(e.accountId)}/reset-credits/${K(e.creditId)}/consume`,{}),onSuccess:(n,r)=>{Ym(t,e),t.invalidateQueries({queryKey:q.resetCredits(r.accountId)})}})}var _h=()=>D({queryKey:q.clients,queryFn:()=>W(`GET`,`/api/clients`),refetchInterval:e=>e.state.data?.some(e=>e.install?.busy)?2e3:!1}),vh=()=>xh(()=>W(`POST`,`/api/clients/reapply`,{})),yh=(e,t=!0)=>D({queryKey:q.clientModels(e??``),queryFn:()=>W(`GET`,`/api/clients/${e}/models`),enabled:!!e&&t,retry:!1}),bh=(e,t=!0)=>D({queryKey:q.backups(e??``),queryFn:()=>W(`GET`,`/api/clients/${e}/backups`),enabled:!!e&&t});function xh(e,t=()=>[]){let n=_();return O({mutationFn:e,onSuccess:(e,r)=>{n.invalidateQueries({queryKey:q.clients}),n.invalidateQueries({queryKey:q.providers}),n.invalidateQueries({queryKey:[`provider`]}),n.invalidateQueries({queryKey:[`client-models`]});for(let e of t(r))n.invalidateQueries({queryKey:e})}})}var Sh=()=>xh(e=>W(`PUT`,`/api/clients/${e.kind}/binding`,{providerId:e.providerId,accountId:e.accountId}),e=>[q.clientModels(e.kind)]),Ch=()=>xh(e=>W(`PUT`,`/api/clients/${e.kind}/bindings`,{bindings:e.bindings}),e=>[q.clientModels(e.kind)]),wh=()=>O({mutationFn:e=>W(`POST`,`/api/clients/${e.kind}/preview-enable`,e.req)}),Th=()=>xh(e=>W(`POST`,`/api/clients/${e.kind}/enable`,e.req),e=>[q.backups(e.kind)]),Eh=()=>xh(e=>W(`POST`,`/api/clients/${e}/disable`)),Dh=()=>xh(e=>W(`POST`,`/api/clients/${e}/force-restore`)),Oh=()=>xh(e=>W(`POST`,`/api/clients/${e}/repair`),e=>[q.backups(e)]),kh=()=>xh(e=>W(`POST`,`/api/clients/${e.kind}/backups/${K(e.id)}/restore`),e=>[q.backups(e.kind)]);function Ah(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/clients/check-updates`,{force:e}),onSuccess:t=>e.setQueryData(q.clients,t)})}var jh=(e,t=!0)=>D({queryKey:q.clientInstallJob(e??``),queryFn:()=>W(`GET`,`/api/clients/${e}/install`),enabled:!!e&&t,retry:!1,refetchInterval:e=>e.state.data?.state===`running`&&800});function Mh(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/clients/${e.kind}/install`,{action:e.action,elevated:e.elevated??!1}),onSuccess:t=>{e.setQueryData(q.clientInstallJob(t.kind),t),e.invalidateQueries({queryKey:q.clients})}})}function Nh(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/clients/${e}/install/cancel`,{}),onSuccess:t=>e.setQueryData(q.clientInstallJob(t.kind),t)})}var Ph=`/api/clients/claude-code/direct`,Fh=e=>D({queryKey:q.claudeDirect,queryFn:()=>W(`GET`,Ph),enabled:e,retry:!1});function Ih(){let e=_();return O({mutationFn:e=>W(`PUT`,Ph,e),onSuccess:t=>{e.setQueryData(q.claudeDirect,t),e.invalidateQueries({queryKey:[`claude-direct-requests`]})}})}var Lh=(e,t)=>D({queryKey:q.claudeDirectRequests(e??``),queryFn:()=>W(`GET`,`${Ph}/accounts/${K(e)}/requests`),enabled:!!e,retry:!1,refetchInterval:t?5e3:!1}),Rh=()=>D({queryKey:q.tokens,queryFn:()=>W(`GET`,`/api/tokens`),refetchInterval:15e3}),zh=e=>D({queryKey:[...q.tokens,e],queryFn:()=>W(`GET`,`/api/tokens/${K(e)}`),enabled:!!e,refetchInterval:1e4});function Bh(e){let t=_();return O({mutationFn:e,onSuccess:()=>{t.invalidateQueries({queryKey:q.tokens}),t.invalidateQueries({queryKey:q.clients})}})}var Vh=()=>Bh(e=>W(`POST`,`/api/tokens`,e)),Hh=()=>Bh(e=>{let{id:t,...n}=e;return W(`PATCH`,`/api/tokens/${K(t)}`,n)}),Uh=()=>Bh(e=>W(`POST`,`/api/tokens/${K(e)}/reset`)),Wh=()=>Bh(e=>W(`DELETE`,`/api/tokens/${K(e)}`)),Gh=(e,t=!0)=>D({queryKey:[`token-invites`,e??``],queryFn:()=>W(`GET`,`/api/tokens/${K(e)}/invites`),enabled:!!e&&t}),Kh=e=>{let t=_();return O({mutationFn:t=>W(`POST`,`/api/tokens/${K(e)}/invites`,{ttlMinutes:t}),onSuccess:()=>void t.invalidateQueries({queryKey:[`token-invites`,e]})})},qh=e=>{let t=_();return O({mutationFn:t=>W(`DELETE`,`/api/tokens/${K(e)}/invites/${K(t)}`),onSuccess:()=>void t.invalidateQueries({queryKey:[`token-invites`,e]})})},Jh=()=>O({mutationFn:e=>W(`POST`,`/api/tokens/${K(e)}/reveal`)}),Yh=()=>D({queryKey:[`mcp-settings`],queryFn:()=>W(`GET`,`/api/mcp/settings`)}),Xh=()=>{let e=_();return O({mutationFn:e=>W(`PUT`,`/api/mcp/settings`,e),onSuccess:t=>e.setQueryData([`mcp-settings`],t)})},Zh=()=>D({queryKey:[`client-mcp`],queryFn:()=>W(`GET`,`/api/clients/mcp`)});function Qh(){let e=_();return O({mutationFn:e=>W(`POST`,`/api/clients/${K(e.kind)}/mcp`,{tokenId:e.tokenId,force:e.force===!0}),onSuccess:()=>void e.invalidateQueries({queryKey:[`client-mcp`]})})}function $h(){let e=_();return O({mutationFn:e=>W(`DELETE`,`/api/clients/${K(e.kind)}/mcp${e.force?`?force=true`:``}`),onSuccess:()=>void e.invalidateQueries({queryKey:[`client-mcp`]})})}var eg=()=>D({queryKey:[`mcp-servers`],queryFn:()=>W(`GET`,`/api/mcp/servers`),refetchInterval:15e3});function tg(e){let t=_();return O({mutationFn:e,onSuccess:()=>{t.invalidateQueries({queryKey:[`mcp-servers`]}),t.invalidateQueries({queryKey:q.tokens})}})}var ng=()=>tg(e=>W(`POST`,`/api/mcp/servers`,e)),rg=()=>tg(e=>W(`PATCH`,`/api/mcp/servers/${K(e.id)}`,e.body)),ig=()=>tg(e=>W(`DELETE`,`/api/mcp/servers/${K(e)}`)),ag=()=>tg(e=>W(`POST`,`/api/mcp/servers/${K(e)}/test`)),og=()=>tg(e=>W(`POST`,`/api/mcp/servers/${K(e)}/oauth/start`)),sg=()=>tg(e=>W(`DELETE`,`/api/mcp/servers/${K(e)}/oauth`)),cg=(e=50)=>D({queryKey:[`mcp-calls`,e],queryFn:()=>W(`GET`,`/api/mcp/calls${G({limit:e})}`),refetchInterval:1e4}),lg=(e,t)=>D({queryKey:q.requests(e),queryFn:()=>W(`GET`,`/api/requests${G({...e})}`),placeholderData:e=>e,refetchInterval:t?5e3:!1}),ug=e=>D({queryKey:q.request(e??``),queryFn:()=>W(`GET`,`/api/requests/${K(e)}`),enabled:!!e,refetchInterval:e=>e.state.data?.status===`pending`&&1e3,gcTime:0}),dg=(e,t,n)=>D({queryKey:[...q.request(e),`body`,t],queryFn:({signal:n})=>Sp(`/api/requests/${K(e)}/bodies/${K(t)}`,n),enabled:n,staleTime:1/0,gcTime:0}),fg=e=>D({queryKey:q.stats(`rate`,e),queryFn:()=>W(`GET`,`/api/stats/rate${G({...e})}`),placeholderData:e=>e,refetchInterval:5e3}),pg=()=>-new Date().getTimezoneOffset(),mg=(e,t,n)=>D({queryKey:q.stats(`summary`,e,t??``,n??``),queryFn:()=>W(`GET`,`/api/stats/summary${G({range:e,client:t,token:n})}`),refetchInterval:15e3,placeholderData:e=>e}),hg=(e,t,n,r,i)=>D({queryKey:q.stats(`timeseries`,e,t,n,r??``,i??``,pg()),queryFn:()=>W(`GET`,`/api/stats/timeseries${G({range:e,groupBy:t,by:n,client:r,token:i,tzOffset:pg()})}`),refetchInterval:3e4,placeholderData:e=>e}),gg=(e,t,n=8,r)=>D({queryKey:q.stats(`top`,e,t??``,n,r??``),queryFn:()=>W(`GET`,`/api/stats/top-models${G({range:e,limit:n,client:t,token:r})}`),refetchInterval:3e4,placeholderData:e=>e}),_g=(e,t,n)=>D({queryKey:q.stats(`providers`,e,n??``,t??``),queryFn:()=>W(`GET`,`/api/stats/providers${G({range:e,client:n,token:t})}`),refetchInterval:3e4,placeholderData:e=>e}),vg=(e=365,t,n)=>D({queryKey:q.stats(`activity`,e,t??``,n??``,pg()),queryFn:()=>W(`GET`,`/api/stats/activity-heatmap${G({days:e,client:t,token:n,tzOffset:pg()})}`),refetchInterval:6e4,placeholderData:e=>e}),yg=e=>D({queryKey:q.stats(`daily-bill`,pg()),queryFn:()=>W(`GET`,`/api/stats/daily-bill${G({tzOffset:pg()})}`),enabled:e,staleTime:0}),bg=()=>D({queryKey:q.plugins,queryFn:()=>W(`GET`,`/api/plugins`),refetchInterval:1e4}),xg=(e=!0)=>D({queryKey:q.pluginHost,queryFn:()=>W(`GET`,`/api/plugins/host`),enabled:e,refetchInterval:15e3}),Sg=e=>D({queryKey:q.pluginJob(e??``),queryFn:()=>W(`GET`,`/api/plugins/jobs/${K(e)}`),enabled:!!e,refetchInterval:e=>e.state.data?.state===`running`||!e.state.data?1e3:!1});function Cg(e){let t=_();return O({mutationFn:e,onSuccess:()=>{t.invalidateQueries({queryKey:q.plugins}),t.invalidateQueries({queryKey:q.pluginHost}),t.invalidateQueries({queryKey:q.clients}),t.invalidateQueries({queryKey:q.providers})}})}var wg=()=>Cg(e=>W(`POST`,`/api/plugins`,e)),Tg=()=>Cg(e=>W(`POST`,`/api/plugins/update`,{spec:e})),Eg=()=>Cg(e=>W(`DELETE`,`/api/plugins${G({spec:e})}`)),Dg=()=>Cg(e=>W(`PATCH`,`/api/plugins${G({spec:e.spec})}`,{enabled:e.enabled,options:e.options})),Og=()=>Cg(e=>W(`PUT`,`/api/plugins/order`,{specs:e})),kg=()=>Cg(e=>W(`POST`,`/api/plugins/prefer`,e)),Ag=()=>Cg(()=>W(`POST`,`/api/plugins/runtime/install`)),jg=(e=!0)=>D({queryKey:q.pluginMarket,queryFn:()=>W(`GET`,`/api/plugins/market`),enabled:e,staleTime:6e5}),Mg=e=>D({queryKey:q.pluginSearch(e),queryFn:()=>W(`GET`,`/api/plugins/search${G({q:e})}`),enabled:e.trim().length>=2,staleTime:6e5}),Ng=(e,t=!0)=>D({queryKey:q.pluginMethods(e),queryFn:()=>W(`GET`,`/api/plugin-providers/${K(e)}/methods`),enabled:t}),Pg=(e,t,n)=>W(`POST`,`/api/plugin-providers/${K(e)}/prompt`,{method:t,inputs:n}),Fg=(e,t,n,r)=>W(`POST`,`/api/plugin-providers/${K(e)}/validate`,{method:t,key:n,value:r});function Ig(e,t){e.invalidateQueries({queryKey:q.providerAccounts(t)}),e.invalidateQueries({queryKey:q.providerUsage(t)}),e.invalidateQueries({queryKey:q.providers})}var Lg=e=>O({mutationFn:t=>W(`POST`,`/api/plugin-providers/${K(e)}/sign-in`,t)}),Rg=(e,t)=>{let n=_();return D({queryKey:q.pluginSignIn(e,t??``),queryFn:async()=>{let r=await W(`GET`,`/api/plugin-providers/${K(e)}/sign-in/${K(t)}`);return r.state===`done`&&Ig(n,e),r},enabled:!!t,refetchInterval:e=>e.state.data?.state===`waiting`||!e.state.data?1500:!1})},zg=e=>{let t=_();return O({mutationFn:t=>W(`POST`,`/api/plugin-providers/${K(e)}/sign-in/${K(t.flow)}/code`,{code:t.code}),onSuccess:n=>{t.setQueryData(q.pluginSignIn(e,n.id),n),n.state===`done`&&Ig(t,e)}})},Bg=e=>{let t=_();return O({mutationFn:t=>W(`POST`,`/api/plugin-providers/${K(e)}/api-key`,t),onSuccess:()=>Ig(t,e)})},Vg=e=>{let t=_();return O({mutationFn:t=>W(`POST`,`/api/plugin-providers/${K(e)}/accounts/${K(t)}/sign-out`),onSuccess:()=>Ig(t,e)})},Hg=(e,t,n)=>D({queryKey:q.pluginUsage(e,t),queryFn:()=>W(`GET`,`/api/plugin-providers/${K(e)}/accounts/${K(t)}/usage`),enabled:n,staleTime:6e4,retry:!1}),Ug=e=>D({queryKey:q.pluginCheckin(e),queryFn:()=>W(`GET`,`/api/plugin-providers/${K(e)}/checkin`)}),Wg=e=>{let t=_();return O({mutationFn:t=>t===void 0?W(`POST`,`/api/plugin-providers/${K(e)}/checkin`):W(`PUT`,`/api/plugin-providers/${K(e)}/checkin`,{on:t}),onSuccess:n=>t.setQueryData(q.pluginCheckin(e),n)})},Gg=(e=!0)=>D({queryKey:q.magpieImport,queryFn:()=>W(`GET`,`/api/plugins/import-magpie`),enabled:e,staleTime:6e4}),Kg=()=>Cg(e=>W(`POST`,`/api/plugins/import-magpie`,{signIns:e})),qg=()=>D({queryKey:q.webhooks,queryFn:()=>W(`GET`,`/api/webhooks`)});function Jg(e){let t=_();return O({mutationFn:e,onSuccess:()=>{t.invalidateQueries({queryKey:q.webhooks}),t.invalidateQueries({queryKey:q.alertRules}),t.invalidateQueries({queryKey:q.alertStates}),t.invalidateQueries({queryKey:[`webhook-deliveries`]})}})}var Yg=()=>Jg(e=>W(`POST`,`/api/webhooks`,e)),Xg=()=>Jg(({id:e,...t})=>W(`PATCH`,`/api/webhooks/${K(e)}`,t)),Zg=()=>Jg(e=>W(`DELETE`,`/api/webhooks/${K(e)}`)),Qg=()=>Jg(e=>W(`POST`,`/api/webhooks/${K(e)}/secret`)),$g=()=>Jg(e=>W(`POST`,`/api/webhooks/${K(e)}/test`)),e_=e=>D({queryKey:q.webhookDeliveries(e??``),queryFn:()=>W(`GET`,`/api/webhooks/${K(e)}/deliveries`),enabled:!!e}),t_=()=>Jg(e=>W(`POST`,`/api/webhook-deliveries/${K(e)}/redeliver`)),n_=()=>D({queryKey:q.alertEvents,queryFn:()=>W(`GET`,`/api/alerts/events`),staleTime:1/0}),r_=()=>D({queryKey:q.alertRules,queryFn:()=>W(`GET`,`/api/alerts/rules`)}),i_=(e=!1)=>D({queryKey:[...q.alertStates,e],queryFn:()=>W(`GET`,`/api/alerts/states${e?`?firing=true`:``}`),refetchInterval:6e4}),a_=()=>Jg(e=>W(`POST`,`/api/alerts/rules`,e)),o_=()=>Jg(({id:e,...t})=>W(`PATCH`,`/api/alerts/rules/${K(e)}`,t)),s_=()=>Jg(e=>W(`DELETE`,`/api/alerts/rules/${K(e)}`));async function c_(e){let t=await fetch(`${xp()}/v1/astra/key`,{headers:{Authorization:`Bearer ${e}`}});if(!t.ok)throw new d_(t.status);return await t.json()}async function l_(e,t={}){let n=await fetch(`${xp()}/v1/astra/key/requests${G({...t,before:t.before??void 0})}`,{headers:{Authorization:`Bearer ${e}`}});if(!n.ok)throw new d_(n.status);return await n.json()}async function u_(e,t){let n=await fetch(`${xp()}/v1/astra/key/stats${G({range:t})}`,{headers:{Authorization:`Bearer ${e}`}});if(!n.ok)throw new d_(n.status);return await n.json()}var d_=class extends Error{status;constructor(e){super(`HTTP ${e}`),this.status=e}},f_=e=>D({queryKey:q.traceTopology(e),queryFn:()=>W(`GET`,`/api/traces/topology${G({range:e})}`),placeholderData:e=>e,refetchInterval:e===`live`?5e3:3e4}),p_=(e=30)=>D({queryKey:q.traceActivity(e),queryFn:()=>W(`GET`,`/api/traces/activity${G({limit:e})}`),placeholderData:e=>e,refetchInterval:15e3}),m_=(e,t)=>D({queryKey:q.traceSessions(e,t),queryFn:()=>W(`GET`,`/api/traces/sessions${G({range:e,client:t})}`),placeholderData:e=>e,refetchInterval:1e4}),h_=(e,t)=>D({queryKey:q.traceSession(e??``,t),queryFn:()=>W(`GET`,`/api/traces/sessions/${K(e)}${G({turn:t})}`),enabled:!!e,placeholderData:e=>e,refetchInterval:e=>e.state.data?.session.active?3e3:!1}),g_=e=>D({queryKey:q.traceRequest(e??``),queryFn:()=>W(`GET`,`/api/traces/requests/${K(e)}`),enabled:!!e,refetchInterval:e=>e.state.data?.inFlight?1e3:!1}),__=()=>D({queryKey:q.smartRouting,queryFn:({signal:e})=>W(`GET`,`/api/smart-routing`,void 0,e),refetchInterval:3e4});function v_(){let e=_();return O({mutationFn:e=>W(`PUT`,`/api/smart-routing`,e),onSuccess:t=>{e.setQueryData(q.smartRouting,t),e.invalidateQueries({queryKey:[`client-models`]}),e.invalidateQueries({queryKey:q.routingModels})}})}var y_=()=>O({mutationFn:e=>W(`POST`,`/api/smart-routing/test`,e)}),b_=()=>D({queryKey:q.routingModels,queryFn:({signal:e})=>W(`GET`,`/api/smart-routing/models`,void 0,e)}),x_=e=>e?.replace(/([a-z0-9])([A-Z])/g,`$1-$2`).toLowerCase();function S_(e,t,n=[]){if(t==null)throw Error(`[lucide]: iconNode is required when icon name is used`);return{name:x_(e),size:24,node:t,...n.length>0?{aliases:n}:{}}}var C_=e=>{let t=``,n=!1;for(let r of e){if(r===`-`||r===`_`||r<=` `){n=t.length>0;continue}t.length===0?t+=r.toLowerCase():t+=n?r.toUpperCase():r,n=!1}return t},w_=e=>{let t=C_(e);return t.charAt(0).toUpperCase()+t.slice(1)},T_=(...e)=>e.filter((e,t,n)=>!!e&&e.trim()!==``&&n.indexOf(e)===t).join(` `).trim(),E_={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`};function D_(e){return e!=null}function O_(e,t={}){let n=t.attributeNames??{},r=e=>n[e]??e,i=e.size??e.width??E_.width,a=e.size??e.height??E_.height,o=e.aliases?.filter(e=>typeof e==`string`&&e.trim()!==``).map(e=>`lucide-${e}`)??[],s=[...e.name?[`lucide-${e.name}`]:[],...o],c=t.className?.split(` `).filter(Boolean)??[],l=t.includeDefaultClasses===!1?T_(...c):T_(`lucide`,...s,...c),u=t.absoluteStrokeWidth?Number(t.strokeWidth??E_[`stroke-width`])*Number(e.size??e.width??E_.width)/Number(t.size??t.width??E_.width):t.strokeWidth??E_[`stroke-width`];return[`svg`,{...Object.entries(E_).reduce((e,[t,n])=>(e[r(t)]=n,e),{}),...`color`in t&&t.color&&{[r(`stroke`)]:t.color},...`size`in t&&D_(t.size)&&{[r(`width`)]:t.size,[r(`height`)]:t.size},...`width`in t&&D_(t.width)&&{[r(`width`)]:t.width},...`height`in t&&D_(t.height)&&{[r(`height`)]:t.height},[r(`stroke-width`)]:u,...l&&{[r(`class`)]:l},[r(`viewBox`)]:`0 0 ${i} ${a}`,...t.hasA11yProp===!1?{[r(`aria-hidden`)]:`true`}:{},...`attributes`in t&&t.attributes},e.node.map(e=>{let[n,i,a]=e,o=t.nonScalingStroke?{[r(`vector-effect`)]:`non-scaling-stroke`,...i}:i;return a?[n,o,a]:[n,o]})]}function k_(e,t={}){return O_(e,{...t,attributeNames:{...t.attributeNames,class:`className`,"stroke-width":`strokeWidth`,"stroke-linecap":`strokeLinecap`,"stroke-linejoin":`strokeLinejoin`,"vector-effect":`vectorEffect`}})}var A_=e=>{for(let t in e)if(t.startsWith(`aria-`)||t===`role`||t===`title`)return!0;return!1},j_=(0,m.createContext)({}),M_=()=>(0,m.useContext)(j_),N_=(0,m.forwardRef)(({color:e,size:t,width:n,height:r,strokeWidth:i,absoluteStrokeWidth:a,nonScalingStroke:o,className:s=``,children:c,iconNode:l=[],icon:u={node:l,aliases:[],size:24},...d},f)=>{let{size:p=24,strokeWidth:h=2,absoluteStrokeWidth:g=!1,nonScalingStroke:_=!1,color:v=`currentColor`,className:y=``}=M_()??{},b=!!c||A_(d),[x,S,C=[]]=k_(u,{color:e??v,width:n??t??p,height:r??t??p,strokeWidth:i??h,absoluteStrokeWidth:a??g,nonScalingStroke:o??_,className:T_(y,s),hasA11yProp:b,attributes:d});return(0,m.createElement)(x,{ref:f,...S},[...C.map(([e,t])=>(0,m.createElement)(e,t)),...Array.isArray(c)?c:[c]])});function J(e,t=[],n=[]){let r=typeof e==`string`?S_(e,t,n):e,i=(0,m.forwardRef)(({className:e,...t},n)=>(0,m.createElement)(N_,{ref:n,icon:r,className:e,...t}));return r.name&&(i.displayName=w_(r.name)),i}var P_={name:`check`,size:24,node:[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]};P_.node;var F_=J(P_),I_={name:`chevron-down`,size:24,node:[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]};I_.node;var L_=J(I_),R_={name:`circle-alert`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]],aliases:[`alert-circle`]};R_.node;var z_=J(R_),B_={name:`circle-x`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`m15 9-6 6`,key:`1uzhvr`}],[`path`,{d:`m9 9 6 6`,key:`z0biqf`}]],aliases:[`x-circle`]};B_.node;var V_=J(B_),H_={name:`copy`,size:24,node:[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]};H_.node;var U_=J(H_),W_={name:`file-code-corner`,size:24,node:[[`path`,{d:`M4 12.15V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2h-3.35`,key:`1wthlu`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`m5 16-3 3 3 3`,key:`331omg`}],[`path`,{d:`m9 22 3-3-3-3`,key:`lsp7cz`}]],aliases:[`file-code-2`]};W_.node;var G_=J(W_),K_={name:`folder`,size:24,node:[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]};K_.node;var q_=J(K_),J_={name:`globe`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20`,key:`13o1zl`}],[`path`,{d:`M2 12h20`,key:`9i4pu4`}]]};J_.node;var Y_=J(J_),X_={name:`info`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`path`,{d:`M12 16v-4`,key:`1dtifu`}],[`path`,{d:`M12 8h.01`,key:`e9boi3`}]]};X_.node;var Z_=J(X_),Q_={name:`puzzle`,size:24,node:[[`path`,{d:`M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z`,key:`w46dr5`}]]};Q_.node;var $_=J(Q_),ev={name:`search`,size:24,node:[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]};ev.node;var tv=J(ev),nv={name:`triangle-alert`,size:24,node:[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`alert-triangle`]};nv.node;var rv=J(nv),iv={name:`x`,size:24,node:[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]};iv.node;var av=J(iv),ov={"common.cancel":`取消`,"common.confirm":`确定`,"common.close":`关闭`,"common.save":`保存`,"common.saved":`已保存`,"common.revert":`还原`,"common.apply":`应用`,"common.delete":`删除`,"common.edit":`编辑`,"common.add":`添加`,"common.create":`创建`,"common.back":`返回`,"common.done":`完成`,"common.more":`更多`,"common.copy":`复制`,"common.copied":`已复制到剪贴板`,"common.refresh":`刷新`,"common.enabled":`启用`,"common.yes":`是`,"common.no":`否`,"common.prev":`上一页`,"common.next":`下一页`,"common.noData":`暂无数据`,"common.selectAll":`全选`,"common.unsaved":`有未保存的更改`,"common.invalidJson":`JSON 格式不正确`,"common.search":`搜索`,"common.clearSearch":`清空搜索`,"common.select":`请选择`,"common.noResults":`没有匹配项`,"common.error":`操作失败`,"pricing.tierMode":`计费方式`,"pricing.outputPolicy":`输出价格`,"pricing.editMode":`编辑方式`,"pricing.days":`生效日`,"models.sync.change":`变更`,"models.sync.changeOne":`项变更`,"models.sync.changeOther":`项变更`,"common.continue":`继续`,"providers.step.template":`选择模板`,"providers.step.details":`填写信息`,"clients.current":`当前提供商`,"common.deleting":`正在删除`,"common.deleted":`已删除`,"common.retry":`重试`,"providers.modelIds":`模型 ID`,"nav.overview":`概览`,"nav.requests":`请求日志`,"nav.traces":`链路追踪`,"nav.clients":`客户端`,"nav.providers":`提供商`,"nav.models":`模型`,"nav.settings":`设置`,"nav.privacy":`隐私护栏`,"nav.tokens":`令牌`,"nav.group.config":`配置`,"nav.group.system":`系统`,"shell.running":`服务运行中`,"shell.discord":`Discord 社区`,"shell.github":`GitHub 仓库`,"shell.connecting":`正在连接…`,"shell.disconnected":`未连接到服务`,"shell.startService":`启动服务`,"shell.startFailed":`服务启动失败`,"shell.collapseSidebar":`收起侧边栏`,"shell.expandSidebar":`展开侧边栏`,"banner.downDesktop":`无法连接 Astra 服务。可以在这里启动,或从菜单栏图标启动。`,"banner.downWeb":`无法连接 Astra 服务,正在重连…(可在终端运行 astra start)`,"banner.mismatch":`服务端 API 版本与界面不一致,请运行 astra update 后重启。`,"banner.loginRequired":`服务端拒绝了本机的管理请求(要求登录),页面因此读不到数据。通常是服务端版本过旧,请运行 astra update 后重启。`,"banner.clientsOutdated":`{names} 的配置还是旧的 Astra 地址或设置(例如 Astra 换了端口),更新后才能正常连接。`,"banner.clientsUpdate":`一键更新`,"banner.clientsUpdated":`已更新 {names},部分客户端需要重启后生效`,"login.subtitle":`该服务对外监听,请输入管理密码`,"login.password":`管理密码`,"login.submit":`登录`,"range.today":`今日`,"range.7d":`7 天`,"range.30d":`30 天`,"range.90d":`90 天`,"range.all":`全部`,"bill.generate":`生成账单`,"bill.title":`今日账单`,"bill.description":`按提供商和模型汇总今天的消费,可复制或保存为图片。`,"bill.style":`账单样式`,"bill.style.receipt":`小票`,"bill.style.manga":`漫画`,"bill.copy":`复制图片`,"bill.save":`保存 PNG`,"bill.copied":`账单图片已复制`,"bill.saved":`账单图片已保存`,"bill.copyFailed":`复制图片失败:{error}`,"bill.saveFailed":`保存图片失败:{error}`,"bill.subtitle":`本地 AI 网关 · 每日消费小票`,"bill.field.date":`日期`,"bill.field.window":`区间`,"bill.field.number":`单号`,"bill.field.currency":`币种`,"bill.field.requests":`请求合计`,"bill.field.successRate":`成功率`,"bill.field.input":`输入 Token`,"bill.field.output":`输出 Token`,"bill.count":`{count} 次`,"bill.modelLine":`{requests} 次 · 入 {input} / 出 {output}`,"bill.subtotal":`小计`,"bill.total":`合计 TOTAL`,"bill.estimate":`金额按各模型定价估算 · 仅供参考`,"bill.thanks":`* 感谢使用 ASTRA GATE *`,"bill.empty":`— 今日暂无消费 —`,"bill.manga.kicker":`ASTRA GATE 每日账单`,"bill.manga.until":`截至 {time}`,"bill.manga.say":`今天一共花掉 {total}!`,"bill.manga.top":`{provider} 一家就占了 {share} 哦~`,"bill.manga.sayEmpty":`今天还没有花钱哦~`,"bill.manga.strip":`{requests} REQ · {tokens} TOKENS`,"bill.manga.facts":`{requests} 次请求 · 成功率 {rate}`,"bill.manga.seal":`已结算`,"overview.cost":`费用`,"overview.requests":`请求数`,"overview.successRate":`成功率`,"overview.tokens":`Token`,"overview.avgTtft":`平均 TTFT`,"overview.costTrend":`费用趋势`,"overview.range":`时间范围`,"overview.measure":`指标`,"overview.trend":`趋势`,"overview.tokensContext":`输入 {input} · 输出 {output}`,"overview.hourlyAverage":`每小时平均`,"overview.dailyAverage":`每日平均`,"overview.total":`合计`,"overview.hour":`小时`,"overview.day":`日期`,"overview.by.model":`模型`,"overview.by.provider":`提供商`,"overview.by.client":`客户端`,"overview.by.token":`令牌`,"overview.other":`其他`,"overview.topModels":`费用最高的模型`,"overview.topModelDetail":`{requests} 次请求 · {tokens} tokens`,"overview.empty.title":`还没有请求`,"overview.empty.detail":`在「客户端」中启用一个客户端,或把任意 OpenAI / Anthropic / Gemini 兼容工具指向下面的网关地址。`,"overview.clientFilter":`按客户端筛选`,"overview.allClients":`全部`,"overview.tokenFilter":`按令牌筛选`,"overview.allTokens":`全部令牌`,"overview.clientEmpty.title":`{client} 暂无请求`,"overview.clientEmpty.detail":`{range}内没有来自该客户端的请求,可切换到其他客户端或时间范围。`,"overview.tokenEmpty.title":`{token} 暂无请求`,"overview.tokenEmpty.detail":`{range}内没有使用该令牌的请求,可切换到其他令牌或时间范围。`,"overview.totalCost":`总成本`,"overview.totalRequests":`总请求数`,"overview.usageTrend":`使用趋势`,"overview.breakdown":`明细`,"overview.viewAll":`查看全部`,"overview.col.input":`输入`,"overview.col.output":`输出`,"overview.col.cacheHit":`缓存命中`,"overview.col.speed":`速度`,"overview.col.share":`占比`,"overview.activity":`活跃度`,"overview.activitySummary":`{from} ~ {to} · {active} / {days} 天有活动`,"overview.activityPeak":`最多 {count} 次/天`,"overview.activityUnit":`次请求`,"overview.activityNone":`无活动`,"overview.activityLegend.less":`少`,"overview.activityLegend.more":`多`,"requests.total":`共 {count} 条`,"requests.totalCost":`消费总额`,"requests.totalCost.hint":`当前筛选条件下全部请求(含所有分页)的费用合计;进行中的请求完成后计入。`,"requests.rate.rpm":`RPM`,"requests.rate.tpm":`TPM`,"requests.rate.hint":`最近 {window} 秒的平均每分钟请求数(RPM)、令牌数(TPM,仅已完成请求)与缓存命中率;跟随当前筛选,每 5 秒自动刷新。`,"requests.elapsed":`已等待(尚未收到首个 token)`,"requests.searchModel":`搜索模型 ID(支持关键字)`,"requests.noFilters":`未设置筛选`,"requests.clearFilters":`清空筛选`,"requests.backToFilters":`返回筛选字段`,"requests.removeFilter":`移除筛选:{filter}`,"requests.filterAdded":`已添加筛选:{filter}`,"requests.filterChanged":`已修改筛选:{filter}`,"requests.filterRemoved":`已移除筛选:{filter}`,"requests.filtersCleared":`已清空全部筛选`,"requests.filteredEmpty":`没有符合筛选条件的记录`,"requests.filteredEmpty.detail":`试试其他模型关键字,或清空筛选条件。`,"requests.returnedModel":`返回:{model}`,"requests.modelMatch":`一致`,"requests.modelMismatch":`不一致`,"requests.modelComparison":`请求:{requested};上游发送:{upstream};API 返回:{returned}`,"requests.modelNotRecorded":`未记录`,"requests.modelNotRecorded.hint":`历史记录或 API 未返回模型 ID;不会用请求模型代替。`,"requests.modelPending":`等待中`,"requests.modelPending.hint":`请求结束后记录 API 返回的模型 ID。`,"requests.mappedModel.hint":`实际发给上游的模型:{model}(客户端角色映射或提供商模型映射)`,"requests.allClients":`全部客户端`,"requests.allTokens":`全部令牌`,"requests.col.token":`令牌`,"requests.detail.account":`订阅账号`,"requests.direct":`直连`,"requests.allProviders":`全部提供商`,"requests.allStatus":`全部状态`,"requests.col.time":`时间`,"requests.col.client":`客户端`,"requests.col.model":`模型`,"requests.col.provider":`提供商`,"requests.col.status":`状态`,"requests.col.ttft":`TTFT`,"requests.col.tps":`TPS`,"requests.col.tokens":`输入/输出`,"requests.col.cost":`费用`,"requests.empty":`没有请求记录`,"requests.empty.detail":`经过 Astra 的每次请求都会记录在这里,包括逐项 token 与计费明细。`,"requests.page":`第 {page} / {pages} 页`,"requests.filters":`当前筛选`,"requests.addFilter":`添加筛选`,"requests.openDetail":`查看 {model} 的请求详情`,"requests.viewError":`点击查看错误信息`,"requests.detail.title":`请求详情`,"requests.detail.summary":`概要`,"requests.detail.protocol":`协议`,"requests.detail.requestedModel":`请求模型`,"requests.detail.upstreamModel":`上游发送模型`,"requests.detail.responseModel":`API 返回模型`,"requests.detail.systemModel":`系统模型`,"requests.detail.stream":`流式`,"requests.detail.upstreamId":`上游请求 ID`,"requests.detail.timing":`耗时`,"requests.detail.generation":`生成耗时`,"requests.detail.total":`总耗时`,"requests.detail.tps":`输出速度`,"requests.detail.error":`错误`,"requests.detail.privacy":`隐私护栏`,"requests.detail.privacyBlocked":`该请求被拦截`,"requests.detail.privacyDryRun":`试运行(未处理)`,"requests.detail.privacyRedacted":`已脱敏 {count} 处`,"requests.detail.billing":`计费`,"requests.detail.usageMissing":`上游未返回用量,本次请求记为 0。`,"requests.detail.usageRaw":`原始 usage`,"requests.detail.pricingSnapshot":`价格快照`,"requests.body.clientRequest":`客户端请求体`,"requests.body.upstreamRequest":`上游请求体`,"requests.body.upstreamRequestHeaders":`上游请求头(发往提供商,凭据脱敏)`,"requests.body.upstreamResponse":`上游响应体`,"requests.body.clientResponse":`返回客户端的响应体`,"requests.body.truncated":`内容较大,仅显示前 {shown}(共 {total})`,"requests.body.loadAll":`加载全部`,"requests.reasoning":`推理`,"requests.routing.grade":`档位`,"requests.routing.judgeMs":`判定耗时`,"requests.routing.fallback":`回退 {grade}({reason})`,"requests.routing.moved":`{from} → {grade}(用不到)`,"requests.routing.hint.judge":`判定为「{grade}」(把握 {percent}%),发往 {model}`,"requests.routing.hint.reused":`{source}:「{grade}」,发往 {model}`,"requests.routing.hint.fallback":`没用上判定({reason}),走了回退档位「{grade}」,发往 {model}`,"requests.routing.hint.moved":`判定为「{from}」,但用不到({reason}),改用「{grade}」,发往 {model}`,"requests.reasoning.notRecorded":`未记录`,"requests.reasoning.budget":`预算 {tokens}`,"requests.reasoning.hint":`客户端请求中明确设置的推理配置;未记录表示该请求未设置或为旧日志,不会用预算或提供商默认值推断。`,"requests.detail.reasoning":`推理强度`,"status.success":`成功`,"status.blocked":`已拦截`,"status.upstream_error":`上游错误`,"status.gateway_error":`网关错误`,"status.client_cancelled":`已取消`,"status.pending":`进行中`,"billing.unpriced":`未配置价格`,"billing.type":`类型`,"billing.tokens":`数量`,"billing.unitPrice":`单价 /1M`,"billing.tier":`档位`,"billing.cost":`费用`,"pricingSource.override":`提供商自定义价`,"pricingSource.provider":`提供商价格 · {key}`,"pricingSource.default":`官方默认价`,"pricingSource.none":`无价格`,"simulator.official":`官方默认价`,"simulator.serviceTier":`service_tier`,"simulator.time":`请求时间(用于时段计费)`,"simulator.run":`计算`,"simulator.pickDate":`选择日期`,"simulator.pickTime":`选择时间`,"simulator.selectedDate":`已选 {date}`,"simulator.clearDate":`清除`,"pricing.none":`尚未配置价格`,"pricing.add":`添加价格`,"pricing.remove":`移除价格`,"pricing.mode.form":`表单`,"pricing.unit":`USD / 百万 tokens`,"pricing.base":`基础价格`,"pricing.perRequest":`每次请求`,"pricing.notes":`备注`,"pricing.name":`名称`,"pricing.contextTiers":`上下文分档`,"pricing.contextTiers.hint":`输入 token 超过阈值时改用另一档价格(如 Claude >200K)。`,"pricing.addTier":`添加分档`,"pricing.threshold":`阈值`,"pricing.mode.whole":`整单套用`,"pricing.mode.progressive":`分段累进`,"pricing.output.highest":`输出按最高档`,"pricing.output.base":`输出按基础价`,"pricing.timeWindows":`时段规则`,"pricing.timeWindows.hint":`按时区和时段调整价格(如 DeepSeek 夜间优惠),可排除节假日。`,"pricing.addWindow":`添加时段`,"pricing.excludeDates":`排除日期 yyyy-MM-dd, …`,"pricing.serviceTiers":`服务等级`,"pricing.serviceTiers.hint":`按 service_tier(flex / priority)调整价格。`,"pricing.addServiceTier":`添加等级`,"pricing.hasOwnPrices":`含独立价格(JSON 编辑)`,"pricing.ruleNameTaken":`该服务等级名称已存在`,"pricing.timezone":`时区`,"pricing.invalidTimezone":`请输入有效的 IANA 时区`,"pricing.start":`开始时间`,"pricing.end":`结束时间`,"pricing.multiplier":`倍率`,"clients.subtitle":`让本机的 AI 客户端通过 Astra 访问模型`,"clients.comingSoon":`即将支持`,"clients.comingSoonDetail":`该客户端的配置方式尚未确认`,"clients.drifted":`配置已被修改`,"clients.search":`搜索客户端`,"clients.warning.drifted":`客户端配置与 Astra 记录的不一致,启用或还原前请先检查。`,"clients.enabled":`已启用`,"clients.filter.all":`全部 {count}`,"clients.filter.enabled":`已接管 {count}`,"clients.filter.attention":`需处理 {count}`,"clients.filter.label":`筛选客户端`,"clients.filter.empty":`没有符合条件的客户端`,"clients.tab.routing":`路由`,"clients.tab.models":`模型与令牌`,"clients.tab.options":`选项`,"clients.tab.maintenance":`版本与备份`,"clients.addProvider":`添加提供商`,"clients.searchProviders":`搜索提供商`,"clients.pending":`{count} 项更改尚未写入客户端配置`,"clients.pending.discard":`放弃`,"clients.pending.apply":`写入配置`,"clients.drift.review":`检查并重新写入`,"clients.disabled":`未启用`,"clients.detected":`已检测到 {version}`,"clients.notDetected":`未检测到安装`,"clients.group.installed":`已安装`,"clients.group.notInstalled":`未检测到`,"clients.group.comingSoon":`即将支持`,"clients.group.expand":`展开{group}`,"clients.group.collapse":`收起{group}`,"clients.checkUpdates":`检查更新`,"clients.updatesFound":`{count} 个客户端有新版本`,"clients.allUpToDate":`所有客户端都是最新版本`,"clients.updateBadge":`可更新`,"clients.shadowedBadge":`需调整 PATH`,"clients.updateTo":`更新到 {version}`,"clients.install":`安装`,"clients.download":`下载`,"clients.installRunning":`进行中…`,"clients.versionTitle":`版本与更新`,"clients.currentVersion":`当前版本`,"clients.latestVersion":`最新版本`,"clients.versionUnknown":`版本未知`,"clients.notInstalled":`未安装`,"clients.latestUnknown":`未检查`,"clients.checkedAt":`检查于 {time}`,"clients.installMethod":`安装方式`,"clients.method.npm":`npm 全局包 {package}`,"clients.method.vscode-extension":`VS Code 扩展 {package}`,"clients.method.script":`官方安装脚本`,"clients.method.manual":`从官网下载安装`,"clients.homepage":`官网`,"clients.blocker.npm-missing":`没有找到 npm。先安装 Node.js(自带 npm),再回来安装。`,"clients.blocker.vscode-missing":`没有找到 VS Code 的 code 命令,请先安装 VS Code。`,"clients.blocker.script-missing":`这个系统上没有对应的安装脚本,请从官网手动安装。`,"clients.blocker.external-install":`{path} 不是通过 npm 安装的,请用原来的安装方式更新。`,"clients.blocker.shadowed":`最新版本已经装在另一个位置,再更新一次也不会改变终端里运行的版本;按上面的提示调整 PATH 即可。`,"clients.installLog":`安装日志`,"clients.noInstallLog":`还没有安装记录`,"clients.job.running":`正在运行…`,"clients.job.succeeded":`已完成`,"clients.job.failed":`失败`,"clients.job.cancelled":`已停止`,"clients.hint.permission-denied":`npm 没有权限写入全局目录(通常是之前用 sudo 安装过,目录属于系统管理员)。`,"clients.hint.admin-cancelled":`已取消管理员授权,没有做任何修改。`,"clients.hint.shadowed":`新版本装到了另一个位置,终端里运行的仍是旧的那一份。具体位置见下面的日志。`,"clients.hint.unchanged":`命令执行成功,但版本没有变化。`,"clients.hint.not-on-path":`装好的命令不在终端的 PATH 里,终端里无法直接运行。具体位置见下面的日志。`,"clients.job.notEffective":`已完成,但没有生效`,"clients.notEffectiveToast":`{name} 的命令执行成功,但没有生效,请查看安装日志`,"clients.otherCopy":`其他副本`,"clients.otherCopyNewer":`更新`,"clients.shadowed.title":`已有新版本 {version},但终端里用不到`,"clients.shadowed.detail":`终端运行的是 {path}({version}),更新的版本在 {other},它在 PATH 中排在后面或不在 PATH 里。把 {dir} 放到 PATH 最前面,或删掉旧的那一份,就会用上新版本。`,"clients.notOnPath.title":`不在终端的 PATH 里`,"clients.notOnPath.detail":`这个客户端装在 {dir},但终端的 PATH 里没有这个目录。把它加入 PATH(例如写进 ~/.zshrc)后,才能在终端直接运行。`,"clients.hint.timeout":`超过 15 分钟没有完成,已停止。`,"clients.admin.badge":`需管理员权限`,"clients.admin.tip":`npm 的全局目录属于系统管理员,安装时 macOS 会弹出授权框,需要输入开机密码`,"clients.admin.tipManual":`npm 的全局目录属于系统管理员,需要在终端用 sudo 运行`,"clients.admin.title":`需要管理员权限`,"clients.admin.prompt":`npm 的全局目录属于系统管理员。点击「授权并开始」后,系统会弹出授权框,输入开机密码(或使用触控 ID)即可;Astra 不会接触你的密码。`,"clients.admin.manual":`npm 的全局目录属于系统管理员,这里无法弹出授权框。请复制下面的命令,在终端中运行。`,"clients.admin.start":`授权并开始`,"clients.admin.copyCommand":`复制命令`,"clients.admin.retry":`以管理员身份重试`,"clients.admin.retryHint":`可以点「以管理员身份重试」,系统会弹出授权框。`,"clients.admin.running":`正在以管理员身份运行,命令结束后才会显示输出,运行中无法停止。`,"clients.admin.fixTip":`想以后安装、更新都不再需要管理员权限,可以在终端执行一次下面的命令,把 npm 全局目录交还给当前用户:`,"clients.installTitle":`安装 {name}`,"clients.updateTitle":`更新 {name}`,"clients.installRunDetail":`将在本机运行下面的命令,输出会实时显示在这里。`,"clients.installStart":`开始`,"clients.installStop":`停止`,"clients.installUnavailable":`当前无法执行这个操作`,"clients.installNpmNote":`全局安装会写入 npm 的全局目录;关闭窗口不会中断安装。`,"clients.installedToast":`{name} 已安装`,"clients.updatedToast":`{name} 已更新`,"clients.uninstall":`卸载`,"clients.uninstallTitle":`卸载 {name}`,"clients.uninstallRunDetail":`将在本机运行下面的命令,把这个客户端删除,输出会实时显示在这里。`,"clients.uninstallRestoreTitle":`会先恢复原始配置`,"clients.uninstallRestoreDetail":`Astra 正在接管 {name} 的配置。卸载前会先把配置恢复到接管前的样子(你手动改过的配置项保持不变),然后再运行卸载命令。`,"clients.uninstallKeepsData":`只删除程序本身,客户端自己的数据和配置文件会保留。`,"clients.uninstallManual":`这个客户端由官方安装程序安装,Astra 不会自动卸载,请按官网说明卸载。`,"clients.uninstallExternal":`{path} 不是通过 npm 安装的,请用原来的安装方式卸载。`,"clients.uninstallBuiltIn":`这个扩展是 VS Code 自带的,无法单独卸载。`,"clients.uninstalledToast":`{name} 已卸载`,"clients.hint.still-installed":`卸载命令执行成功,但仍能找到这个客户端(另一份不是通过这种方式安装的)。具体位置见下面的日志。`,"clients.enable":`启用…`,"clients.disable":`禁用`,"clients.disableRestore":`禁用并还原`,"clients.pickProviderFirst":`请先在下方选择一个提供商`,"clients.appliedAt":`于 {time} 写入配置`,"clients.bound":`已切换到 {provider},立即生效`,"clients.boundModelsSynced":`已切换到 {provider},并同步了 {client} 配置里的模型列表`,"clients.disableConfirm":`禁用 {name}?`,"clients.disableDetail":`会撤销 Astra 写入的配置项,恢复为启用前的状态。`,"clients.disabledToast":`{name} 已禁用并还原配置`,"clients.driftTitle":`部分配置已被手动修改`,"clients.driftDetail":`以下配置项在启用后被改动过,未自动还原:{keys}。是否强制还原?`,"clients.forceRestore":`强制还原`,"clients.repair.title":`{name} 读不了这个配置文件:它不是标准 JSON`,"clients.repair.problem.trailing-comma":`第 {line} 行有多余的逗号`,"clients.repair.problem.comment":`第 {line} 行有注释`,"clients.repair.hint":`修复只删掉多余的逗号和注释,其余内容不变;修改前会先备份。`,"clients.repair.action":`修复`,"clients.repair.done":`已修复 {name} 的配置文件`,"clients.providerTitle":`使用的提供商`,"clients.providerFooter":`可以添加多个提供商并拖动排序:请求的模型(按模型 ID 精确匹配,或提供商的模型映射)由排在最前、提供该模型的提供商处理;都没有时交给第一个。修改立即生效,客户端的模型列表会自动包含所有提供商的模型。`,"clients.primaryProvider":`首选`,"clients.dragToReorder":`拖动调整 {provider} 的顺序`,"clients.removeProvider":`移除 {provider}`,"clients.providerDisabledBadge":`已停用`,"clients.moreProvidersTitle":`可添加的提供商`,"clients.providerAdded":`已添加 {provider},立即生效`,"clients.providerRemoved":`已移除 {provider}`,"clients.providerOrderSaved":`已更新提供商顺序,立即生效`,"clients.providersModelsSynced":`已更新提供商,并同步了 {client} 配置里的模型列表`,"clients.accountTitle":`订阅账号`,"clients.accountFooter":`绑定到具体账号,用量按账号统计;留空使用该提供商的默认账号。`,"clients.account":`账号`,"clients.accountDefault":`默认账号`,"clients.noProviders":`还没有可用的提供商`,"clients.noProvidersDetail":`先添加一个 AI 提供商,再为客户端选择它。`,"clients.modelTitle":`模型`,"clients.modelFooter":`启用时写入客户端配置的默认模型;不设置则使用客户端自己的默认值。`,"clients.modelFooterEnabled":`修改默认模型需要重新写入客户端配置。`,"clients.modelSlotsFooter":`选中的模型会写进 Claude Code 的配置(默认模型 ANTHROPIC_MODEL,各档位 ANTHROPIC_DEFAULT_*_MODEL);留空就不写入,配置文件里已有的同名设置也不会被改动。`,"clients.modelSlotsFooterEnabled":`修改后需要重新写入客户端配置。`,"clients.options.title":`专属设置`,"clients.options.footer":`这些设置只对当前客户端生效;写入客户端配置的项目会在启用时一并写入,“网关”类的项目由 Astra 在转发该客户端请求时处理。`,"clients.options.footerEnabled":`修改后需要重新应用。`,"clients.options.unset":`不设置`,"clients.protocols.title":`模型协议`,"clients.protocols.footer":`每个模型默认走它的原生协议,网关原样转发、不做转换;也可以给单个模型指定别的协议,由网关转换。在客户端自己的设置里改的协议也会记录到这里。`,"clients.protocols.footerEnabled":`修改后需要重新应用。`,"clients.protocols.auto":`自动 · {protocol}`,"clients.protocols.autoTranslated":`自动 · {protocol}(网关转换)`,"clients.protocols.native":`原生协议:{protocols}`,"clients.protocols.noNative":`没有这个客户端能用的原生协议,由网关转换`,"clients.option.context1m":`1M 上下文`,"clients.option.context1m.hint":`给 Claude Code 的模型名自动加 [1m] 后缀(Haiku 档和已知窗口不足 1M 的模型除外)。需要上游支持 1M 上下文。`,"clients.option.cacheTtl":`缓存时长`,"clients.option.cacheTtl.hint":`给客户端已有的 cache_control 补上 5 分钟或 1 小时的 ttl,不增删缓存断点。1 小时的写入价更高,适合长会话。`,"clients.option.maxThinkingTokens":`思考 token 上限`,"clients.option.maxThinkingTokens.hint":`写入 MAX_THINKING_TOKENS;留空则不设置。`,"clients.option.disablePromptCaching":`关闭提示缓存`,"clients.option.disablePromptCaching.hint":`写入 DISABLE_PROMPT_CACHING=1,客户端不再发送缓存断点。`,"clients.option.autoModeServerOff":`关闭 auto 模式的服务端审查`,"clients.option.autoModeServerOff.hint":`写入 CLAUDE_CODE_AUTO_MODE_SERVER=0:auto 模式不再向服务端请求审查,改用 Claude Code 自带的分类器。上游不支持服务端审查、auto 模式反复要求手动确认时打开。`,"clients.option.contextWindow":`上下文窗口`,"clients.option.contextWindow.hint":`写入 model_context_window;留空则用 Codex 默认值。`,"clients.option.autoCompactTokenLimit":`自动压缩阈值`,"clients.option.autoCompactTokenLimit.hint":`写入 model_auto_compact_token_limit,达到后自动压缩会话;留空则不设置。`,"clients.option.reasoningEffort":`推理强度`,"clients.option.reasoningEffort.hint":`写入 model_reasoning_effort;默认则不设置。`,"clients.option.modelCatalog":`写入模型目录`,"clients.option.modelCatalog.hint":`把所绑定提供商的模型追加到 Codex 的模型目录(~/.codex/astra-models.json,由 model_catalog_json 指向),原有模型全部保留。需要先运行过一次 Codex(生成 models_cache.json);Codex 只在启动时读取目录,模型变化后需重启 Codex。`,"clients.optionChoice.default":`默认`,"clients.optionChoice.5m":`5 分钟`,"clients.optionChoice.1h":`1 小时`,"clients.optionChoice.minimal":`最低`,"clients.optionChoice.low":`低`,"clients.optionChoice.medium":`中`,"clients.optionChoice.high":`高`,"clients.modelSlot.ANTHROPIC_MODEL":`默认模型`,"clients.modelSlot.ANTHROPIC_DEFAULT_FABLE_MODEL":`Fable 档位`,"clients.modelSlot.ANTHROPIC_DEFAULT_OPUS_MODEL":`Opus 档位`,"clients.modelSlot.ANTHROPIC_DEFAULT_SONNET_MODEL":`Sonnet 档位`,"clients.modelSlot.ANTHROPIC_DEFAULT_HAIKU_MODEL":`Haiku 档位(快速/后台)`,"clients.defaultModel":`默认模型`,"clients.modelPlaceholder":`选择模型`,"clients.modelUnset":`不设置`,"clients.roleMapTitle":`角色映射`,"clients.roleMapFooter":`Claude Desktop 只认 Sonnet / Opus / Haiku 这类角色模型,Astra 会把它们换成这里选的提供商模型。至少设置一个;没设置的角色使用第一个已设置的。`,"clients.roleMapFooterEnabled":`映射在网关中实时生效,点击应用后保存。`,"clients.roleMapRequired":`请至少为一个角色选择模型`,"clients.roleMapHint":`启用前,请先在下方「角色映射」中为至少一个角色(Sonnet / Opus / Haiku)选择模型`,"clients.roleMapGoto":`去设置角色映射`,"clients.role.sonnet":`Sonnet`,"clients.role.opus":`Opus`,"clients.role.haiku":`Haiku`,"clients.maintenance":`维护`,"clients.openConfigDir":`在访达中打开配置目录`,"clients.copyConfigPath":`复制配置文件路径`,"clients.backups":`配置备份`,"clients.backupsDetail":`每次修改前自动备份,可随时恢复。`,"clients.noBackups":`还没有备份`,"clients.firstWrite":`首次修改前`,"clients.restore":`恢复`,"clients.restoreConfirm":`用这个备份覆盖当前配置?`,"clients.restored":`已从备份恢复`,"clients.tokenTitle":`令牌`,"clients.token":`写入配置的令牌`,"clients.tokenFooter":`启用时把「令牌.客户端」写入客户端配置,用量按令牌统计。多个客户端可以共用一个令牌。`,"clients.tokenFooterEnabled":`更换令牌需要重新写入客户端配置。`,"clients.tokenDisabled":`{name}(已停用)`,"clients.manageTokens":`管理令牌`,"clients.claudeDirect.configure":`直连设置`,"clients.claudeDirect.modeTitle":`连接方式(Astra 启动器)`,"clients.claudeDirect.mode":`连接方式`,"clients.claudeDirect.gateway":`网关`,"clients.claudeDirect.direct":`官方直连`,"clients.claudeDirect.gatewayDetail":`使用原有网关配置;启用接管后,默认 Claude Code 请求经过 Astra。astra claude 仅用于直连模式。`,"clients.claudeDirect.directDetail":`用下面选中的 Claude 订阅账号直连 Anthropic 官方,不经过网关。`,"clients.claudeDirect.modeNote":`这里只影响 Astra 启动器自己的会话;直接运行 claude 仍是原来的默认配置。`,"clients.claudeDirect.modeFooter":`切换只改变启动方式,不会热切换已经运行的会话,也不会修改用户默认的 ~/.claude 配置。`,"clients.claudeDirect.loadFailed":`无法读取直连设置`,"clients.claudeDirect.gatewayOnTitle":`网关接管已启用,直连会被覆盖`,"clients.claudeDirect.gatewayOnDetail":`当前 Claude Code 已由 Astra 接管:直连会被立刻写回网关配置。要真正直连,请先在上方「禁用并还原」,再切到官方直连。`,"clients.claudeDirect.noAccount":`还没有可用的 Claude 订阅账号`,"clients.claudeDirect.noAccountDetail":`直连用的是「Claude 订阅(Pro/Max)」提供商下已登录的账号;去「提供商」登录一个,再回到这里选择。`,"clients.claudeDirect.goProviders":`去提供商登录`,"clients.claudeDirect.needAccountToast":`先在「提供商」里登录 Claude 订阅账号`,"clients.claudeDirect.accountsTitle":`订阅账号`,"clients.claudeDirect.accountsFooter":`直连使用该订阅账号的短期令牌直连 Anthropic 官方,不经过网关;令牌留在 Astra 本机,不会写进命令或客户端配置。`,"clients.claudeDirect.account":`使用的账号`,"clients.claudeDirect.accountDisabledSuffix":`{status}(未启用)`,"clients.claudeDirect.launchTitle":`启动`,"clients.claudeDirect.launchNote":`需要本机已安装新版 Astra CLI(npm i -g astragate)。命令会用所选订阅账号启动官方 Claude Code,直连 Anthropic 官方、不经过网关;Astra 只把短期令牌交给它,刷新令牌留在 Astra。直接运行 claude 仍是你原来的配置。令牌到期后需要重新运行命令(会话中途不能续期)。若改用环境变量提供令牌,官方客户端里依赖 claude.ai 登录的功能(连接器、/schedule 等)将不可用。`,"clients.claudeDirect.statsTitle":`本机统计`,"clients.claudeDirect.statsConsent":`收集本机统计`,"clients.claudeDirect.statsConsentDetail":`默认关闭。开启后由 Claude Code 自己把用量数据发到本机 Astra:只有模型、时间、token 数和它自己估算的费用,没有对话正文、提示词和工具内容。`,"clients.claudeDirect.statsFooter":`Astra 仅在本机保存统计,留存时间沿用请求日志设置。关闭后立即停止接收;运行中会话仍可能尝试导出,重启后停止。估算不代表订阅扣费。组织策略可能覆盖客户端设置;直连不执行网关的拦截和脱敏。`,"clients.claudeDirect.statsEmpty":`还没有统计数据`,"clients.claudeDirect.statsEmptyDetail":`开启统计后,用上面的命令启动一次会话,数据会在几秒内出现在这里。`,"clients.claudeDirect.statsFailed":`无法读取统计`,"clients.claudeDirect.statsTotals":`最近 {count} 条`,"clients.claudeDirect.statsInDetail":`总输入(含缓存读 {cache}):{input} · 总输出:{output}`,"clients.claudeDirect.statsCost":`估算费用`,"clients.claudeDirect.statsCostDetail":`客户端自己估算,不代表实际订阅扣费。`,"clients.claudeDirect.statsFailedCount":`其中失败 {count} 条`,"clients.claudeDirect.statusError":`失败`,"clients.claudeDirect.tokensDetail":`输入 {input} / 输出 {output}`,"tokens.subtitle":`客户端和直接调用都通过令牌访问 Astra,用量按令牌统计`,"tokens.add":`新建令牌`,"tokens.default":`默认`,"tokens.disabledBadge":`已停用`,"tokens.copy":`复制令牌`,"tokens.copied":`已复制令牌`,"tokens.copyUrl":`复制网关地址`,"tokens.urlCopied":`已复制网关地址`,"tokens.copyJoin":`复制员工接入命令`,"connect.open":`连接统一网关`,"connect.title":`连接统一网关`,"connect.cta.title":`有管理员发的接入链接或 API Key?`,"connect.cta.detail":`一键把本机的 AI 客户端接到统一网关:请求先到本机,再转发过去。`,"connect.link.title":`接入这个统一网关?`,"connect.link.detail":`你点开了一个接入链接。`,"connect.link.trust":`只接入你信任的地址。接入后,选中的客户端的请求会经过本机转发到这个网关。`,"connect.link.continue":`继续`,"connect.manual.detail":`输入管理员给你的网关地址和你自己的 Key。`,"connect.gateway":`网关地址`,"connect.key":`API Key`,"connect.keyHint":`加密保存在本机,不会写进客户端配置。`,"connect.useKey":`改用 Key 接入`,"connect.verify":`验证并继续`,"connect.insecure":`这个地址是 http,Key 会以明文经过网络。`,"connect.joined":`已验证 · 令牌「{name}」· 可用 {count} 个模型`,"connect.pick.title":`选择要接入的客户端`,"connect.pick.detail":`只改变客户端绑定的提供商。原来的提供商留在后面,统一网关不支持的模型仍用它们。`,"connect.pick.none":`本机没有可接入的客户端。`,"connect.pick.apply":`接入 {n} 个客户端`,"connect.pick.skip":`先不接入`,"connect.done.title":`接入完成`,"connect.done.ok":`{name} 已接入`,"connect.done.failed":`{name} 没有接入:{error}`,"connect.done.restart":`重启这些客户端后生效。`,"connect.problem.dead":`这个链接已失效:已被使用、已过期或已被撤销。请让管理员重新生成,或改用 Key 接入。`,"connect.problem.unknown":`接入链接无效。`,"connect.problem.key":`这个 Key 无效。`,"connect.problem.disabled":`这个令牌已被停用,请联系管理员。`,"connect.problem.unreachable":`连不上统一网关,请检查地址和网络。`,"connect.problem.other":`接入失败。`,"connect.banner.title":`已接入统一网关`,"connect.banner.clients":`{n} 个客户端在用`,"connect.banner.none":`还没有客户端使用它`,"connect.banner.manage":`接入更多客户端`,"connect.banner.error":`暂时读不到用量:{error}`,"connect.leave":`退出`,"connect.leave.confirm":`退出统一网关?`,"connect.leave.detail":`会移除本机的提供商「统一网关」和它保存的 Key,不影响你在统一网关上的令牌。还有其他提供商的客户端继续用它们,只用统一网关的客户端会被停用并还原配置。`,"connect.leave.done":`已退出统一网关`,"tokens.invite.open":`生成员工接入链接`,"tokens.invite.title":`员工接入链接 · {name}`,"tokens.invite.description":`链接只能用一次,不含 Key。员工在桌面端点开它,由本机向这个网关换取 Key。`,"tokens.invite.lifetime":`有效期`,"tokens.invite.minutes":`{n} 分钟`,"tokens.invite.hours":`{n} 小时`,"tokens.invite.generate":`生成并复制`,"tokens.invite.copied":`已复制接入链接:只能用一次,请直接发给员工`,"tokens.invite.linkOnce":`刚生成的链接(只显示这一次)`,"tokens.invite.recent":`最近的链接`,"tokens.invite.none":`还没有生成过链接`,"tokens.invite.status.pending":`待使用`,"tokens.invite.status.used":`已使用`,"tokens.invite.status.expired":`已过期`,"tokens.invite.status.revoked":`已撤销`,"tokens.invite.usedAt":`{time} 使用,来自 {ip}`,"tokens.invite.expires":`{time} 到期`,"tokens.invite.revoke":`撤销`,"tokens.copyUrlShort":`网关地址`,"tokens.copyJoinShort":`接入命令`,"tokens.joinCopied":`已复制接入命令(不含 Key):发给员工,让他们在终端运行并输入各自的 Key`,"tokens.copyFailed":`复制失败,请手动选择复制`,"tokens.clients":`使用的客户端`,"tokens.noClients":`暂无客户端使用`,"tokens.directProvider":`直连提供商`,"tokens.directNone":`不允许直接调用`,"tokens.directAccount":`直连订阅账号`,"tokens.detail.open":`统计详情`,"tokens.detail.viewLogs":`查看日志`,"tokens.detail.byProvider":`按提供商`,"tokens.detail.byProviderHint":`「转出」是这个提供商失败、请求交给池里下一个的次数;「转入」是它接手别人失败请求的次数。`,"tokens.detail.byModel":`按模型`,"tokens.detail.recent":`最近请求`,"tokens.detail.provider":`提供商`,"tokens.detail.model":`模型`,"tokens.detail.time":`时间`,"tokens.detail.status":`状态`,"tokens.detail.share":`占比`,"tokens.detail.failoversOut":`转出`,"tokens.detail.failoversIn":`转入`,"tokens.pool.title":`提供商池`,"tokens.pool.hint":`直接调用(裸令牌)按下面的方式在这些提供商之间分配;某个提供商限流或出错时,在回复开始前自动换下一个。通过客户端调用仍走客户端页的绑定。`,"tokens.pool.empty":`未设置:这个令牌不能直接调用。`,"tokens.pool.add":`添加提供商…`,"tokens.pool.remove":`移出 {provider}`,"tokens.pool.strategy":`分配方式`,"tokens.pool.weight":`权重`,"tokens.pool.tier":`层级`,"tokens.pool.tierN":`第 {n} 层`,"tokens.pool.primary":`主`,"tokens.pool.backup":`备 {n}`,"tokens.pool.share":`预计流量分配`,"tokens.pool.shareHint":`按全部提供商健康、都能服务所请求的模型计`,"tokens.pool.standby":`备用`,"tokens.pool.sticky":`同一会话固定走同一提供商`,"tokens.pool.stickyHint":`保住上游的提示缓存(缓存不跨提供商共享)。关闭后 agent 每轮都可能重写缓存,输入成本会明显上升。`,"tokens.pool.failover":`失败时自动换下一个`,"tokens.pool.failoverHint":`429、5xx、超时或连不上时,在回复开始前换下一个提供商重试;已开始输出后出错不会重试。`,"tokens.pool.maxAttempts":`每个请求最多尝试的提供商数`,"tokens.pool.noModels":`{providers} 没有启用的模型:收不到请求,也无法参与转移。`,"tokens.pool.summary":`{count} 个提供商 · {strategy}`,"tokens.strategy.failover":`主备`,"tokens.strategy.failover.hint":`总走排在最前面的健康提供商,它失败才换下一个。拖动调整顺序。`,"tokens.strategy.round_robin":`轮询`,"tokens.strategy.round_robin.hint":`每个新会话轮到下一个提供商(关闭粘滞时是每个请求)。适合几个等价的 Key 分摊限额。`,"tokens.strategy.weighted":`加权`,"tokens.strategy.weighted.hint":`按权重比例穿插分配,不是随机。接入新提供商时可以从小权重开始灰度。`,"tokens.strategy.tiered":`分层`,"tokens.strategy.tiered.hint":`先用第 1 层(层内按权重分配),整层都不可用时才用下一层。`,"tokens.strategy.least_busy":`最少并发`,"tokens.strategy.least_busy.hint":`进行中请求最少的提供商优先,响应快的自然分得更多。`,"tokens.health.healthy":`正常`,"tokens.health.cooling":`冷却至 {time}`,"tokens.health.open":`熔断至 {time}`,"tokens.health.half_open":`试探中`,"tokens.health.no_account":`无可用账号`,"tokens.health.disabled":`已停用`,"tokens.health.missing":`已删除`,"tokens.directHint":`在其他工具中填写网关地址 {url} 和该令牌即可直接调用,请求会发往直连提供商。`,"tokens.today":`今日`,"tokens.total":`累计`,"tokens.cost":`消耗`,"tokens.requests":`请求`,"tokens.cacheHit":`缓存命中率`,"tokens.tps":`TPS`,"tokens.tpsContext":`加权输出速度`,"tokens.tokens":`Token`,"tokens.inOut":`输入 / 输出`,"tokens.details":`展开详情`,"tokens.requestsContext":`{count} 次请求`,"tokens.lastUsedTitle":`最近使用`,"tokens.limits":`限额`,"tokens.limitsHint":`超出后网关拒绝该令牌的请求:周期额度返回 429 并告知重置时间,总额度返回 403。正在进行的请求可能让用量略超上限。周期按设置中的时区计算。`,"tokens.unlimited":`不限`,"tokens.addLimit":`添加限额`,"tokens.removeLimit":`删除限额`,"tokens.limitMetric":`指标`,"tokens.limitPeriod":`周期`,"tokens.limitValue":`上限`,"tokens.metric.cost":`费用(USD)`,"tokens.metric.requests":`请求数`,"tokens.metric.tokens":`Token 数`,"tokens.period.day":`每日`,"tokens.period.week":`每周`,"tokens.period.month":`每月`,"tokens.period.total":`总计`,"tokens.rpm":`每分钟请求数`,"tokens.rpmHint":`留空表示不限。`,"tokens.rpmUsage":`近 1 分钟 {used} / {limit}`,"tokens.limitUsed":`{used} / {limit}`,"tokens.limitResets":`{time} 重置`,"tokens.limitExhausted":`已用完`,"tokens.limitDuplicate":`同一指标和周期只能设置一次`,"tokens.allowedClients":`允许的客户端`,"tokens.allowedClientsAny":`所有客户端`,"tokens.allowedClientsOnly":`仅以下客户端`,"tokens.allowedClientsHint":`限制密钥后缀(令牌.客户端)可用的客户端。都不勾选时只能直连(还需要设置直连提供商)。`,"tokens.mcp":`MCP 服务器`,"tokens.mcpHint":`这个令牌可以通过 MCP 网关使用的服务器。不选则不能使用 MCP。`,"tokens.mcpNone":`还没有 MCP 服务器,先到"MCP 网关"页面添加。`,"tokens.directOnly":`仅直连`,"tokens.selfService":`自助查询`,"tokens.selfServiceHint":`持有该令牌的人可以用它查询自己的额度和用量(看不到上游信息):打开 {url}/key 页面,或调用 {url}/v1/astra/key;也兼容 OpenAI 旧版余额接口 {url}/v1/dashboard/billing/subscription。`,"settings.tab.notifications":`通知`,"settings.quota.subscriptionInterval":`订阅账号查询间隔`,"settings.quota.subscriptionIntervalHint":`已登录的订阅账号按这个间隔在后台刷新额度,0 表示关闭,最短 10 分钟(上游接口有频率限制)。`,"alerts.webhooks":`Webhook`,"alerts.webhooks.hint":`告警以 JSON POST 发往这些地址。设置了签名密钥时带 X-Astra-Signature(HMAC-SHA256,对「时间戳.请求体」签名)。`,"alerts.webhooks.empty":`还没有 Webhook`,"alerts.webhooks.add":`添加 Webhook`,"alerts.webhooks.edit":`编辑 Webhook`,"alerts.webhooks.name":`名称`,"alerts.webhooks.url":`地址`,"alerts.webhooks.timeout":`超时(秒)`,"alerts.webhooks.useProxy":`使用网络代理`,"alerts.webhooks.useProxyHint":`开启时跟随设置里的网络代理;关闭则始终直连。`,"alerts.webhooks.enabled":`启用`,"alerts.webhooks.headers":`自定义请求头`,"alerts.webhooks.headersHint":`例如 Authorization。保存后只显示名称;编辑时值留空表示保持原值。`,"alerts.webhooks.addHeader":`添加请求头`,"alerts.webhooks.headerName":`请求头名称`,"alerts.webhooks.headerValue":`请求头的值`,"alerts.webhooks.headerKept":`留空保持原值`,"alerts.webhooks.signed":`签名`,"alerts.webhooks.signedHint":`生成签名密钥,接收方可以用它校验请求确实来自 Astra。`,"alerts.webhooks.secretTitle":`签名密钥`,"alerts.webhooks.secretShown":`请立即保存这个密钥,它只显示这一次。`,"alerts.webhooks.resetSecret":`重新生成签名密钥`,"alerts.webhooks.resetSecretConfirm":`重新生成 {name} 的签名密钥?`,"alerts.webhooks.resetSecretDetail":`旧密钥立即失效,接收方需要换成新密钥。`,"alerts.webhooks.test":`发送测试`,"alerts.webhooks.testOk":`测试通知已送达(HTTP {status})`,"alerts.webhooks.testFailed":`测试失败:{error}`,"alerts.webhooks.deliveries":`投递记录`,"alerts.webhooks.deleteConfirm":`删除 Webhook {name}?`,"alerts.webhooks.deleteDetail":`引用它的告警规则不再发往这里,投递记录一并删除。`,"alerts.webhooks.deleted":`已删除 {name}`,"alerts.webhooks.disabledBadge":`已停用`,"alerts.webhooks.unsigned":`未签名`,"alerts.webhooks.format":`格式`,"alerts.webhooks.format.generic":`通用 JSON`,"alerts.webhooks.format.generic.hint":`Astra 自己的 JSON 载荷,带 X-Astra-Signature 签名,适合自己写接收服务。`,"alerts.webhooks.format.feishu":`飞书`,"alerts.webhooks.format.feishu.hint":`飞书群的自定义机器人:群设置 → 群机器人 → 添加自定义机器人,复制 Webhook 地址。开启了签名校验时填入它的签名密钥。`,"alerts.webhooks.format.dingtalk":`钉钉`,"alerts.webhooks.format.dingtalk.hint":`钉钉群的自定义机器人:群设置 → 机器人 → 自定义,复制 Webhook 地址。安全设置选「加签」时填入 SEC 开头的密钥;选「自定义关键词」时关键词需要包含「Astra」。`,"alerts.webhooks.format.wecom":`企业微信`,"alerts.webhooks.format.wecom.hint":`企业微信群机器人:群聊 → 添加群机器人,复制 Webhook 地址。`,"alerts.webhooks.format.slack":`Slack`,"alerts.webhooks.format.slack.hint":`Slack 的 Incoming Webhook 地址。`,"alerts.webhooks.format.discord":`Discord`,"alerts.webhooks.format.discord.hint":`Discord 频道设置 → 整合 → Webhook,复制 Webhook 地址。`,"alerts.webhooks.botSecret":`机器人签名密钥`,"alerts.webhooks.botSecretHint":`机器人安全设置里的签名密钥,加密保存,保存后不再显示。`,"alerts.webhooks.botSignedHint":`机器人开启了签名校验时打开,并填入它的签名密钥。`,"alerts.delivery.status.pending":`等待重试`,"alerts.delivery.status.success":`成功`,"alerts.delivery.status.failed":`失败`,"alerts.delivery.attempts":`已尝试 {count} 次`,"alerts.delivery.next":`下次重试 {time}`,"alerts.delivery.empty":`暂无投递记录`,"alerts.delivery.payload":`载荷`,"alerts.delivery.response":`响应`,"alerts.delivery.redeliver":`重新投递`,"alerts.delivery.redelivered":`已重新加入投递队列`,"alerts.rules":`告警规则`,"alerts.rules.hint":`每条规则 = 事件 + 条件 + 范围 → Webhook。同一对象只在进入触发状态时通知一次,可选持续提醒和恢复通知。`,"alerts.rules.empty":`还没有告警规则`,"alerts.rules.add":`添加规则`,"alerts.rules.edit":`编辑规则`,"alerts.rules.name":`名称`,"alerts.rules.event":`事件`,"alerts.rules.subjects":`范围`,"alerts.rules.subjectsAll":`全部`,"alerts.rules.subjectsOnly":`仅选中的`,"alerts.rules.webhooks":`通知到`,"alerts.rules.noWebhooks":`还没有 Webhook,先在上面添加一个。`,"alerts.rules.notifyResolved":`恢复时也通知`,"alerts.rules.repeat":`重复提醒(分钟)`,"alerts.rules.repeatHint":`持续触发时每隔多久再提醒一次;留空只提醒一次。`,"alerts.rules.cooldown":`防抖(分钟)`,"alerts.rules.cooldownHint":`恢复后这么久之内再次触发不通知,避免来回抖动刷屏。`,"alerts.rules.firing":`{count} 个触发中`,"alerts.rules.deleteConfirm":`删除告警规则 {name}?`,"alerts.rules.deleted":`已删除 {name}`,"alerts.rules.disabledBadge":`已停用`,"alerts.rules.enabled":`启用`,"alerts.firing":`触发中的告警`,"alerts.firing.empty":`当前没有触发中的告警`,"alerts.event.provider.balance.low":`提供商余额不足`,"alerts.event.provider.balance.low.hint":`已开启用量查询的 API Key 提供商,余额低于阈值(按套餐单位)或已用百分比达到阈值。`,"alerts.event.provider.quota.failed":`提供商余额查询失败`,"alerts.event.provider.quota.failed.hint":`余额查询连续失败达到次数。`,"alerts.event.account.quota.high":`订阅账号额度紧张`,"alerts.event.account.quota.high.hint":`订阅账号的 5 小时 / 每周 / 点数窗口已用百分比达到阈值。`,"alerts.event.account.auth.invalid":`订阅账号失效`,"alerts.event.account.auth.invalid.hint":`账号登录过期或被撤销,需要重新登录。`,"alerts.event.account.quota.failed":`订阅账号额度查询失败`,"alerts.event.account.quota.failed.hint":`后台额度同步连续失败达到次数。`,"alerts.event.token.usage.high":`令牌额度用量高`,"alerts.event.token.usage.high.hint":`令牌某项限额的已用百分比达到阈值。`,"alerts.event.token.limit.reached":`令牌额度用完`,"alerts.event.token.limit.reached.hint":`令牌某项限额已用完,或请求被每分钟请求数拦截。`,"alerts.param.metric":`比较`,"alerts.param.value":`阈值`,"alerts.param.plan":`套餐`,"alerts.param.plan.placeholder":`留空表示第一个有数据的套餐`,"alerts.param.window":`窗口`,"alerts.param.budget":`限额`,"alerts.param.budget.placeholder":`留空表示任一限额,例如 cost:month`,"alerts.choice.metric.remaining":`余额低于`,"alerts.choice.metric.usedPercent":`已用百分比达到`,"alerts.choice.window.any":`任一窗口`,"alerts.choice.window.session":`5 小时`,"alerts.choice.window.weekly":`每周`,"alerts.choice.window.credits":`点数`,"alerts.subject.provider":`提供商`,"alerts.subject.account":`订阅账号`,"alerts.subject.token":`令牌`,"key.title":`令牌额度查询`,"key.subtitle":`输入 Astra 令牌,查看它的额度和用量。只显示这个令牌自己的信息。`,"key.placeholder":`sk-astra-…`,"key.submit":`查询`,"key.invalid":`令牌无效或不存在`,"key.error":`查询失败:{error}`,"key.disabled":`这个令牌已停用`,"key.limits":`限额`,"key.unlimited":`不限额`,"key.rpm":`每分钟请求数:近 1 分钟 {used} / {limit}`,"key.usage":`用量`,"key.today":`今日`,"key.week":`本周`,"key.month":`本月`,"key.total":`累计`,"key.requests":`请求`,"key.cost":`费用`,"key.tokens":`Token`,"key.daily":`近 30 天费用`,"key.clients":`可用客户端`,"key.clientsAny":`所有客户端`,"key.directOnly":`仅直连`,"key.timeZone":`周期按 {zone} 计算`,"key.forget":`换一个令牌`,"key.resets":`{time} 重置`,"key.exhausted":`已用完`,"key.tab.overview":`额度与用量`,"key.tab.stats":`统计`,"key.tab.requests":`请求记录`,"key.stats.requests":`请求数`,"key.stats.successRate":`成功率`,"key.stats.avgTtft":`平均首字`,"key.stats.trend":`请求趋势`,"key.stats.byModel":`按模型`,"key.stats.byClient":`按客户端`,"key.stats.errors":`失败原因`,"key.stats.noErrors":`这段时间没有失败的请求`,"key.stats.direct":`直接调用`,"key.stats.retention":`请求记录只保留最近 {days} 天;额度和上面的累计用量不受影响。`,"key.requests.empty":`还没有请求记录`,"key.requests.all":`全部`,"key.requests.failed":`失败`,"key.requests.more":`加载更多`,"key.requests.time":`时间`,"key.requests.model":`模型`,"key.requests.client":`客户端`,"key.requests.status":`结果`,"key.requests.tokens":`输入 / 输出`,"key.requests.latency":`首字 / 总耗时`,"key.requests.success":`成功`,"key.category.cancelled":`客户端取消`,"key.category.blocked":`被拦截`,"key.category.limit":`超出令牌限额`,"key.category.timeout":`超时`,"key.category.rate_limited":`上游限流`,"key.category.auth":`令牌无权使用`,"key.category.unavailable":`上游不可用`,"key.category.invalid_request":`请求无效`,"key.category.unsupported":`不支持的转换`,"key.category.internal":`网关内部错误`,"key.category.other":`其他错误`,"tokens.neverUsed":`尚未使用`,"tokens.settings":`设置`,"tokens.name":`名称`,"tokens.namePlaceholder":`例如:工作电脑`,"tokens.enable":`启用`,"tokens.disable":`停用`,"tokens.disableConfirm":`停用 {name}?`,"tokens.disableDetail":`使用该令牌的客户端和直接调用都会被拒绝,直到重新启用。不会修改客户端配置。`,"tokens.reset":`重置密钥`,"tokens.resetConfirm":`重置 {name} 的密钥?`,"tokens.resetDetail":`旧密钥立即失效。使用该令牌的已启用客户端会自动改写配置;被手动修改过的配置会跳过,需要重新启用。`,"tokens.resetDone":`已重置密钥,改写了 {count} 个客户端配置`,"tokens.skipped":`以下客户端未能自动更新,需要在「客户端」页面重新启用:{clients}`,"tokens.delete":`删除令牌`,"tokens.deleteConfirm":`删除 {name}?`,"tokens.deleteDetail":`使用它的客户端会切换到默认令牌并自动改写配置。历史请求日志保留该令牌的名称。`,"tokens.deleted":`已删除 {name}`,"tokens.created":`已创建 {name}`,"tokens.createTitle":`新建令牌`,"tokens.settingsTitle":`令牌设置 · {name}`,"tokens.empty":`还没有令牌`,"clients.enableTitle":`启用 {name}`,"clients.enableDetail":`以下是将要写入的改动。Astra 只新增或修改自己的配置项,并在首次修改前备份原文件。`,"clients.enabledToast":`{name} 已启用`,"clients.enabledRestart":`{name} 已启用,请重启客户端使配置生效`,"clients.noChanges":`配置已是最新,无需改动。`,"providers.add":`添加提供商`,"providers.count":`{count} 个提供商`,"providers.empty":`还没有提供商`,"providers.emptyDetail":`从内置模板添加 OpenAI、Anthropic、DeepSeek、OpenRouter 等,或接入自定义的兼容接口。`,"providers.import":`从其他应用导入`,"import.title":`从其他应用导入提供商`,"import.detail":`只读扫描 CC Switch、Alma、Claude Code、Codex、Magpie 的本地配置,不会修改它们;API Key 由服务端直接读取并加密保存,不经过浏览器。`,"import.search":`搜索名称或地址`,"import.path":`读取位置:{path}`,"import.notFound":`未找到`,"import.sourceError":`读取失败:{error}`,"import.noItems":`没有可导入的提供商`,"import.noMatch":`没有匹配的提供商`,"import.scanning":`正在扫描…`,"import.status.new":`新增`,"import.status.same":`已存在`,"import.status.sameHost":`同地址`,"import.status.off":`已停用`,"import.status.skip":`无法导入`,"import.existing":`已有提供商「{name}」`,"import.sameHostHint":`已有同地址提供商「{name}」,将作为新的提供商导入`,"import.noKey":`无 Key`,"import.models":`{count} 个模型`,"import.template":`模板:{id}`,"import.ignored":`将忽略:{fields}`,"import.skip.official-login":`官方登录(令牌绑定来源应用,不可导入)`,"import.skip.no-base-url":`缺少接口地址`,"import.skip.unsupported-protocol":`协议不支持`,"import.skip.points-to-astra":`指向 Astra 自身`,"import.skip.invalid-base-url":`接口地址无效`,"import.skip.no-inline-key":`Key 来自环境变量,不会读取`,"import.selected":`导入所选({count})`,"import.done":`已导入 {count} 个提供商`,"import.doneSkipped":`已导入 {count} 个提供商,跳过 {skipped} 个`,"import.footnote":`路由、限流、余额查询、会话与用量等设置不会导入;导入不会改动任何客户端配置,也不会发起上游请求。`,"import.rescan":`重新扫描`,"providers.modelCount":`{count} 个模型`,"providers.priceKeyShort":`价格:{key}`,"providers.templateUpdate":`模板更新`,"providers.noKey":`未设置密钥`,"providers.card.active":`已启用`,"providers.card.disabled":`已停用`,"providers.card.subscription":`订阅账号`,"providers.card.noAuth":`无需密钥`,"providers.card.requests7d":`近 7 天请求`,"providers.card.noRequests":`暂无请求`,"providers.card.noRequests7d":`7 天无请求`,"providers.card.requestsUnit":`次`,"providers.card.lowSuccess":`成功率偏低`,"providers.view.label":`列表视图`,"providers.view.grid":`卡片`,"providers.view.table":`表格`,"providers.overview.range":`统计范围`,"providers.overview.requests":`请求`,"providers.overview.cost":`成本`,"providers.overview.successRate":`成功率`,"providers.overview.failoverCount":`故障转移 {count} 次`,"providers.overview.enabled":`启用 / 全部`,"providers.overview.withTraffic":`{count} 个有请求`,"providers.overview.share":`请求占比`,"providers.overview.ranking":`请求量排行`,"providers.overview.costShare":`成本占比`,"providers.overview.noCost":`该时段暂无成本`,"providers.overview.noData":`该时段暂无请求`,"providers.overview.health":`健康状况`,"providers.overview.healthy":`正常`,"providers.overview.lowSuccess":`成功率 < 90%`,"providers.overview.others":`其他`,"providers.overview.showCharts":`展开图表`,"providers.overview.hideCharts":`收起图表`,"providers.col.provider":`提供商`,"providers.col.status":`状态`,"providers.col.models":`模型`,"providers.col.trend":`7 天趋势`,"providers.col.requests":`请求`,"providers.col.successRate":`成功率`,"providers.col.ttft":`首字延迟`,"providers.col.tokens":`Token 入 / 出`,"providers.col.cost":`成本`,"providers.col.enabled":`启用`,"providers.created":`已添加 {name}`,"providers.addTitle":`选择提供商模板`,"providers.addTitleDetails":`填写提供商信息`,"providers.addDetail":`模板包含接口地址、协议和默认模型列表。`,"providers.custom":`自定义提供商`,"providers.customDetail":`任意 OpenAI / Anthropic / Gemini 兼容接口`,"providers.searchTemplates":`搜索模板`,"providers.category.recommended":`推荐`,"providers.category.official":`官方`,"providers.category.subscription":`订阅`,"providers.category.coding":`编程套餐`,"providers.category.cn":`国内`,"providers.category.aggregator":`聚合平台`,"providers.category.inference":`推理平台`,"providers.category.local":`本地`,"providers.category.custom":`其他`,"providers.category.plugin":`插件`,"providers.pluginProvided":`由插件提供 · 打开后登录账号`,"providers.pluginHint":`安装 OpenCode / magpie 提供商插件后,它提供的提供商会出现在这里。`,"providers.create":`添加`,"providers.name":`名称`,"providers.variant":`区域 / 版本`,"providers.variantDefault":`默认区域`,"providers.baseUrl":`接口地址`,"providers.baseUrlHint":`通常以 /v1 结尾`,"providers.protocol":`协议`,"providers.authScheme":`认证方式`,"providers.apiKey":`API Key`,"providers.apiKeyHint":`加密保存在本机`,"providers.subscriptionWizardHint":`无需 API Key——使用订阅账号登录`,"providers.subscriptionWizardDetail":`创建提供商后,在其「账户」标签页点击「添加账户」,用浏览器完成授权即可。不同订阅的服务条款与配额以官方为准。`,"providers.subscriptionAdded":`已添加 · 在该提供商内添加账号`,"providers.subscription.quotaSession":`5h 已用 {percent}%`,"providers.subscription.quotaWeekly":`每周已用 {percent}%`,"providers.subscription.quotaCredits":`额度已用 {percent}%`,"providers.subscription.quotaBalance":`余额 {balance}`,"providers.subscription.quotaRefresh":`刷新额度`,"providers.subscription.quotaUnsupported":`该订阅暂不支持额度查询`,"providers.subscription.quotaResets":`重置于 {when}`,"providers.subscription.quotaLoading":`正在获取额度…`,"providers.subscription.quotaNoAccount":`账号已失效,重新登录后可查看额度`,"providers.subscription.quotaWindowPremium":`高级请求`,"providers.subscription.quotaPremiumCount":`已用 {used} / {total} 次高级请求`,"providers.subscription.quotaOverage":`额外 {count} 次`,"providers.subscription.quotaOverageOff":`未开启超额使用`,"providers.subscription.quotaFetchedAt":`更新于 {when}`,"providers.subscription.quotaNoWindows":`该账号没有可展示的额度窗口`,"providers.subscription.quotaWindowSession":`会话窗口`,"providers.subscription.quotaWindowWeekly":`每周窗口`,"providers.subscription.quotaWindowCredits":`额度`,"providers.quota.title":`用量查询`,"providers.quota.footer":`按模板查询该提供商的余额或套餐用量,结果显示在提供商卡片和托盘里。查询失败只会显示错误,不会影响提供商本身的使用。`,"providers.quota.enable":`启用用量查询`,"providers.quota.enableHint":`开启后按间隔在后台刷新`,"providers.quota.template":`查询模板`,"providers.quota.templateAuto":`自动({name})`,"providers.quota.templateNone":`自动(没有匹配的模板)`,"providers.quota.custom":`自定义`,"providers.quota.kind.balance":`余额`,"providers.quota.kind.plan":`套餐用量`,"providers.quota.param.userId":`用户 ID`,"providers.quota.param.accessToken":`系统访问令牌`,"providers.quota.paramsHint":`New API / One API 在个人设置里生成的系统访问令牌和用户 ID,不是 sk- 开头的 API Key。`,"providers.quota.secretStored":`已保存,留空不修改`,"providers.quota.interval":`自动查询间隔(分钟)`,"providers.quota.intervalHint":`留空跟随全局设置,0 表示不在后台查询。当前:{value}`,"providers.quota.intervalEvery":`每 {minutes} 分钟`,"providers.quota.intervalOff":`不在后台查询`,"providers.quota.timeout":`超时(秒)`,"providers.quota.baseUrl":`查询地址`,"providers.quota.baseUrlHint":`留空使用提供商的接口地址({{origin}} / {{baseUrl}} 由它得出)`,"providers.quota.method":`方法`,"providers.quota.url":`URL`,"providers.quota.urlHint":`可用占位符:{{origin}}、{{baseUrl}}、{{host}}、{{apiKey}} 以及上面的参数名`,"providers.quota.auth":`认证`,"providers.quota.auth.provider":`使用提供商的 API Key`,"providers.quota.auth.none":`只用下面的请求头`,"providers.quota.headers":`请求头(JSON)`,"providers.quota.extract":`提取规则(JSON)`,"providers.quota.extractHint":`字符串是响应里的路径(如 data.balance),数字是常量;数组按顺序取第一个存在的值;支持 $const、$add、$sub、$mul、$div、$scale、$pctUsed、$eq、$not、$case、$var、$time。取不到的字段不会被当成 0。`,"providers.quota.invalidJson":`{field} 不是有效的 JSON 对象`,"providers.quota.test":`测试查询`,"providers.quota.testDesc":`用当前(未保存)的配置发一次真实请求`,"providers.quota.fetch":`立即查询`,"providers.quota.refresh":`刷新余额`,"providers.quota.fetchedAt":`更新于 {time}`,"providers.quota.never":`尚未查询`,"providers.quota.off":`未启用用量查询`,"providers.quota.rawResponse":`原始响应(已脱敏)`,"providers.quota.requestUrl":`请求地址`,"providers.quota.httpStatus":`HTTP 状态`,"providers.quota.testOk":`查询成功`,"providers.quota.testFailed":`查询失败`,"providers.quota.extracted":`提取结果`,"providers.quota.balance":`余额 {amount}`,"providers.quota.usedPercent":`已用 {percent}%`,"providers.quota.window":`{window}已用 {percent}%`,"providers.quota.totalUsed":`已用 {used} / 共 {total}`,"providers.quota.resets":`{time}重置`,"providers.quota.invalid":`账户不可用`,"providers.quota.failed":`用量查询失败:{error}`,"providers.quota.lastGood":`下面是上次成功的结果`,"providers.quota.error.config":`查询配置不完整`,"providers.quota.error.no_key":`该提供商没有 API Key`,"providers.quota.error.unauthorized":`上游拒绝了额度查询(凭据无效或没有权限)`,"providers.quota.error.no_endpoint":`该地址没有额度接口,请换一个模板或使用自定义查询`,"providers.quota.error.rate_limited":`上游限流,请调大查询间隔`,"providers.quota.error.upstream":`上游返回错误`,"providers.quota.error.timeout":`查询超时`,"providers.quota.error.network":`无法连接上游`,"providers.quota.error.not_json":`响应不是 JSON`,"providers.quota.error.too_large":`响应过大`,"providers.quota.error.empty":`查询成功,但没有取到额度字段`,"settings.proxy":`网络代理`,"settings.proxy.footer":`网关转发、订阅登录、额度查询、更新检查和客户端安装都按这里的设置联网;本机地址始终直连,单独配置了代理的提供商以提供商为准。`,"settings.proxy.mode":`代理方式`,"settings.proxy.mode.system":`跟随系统`,"settings.proxy.mode.custom":`自定义`,"settings.proxy.mode.direct":`不使用`,"settings.proxy.mode.system.hint":`优先使用 HTTPS_PROXY 等环境变量,其次是操作系统的代理设置`,"settings.proxy.mode.custom.hint":`所有出站请求使用下面填写的代理`,"settings.proxy.mode.direct.hint":`忽略环境变量和系统代理,一律直连`,"settings.proxy.url":`代理地址`,"settings.proxy.urlHint":`支持 http、https、socks5,需包含端口`,"settings.proxy.username":`用户名`,"settings.proxy.password":`密码`,"settings.proxy.optional":`可选`,"settings.proxy.passwordSaved":`已保存,留空则不修改`,"settings.proxy.bypass":`不走代理的地址`,"settings.proxy.bypassHint":`用逗号分隔,同时匹配子域名`,"settings.proxy.saved":`代理设置已保存`,"settings.pluginMarket":`插件市场`,"settings.pluginMarket.footer":`插件市场默认读取 Astra 官网的清单(含社区仓库的插件和官网发布的插件包)。官网不可达时依次用上次拿到的副本和内置副本。环境变量 ASTRA_PLUGIN_MARKET 优先于这里的设置。`,"settings.pluginMarket.url":`市场地址`,"settings.pluginMarket.urlHint":`清单(registry.json)的 http(s) 地址;留空并保存则恢复默认。`,"settings.pluginMarket.offline":`只用本地副本`,"settings.pluginMarket.offlineHint":`不联网取清单,也没有搜索,只显示上次拿到的副本或内置副本。`,"settings.pluginMarket.saved":`插件市场地址已保存`,"settings.pluginMarket.reset":`恢复默认`,"settings.quota":`提供商用量查询`,"settings.quota.autoInterval":`后台查询间隔`,"settings.quota.autoIntervalHint":`已启用用量查询的提供商按这个间隔在后台刷新余额,0 表示关闭;单个提供商可以另行设置。`,"settings.usageTimeZone":`令牌额度时区`,"settings.usageTimeZone.system":`服务器时区({zone})`,"settings.usageTimeZone.hint":`令牌的每日、每周、每月额度在这个时区的零点重置,每日用量也按它统计。容器里默认是 UTC。`,"settings.minutes":`分钟`,"tray.quotaBalance":`余额`,"providers.subscription.relogin":`重新登录`,"providers.getKey":`获取 API Key ↗`,"providers.priceKey":`价格表`,"providers.priceKeyHint":`决定使用哪个提供商的模型价格;同一模型在不同提供商价格不同。`,"providers.priceKeyNone":`仅用官方默认价`,"providers.priceKeyDefault":`默认({id})`,"providers.templateModels":`将添加模板中的 {count} 个模型,之后可增删。`,"providers.moreOptions":`更多选项`,"providers.moreOptionsDetail":`这些都可以在创建后到「设置」里修改。`,"providers.initialModels":`初始模型`,"providers.initialModelsTemplateHint":`每行一个或用逗号分隔;留空则添加模板中的 {count} 个模型。`,"providers.initialModelsCustomHint":`每行一个或用逗号分隔;留空可在创建后从上游获取。`,"providers.tab.models":`模型`,"providers.tab.settings":`设置`,"providers.tab.accounts":`账户`,"providers.tab.apiKey":`API Key`,"providers.test":`测试连接`,"providers.testDialog.title":`测试 {name}`,"providers.testDialog.subtitle":`应用隐私策略并记录请求,不重试`,"providers.testDialog.modeSingle":`单模型`,"providers.testDialog.modeBatch":`批量模型`,"providers.testDialog.config":`测试配置`,"providers.testDialog.model":`测试模型`,"providers.testDialog.modelPlaceholder":`输入任意模型 ID`,"providers.testDialog.showModels":`显示模型列表`,"providers.testDialog.protocol":`测试协议`,"providers.testDialog.stream":`流式响应`,"providers.testDialog.maxTokens":`最大输出 tokens`,"providers.testDialog.imageSize":`图片尺寸`,"providers.testDialog.imageSizeHint":`留空由上游决定;可填 auto 或 宽x高,如 1024x1024。`,"providers.testDialog.imageQuality":`图片质量`,"providers.testDialog.imageDefault":`默认(不传)`,"providers.testDialog.imageCount":`生成数量`,"providers.testDialog.imageOperation":`图片能力`,"providers.testDialog.imageGenerate":`生成图片`,"providers.testDialog.imageEdit":`编辑图片`,"providers.testDialog.imageEditHint":`编辑测试默认把一张内置的 128×128 红色圆形图片上传到 images/edits,默认提示词让它把红色改成蓝色;也可以选自己的图片。`,"providers.testDialog.imageInput":`测试图片`,"providers.testDialog.imageInputDefault":`内置红色圆形(默认)`,"providers.testDialog.imageInputLimits":`128×128 PNG,几百字节`,"providers.testDialog.imageInputPick":`选择图片…`,"providers.testDialog.imageInputReset":`恢复默认`,"providers.testDialog.imageInputType":`只支持 PNG、JPEG、WebP 图片`,"providers.testDialog.imageInputTooLarge":`图片不能超过 4 MB`,"providers.testDialog.imageInputUnreadable":`读不了这张图片`,"providers.testDialog.imageAlt":`第 {n} 张结果图片`,"providers.testDialog.imageSave":`保存图片`,"providers.testDialog.imageSection":`图片模型`,"providers.testDialog.batchAutoHint":`图片模型自动走图片接口,其余模型按这里的协议请求。`,"providers.testDialog.prompt":`测试提示词(可选)`,"providers.testDialog.promptHint":`留空时使用默认提示词。`,"providers.testDialog.realRequest":`真实请求,可能消耗额度`,"providers.testDialog.savedCredentials":`使用此提供商已保存的连接与凭据。`,"providers.testDialog.start":`开始测试`,"providers.testDialog.retest":`重新测试`,"providers.testDialog.stop":`停止`,"providers.testDialog.stopRest":`停止后续`,"providers.testDialog.testN":`测试 {count} 个模型`,"providers.testDialog.metrics.http":`HTTP 响应`,"providers.testDialog.metrics.firstWait":`首字等待`,"providers.testDialog.metrics.ttft":`首字总延迟`,"providers.testDialog.metrics.total":`完整耗时`,"providers.testDialog.metricsHelp":`HTTP 响应:从发出请求到收到上游响应头。首字:到回答的第一个字节。等待从响应头到达算起,总延迟从发出请求算起。`,"providers.testDialog.reply":`API 提供商回复`,"providers.testDialog.preview":`预览`,"providers.testDialog.raw":`原文`,"providers.testDialog.rawNote":`网关处理后的响应正文(凭据已脱敏)`,"providers.testDialog.rawTruncated":`已截断:原文超过 256 KiB`,"providers.testDialog.reasoning":`推理过程`,"providers.testDialog.noText":`上游没有返回文本。`,"providers.testDialog.headers":`响应头`,"providers.testDialog.headersCount":`{count} 个`,"providers.testDialog.headersEmpty":`上游没有返回响应头。`,"providers.testDialog.emptyTitle":`尚未测试`,"providers.testDialog.emptyDetail":`点击开始测试,向上游发送一条真实请求。`,"providers.testDialog.status.idle":`等待测试`,"providers.testDialog.status.running":`测试中`,"providers.testDialog.status.success":`测试成功`,"providers.testDialog.status.failed":`测试失败`,"providers.testDialog.selected":`已选 {n} / {total}`,"providers.testDialog.progress":`已完成 {done} / {total} · 成功 {ok} · 失败 {failed}`,"providers.testDialog.progressDone":`本批已完成 {total} / {total} · 成功 {ok} · 失败 {failed}`,"providers.testDialog.clearSelection":`清空选择`,"providers.testDialog.searchModels":`搜索或输入模型 ID`,"providers.testDialog.addModel":`添加「{id}」`,"providers.testDialog.view":`查看`,"providers.testDialog.noModels":`该提供商还没有模型;在上方输入模型 ID 即可测试。`,"providers.testDialog.status.queued":`排队中`,"providers.testDialog.status.cancelled":`已取消`,"providers.testDialog.statusColumn":`状态`,"providers.testDialog.ownFilter":`输入模型 ID 可添加列表中没有的模型`,"providers.duplicate":`复制提供商`,"providers.deleteConfirm":`删除 {name}?`,"providers.deleteDetail":`提供商及其模型设置会被删除,请求记录保留。`,"providers.deleted":`已删除`,"providers.deleteBound":`仍有客户端在使用:{clients}。请先为它们切换提供商。`,"providers.templateVersions":`当前版本 {current},最新版本 {latest}`,"providers.templateApplied":`已更新到最新模板`,"providers.templateUpToDate":`已是最新模板。`,"providers.templateSwitch":`更换模板`,"providers.templateSwitchDetail":`接口地址和协议优先级换成新模板的;Key、模型和你改过的设置都保留。`,"providers.templateSwitchTarget":`新模板`,"providers.templateSwitchEndpoints":`更换后的接口`,"providers.templateSwitchCurrent":`{name}(当前)`,"providers.templateSwitched":`已换到「{name}」`,"providers.templateSwitchConfirm":`改用「{alt}」?`,"providers.templateSwitchConfirmDetail":`接口地址换成 {urls};Key、模型和你改过的设置都保留。`,"providers.keyAlternative.title":`Key 可能和模板不匹配`,"providers.keyAlternative.rejected":`上游拒绝了这个 Key。「{name}」和「{alt}」的 Key 不通用:如果这是「{alt}」的 Key,换用那个模板即可。`,"providers.keyAlternative.switch":`改用「{alt}」`,"providers.keyAlternative.wizard":`「{name}」和「{alt}」的 Key 不通用,请确认你的 Key 属于这一个。`,"providers.keyAlternative.pick":`改选「{alt}」`,"providers.searchModels":`搜索模型`,"providers.addModels":`添加模型`,"providers.addModelsDetail":`输入模型 ID,每行一个或用逗号分隔;会自动关联到系统模型以继承参数和价格。`,"providers.fetchRemote":`从上游获取`,"providers.fetchRemoteDetail":`读取提供商的模型列表,自动关联到系统模型以继承参数和价格。`,"providers.noModels":`还没有模型`,"providers.noModelsDetail":`从上游获取模型列表,或手动输入模型 ID。`,"providers.modelsFooter":`模型默认只需要 ID:未覆盖的字段继承关联的系统模型,价格按此提供商的价格表计算。`,"providers.modelMap.title":`模型映射`,"providers.modelMap.footer":`把客户端请求的模型 ID 转成本提供商的模型,例如 deepseek-v4.1 → deepseek-chat。映射的 ID 会出现在客户端的模型列表里;客户端绑定了多个提供商时,请求这个 ID 也会路由到这里。计费按实际发送的模型计算。`,"providers.modelMap.add":`添加映射`,"providers.modelMap.addDetail":`客户端请求左边的模型 ID 时,Astra 改为向本提供商请求右边的模型。`,"providers.modelMap.needModels":`先给提供商添加模型`,"providers.modelMap.from":`请求的模型 ID`,"providers.modelMap.to":`本提供商的模型`,"providers.modelMap.toPlaceholder":`选择模型`,"providers.modelMap.remove":`删除映射 {from}`,"providers.modelMap.saved":`已保存模型映射`,"providers.modelMap.missingTarget":`目标模型不存在`,"providers.unlinked":`未关联`,"providers.modelsAdded":`已添加 {count} 个模型`,"providers.addSelected":`添加 {count} 个`,"providers.linksTo":`关联到 {id}`,"providers.noLink":`不关联系统模型`,"providers.added":`已添加`,"providers.linkedModel":`关联的系统模型`,"providers.linkedModelHint":`未覆盖的字段和价格都从这里继承。`,"providers.overrides":`字段覆盖`,"providers.price":`价格`,"providers.customPrice":`自定义价格`,"providers.customPriceHint":`自定义价格完全替换继承的价格,不乘提供商倍率。`,"providers.inheritedPriceHint":`当前生效的价格(继承,已按提供商价格表解析):`,"providers.removeModel":`从提供商移除 {id}?`,"providers.removeModelShort":`移除此模型`,"providers.selectAllModels":`选择当前列表中的全部模型`,"providers.selectModel":`选择 {id}`,"providers.selectedModels":`已选 {n} 个`,"providers.removeSelected":`移除所选`,"providers.removeSelectedConfirm":`从提供商移除所选的 {n} 个模型?`,"providers.backup":`备份与恢复`,"backup.title":`备份与恢复`,"backup.detail":`把提供商和它们的模型导出成一个文件,或从这样的文件恢复。不含 OAuth 账号、客户端绑定、令牌和 MCP 服务器。`,"backup.export.title":`导出`,"backup.export.secrets":`API 密钥`,"backup.secrets.none":`不含密钥(推荐)`,"backup.secrets.passphrase":`用口令加密密钥`,"backup.secrets.plaintext":`明文密钥`,"backup.secrets.hint":`带密钥的导出只能在本机操作。`,"backup.passphrase":`口令`,"backup.passphrase.hint":`至少 8 个字符。口令丢失后无法找回文件里的密钥。`,"backup.plaintext.warn":`文件里的密钥是明文,拿到文件的人可以直接使用。只存放在你自己保管的位置,不要上传到网盘。`,"backup.export.run":`导出`,"backup.export.done":`已导出 {count} 个提供商`,"backup.import.title":`从文件恢复`,"backup.import.choose":`选择备份文件`,"backup.import.encrypted":`这个备份的密钥用口令加密了,输入口令后预览。`,"backup.import.preview":`预览`,"backup.import.run":`导入所选({count})`,"backup.import.done":`已导入 {count} 个提供商`,"backup.import.doneSkipped":`已导入 {count} 个,跳过 {skipped} 个`,"backup.import.badFile":`这不是有效的备份文件。`,"backup.import.noKeys":`文件里没有密钥,导入后需要重新填写。`,"backup.status.new":`新增`,"backup.status.sameHost":`地址已存在`,"backup.status.same":`已存在,跳过`,"backup.status.invalid":`无效`,"backup.models":`{count} 个模型`,"backup.webdav.title":`云端备份(WebDAV)`,"backup.webdav.hint":`把备份放到你自己的 WebDAV 服务(Nextcloud、坚果云等)。只能在本机操作;明文密钥不会上传,只能选不含密钥或口令加密。`,"backup.webdav.url":`服务地址`,"backup.webdav.username":`用户名`,"backup.webdav.password":`密码`,"backup.webdav.passwordKept":`已保存,留空则不修改`,"backup.webdav.folder":`文件夹`,"backup.webdav.save":`保存设置`,"backup.webdav.saved":`已保存`,"backup.webdav.forget":`移除设置`,"backup.webdav.test":`测试连接`,"backup.webdav.testOk":`连接正常,可以读写`,"backup.webdav.upload":`立即备份`,"backup.webdav.uploadDone":`已上传 {count} 个提供商`,"backup.webdav.restore":`从云端恢复`,"providers.section.basic":`基本信息`,"providers.section.auth":`认证`,"providers.section.endpoints":`接口`,"providers.section.billing":`计费`,"providers.section.advanced":`高级`,"providers.section.info":`信息`,"providers.subscription":`订阅账号`,"providers.subscription.footer":`令牌加密保存在本机;过期后在下次使用时自动续期。`,"providers.subscription.login":`登录订阅`,"providers.subscription.loginDesc":`按提供商的授权流程完成登录,令牌只保存在本机。`,"providers.subscription.logout":`登出并删除`,"providers.subscription.logoutConfirm":`登出账号「{name}」?绑定该账号的客户端将回退到默认账号。`,"providers.subscription.refreshToken":`刷新令牌`,"providers.subscription.tokenRefreshed":`令牌已刷新`,"providers.subscription.expires":`到期`,"providers.subscription.status.active":`有效`,"providers.subscription.status.expired":`已过期`,"providers.subscription.status.revoked":`已失效`,"providers.subscription.none":`尚未登录订阅账号`,"providers.subscription.openAuthorize":`打开授权页`,"providers.subscription.doneAuthorize":`我已完成授权`,"providers.subscription.waiting":`等待授权…`,"providers.subscription.waitingDetail":`已在浏览器打开授权页;完成后本页会自动检测到新账号。`,"providers.subscription.cliDetail":`在浏览器完成授权后本页会自动完成登录(服务端轮询,无需回调地址)。`,"providers.subscription.checkNow":`我已授权,立即验证`,"providers.subscription.checkNowHint":`在浏览器完成授权后点一下;本页也会每几秒自动检查一次。`,"providers.subscription.pasteTitle":`把授权页显示的授权码粘回来`,"providers.subscription.pasteDetail":`Claude 的回调地址是它自己注册的地址(不是本机),所以无法自动跳回来:授权页上会显示一个授权码。点「打开授权页」完成授权,再把授权码整段复制粘贴到下面。`,"providers.subscription.pastePlaceholder":`粘贴授权码(形如 xxxx#yyyy)`,"providers.subscription.pasteCode":`授权码`,"providers.subscription.pasteSubmit":`完成登录`,"providers.subscription.stillWaiting":`还没收到授权,请确认浏览器里已完成确认。`,"providers.subscription.deviceCode":`设备码`,"providers.subscription.visitPage":`打开验证页面`,"providers.subscription.loginOk":`授权成功:{name}`,"providers.subscription.loginFailed":`登录失败`,"providers.subscription.importCodex":`导入本机 Codex 登录`,"providers.subscription.importCodexHint":`把本机 ~/.codex/auth.json 里已有的 codex 登录态接进来,不用再走一遍浏览器授权`,"providers.subscription.importOk":`已导入本机 Codex 账号:{name}`,"providers.subscription.importCopilot":`导入本机 GitHub 授权`,"providers.subscription.importCopilotHint":`接入本机已有的 GitHub 授权(VS Code 的 GitHub 会话、GH_TOKEN 或 Copilot 插件配置)来建 Copilot 账号,不用再走一遍设备码授权`,"providers.subscription.importCopilotPlaceholder":`或粘贴 GitHub token(gho_…)`,"providers.subscription.importCopilotToken":`GitHub token`,"providers.subscription.localCopilotFound":`检测到本机 GitHub 授权:{source}`,"providers.subscription.importBatch":`批量导入 token`,"providers.subscription.importBatchTitle":`批量导入 GitHub token`,"providers.subscription.importBatchLabel":`GitHub token 列表(每行一个)`,"providers.subscription.importBatchDesc":`粘贴 GitHub token(gho_ / ghp_ / github_pat_),每行一个。每个 token 会建成一个 Copilot 账号;重复的、没有 Copilot 订阅的 token 只会报告结果,不会导入。也可以直接粘贴可用的 Copilot 令牌(tid=…;exp=…),它不需要置换,但无法自动续期,到期后需重新导入。`,"providers.subscription.importBatchPlaceholder":`gho_xxxxxxxxxxxx
|
|
11
|
+
tid=xxxx;exp=1760000000;sku=...
|
|
12
|
+
# 以 # 开头的行会被忽略`,"providers.subscription.importBatchCount":`已识别 {n} 个 token`,"providers.subscription.importBatchRun":`导入`,"providers.subscription.importBatchSummary":`已导入 {ok} 个,重复 {dup} 个,失败 {fail} 个`,"providers.subscription.importBatchStatus.imported":`已导入`,"providers.subscription.importBatchStatus.duplicate":`重复`,"providers.subscription.importBatchStatus.invalid_format":`格式错误`,"providers.subscription.importBatchStatus.failed":`失败`,"providers.subscription.importBatchStatus.updated":`已更新`,"providers.subscription.importBatchStatus.ready":`可导入`,"providers.accounts.statTotal":`{n} 个账户`,"providers.accounts.statUsable":`{n} 可用`,"providers.accounts.statCooling":`{n} 冷却中`,"providers.accounts.statDead":`{n} 失效`,"providers.accounts.providerProxy":`提供商代理:{proxy}`,"providers.accounts.filter.all":`全部`,"providers.accounts.filter.usable":`可用`,"providers.accounts.filter.cooling":`冷却`,"providers.accounts.filter.dead":`失效`,"providers.accounts.filter.disabled":`停用`,"providers.accounts.filterLabel":`按状态筛选`,"providers.accounts.search":`搜索邮箱 / 名称 / Key`,"providers.accounts.add":`添加账户`,"providers.accounts.addLogin":`浏览器登录`,"providers.accounts.addLoginProxy":`浏览器登录(指定代理)…`,"providers.accounts.addToken":`粘贴令牌…`,"providers.accounts.addApiKey":`添加 API Key…`,"providers.accounts.batchImport":`批量导入`,"providers.accounts.export":`导出`,"providers.accounts.exportConfirm":`导出这个提供商的全部账户凭据?`,"providers.accounts.exportDetail":`会把令牌 / API Key 以明文复制到剪贴板,每行一条,可直接粘贴回「批量导入」。拿到它的人可以使用这些账户,请妥善保管,用完清空剪贴板。`,"providers.accounts.exportDone":`已复制 {n} 个账户的凭据到剪贴板`,"providers.accounts.exportSkipped":`(另有 {n} 个账户没有可导出的凭据)`,"providers.accounts.exportNone":`没有可导出的凭据`,"providers.accounts.exportCopyFailed":`无法写入剪贴板,请换用本机访问或 https 地址`,"providers.accounts.noMatch":`没有符合条件的账户`,"providers.accounts.select":`选择 {name}`,"providers.accounts.selected":`已选 {n} 个账户`,"providers.accounts.clearSelection":`取消选择`,"providers.accounts.bulkDeleteConfirm":`删除选中的 {n} 个账户?`,"providers.accounts.bulkDeleteDetail":`令牌会从本机删除;绑定这些账户的客户端将回退到默认账户。`,"providers.accounts.bulkDone":`已处理 {n} 个账户`,"providers.accounts.kind.oauth":`OAuth`,"providers.accounts.kind.api_key":`API Key`,"providers.accounts.source.login":`浏览器登录`,"providers.accounts.source.local":`本机导入`,"providers.accounts.source.token":`粘贴导入`,"providers.accounts.source.batch":`批量导入`,"providers.accounts.source.plugin":`插件登录`,"providers.accounts.expiresAt":`{when} 到期`,"providers.accounts.neverExpires":`不过期`,"providers.accounts.proxyBadge":`独立代理`,"providers.accounts.signedOut":`登录已失效`,"providers.accounts.quotaShortWeekly":`周`,"providers.accounts.quotaShortSession":`会话`,"providers.accounts.quotaShortCredits":`额度`,"providers.accounts.quotaShortPremium":`高级`,"providers.accounts.order":`#{n}`,"providers.usage.title":`请求用量`,"providers.usage.today":`今日`,"providers.usage.total":`累计`,"providers.usage.requests":`请求次数`,"providers.usage.tokens":`Token 数`,"providers.usage.cost":`消耗额度`,"providers.usage.hint":`仅统计经过 Astra 的请求;Token 为输入与输出之和。费用按请求时的模型定价计算,订阅显示等效费用。`,"providers.usage.dayHint":`今日按 {zone} 的自然日统计。`,"providers.usage.error":`用量统计加载失败`,"providers.accounts.detail.identity":`账户`,"providers.accounts.detail.name":`名称`,"providers.accounts.detail.proxy":`账户代理`,"providers.accounts.detail.proxyHint":`此账户的请求、令牌刷新与额度查询都走这里;留空则跟随提供商({fallback})。`,"providers.accounts.detail.quota":`额度`,"providers.accounts.detail.credentials":`凭据`,"providers.accounts.detail.kind":`类型`,"providers.accounts.detail.source":`来源`,"providers.accounts.detail.status":`状态`,"providers.accounts.detail.expires":`令牌到期`,"providers.accounts.detail.lastRefresh":`最近刷新`,"providers.accounts.detail.created":`添加时间`,"providers.accounts.detail.order":`故障转移顺序`,"providers.accounts.detail.lastError":`最近错误`,"providers.accounts.detail.key":`API Key`,"providers.accounts.proxyFallbackSystem":`系统代理`,"providers.accounts.renamed":`已重命名`,"providers.accounts.proxySaved":`账户代理已保存`,"providers.accounts.loginProxyTitle":`使用指定代理登录`,"providers.accounts.loginProxyDesc":`新账户从登录起就通过这个代理访问上游(换码、刷新、请求都走它)。授权页仍在你的浏览器里打开。`,"providers.accounts.loginProxyStart":`开始登录`,"providers.accounts.import.batchTitle":`批量导入账户`,"providers.accounts.import.tokenTitle":`粘贴令牌`,"providers.accounts.import.apiKeyTitle":`添加 API Key`,"providers.accounts.import.desc":`令牌只在本机加密保存,结果里只显示首尾几位。`,"providers.accounts.import.label":`要导入的令牌(每行一条)`,"providers.accounts.import.apiKeyLabel":`API Key(每行一把)`,"providers.accounts.import.formats":`支持:{formats}`,"providers.accounts.import.count":`已识别 {n} 条`,"providers.accounts.import.preview":`预览`,"providers.accounts.import.run":`导入`,"providers.accounts.import.proxy":`账户代理(可选)`,"providers.accounts.import.summary":`已导入 {ok} 条,重复 {dup} 条,失败 {fail} 条`,"providers.accounts.import.previewSummary":`可导入 {ok} 条,重复 {dup} 条,无法识别 {fail} 条`,"providers.accounts.import.rotateWarning":`refresh token 通常只能用一次:导入后,原来使用它的客户端(Claude Code、Codex 等)可能需要重新登录。`,"providers.accounts.credential.refresh_token":`refresh token`,"providers.accounts.credential.setup_token":`setup-token`,"providers.accounts.credential.api_key":`API Key`,"providers.accounts.credential.github_token":`GitHub token`,"providers.accounts.credential.copilot_token":`Copilot 令牌`,"providers.accounts.credential.claude_credentials":`.credentials.json`,"providers.accounts.credential.codex_auth_json":`auth.json`,"providers.accounts.format.claude-refresh-token":`refresh token(sk-ant-ort01-…)`,"providers.accounts.format.claude-setup-token":`claude setup-token(sk-ant-oat01-…)`,"providers.accounts.format.claude-credentials-json":`Claude Code 的 .credentials.json`,"providers.accounts.format.codex-auth-json":`~/.codex/auth.json 的内容`,"providers.accounts.format.refresh-token":`refresh token`,"providers.accounts.format.grok-sso":`Grok Web SSO(sso cookie / email----password----…----sso)`,"providers.accounts.format.kimi-api-key":`Kimi Code API Key(sk-kimi-…)`,"providers.accounts.format.zai-api-key":`Z.AI Coding Plan API Key`,"providers.accounts.format.bigmodel-api-key":`智谱 Coding Plan API Key`,"providers.accounts.format.github-token":`GitHub token(gho_ / ghp_ / github_pat_)`,"providers.accounts.format.copilot-token":`Copilot 令牌(tid=…;exp=…)`,"providers.subscription.localCopilotHint":`点「导入本机 GitHub 授权」时会读取 VS Code 的系统凭据(macOS 会弹授权框),也可以直接粘贴一个 GitHub token`,"providers.subscription.localCodexFound":`检测到本机 Codex 登录:{who}`,"providers.subscription.unknownAccount":`未知账号`,"providers.subscription.credits.title":`额度重置卡`,"providers.subscription.credits.footer":`codex 的额度重置卡:用一张可以立刻解除当前被限流的窗口。`,"providers.subscription.credits.none":`这个账号没有重置卡`,"providers.subscription.credits.unavailable":`暂时读不到重置卡(账号可能未登录,或上游不可达)。`,"providers.subscription.credits.availableCount":`可用 {count} 张`,"providers.subscription.credits.consume":`使用`,"providers.subscription.credits.consumeConfirm":`使用重置卡「{title}」?`,"providers.subscription.credits.consumeDetail":`会立刻解除当前被限流的窗口,且无法撤销。`,"providers.subscription.credits.consumed":`重置卡已使用,额度已刷新`,"providers.subscription.credits.consumeFailed":`使用重置卡失败`,"providers.subscription.credits.expires":`有效期至 {when}`,"providers.subscription.credits.redeemedAt":`已于 {when} 使用`,"providers.subscription.credits.notInPlan":`当前套餐不支持`,"providers.subscription.credits.status.available":`可用`,"providers.subscription.credits.status.redeemed":`已使用`,"providers.subscription.credits.status.expired":`已过期`,"providers.subscription.needsVerification":`即将支持:该订阅的登录流程尚未核实,暂不能登录`,"providers.subscription.current":`当前使用`,"providers.subscription.disabled":`已停用`,"providers.subscription.activate":`切换到此账号`,"providers.subscription.activated":`已切换到 {name},下一个请求起生效`,"providers.subscription.enable":`启用`,"providers.subscription.disable":`停用`,"providers.subscription.moveUp":`上移`,"providers.subscription.moveDown":`下移`,"providers.subscription.cooldown":`限流冷却至 {when}`,"providers.subscription.policy.title":`使用策略`,"providers.subscription.policy.footer":`切换账号对下一个请求立即生效,无需重启客户端;在客户端或令牌上固定了账号的请求不受影响。`,"providers.subscription.policy.claudeCodeOnly":`仅限 Claude Code`,"providers.subscription.policy.claudeCodeOnlyDetail":`只接受 Claude Code(含 IDE 插件与 Agent SDK)的请求,并原样转发它的请求头;其他客户端会收到 403。`,"providers.subscription.policy.anyWarning":`已允许其他客户端使用:Astra 只补齐 OAuth 必需的请求头,不会伪装成 Claude Code。Anthropic 可能把这些请求计入额外用量、直接拒绝,或视为违反服务条款。`,"providers.subscription.policy.mimic":`其他客户端模拟 Claude Code`,"providers.subscription.policy.mimicDetail":`非 Claude Code 客户端的请求会带上 Claude Code 的身份(system 身份块、claude-cli User-Agent、X-Stainless 指纹与完整 beta 集),否则订阅令牌的非 Haiku 模型会被上游拒绝。默认关闭。`,"providers.subscription.policy.mimicWarning":`已开启模拟 Claude Code:请求会伪装成官方 CLI。这违反 Anthropic 的使用条款,可能导致账号被限制或封禁,风险由你自己的账号承担。`,"providers.subscription.policy.switchMode":`账号切换`,"providers.subscription.policy.manual":`手动`,"providers.subscription.policy.failover":`自动故障转移`,"providers.subscription.policy.manualDetail":`只在你切换账号,或当前账号失效、被停用时更换。`,"providers.subscription.policy.failoverDetail":`当前账号被限流(429)、认证被拒绝(401/403)且无法恢复,或登录失效时,自动换到下一个可用账号并继续使用它。`,"providers.subscription.policy.balanced":`均衡分配`,"providers.subscription.policy.balancedDetail":`把请求分摊到所有可用账号,优先选当前并发最少的。同一会话(相同 prompt_cache_key 或 Claude Code 会话)固定使用同一个账号,保证上游提示词缓存命中;被限流、认证拒绝且无法恢复或已失效的账号会被跳过。绑定关系只保存在内存里。`,"providers.notes":`备注`,"providers.apiKeyStored":`API Key 加密保存在本机,留空表示不修改。`,"providers.replaceKey":`输入新密钥以替换`,"providers.endpointsFooter":`每种协议一个地址;客户端协议与上游不同时,Astra 自动转换。`,"providers.fullUrl":`完整 URL`,"providers.addEndpoint":`添加接口`,"providers.preferred":`上游协议优先级`,"providers.preferredHint":`需要转换协议时按此顺序选择上游接口`,"providers.preferredMissing":`{protocol} 没有配置接口地址,排在优先级里也不会被选中`,"providers.billingFooter":`倍率只作用于继承来的价格;模型上的自定义价格不乘倍率。`,"providers.multiplier":`价格倍率`,"providers.multiplierHint":`例如中转站按官方价 ×1.1 计费`,"providers.proxy":`HTTP 代理`,"providers.proxyHint":`此提供商的请求、订阅登录、令牌刷新与额度查询都走这里;订阅账户可在「账户」里单独设置`,"providers.headers":`额外请求头`,"providers.mimicClaudeCode":`模拟 Claude Code`,"providers.mimicClaudeCode.hint":`发往此上游的 Anthropic 请求会带上 Claude Code 的身份(claude-cli User-Agent、X-Stainless 指纹、system 身份块);真正的 Claude Code 请求原样转发。默认关闭,请只用于允许这种用法的上游。`,"providers.addHeader":`添加请求头`,"providers.addHeaderDetail":`随每个发往该提供商的请求一起发送;保存后生效。`,"providers.headerName":`名称`,"providers.headerValue":`值`,"providers.addEndpointDetail":`为一种协议配置接口地址;保存后生效。`,"providers.fullUrlHint":`地址即完整请求 URL,不再追加路径`,"providers.adapterSettings":`适配器设置(JSON)`,"providers.adapter":`适配器`,"providers.boundClients":`使用中的客户端`,"origin.inherited":`继承`,"origin.overridden":`已覆盖`,"origin.unset":`未设置`,"origin.reset":`重置为继承`,"models.count":`{count} 个模型`,"models.search":`搜索模型、别名`,"models.allVendors":`全部厂商`,"models.sync":`同步模型目录`,"models.syncDetail":`从官网目录(astra-gate.si)获取最新的模型参数和价格,用户修改过的字段不会被覆盖。`,"models.new":`新建模型`,"models.newDetail":`为系统中没有的模型添加参数和默认价格。`,"models.col.model":`模型`,"models.col.vendor":`厂商`,"models.col.context":`上下文`,"models.col.price":`输入 / 输出`,"models.col.providerPrices":`提供商价格`,"models.empty":`没有匹配的模型`,"models.source.seed":`内置`,"models.source.sync":`同步`,"models.source.user":`自定义`,"models.modified":`已修改`,"models.providerPriceCount":`{count} 个提供商`,"models.updated":`更新于 {time}`,"models.resetField":`恢复为内置值`,"models.fieldReset":`已恢复为内置值`,"models.deleteConfirm":`删除模型 {id}?`,"models.section.basic":`基本参数`,"models.section.capabilities":`能力`,"models.section.pricing":`官方默认价格`,"models.section.providerPrices":`各提供商价格`,"models.section.overrides":`提供商自定义价格`,"models.section.simulator":`计费模拟器`,"models.modifiedFooter":`标记为「已修改」的字段不会被后续的内置数据或同步覆盖。`,"models.pricingHint":`模型厂商的官方价格;没有对应提供商价格时使用(会乘提供商倍率)。`,"models.providerPricesFooter":`同一模型在不同 AI 提供商的价格(按价格表区分),优先于官方默认价。`,"models.overridesFooter":`这些提供商为该模型单独设置了价格,优先级最高。`,"models.noProviderPrices":`没有提供商专属价格`,"models.hasTimeWindows":`含时段规则`,"models.hasTiers":`含分档`,"models.deletePrice":`删除 {key} 的价格?`,"models.addPrice":`添加提供商价格`,"models.editPrice":`编辑 {key} 的价格`,"models.priceSheetDetail":`该价格只在价格表匹配的提供商上生效。`,"models.pickPriceKey":`选择价格表`,"models.customPriceKey":`或输入自定义价格表 ID`,"models.upstreamId":`该提供商的模型 ID`,"models.upstreamIdHint":`与系统模型 ID 不同时填写,用于自动关联`,"models.simulatorUnsaved":`有未保存的更改:模拟使用编辑中的价格。`,"models.field.id":`模型 ID`,"models.field.idHint":`客户端请求时使用的名称`,"models.field.displayName":`显示名称`,"models.field.vendor":`厂商`,"models.field.family":`系列`,"models.field.aliases":`别名`,"models.field.contextWindow":`上下文窗口`,"models.field.maxOutputTokens":`最大输出`,"models.field.inputPrice":`输入价格 /1M`,"models.field.outputPrice":`输出价格 /1M`,"models.sync.newModel":`新模型`,"models.sync.price":`价格 · {key}`,"models.sync.field":`字段 · {field}`,"models.sync.applied":`已应用 {count} 项更改`,"models.sync.apply":`应用 {count} 项`,"models.sync.check":`检查更新`,"models.sync.none":`没有可用的更新`,"models.sync.userModified":`已被用户修改`,"models.sync.more":`还有 {n} 处变更`,"models.sync.selectAll":`全选`,"models.sync.selectedOf":`已选 {n} / {total} 项 · {models} 个模型`,"models.sync.groupCount":`{n} 项`,"cap.vision":`图像输入`,"cap.tools":`工具调用`,"cap.reasoning":`推理`,"cap.promptCache":`提示缓存`,"cap.audio":`音频`,"cap.pdf":`PDF`,"cap.structuredOutput":`结构化输出`,"requests.col.cache":`缓存命中 / 写入`,"usage.title":`Token 用量`,"usage.inputTotal":`输入总量`,"usage.outputTotal":`输出总量`,"usage.input":`普通输入`,"usage.output":`普通输出`,"usage.uncachedInput":`未缓存输入`,"usage.regularOutput":`非推理输出`,"usage.cacheRead":`缓存命中`,"usage.cacheWrite":`缓存写入`,"usage.cacheWrite5m":`缓存写入 · 5 分钟`,"usage.cacheWrite30m":`缓存写入 · 30 分钟`,"usage.cacheWrite1h":`缓存写入 · 1 小时`,"usage.cacheWrite12h":`缓存写入 · 12 小时`,"usage.reasoning":`推理 / 思考`,"usage.inputAudio":`音频输入`,"usage.outputAudio":`音频输出`,"usage.inputImage":`图像输入`,"usage.outputImage":`图像输出`,"usage.hitShort":`命中`,"usage.writeShort":`写入`,"usage.reasoningShort":`推理`,"usage.hitRate":`缓存命中率`,"usage.noCache":`上游未报告缓存读取或写入 Token`,"usage.missing":`上游未报告用量,缓存命中率未知。`,"usage.hitTooltip":`缓存命中 {read} / 输入总量 {total} tokens`,"usage.writeTooltip":`共写入 {tokens} tokens;5m / 1h 在详情中分别列出`,"usage.totalsHint":`输入总量已包含缓存命中和写入;输出总量已包含推理 Token,不重复相加。命中率 = 缓存读取 / 输入总量。`,"usage.cacheAmounts":`命中 {read} · 写入 {write}`,"settings.appearance":`外观`,"settings.theme":`主题`,"settings.theme.system":`跟随系统`,"settings.theme.light":`浅色`,"settings.theme.dark":`深色`,"settings.accent":`强调色`,"settings.accent.system":`跟随系统`,"settings.accent.followingSystem":`正在使用系统强调色`,"settings.accent.systemUnavailable":`无法读取系统强调色,使用默认蓝色`,"settings.accent.blue":`蓝色`,"settings.accent.purple":`紫色`,"settings.accent.pink":`粉色`,"settings.accent.red":`红色`,"settings.accent.orange":`橙色`,"settings.accent.yellow":`黄色`,"settings.accent.green":`绿色`,"settings.accent.graphite":`石墨色`,"settings.language":`语言`,"settings.languageHint":`同时决定新请求计费说明的语言`,"settings.gateway":`网关`,"settings.requireKey":`要求访问密钥`,"settings.requireKeyHint":`默认开启。关闭后,本机不带密钥(或密钥无效)的请求也能使用网关,按默认令牌的提供商处理;局域网和远程请求始终需要令牌。`,"settings.requireKeyOffConfirm":`关闭访问密钥验证?`,"settings.requireKeyOffDetail":`关闭后,本机上的任何程序都可以直接使用你的提供商额度,无需密钥(局域网和远程请求仍需令牌)。仅建议在可信环境中关闭。`,"settings.requireKeyOff":`仍然关闭`,"settings.requireKeyOffNote":`已关闭:本机程序无需密钥即可使用网关`,"settings.gatewayFooter":`端口通过终端修改:astra start --port <端口>`,"settings.gatewayUrl":`网关地址`,"settings.listen":`监听`,"settings.listen.local":`仅本机`,"settings.listen.lan":`局域网`,"settings.listen.pending":`已改为 {host},重启服务后生效`,"settings.listen.env":`{address} · 由环境变量 ASTRA_HOST 决定,不能在这里修改`,"settings.listen.localOnly":`{address} · 只能在运行 Astra 的这台电脑上修改`,"settings.listen.lanConfirm":`开启局域网访问?`,"settings.listen.lanDetail":`同一网络中的设备将能通过本机 IP 访问 Astra:调用网关必须带令牌,打开管理后台要用管理员密码登录。局域网内的流量不加密,请只在可信网络中开启。`,"settings.listen.lanAction":`开启`,"settings.listen.passwordTitle":`先设置管理员密码`,"settings.listen.passwordDetail":`开启局域网访问后,其他设备打开管理后台必须登录。没有管理员密码,服务不会在局域网上启动。`,"settings.listen.passwordRepeat":`再次输入密码`,"settings.listen.passwordMismatch":`两次输入的密码不一致`,"settings.listen.passwordAction":`设置密码并开启`,"settings.listen.saved":`已保存,重启服务后生效`,"settings.listen.restart":`重启服务`,"settings.listen.restartHint":`在终端运行 astra restart 使新地址生效`,"settings.listen.restarted":`服务已重启`,"settings.listen.networkUrl":`局域网地址`,"settings.startup":`开机自启动`,"settings.startup.app":`桌面端`,"settings.startup.appHint":`登录系统后在托盘 / 菜单栏中打开,不弹出窗口,服务随之启动`,"settings.startup.appUnsupported":`仅安装版桌面端可用`,"settings.startup.service":`后台服务`,"settings.startup.service.launchd":`登录后在后台启动网关,不打开任何窗口(LaunchAgent,与 astra autostart 相同)`,"settings.startup.service.systemd":`登录后由 systemd 用户服务启动网关(与 astra autostart 相同)`,"settings.startup.service.registry":`登录 Windows 后在后台启动网关(注册表 Run 项,与 astra autostart 相同)`,"settings.startup.entry":`已写入 {location}`,"settings.startup.saved":`已开启,下次登录系统时生效`,"settings.startup.failed":`系统没有接受这项更改`,"settings.startup.localOnly":`只能在运行 Astra 的这台电脑上修改`,"settings.startup.unsupported.container":`容器内由容器的重启策略负责启动(例如 compose 的 restart: unless-stopped)`,"settings.startup.unsupported.no-systemd":`这台 Linux 没有 systemd,无法注册开机自启动`,"settings.startup.unsupported.platform":`当前系统不支持开机自启动`,"settings.startup.macFooter":`macOS 可能会在「系统设置 › 通用 › 登录项」中要求允许 Astra 在后台运行。`,"settings.dataDir":`数据目录`,"settings.openFolder":`打开目录`,"settings.streamIdle":`流式空闲超时`,"settings.streamIdleHint":`上游超过该时间无数据则断开`,"settings.requestCompression":`上游请求压缩`,"settings.requestCompressionHint":`需要压缩请求体的提供商(如 ChatGPT 订阅默认用 zstd)使用的格式;其他提供商始终发原文`,"settings.requestCompression.default":`按提供商默认`,"settings.requestCompression.none":`不压缩`,"settings.preventSleep":`处理请求时阻止系统休眠`,"settings.preventSleepHint":`网关有请求在处理(包括流式输出)时,阻止系统因闲置而睡眠,最后一个请求结束约 30 秒后解除;关闭开关或退出服务立即解除。显示器照常熄灭,合盖仍会睡眠。默认关闭;Linux 需要 systemd(systemd-inhibit),容器里不起作用。`,"settings.clientFailover":`提供商失败时自动切换`,"settings.clientFailoverHint":`客户端绑定了多个提供商时,请求遇到限流、认证被拒、5xx 或网络错误,且还没有任何内容返回给客户端,网关会按绑定顺序换下一个能服务该模型的提供商重试,所有提供商都失败才把错误返回给客户端。默认开启;关闭后只使用第一个能服务该模型的提供商。失败的提供商会短暂冷却,期间被跳过。`,"settings.sidebar":`侧边栏菜单`,"settings.sidebar.footer":`关闭后该项从左侧菜单隐藏,页面仍可通过地址或命令面板打开。设置不可隐藏。`,"settings.qualifiedModels":`按提供商区分同名模型`,"settings.qualifiedModels.footer":`多个提供商提供同一个模型时,客户端的模型列表里它们会分成「模型名@提供商别名」各一项,选哪一项请求就发给哪个提供商。不带别名的模型名仍按提供商优先级转发,所以已有配置不受影响。别名在提供商详情页设置,默认是提供商名称。`,"settings.qualifiedModels.mode":`在模型 ID 后附加提供商别名`,"settings.qualifiedModels.modeHint":`默认关闭,关闭时与现在完全一致。「仅多个提供商的模型」只给多个提供商都提供的模型加别名,其余保持原名;「所有模型」每一项都加。修改后,已启用客户端的模型列表会自动更新。`,"settings.qualifiedModels.mode.off":`关闭`,"settings.qualifiedModels.mode.shared":`仅多个提供商的模型`,"settings.qualifiedModels.mode.all":`所有模型`,"settings.qualifiedModels.separator":`分隔符`,"settings.qualifiedModels.separatorHint":`模型名与提供商别名之间的符号,1–8 个字符,不含空白,默认 @。`,"providers.alias.title":`别名`,"providers.alias.footer":`开启「按提供商区分同名模型」后,这个提供商的模型 ID 会写成「模型名@别名」。别名不区分大小写,空格会换成 -;两个提供商别名相同时,列表里靠前的优先。`,"providers.alias.label":`提供商别名`,"providers.alias.hint":`留空则使用提供商名称`,"providers.alias.saved":`已保存别名`,"providers.timeout.title":`响应超时`,"providers.timeout.label":`首字超时(秒)`,"providers.timeout.hint":`等待这个提供商开始响应的最长时间,留空不限制。`,"providers.timeout.footer":`超时算这个提供商失败:绑定了多个提供商的客户端和令牌的提供商池会换下一个继续,否则返回 504。只限制「开始响应」之前,响应开始后由设置里的流式空闲超时管。最大 3600 秒。`,"providers.timeout.saved":`已保存响应超时`,"settings.logging":`记录`,"settings.debugBodies":`保存请求与响应内容`,"settings.debugBodiesHint":`用于排查问题;内容保存在本机数据目录,不含密钥。`,"settings.traceContent":`在链路追踪中记录对话内容`,"settings.traceContentHint":`记录每次工具调用的参数(每个最多 4 KB)、用户提问和模型回复的开头(各 300 字)。默认关闭;内容随请求日志一起保存在本机,参数不经隐私护栏处理。`,"settings.bodyRetention":`内容保留`,"settings.requestRetention":`自动清理请求记录`,"settings.keepForever":`永久保留`,"settings.days":`天`,"settings.effort":`推理强度换算`,"settings.effortHint":`在 OpenAI reasoning effort 与 Anthropic / Gemini thinking budget 之间转换时使用。`,"settings.privacy":`隐私护栏`,"settings.privacy.footer":`请求发往提供商之前在本机检测敏感信息。原值只保存在请求内存中,不会写入数据库。`,"settings.privacy.enabled":`启用隐私护栏`,"settings.privacy.enabledHint":`关闭后所有请求原样转发`,"settings.privacy.dryRun":`只检测不处理`,"settings.privacy.dryRunHint":`记录命中但放行请求,用于观察效果`,"settings.privacy.restore":`还原响应占位符`,"settings.privacy.restoreHint":`响应中的占位符会替换回原值,客户端无感知`,"settings.privacy.recordSamples":`记录命中样本`,"settings.privacy.recordSamplesHint":`日志中保存遮罩后的样本(如 john••••om);默认不保存原值`,"settings.privacy.recordFullSamples":`显示完整命中内容`,"settings.privacy.recordFullSamplesHint":`开启后日志会保存命中的原文(每条最多 256 字符),调试规则时有用;日志里会多一份敏感数据,用完建议关闭`,"settings.privacy.defaultAction":`默认动作`,"settings.privacy.action.off":`关闭`,"settings.privacy.action.warn":`仅警告`,"settings.privacy.action.block":`拦截`,"settings.privacy.action.redact":`脱敏`,"settings.privacy.categories":`检测类别`,"settings.privacy.category.api_key":`API 密钥`,"settings.privacy.category.aws_key":`AWS 密钥`,"settings.privacy.category.jwt":`JWT 令牌`,"settings.privacy.category.private_key":`私钥`,"settings.privacy.category.email":`邮箱地址`,"settings.privacy.category.phone":`手机号`,"settings.privacy.category.intranet":`内网地址`,"settings.privacy.category.custom":`自定义`,"settings.privacy.category.credit_card":`银行卡号`,"settings.privacy.category.national_id":`证件号码`,"settings.privacy.category.credential":`凭据 / 连接串`,"settings.privacy.enableCategory":`启用`,"settings.privacy.customRules":`自定义规则`,"settings.privacy.noCustomRules":`暂无自定义规则`,"settings.privacy.addRule":`添加规则`,"settings.privacy.ruleName":`规则名称`,"settings.privacy.rulePattern":`正则表达式`,"settings.privacy.rulePatternHint":`对请求中的每个字符串值逐个匹配`,"settings.privacy.ruleTemplates":`从模板填入`,"settings.privacy.ruleTemplatesHint":`选择常用规则模板,名称与表达式可再修改`,"settings.privacy.ruleTemplateNone":`自定义(手动输入)`,"settings.privacy.template.ipv4All":`所有 IPv4 地址`,"settings.privacy.template.ipv4AllHint":`含公网地址;内置「内网地址」只覆盖私有网段`,"settings.privacy.template.landline":`座机号码(中国大陆)`,"settings.privacy.template.licensePlate":`车牌号(中国大陆)`,"settings.privacy.template.passportCn":`护照号(中国)`,"settings.privacy.template.uscc":`统一社会信用代码`,"settings.privacy.template.longToken":`通用长令牌(32 位以上随机串)`,"settings.privacy.template.longTokenHint":`命中面较宽,建议搭配「仅警告」使用`,"settings.privacy.template.macAddress":`MAC 地址`,"settings.privacy.template.unixHome":`Unix / macOS 用户目录路径`,"settings.privacy.template.windowsProfile":`Windows 用户目录路径`,"settings.privacy.template.unixHomeHint":`路径中会暴露本机用户名`,"settings.privacy.template.genericHint":`可按需要再调整表达式`,"settings.privacy.template.cloudAccessKey":`云厂商 AccessKey(阿里云 LTAI… / 腾讯云 AKID…)`,"settings.privacy.template.awsSecretKey":`AWS Secret Access Key(40 位)`,"settings.privacy.template.imWebhook":`IM 机器人 Webhook(钉钉 / 企微 / 飞书 / Slack)`,"settings.privacy.template.imWebhookHint":`Webhook 地址本身就是凭证,泄露后任何人都能向群里发消息`,"settings.privacy.template.internalService":`内部系统域名(gitlab. / jenkins. / jira. …)`,"settings.privacy.template.jdbcConn":`JDBC 连接串(含账号密码)`,"settings.privacy.template.jdbcHint":`连接串里的账号密码通常是明文`,"settings.privacy.template.smtpConn":`邮件服务器连接串(smtp://user:pass@…)`,"settings.privacy.template.keyFileRef":`密钥文件引用(.pem / .key / .pfx / .jks)`,"settings.privacy.template.confidentialMarker":`内部 / 机密标记(机密、Confidential…)`,"settings.privacy.template.confidentialHint":`按文档密级标记做警告或拦截`,"settings.privacy.template.employeeId":`员工工号(EMP-123456 / 工号123456)`,"settings.privacy.template.labeledNumber":`带标签编号(合同编号 / 订单编号 / 工单编号…)`,"settings.privacy.invalidPattern":`正则表达式无效`,"settings.privacy.deleteRuleConfirm":`删除规则「{name}」?`,"settings.privacy.tester":`试用检测`,"settings.privacy.testerHint":`按当前策略检测下面的文本(不影响真实请求)`,"settings.privacy.testerPlaceholder":`粘贴一段请求文本或 JSON…`,"settings.privacy.runTest":`检测`,"settings.privacy.noHits":`没有命中任何规则`,"settings.privacy.wouldBlock":`会拦截请求`,"settings.privacy.wouldRedact":`将脱敏 {count} 处`,"privacy.tab.overview":`概览`,"privacy.tab.logs":`拦截日志`,"privacy.tab.rules":`检测规则`,"privacy.tab.tester":`试用检测`,"privacy.stats":`防护统计`,"privacy.stats.events":`护栏事件`,"privacy.stats.blocked":`拦截请求`,"privacy.stats.dryRun":`只检测请求`,"privacy.stats.redactions":`脱敏处数`,"privacy.stats.byCategory":`类别命中`,"privacy.stats.col.category":`类别`,"privacy.stats.col.requests":`请求数`,"privacy.stats.col.hits":`命中数`,"privacy.stats.col.warn":`警告`,"privacy.stats.col.block":`拦截`,"privacy.stats.col.redact":`脱敏`,"privacy.logs.total":`共 {count} 条事件`,"privacy.logs.empty":`还没有隐私事件`,"privacy.logs.clear":`清空日志`,"privacy.logs.clearConfirm":`清空全部拦截日志?`,"privacy.logs.clearDetail":`只清除隐私护栏的命中记录,请求日志本身保留;此操作无法撤销。`,"privacy.logs.cleared":`已清除 {count} 条拦截事件`,"privacy.logs.empty.detail":`护栏检测到敏感内容后,对应的请求会出现在这里`,"privacy.logs.col.outcome":`处置结果`,"privacy.logs.col.action":`命中动作`,"privacy.logs.col.hits":`命中详情`,"privacy.logs.outcome.blocked":`已拦截`,"privacy.logs.outcome.redacted":`脱敏 {count} 处`,"privacy.logs.outcome.dryRun":`只检测`,"privacy.logs.blockedOnly":`仅拦截`,"privacy.logs.passedOnly":`仅放行`,"privacy.logs.moreHits":`+{count} 类`,"privacy.logs.viewRequest":`查看请求 {model}`,"settings.effort.low":`low`,"settings.effort.medium":`medium`,"settings.effort.high":`high`,"settings.about":`关于`,"settings.serverVersion":`服务版本`,"settings.desktopVersion":`桌面端版本`,"settings.versionMismatch":`与服务版本 {server} 不一致`,"settings.logs":`打开日志目录`,"settings.logout":`退出登录`,"settings.checkUpdates":`检查更新`,"settings.upToDate":`已是最新版本`,"settings.updateAvailable":`有可用更新 {version}`,"settings.updateCheckFailed":`检查失败:{error}`,"settings.updateApplyHint":`可从 Astra 托盘菜单安装,或在终端运行 astra update`,"settings.updateApply":`立即更新`,"settings.updateApplied":`服务已更新并重启`,"settings.updateDesktopRelaunch":`桌面端将重启以完成更新`,"settings.updateDownloadOpened":`已打开下载页,安装新版即可完成更新(含内置服务)`,"settings.updateDownloading":`新版本正在后台下载,下载完成后会提示重启安装`,"settings.lastChecked":`上次检查:{time}`,"settings.autoCheck":`自动检查更新`,"settings.previewUpdates":`接收预览版更新`,"settings.previewUpdatesHint":`提前获得下一个正式版的新功能,可能不稳定。关闭后不会降级,停在当前版本直到更新的正式版发布`,"settings.tab.general":`常规`,"settings.tab.tray":`托盘面板`,"settings.tab.models":`模型`,"settings.tab.network":`网络`,"settings.tab.usage":`用量`,"settings.tray.titleHeading":`菜单栏常驻文字`,"settings.tray.titleHint":`显示在菜单栏图标旁,不用点开就能看到。Windows 与 Linux 显示在图标提示中。`,"settings.tray.title.none":`不显示`,"settings.tray.title.none.hint":`只显示图标`,"settings.tray.title.requests":`今日调用`,"settings.tray.title.requests.hint":`例如 7`,"settings.tray.title.tokens":`今日 tokens`,"settings.tray.title.tokens.hint":`例如 68.8K`,"settings.tray.title.cost":`今日费用`,"settings.tray.title.cost.hint":`例如 $0.37`,"settings.tray.title.quota":`订阅窗口`,"settings.tray.title.quota.hint":`剩余最少的订阅窗口,例如 64%`,"settings.tray.title.alerts":`仅异常提示`,"settings.tray.title.alerts.hint":`有失败请求、额度告急或网关停止时才显示`,"settings.tray.usageHeading":`用量信息`,"settings.tray.clientsHeading":`客户端`,"settings.tray.section.overview":`今日概览`,"settings.tray.section.overview.hint":`调用次数、tokens 与失败数`,"settings.tray.section.cost":`预估费用`,"settings.tray.section.cost.hint":`按官方 API 价格折算,不替代账单`,"settings.tray.section.chart":`今日趋势`,"settings.tray.section.chart.hint":`每小时调用次数柱状图`,"settings.tray.section.topModel":`常用模型`,"settings.tray.section.topModel.hint":`今日 tokens 占比最高的模型`,"settings.tray.section.compareYesterday":`对比昨天`,"settings.tray.section.compareYesterday.hint":`今日 tokens 相对昨日全天的变化`,"settings.tray.section.cacheHitRate":`缓存命中率`,"settings.tray.section.cacheHitRate.hint":`缓存读取占输入 tokens 的比例`,"settings.tray.section.quota":`额度与余额`,"settings.tray.section.quota.hint":`Codex、Claude 等订阅的窗口用量与重置时间,以及已启用用量查询的 API 提供商余额`,"settings.tray.section.clients":`客户端提供商`,"settings.tray.section.clients.hint":`已启用客户端当前使用的提供商,点击可切换`,"settings.tray.previewHeading":`面板预览`,"settings.tray.previewHint":`点击托盘图标展开的面板。改动立即生效,预览即实际效果。`,"settings.tray.previewFooter":`使用当前真实数据渲染。`,"settings.tray.reset":`恢复默认`,"tray.status.running":`网关运行中`,"tray.status.stopped":`网关未运行`,"tray.status.starting":`正在启动网关…`,"tray.status.stopping":`正在停止网关…`,"tray.status.restarting":`正在重启网关…`,"tray.stoppedHint":`网关停止期间,客户端无法通过 Astra 调用模型。`,"tray.mismatch":`API 版本不匹配`,"tray.update":`有可用更新`,"tray.copyAddress":`复制网关地址`,"tray.settings":`托盘面板设置`,"tray.more":`更多操作`,"tray.today":`今日`,"tray.failures":`{count} 次失败`,"tray.justNow":`刚刚`,"tray.updated":`更新于{time}`,"tray.loadFailed":`无法读取用量数据`,"tray.requests":`次调用`,"tray.tokens":`tokens`,"tray.cost":`预估费用`,"tray.topModel":`常用模型`,"tray.cacheHit":`缓存命中`,"tray.vsYesterday":`较昨日`,"tray.chartLabel":`今日每小时调用次数`,"tray.hourBar":`{hour} · {count} 次调用`,"tray.quota":`额度与余额`,"tray.quotaRemaining":`剩余`,"tray.quotaReset":`重置`,"tray.quotaCredits":`额度`,"tray.quotaPending":`正在获取额度…`,"tray.clients":`客户端`,"tray.unbound":`未绑定`,"tray.switchProvider":`切换 {client} 的提供商`,"tray.disabledProvider":`{name}(已停用)`,"tray.restart":`重启网关`,"tray.stop":`停止网关`,"tray.quit":`退出`,"tray.open":`打开 Astra`,"tray.title.requests":`今日调用 {count} 次`,"tray.title.tokens":`今日 tokens {count}`,"tray.title.cost":`今日预估费用 {amount}`,"tray.title.quota":`{plan} {window}窗口剩余 {remaining}`,"tray.title.failures":`今日 {count} 次失败`,"tray.tab.overview":`概览`,"tray.tab.quota":`额度`,"tray.alert.failures":`{count} 次失败 · 占今日 {share}`,"tray.alert.quota":`{plan} {window}窗口仅剩 {remaining}`,"tray.quotaTightest":`额度 · 最紧张`,"tray.viewAll":`查看全部`,"nav.plugins":`插件`,"providers.card.plugin":`插件登录`,"plugins.subtitle":`兼容 magpie 的插件:提供商插件(OpenCode 插件,在 Bun 插件宿主中运行)、网关中间件与客户端(Agent)插件。`,"plugins.add":`添加插件`,"plugins.updateAll":`全部更新`,"plugins.tab.installed":`已安装`,"plugins.tab.market":`插件市场`,"plugins.tab.runtime":`运行环境`,"plugins.empty":`还没有安装插件`,"plugins.emptyDetail":`在「插件市场」中挑选,或添加 npm 包、GitHub 仓库或本地文件夹。`,"plugins.orderHint":`列表顺序即网关中间件的执行顺序。`,"plugins.kind.provider":`提供商`,"plugins.kind.middleware":`中间件`,"plugins.kind.agent":`客户端`,"plugins.kind.pi":`pi 扩展`,"plugins.local":`本地`,"plugins.moveUp":`上移`,"plugins.moveDown":`下移`,"plugins.enabled":`启用`,"plugins.options":`选项`,"plugins.update":`更新`,"plugins.removeConfirm":`删除插件 {name}?`,"plugins.removeDetail":`插件会被卸载;它添加的客户端会先恢复原来的配置。`,"plugins.cantLoad":`插件无法加载`,"plugins.hostCantLoad":`插件宿主没能加载它`,"plugins.mw.error":`中间件没能加载:{error}`,"plugins.mw.stats":`中间件 {hooks} · 调用 {calls} 次 · 平均 {micros} µs · 失败 {failures} 次`,"plugins.mw.lastError":`最近一次失败:{error}`,"plugins.agent.adds":`添加了客户端「{name}」,前往「客户端」页面启用`,"plugins.agent.error":`客户端没能加载:{error}`,"plugins.provides":`登录到:{providers}`,"plugins.servedBy":`{provider} 由另一个插件 {other} 提供`,"plugins.useFor":`用它提供 {provider}`,"plugins.picked":`已被选定为这些提供商的提供者。`,"plugins.optionsTitle":`{name} 的选项`,"plugins.optionsExample":`尚未设置,以下是插件给出的示例。`,"plugins.optionsNone":`尚未设置。插件以 JSON 对象读取选项(中间件的 ctx.options)。`,"plugins.optionsClear":`清除选项`,"plugins.optionsSaved":`选项已保存`,"plugins.optionsObject":`选项必须是一个 JSON 对象`,"plugins.addTitle":`添加插件`,"plugins.addDetail":`npm 包(可带版本)、Git 仓库(github:用户/仓库)或本机文件、文件夹的绝对路径。`,"plugins.spec":`插件`,"plugins.specHint":`例如 @astragate-community/middleware-word-guard、github:someone/plugin、/Users/me/my-plugin`,"plugins.install":`安装`,"plugins.installed":`已安装`,"plugins.installConfirm":`安装 {name}?`,"plugins.trustTitle":`插件会以你的权限运行代码`,"plugins.trustDetail":`提供商插件在插件宿主中拥有完整权限,能看到经过它的请求内容;中间件能读取并修改所有请求与回复。只安装你信任的插件。`,"plugins.job.title":`插件任务`,"plugins.job.running":`正在处理 {target}…`,"plugins.job.done":`{target} 已完成`,"plugins.job.failed":`{target} 失败`,"plugins.job.failedTitle":`没能完成`,"plugins.searchPlaceholder":`搜索 npm 与 GitHub 上的插件…`,"plugins.searchResults":`搜索结果`,"plugins.noResults":`没有找到插件`,"plugins.marketNote":`插件市场来自 Astra 官网(astra-gate.si)的清单:社区仓库(astragate-community/astra-gate-plugins)里的插件,加上官网发布的插件。插件包按清单里的地址下载,并按清单里的哈希校验。`,"plugins.origin.astra":`Astra`,"plugins.minVersion":`需要 Astra {version}+`,"plugins.linkInvalid":`链接里的插件既不是包名也不是 GitHub 仓库,已忽略。`,"plugins.bunDetail":`提供商插件运行在 Bun 上。Astra 会在第一次需要时下载固定版本的 Bun 并校验其 SHA-256;中间件与客户端插件不需要 Bun。`,"plugins.bunPath":`位置`,"plugins.bunMissing":`尚未下载`,"plugins.bunVersion":`版本`,"plugins.bunTarget":`构建`,"plugins.bunNoBuild":`这台机器没有可用的 Bun 构建`,"plugins.bunFailed":`下载 Bun 失败`,"plugins.bunDownload":`下载 Bun {version}`,"plugins.bunDownloading":`正在下载…`,"plugins.host":`插件宿主`,"plugins.hostDetail":`提供商插件在一个独立的 Bun 进程(magpie 的 host.js)中运行,插件或代理改变时自动重启。`,"plugins.hostState":`状态`,"plugins.hostRunning":`运行中`,"plugins.hostStopped":`未运行(需要时启动)`,"plugins.hostStartFailed":`启动失败`,"plugins.hostGone":`宿主已退出`,"plugins.hostPluginError":`没能加载:{error}`,"pluginAccounts.noPlugin":`插件不可用`,"pluginAccounts.apiKey":`API 密钥`,"pluginAccounts.browser":`浏览器登录`,"pluginAccounts.empty":`还没有登录账号`,"pluginAccounts.emptyDetail":`用上面的方式登录,登录信息由插件保存。`,"pluginAccounts.current":`当前`,"pluginAccounts.active":`可用`,"pluginAccounts.lapsed":`需重新登录`,"pluginAccounts.lapsedDetail":`供应商拒绝了这个账号的登录,请重新登录。`,"pluginAccounts.usage":`额度`,"pluginAccounts.signOut":`退出登录`,"pluginAccounts.signOutConfirm":`退出 {name} 的登录?`,"pluginAccounts.plan":`套餐`,"pluginAccounts.until":`到期`,"pluginAccounts.resets":`{at} 重置`,"pluginAccounts.signedIn":`已登录`,"pluginAccounts.signInTitle":`登录 {name}`,"pluginAccounts.continue":`继续`,"pluginAccounts.key":`密钥`,"pluginAccounts.signIn":`登录`,"pluginAccounts.openPage":`打开登录页面`,"pluginAccounts.openAgain":`再次打开登录页面`,"pluginAccounts.deviceCode":`确认码`,"pluginAccounts.code":`页面显示的代码`,"pluginAccounts.waiting":`在浏览器中完成登录后,这里会自动继续。`,"pluginAccounts.failed":`登录失败`,"pluginAccounts.checkin":`每日签到`,"pluginAccounts.checkinOn":`自动签到`,"pluginAccounts.checkinNow":`立即签到`,"pluginAccounts.checkinDetail":`插件会按北京时间每天为每个可用账号签到一次;失败的会在 30 分钟后重试。Astra 不会处理验证码。`,"pluginAccounts.checkinNever":`今天还没有签到`,"pluginAccounts.credit":`+{credit}`,"pluginAccounts.streak":`连续 {days} 天`,"pluginAccounts.outcome.claimed":`已签到`,"pluginAccounts.outcome.done":`今天已签过`,"pluginAccounts.outcome.ineligible":`不符合条件`,"pluginAccounts.outcome.inactive":`现在没有签到活动`,"pluginAccounts.outcome.captcha":`需要验证码,请在它自己的应用里签到`,"pluginAccounts.outcome.failed":`失败`,"plugins.browseMarket":`浏览插件市场`,"plugins.off":`插件已在服务端关闭`,"plugins.hostRecent":`插件最近的提示`,"plugins.offDetail":`服务以 ASTRA_PLUGINS=off 启动:已安装的插件都不运行,也不能安装新插件。去掉这个环境变量并重启即可恢复。`,"plugins.bunReady":`已就绪`,"plugins.kind.all":`全部`,"plugins.kindFilter":`按类型筛选`,"plugins.magpie.banner":`这台电脑上的 magpie 装有 {count} 个 Astra 还没有的插件。`,"plugins.magpie.import":`从 magpie 导入`,"plugins.magpie.off":`已停用`,"plugins.magpie.signIns":`同时复制 {count} 个登录信息`,"plugins.magpie.title":`从 magpie 导入插件`,"plugins.magpie.signInsDetail":`把 magpie 的 plugin-auth.json 中的插件登录复制到 Astra(两者都以明文保存);Astra 已有的同名账号保持不变,magpie 的文件不会被修改。`,"plugins.openProviders":`在「提供商」中登录`,"plugins.searchNote":`搜索结果包含插件市场自己的条目,以及 npm 与 GitHub 的 magpie-plugin 主题;后两者未经审核,安装前请确认来源可信。`,"settings.tab.remote":`远程访问`,"settings.remote.status":`状态`,"settings.remote.statusFooter":`通过 Cloudflare Tunnel 把网关开放到公网,无需公网 IP 或路由器端口转发。cloudflared 由 Astra 首次开启时自动下载并托管运行。`,"settings.remote.enable":`远程访问`,"settings.remote.state.off":`未开启`,"settings.remote.state.downloading":`正在下载 cloudflared…`,"settings.remote.state.starting":`正在连接 Cloudflare…`,"settings.remote.state.connected":`已连接`,"settings.remote.state.reconnecting":`连接中断,正在重连…`,"settings.remote.connectedSince":`已连接 {time}`,"settings.remote.publicUrl":`远程网关地址`,"settings.remote.publicUrlHint":`在其他设备的客户端里填这个地址,并使用 Astra 令牌。`,"settings.remote.openPage":`在浏览器中打开`,"settings.remote.download":`下载进度`,"settings.remote.enableConfirm":`开启远程访问?`,"settings.remote.enableDetail":`任何知道地址的人都能访问你的网关入口(仍需 Astra 令牌才能调用)。请只把地址和令牌分享给信任的人。`,"settings.remote.enableAction":`开启`,"settings.remote.disableSelfConfirm":`关闭远程访问?`,"settings.remote.disableSelfDetail":`你正在通过远程地址访问此页面,关闭后会立即断开,只能回到这台电脑上重新开启。`,"settings.remote.disableAction":`关闭`,"settings.remote.cloudflaredMissing":`首次开启时自动下载 {version}(约 20–55 MB)`,"settings.remote.cloudflaredUnsupported":`这台机器没有可用的 cloudflared 版本`,"settings.remote.password":`管理员密码`,"settings.remote.passwordSet":`已设置`,"settings.remote.passwordMissing":`未设置 · 开启局域网访问或远程开放管理后台时需要`,"settings.remote.passwordChange":`修改`,"settings.remote.passwordSetAction":`设置密码`,"settings.remote.passwordNew":`新密码(至少 8 位)`,"settings.remote.passwordSaved":`管理员密码已保存`,"settings.remote.block.token":`固定域名模式需要填写隧道令牌。`,"settings.remote.block.hostname":`固定域名模式需要填写公网域名。`,"settings.remote.block.password":`远程开放管理后台前,请先设置管理员密码。`,"settings.remote.mode":`连接方式`,"settings.remote.modeLabel":`隧道类型`,"settings.remote.mode.quick":`临时地址`,"settings.remote.mode.named":`固定域名`,"settings.remote.mode.quick.hint":`无需 Cloudflare 账号,分配一个 *.trycloudflare.com 地址`,"settings.remote.mode.named.hint":`使用你在 Cloudflare 创建的隧道和自己的域名`,"settings.remote.quickWarning":`临时地址不支持流式输出(SSE),大多数编程客户端会因此无法正常工作;每次启动地址都会变化,也没有可用性保证。仅适合临时试用,长期使用请选择固定域名。`,"settings.remote.token":`隧道令牌`,"settings.remote.tokenHint":`安装命令中 --token 后面的值`,"settings.remote.tokenSaved":`已保存,留空则保持不变`,"settings.remote.hostname":`公网域名`,"settings.remote.hostnameHint":`在隧道的「公网主机名」里配置的域名`,"settings.remote.origin":`服务地址`,"settings.remote.originHint":`公网主机名的服务(Service)指向这里`,"settings.remote.namedFooter":`在 Cloudflare Zero Trust → Networks → Tunnels 创建隧道,复制安装命令里的令牌;再为隧道添加公网主机名,把服务指向上面的服务地址。服务端口变化时需要同步修改。`,"settings.remote.saved":`远程访问设置已保存`,"settings.remote.guide":`查看配置教程`,"settings.remote.scope":`远程开放范围`,"settings.remote.scopeFooter":`远程请求经 Cloudflare 转发,会单独识别:本机的「强制令牌」开关不影响它们。`,"settings.remote.scope.gateway":`网关 API`,"settings.remote.scope.gatewayHint":`/v1、/v1beta 以及令牌自助查询页 /key`,"settings.remote.scope.gatewayBadge":`始终需要令牌`,"settings.remote.scope.admin":`管理后台`,"settings.remote.scope.adminHint":`需要管理员密码;登录失败会被限速`,"settings.remote.adminConfirm":`允许远程登录管理后台?`,"settings.remote.adminDetail":`知道地址和管理员密码的人可以修改所有设置、提供商和插件。请确认密码足够强。`,"settings.remote.adminAction":`允许`,"settings.remote.log":`运行日志`,"settings.remote.logEmpty":`暂无输出`,"settings.remote.unsupported":`容器内不托管远程访问`,"settings.remote.unsupportedDetail":`在 Docker 中请把 cloudflared 作为 sidecar 容器运行,并设置管理员密码。详见文档「Docker 部署」。`,"shell.remoteOn":`远程访问已开启`,"login.remoteBlocked":`远程管理已关闭`,"login.remoteBlockedDetail":`这个地址只开放网关 API。如需远程管理,请在这台电脑上的「设置 → 远程访问」中开启「管理后台」。`,"settings.remote.connectedJustNow":`刚刚连接`,"settings.remote.connectedFor":`已连接 {duration}`,"settings.remote.copyMenu":`复制地址`,"settings.remote.copy.openai":`OpenAI / Gemini 地址(带 /v1)`,"settings.remote.copy.anthropic":`Anthropic 地址(不带 /v1,Claude Code 等使用)`,"settings.remote.copy.key":`令牌自助查询页(/key)`,"settings.remote.logWithVersion":`运行日志 · cloudflared {version}`,"settings.remote.err.token":`隧道令牌无效,请在 Cloudflare 后台重新复制。`,"settings.remote.err.tokenLost":`已保存的隧道令牌无法读取(数据目录的密钥已变化),请重新填写。`,"settings.remote.err.network":`连不上 Cloudflare,请检查网络或代理(cloudflared 需要访问 Cloudflare 的 7844 端口)。`,"settings.remote.err.rate":`Cloudflare 暂时不再分配临时地址(请求过多),稍后会自动重试。`,"settings.remote.err.download":`cloudflared 下载失败。可以在下方「cloudflared」里换一个下载来源,或改用已安装的 cloudflared。`,"settings.remote.err.generic":`连接出错,正在自动重试`,"settings.remote.err.origin":`Cloudflare 连不上 Astra:请确认 Cloudflare 后台的服务地址是 {origin}。`,"settings.remote.modeSwitchConfirm":`切换连接方式?`,"settings.remote.modeSwitchDetail":`隧道会重新连接,正在通过远程地址进行的连接会中断;临时地址每次都会变化。`,"settings.remote.modeSwitchStopDetail":`固定域名还没有填写隧道令牌和公网域名,切换后远程访问会关闭。`,"settings.remote.modeSwitchAction":`切换`,"settings.remote.savedRestart":`已保存,隧道正在重新连接`,"settings.remote.adminOffSelfConfirm":`关闭远程管理?`,"settings.remote.adminOffSelfDetail":`你正在通过远程地址使用管理后台,关闭后会立即失去访问,只能回到这台电脑上重新开启。`,"tokens.remoteHint":`远程访问已开启:其他设备使用 {url};令牌持有者可以打开 {key} 查看额度和用量。`,"requests.col.origin":`来源`,"requests.allOrigins":`全部来源`,"requests.origin.remote":`远程`,"requests.origin.local":`本机`,"requests.origin.remoteFrom":`远程 · {ip}`,"settings.remote.state.downloadingFrom":`正在从 {source} 下载 cloudflared…`,"settings.remote.cf.footer":`无论从哪个来源下载,文件都会按固定的 SHA-256 校验,来源本身不需要可信。`,"settings.remote.cf.program":`程序`,"settings.remote.cf.downloaded":`已下载 · {version}`,"settings.remote.cf.notDownloaded":`首次开启时下载 {version}`,"settings.remote.cf.installedProgram":`本机安装 · {version}`,"settings.remote.cf.installedUnknown":`本机安装 · 版本未知`,"settings.remote.cf.fromEnv":`由环境变量 ASTRA_CLOUDFLARED 指定,下方设置不生效`,"settings.remote.cf.source":`下载来源`,"settings.remote.cf.source.auto":`自动`,"settings.remote.cf.source.github":`GitHub`,"settings.remote.cf.source.astra":`Astra 官网镜像`,"settings.remote.cf.source.custom":`自定义地址`,"settings.remote.cf.source.auto.hint":`先从 GitHub 下载,失败或卡住时改用 Astra 官网镜像`,"settings.remote.cf.source.github.hint":`只从 GitHub Releases 下载`,"settings.remote.cf.source.astra.hint":`从 astra-gate.si 下载,国内网络通常更快`,"settings.remote.cf.source.custom.hint":`从你指定的地址下载,例如 GitHub 加速代理`,"settings.remote.cf.baseUrl":`下载地址`,"settings.remote.cf.baseUrlHint":`按「地址/版本号/文件名」下载,与 GitHub Releases 的目录结构相同`,"settings.remote.cf.installed":`已安装的 cloudflared`,"settings.remote.cf.installedHint":`不下载,直接运行这台电脑上已有的 cloudflared`,"settings.remote.cf.installedPath":`cloudflared 程序路径`,"settings.remote.cf.choose":`使用已安装的`,"settings.remote.cf.detect":`自动查找`,"settings.remote.cf.detectNone":`没有在 PATH 中找到 cloudflared`,"settings.remote.cf.use":`使用`,"settings.remote.cf.useDownloaded":`改用下载版本`,"settings.remote.cf.saved":`cloudflared 设置已保存`,"traces.subtitle":`Agent → Astra → 提供商:每一跳的流量、耗时、重试与改写`,"traces.tab.label":`链路视图`,"traces.tab.topology":`拓扑`,"traces.tab.sessions":`会话`,"traces.tab.requests":`请求`,"traces.range.label":`时间范围`,"traces.range.live":`实时`,"traces.range.1h":`1 小时`,"traces.range.24h":`24 小时`,"traces.range.7d":`7 天`,"traces.canvas.hint":`拖动空白处平移 · 拖动节点调整布局 · ⌘/Ctrl + 滚轮缩放`,"traces.canvas.details":`详情`,"traces.canvas.fit":`适应`,"traces.canvas.resetLayout":`重置布局`,"traces.canvas.zoomIn":`放大`,"traces.canvas.zoomOut":`缩小`,"traces.canvas.close":`关闭详情`,"traces.canvas.minimap":`小地图`,"traces.topology.legend":`线宽 = 请求量 · 橙色线 = 限流 / 切号`,"traces.live.arriving":`鉴权 / 路由中`,"traces.live.upstream":`已发往上游,等待首字节`,"traces.live.streaming":`上游已响应,正在回传`,"traces.live.done":`已完成`,"traces.live.failed":`失败`,"traces.live.badge":`{count} 进行中`,"traces.live.legend.out":`发往上游`,"traces.live.legend.back":`响应回传`,"traces.live.legend.slow":`等待过久`,"traces.live.legend.failed":`失败`,"traces.live.legend.think":`思考`,"traces.live.legend.write":`文本`,"traces.live.legend.tool":`调用工具`,"traces.live.legend.retry":`重试 / 切换`,"traces.topology.requestsIn":`个请求({window})`,"traces.topology.perMinute":`{count}/分`,"traces.topology.count":`{count} 次`,"traces.topology.direct":`直接调用`,"traces.topology.activeSessions":`{count} 个会话进行中`,"traces.topology.idle":`空闲`,"traces.topology.accounts":`{count} 个账号`,"traces.topology.cooling":`{count} 个冷却中`,"traces.topology.apiKey":`API Key`,"traces.topology.empty":`这段时间没有经过 Astra 的请求。`,"traces.topology.gateway":`Astra 网关`,"traces.topology.inFlightCount":`进行中 {count}`,"traces.topology.overheadNoteTitle":`自身开销怎么算`,"traces.topology.overheadNote":`第一次发往上游的时刻 − 请求进门的时刻,不含上游与重试。`,"traces.viewSessions":`查看会话`,"traces.kind.agent":`Agent`,"traces.kind.gateway":`网关`,"traces.kind.provider":`提供商`,"traces.kind.tool":`Agent 端工具`,"traces.kind.main":`主代理`,"traces.kind.sidechain":`子代理`,"traces.kind.aux":`辅助调用`,"traces.kv.requests":`请求数`,"traces.kv.errors":`错误`,"traces.kv.errorRate":`错误率`,"traces.kv.inFlight":`进行中`,"traces.kv.rate":`请求/分`,"traces.kv.activeSessions":`活跃会话`,"traces.kv.attempts":`上游尝试`,"traces.kv.rateLimited":`429 次数`,"traces.kv.failovers":`切号`,"traces.kv.ttfbP95":`首字节 P95`,"traces.kv.overheadP50":`自身开销 P50`,"traces.kv.overheadP95":`Astra 开销 P95`,"traces.kv.calls":`调用`,"traces.kv.cost":`费用`,"traces.kv.status":`状态`,"traces.kv.duration":`耗时`,"traces.kv.firstToken":`首 token`,"traces.kv.tokens":`输入 / 输出`,"traces.kv.cacheRead":`缓存读`,"traces.kv.finish":`finish_reason`,"traces.kv.link":`关联方式`,"traces.kv.toolCalls":`工具调用`,"traces.kv.gap":`间隔`,"traces.kv.session":`会话`,"traces.kv.step":`步骤`,"traces.kv.protocols":`协议`,"traces.kv.traceparent":`traceparent`,"traces.kv.token":`令牌`,"traces.kv.client":`客户端`,"traces.kv.bytes":`请求体`,"traces.kv.bodyTime":`读请求体`,"traces.kv.rewritten":`改写了请求`,"traces.kv.hits":`命中`,"traces.kv.categories":`类型`,"traces.kv.restored":`还原占位符`,"traces.kv.dryRun":`只记录不处理`,"traces.kv.provider":`提供商`,"traces.kv.model":`模型`,"traces.kv.capabilities":`能力探测`,"traces.kv.lossy":`有损映射`,"traces.kv.claudeMode":`Claude 订阅头`,"traces.kv.upstreamId":`上游 request-id`,"traces.kv.reads":`读取次数`,"traces.kv.events":`事件数`,"traces.kv.maxGap":`最长停顿`,"traces.kv.http":`HTTP 状态`,"traces.kv.ttfb":`首字节`,"traces.kv.credentials":`凭据准备`,"traces.kv.refreshed":`已刷新令牌`,"traces.kv.retry":`重试原因`,"traces.kv.processing":`上游处理时长`,"traces.kv.rateLimitHeaders":`上游限流响应头`,"traces.stage.gateway.request":`网关请求`,"traces.stage.gateway.route":`鉴权 · 路由 · 限额`,"traces.stage.gateway.body":`读请求体`,"traces.stage.gateway.middleware":`中间件插件`,"traces.stage.gateway.privacy":`隐私护栏`,"traces.stage.gateway.resolve":`提供商 / 模型解析`,"traces.stage.gateway.encode":`协议转换`,"traces.stage.upstream.attempt":`上游尝试`,"traces.stage.gateway.response":`响应回写`,"traces.account.title":`账号(剩余额度来自上游限流响应头)`,"traces.account.ok":`正常`,"traces.account.cooldown":`冷却至 {time}`,"traces.account.expired":`需重新登录`,"traces.account.revoked":`授权已失效`,"traces.account.disabled":`已停用`,"traces.account.remaining":`剩余 {count}`,"traces.account.cooldownIn":`冷却 {time}`,"traces.account.attempts":`{count} 次`,"traces.account.ready":`就绪`,"traces.hub.route":`→ {target}`,"traces.hub.switch":`{reason} → {target}`,"traces.switch.rate_limited_failover":`限流,换账号`,"traces.switch.auth_failover":`认证失败,换账号`,"traces.switch.auth_refresh":`刷新登录后重试`,"traces.switch.provider_failover":`切换提供商`,"traces.switch.compression_rejected":`改发未压缩的请求`,"traces.cause.user":`用户提问`,"traces.cause.tool_result":`工具结果`,"traces.cause.results":`工具结果 ×{count}`,"traces.cause.chars":`{count} 字`,"traces.cause.failed":`失败`,"traces.cause.retry":`重试`,"traces.output.think":`思考`,"traces.output.text":`文本`,"traces.output.tool":`调用工具`,"traces.output.thinkLine":`{time} · {chars} 字`,"traces.output.waiting":`等待首个输出…`,"traces.output.noArgs":`参数未记录`,"traces.finish.stop":`回复结束`,"traces.finish.tool_calls":`等待执行工具`,"traces.finish.length":`达到长度上限`,"traces.finish.content_filter":`被内容过滤`,"traces.finish.error":`出错`,"traces.finish.other":`结束`,"traces.activity.title":`实时活动`,"traces.activity.hint":`新的在上面 · 悬停高亮路径`,"traces.activity.toggle":`活动流`,"traces.activity.empty":`还没有请求。Agent 发起请求后会出现在这里。`,"traces.activity.cause":`发起`,"traces.activity.route":`路由`,"traces.activity.output":`返回`,"traces.activity.content":`记录内容`,"traces.activity.contentHint":`打开后,新请求的工具参数、提问和回复开头会被记录(默认关闭)`,"traces.activity.contentOff":`工具参数和提问内容未记录。打开「记录内容」后,新的请求才会有。`,"traces.activity.tokens":`输入 {input} · 输出 {output}`,"traces.activity.open":`查看链路`,"traces.link.new_turn":`新一轮(用户输入)`,"traces.link.tool_call":`工具调用 id(精确)`,"traces.link.session":`按会话兜底`,"traces.link.inferred":`推断`,"traces.retry.compression_rejected":`上游不收压缩的请求体`,"traces.retry.auth_refresh":`401/403 后刷新令牌重试`,"traces.retry.rate_limited_failover":`429 限流,切换账号`,"traces.retry.auth_failover":`账号不可用或认证被拒绝,切换账号`,"traces.retry.provider_failover":`提供商失败,换池里的下一个`,"traces.yes":`是`,"traces.no":`否`,"traces.node.entry":`入口`,"traces.node.entryDetail":`鉴权 · 路由 · 限额`,"traces.node.middleware":`中间件`,"traces.node.rewritten":`改写了请求`,"traces.node.unchanged":`未修改`,"traces.node.privacy":`隐私护栏`,"traces.node.hits":`命中 {count}`,"traces.node.resolve":`解析`,"traces.node.routing":`智能路由`,"traces.route.source.judge":`判定`,"traces.route.source.pin":`沿用会话`,"traces.route.source.turn":`沿用本轮`,"traces.route.source.fallback":`回退`,"traces.route.source.breaker":`熔断`,"traces.route.mode.session":`按会话`,"traces.route.mode.turn":`每次提问`,"traces.kv.routeSource":`决定来自`,"traces.kv.routeMode":`规则`,"traces.kv.routeConfidence":`把握`,"traces.kv.routeFallback":`回退原因`,"traces.kv.routeAdjusted":`原判定档位(调用方用不到)`,"traces.kv.routeJudge":`判定服务`,"traces.kv.routeJudgeTokens":`判定 token(输入 / 输出)`,"traces.kv.routeNewConnection":`先建立了连接`,"traces.request.time.routing":`智能路由判定`,"traces.session.routing":`智能路由 · {grade}`,"traces.node.passthrough":`直通`,"traces.node.encode":`协议转换`,"traces.node.attempt":`尝试 {n}`,"traces.node.failedOver":`失败,已换下一个`,"traces.node.decode":`响应解码`,"traces.node.maxGap":`最长停顿 {ms}`,"traces.node.reencode":`协议回编码`,"traces.node.restore":`占位符还原`,"traces.node.restored":`还原 {count} 处`,"traces.node.middlewareResponse":`中间件 · 响应`,"traces.node.events":`{count} 个事件`,"traces.sessions.empty":`还没有会话。Agent 经过 Astra 发出请求后会出现在这里。`,"traces.sessions.active":`进行中`,"traces.sessions.turnsCalls":`{turns} 轮 · {calls} 次调用`,"traces.sessions.errors":`{count} 个错误`,"traces.session.notFound":`找不到这个会话,可能已超出请求日志的保留期。`,"traces.session.back":`返回会话列表`,"traces.session.empty":`这一轮没有记录到调用。`,"traces.session.turn":`第 {n} 轮`,"traces.session.turnPicker":`选择轮次`,"traces.session.viewLabel":`展示方式`,"traces.session.view.canvas":`画布`,"traces.session.view.timeline":`时间线`,"traces.session.legend.exact":`工具调用 id 精确关联`,"traces.session.legend.inferred":`推断关联`,"traces.session.legend.tool":`连线标签:Agent 端工具与间隔(点击查看)`,"traces.session.tool":`工具`,"traces.session.toolCount":`{count} 个工具调用`,"traces.session.tries":`{count} 次尝试`,"traces.session.inferredSub":`推断:子代理`,"traces.session.inferredAux":`推断:辅助调用`,"traces.session.turnRow":`这一轮`,"traces.session.toolGapRow":`工具 / 等待`,"traces.session.toolNoteTitle":`这段时间里发生了什么`,"traces.session.toolNote":`两次调用之间的间隔:Agent 在执行工具,或在等你确认。要区分两者需要接入 Agent 遥测。`,"traces.session.time.title":`这一轮的时间`,"traces.session.time.model":`模型调用`,"traces.session.time.tools":`工具 / 等待`,"traces.session.time.retries":`重试浪费`,"traces.session.time.needsTelemetry":`细分需 Agent 遥测`,"traces.session.time.overhead":`Astra 自身开销 {ms},已含在模型调用内。`,"traces.session.groupCalls":`{count} 次调用 · {ms}`,"traces.session.groupTools":`{count} 次工具调用 · 点击展开`,"traces.session.expandAll":`全部展开`,"traces.session.nextAnomaly":`跳到异常({count})`,"traces.session.toolRow":`工具 · {names}`,"traces.phase.wait":`等首个输出`,"traces.phase.think":`思考`,"traces.phase.write":`输出`,"traces.phase.tool":`生成工具调用`,"traces.flag.error":`失败`,"traces.flag.retry":`重试`,"traces.flag.slow":`慢`,"traces.agent.label":`Agent`,"traces.agent.upstream":`等待模型响应`,"traces.agent.waiting":`模型开始响应`,"traces.agent.thinking":`思考中`,"traces.agent.writing":`输出中`,"traces.agent.tool":`生成工具调用 {name}`,"traces.agent.tools":`运行工具 {names}`,"traces.agent.idle":`等待你的输入`,"traces.agent.failed":`上次调用失败`,"traces.agent.retrying":`重试中`,"traces.kv.phases":`阶段`,"traces.kv.reasoning":`思考设置`,"traces.kv.chars":`思考 / 输出字数`,"traces.kv.tools":`调用的工具`,"traces.kv.startAt":`开始于`,"traces.kv.raw":`记录的全部属性与事件`,"traces.kv.messages":`消息数`,"traces.kv.toolDefs":`工具定义`,"traces.kv.systemChars":`system 提示词`,"traces.kv.maxTokens":`输出上限`,"traces.kv.requestId":`请求 id`,"traces.kv.reasoningTokens":`推理 token`,"traces.kv.generation":`生成耗时`,"traces.kv.speed":`输出速度`,"traces.unit.chars":`{count} 字符`,"traces.request.time.generationOther":`生成 · 其他`,"traces.timeline.node":`节点`,"traces.timeline.duration":`耗时`,"traces.request.pick":`选一个请求查看链路`,"traces.request.none":`还没有请求。`,"traces.request.notFound":`找不到这个请求,可能已超出请求日志的保留期。`,"traces.request.pending":`进行中`,"traces.request.inFlight":`请求还在进行中,结束后显示完整链路。`,"traces.request.openSession":`查看所在会话`,"traces.request.parent":`上一步`,"traces.request.child":`下一步`,"traces.request.legend.request":`请求方向`,"traces.request.legend.response":`响应方向`,"traces.request.legend.failed":`失败的尝试`,"traces.request.time.title":`时间去哪了`,"traces.request.time.astra":`Astra 自身`,"traces.request.time.retries":`重试浪费`,"traces.request.time.ttfb":`上游首字节`,"traces.request.time.firstToken":`等首 token`,"traces.request.time.generation":`生成`,"traces.openInLog":`在请求日志中打开`,"traces.openRequest":`打开这次请求的链路`,"traces.openTrace":`查看链路`,"traces.error.title":`加载链路数据失败`,"traces.error.unsupportedTitle":`当前连接的 Astra 服务不支持链路追踪`,"traces.error.unsupported":`这个端口上运行的是还没有链路追踪功能的旧版本 astra-server。停掉旧服务(例如退出 Astra 桌面版),再用新版本重新启动。`,"nav.smartRouting":`智能路由`,"nav.mcp":`MCP 网关`,"mcp.subtitle":`把多个 MCP 服务器聚合成一个地址,按令牌决定谁能用哪些服务器。`,"mcp.gateway.title":`网关`,"mcp.clients.title":`应用到客户端`,"mcp.clients.hint":`把网关地址和一个令牌写进 Claude Code 或 Codex 的 MCP 配置,客户端只需要这一个条目就能用上这里所有的服务器。服务器的配置和授权留在 Astra。`,"mcp.clients.token":`令牌`,"mcp.clients.pickToken":`选择令牌`,"mcp.clients.noToken":`还没有绑定了 MCP 服务器的令牌。先到「令牌」页给一个令牌选择 MCP 服务器。`,"mcp.clients.apply":`写入`,"mcp.clients.replace":`更换令牌`,"mcp.clients.remove":`移除`,"mcp.clients.state.missing":`未写入`,"mcp.clients.state.applied":`已写入`,"mcp.clients.state.drifted":`已被改动`,"mcp.clients.state.conflict":`冲突`,"mcp.clients.usesToken":`使用令牌 {name}`,"mcp.clients.gatewayOff":`网关还没有开启,客户端会得到 404。先打开上面的「启用 MCP 网关」。`,"mcp.clients.drifted":`条目在 Astra 写入之后被改动过。覆盖会用当前选择的令牌重新写入。`,"mcp.clients.conflict":`文件里已经有一个名为 astra 的条目,不是 Astra 写的,Astra 不会覆盖它。改名或删除它之后再写入。`,"mcp.clients.unreadable":`客户端的文件现在读不了:{error}`,"mcp.clients.force":`覆盖并重新写入`,"mcp.clients.forceRemove":`强制移除`,"mcp.clients.applied":`已写入 {client},重启客户端后生效。`,"mcp.clients.removed":`已从 {client} 移除。`,"mcp.clients.stdio":`网关只转发 http 类型的 MCP 服务器;本机上的 stdio 服务器不在其中。`,"mcp.gateway.enable":`启用 MCP 网关`,"mcp.gateway.enableHint":`关闭时 /mcp 不响应(404),不会暴露任何新入口。`,"mcp.gateway.endpoint":`聚合地址`,"mcp.gateway.endpointHint":`客户端把它当作一个 MCP 服务器,用 Astra 令牌作为 Bearer 凭据;每个服务器还有自己的 /mcp/<标识> 地址(工具名不带前缀)。`,"mcp.gateway.origins":`允许的浏览器来源`,"mcp.gateway.originsHint":`每行一个,例如 https://app.example.com。带有未列出 Origin 头的请求会被拒绝(防 DNS 重绑定);没有 Origin 头的非浏览器客户端不受影响。`,"mcp.gateway.originsSave":`保存来源`,"mcp.gateway.copyEndpoint":`复制地址`,"mcp.gateway.copied":`已复制`,"mcp.servers.title":`MCP 服务器`,"mcp.servers.add":`添加服务器`,"mcp.servers.emptyTitle":`还没有 MCP 服务器`,"mcp.servers.emptyDetail":`添加远程的 MCP 服务器(Streamable HTTP 或旧版 SSE),再在令牌里选择它能用哪些。`,"mcp.servers.localOnly":`添加、修改、测试和授权服务器只能在运行 Astra 的这台机器上操作。`,"mcp.server.addTitle":`添加 MCP 服务器`,"mcp.server.editTitle":`编辑 {name}`,"mcp.server.name":`名称`,"mcp.server.slug":`标识`,"mcp.server.slugHint":`小写字母、数字和单个连字符;它是聚合地址里这个服务器工具名的前缀(<标识>__<工具>),发布后不要随意改,客户端的工具白名单会用到它。留空则由名称生成。`,"mcp.server.url":`地址`,"mcp.server.urlHint":`http:// 或 https:// 开头,不要在地址里带密钥;需要凭据请用请求头或 OAuth。`,"mcp.server.transport":`传输`,"mcp.server.transport.http":`Streamable HTTP`,"mcp.server.transport.sse":`旧版 SSE`,"mcp.server.transportHint":`Streamable HTTP 会自动识别服务器说的是新版(2026-07-28)还是带会话的旧版协议;旧版 HTTP+SSE 已弃用,只在服务器只支持它时选用。`,"mcp.server.auth":`认证`,"mcp.server.auth.none":`无`,"mcp.server.auth.header":`请求头`,"mcp.server.auth.oauth":`OAuth`,"mcp.server.headers":`请求头`,"mcp.server.headersHint":`例如 Authorization: Bearer …。值加密保存,保存后不再显示;编辑时留空表示保持原值。`,"mcp.server.headerName":`名称`,"mcp.server.headerValue":`值`,"mcp.server.headerKept":`保持原值`,"mcp.server.addHeader":`添加请求头`,"mcp.server.removeHeader":`删除这个请求头`,"mcp.server.timeout":`超时(秒)`,"mcp.server.timeoutHint":`单次列出工具或调用工具的时间上限。`,"mcp.server.enabled":`启用`,"mcp.server.oauthNote":`保存后点"授权",在浏览器里登录上游服务。授权得到的是你自己账号的权限,所有绑定了这个服务器的令牌共用这个身份。`,"mcp.server.created":`已添加 {name}`,"mcp.server.saved":`已保存 {name}`,"mcp.server.deleted":`已删除 {name}`,"mcp.server.deleteConfirm":`删除 {name}?`,"mcp.server.deleteDetail":`绑定了它的令牌将不再能使用这个服务器;已保存的授权也会一并删除。`,"mcp.status.unknown":`未检测`,"mcp.status.ok":`正常`,"mcp.status.needs_auth":`需要授权`,"mcp.status.auth_error":`凭据被拒绝`,"mcp.status.unreachable":`无法连接`,"mcp.status.version_unsupported":`协议版本不支持`,"mcp.server.protocol":`协议 {version}`,"mcp.server.boundTokens":`{count} 个令牌`,"mcp.server.disabledBadge":`已停用`,"mcp.server.test":`测试连接`,"mcp.server.testOk":`连接正常,{count} 个工具`,"mcp.server.testToolsTitle":`{name} 的工具`,"mcp.server.testFailed":`连接失败:{message}`,"mcp.server.authorize":`授权`,"mcp.server.reauthorize":`重新授权`,"mcp.server.authorizeOpened":`已在浏览器中打开授权页面,完成后回到这里查看状态。`,"mcp.server.authorizeNotNeeded":`无需再次授权。`,"mcp.server.authorized":`已授权`,"mcp.server.authorizedBy":`授权方 {issuer}`,"mcp.server.forget":`忘记授权`,"mcp.server.forgetConfirm":`忘记 {name} 的授权?`,"mcp.server.forgetDetail":`之后需要重新授权,这个服务器才能再被使用。`,"mcp.server.forgotten":`已忘记授权`,"mcp.calls.title":`最近的调用`,"mcp.calls.hint":`只记录谁调用了哪个工具、耗时和结果,不记录参数和返回内容;保留 30 天。`,"mcp.calls.empty":`还没有调用。`,"mcp.calls.time":`时间`,"mcp.calls.token":`令牌`,"mcp.calls.tool":`工具`,"mcp.calls.duration":`耗时`,"mcp.calls.result":`结果`,"mcp.calls.ok":`成功`,"mcp.calls.era.modern":`新版`,"mcp.calls.era.legacy":`旧版`,"mcp.calls.error.tool":`工具报错`,"mcp.calls.error.needs_auth":`需要授权`,"mcp.calls.error.unreachable":`无法连接`,"mcp.calls.error.timeout":`超时`,"mcp.calls.error.needs_input":`需要交互`,"mcp.calls.error.protocol":`协议错误`,"smartRouting.subtitle":`按任务难度给请求挑模型:先让一个小的判定模型看一眼问题,再交给对应档位的模型`,"smartRouting.loadFailed":`加载智能路由设置失败`,"smartRouting.status":`状态`,"smartRouting.statusFooter":`开关会连同页面上还没保存的修改一起保存。关闭时,客户端选了虚拟模型会收到“未启用”的提示。`,"smartRouting.enable":`启用智能路由`,"smartRouting.state.on":`已启用`,"smartRouting.state.off":`未启用。先完成下面三步,再打开开关。`,"smartRouting.state.pins":`{count} 个会话已钉住档位`,"smartRouting.state.breaker":`判定服务连续失败,暂时直接使用回退档位`,"smartRouting.use":`在客户端里选择这个模型`,"smartRouting.useHint":`客户端的模型选成它,请求才会走智能路由;选其他模型完全不受影响。`,"smartRouting.recent":`最近的判定`,"smartRouting.recent.none":`保存设置之后还没有新的判定。`,"smartRouting.recent.judged":`近 {total} 次里 {count} 次按判定分配`,"smartRouting.recent.fallback":`{reason} {count} 次`,"smartRouting.recent.median":`判定中位耗时 {ms} 毫秒`,"smartRouting.recent.failing":`最近的判定大多没有用上,这些请求都走了回退档位「{grade}」`,"smartRouting.recent.last":`最近一次:{reason},{time}`,"smartRouting.recent.hint.timeout":`判定服务没能在超时内回答。最慢的是新建连接:经代理建立连接可能要好几秒(需要新建连接时 Astra 会多等 3 秒)。检查网络和代理——判定服务的地址能直连时,可以让它绕过代理——或者把超时调大一些。`,"smartRouting.recent.hint.network":`连不上判定服务:检查服务地址、网络和代理设置。`,"smartRouting.recent.hint.auth":`判定服务拒绝了密钥:重新填写这个服务自己的密钥。`,"smartRouting.recent.hint.rate_limited":`判定服务在限流:稍后会恢复;经常出现时检查它的额度和速率限制。`,"smartRouting.recent.hint.overloaded":`判定服务繁忙或暂时不可用:稍后会恢复。`,"smartRouting.recent.hint.bad_request":`判定服务拒绝了请求:检查判定模型名和接口协议是否和这个服务对得上。`,"smartRouting.recent.hint.bad_response":`判定服务的回答无法识别:检查接口协议和服务地址是否匹配。`,"smartRouting.recent.hint.low_confidence":`判定的把握低于“最低把握”:调低最低把握,或者把档位描述写得更具体、彼此区分得更清楚。`,"smartRouting.recent.hint.breaker":`判定服务连续失败,Astra 暂时不再调用它。看看它之前的失败原因。`,"smartRouting.recent.hint.no_text":`这些请求里没有可读的用户文字(例如只有工具结果或图片),没有东西可判定,所以用了回退档位。`,"smartRouting.recent.hint.not_configured":`密钥没有保存,或者保存的密钥读不出来了(例如数据目录换了机器):重新填写密钥。`,"smartRouting.recent.hint.error":`Astra 判定时出了内部错误,详情在服务日志里。`,"smartRouting.recent.hint.other":`用下面的“试一试”检查判定服务;每条请求在链路追踪的「智能路由」节点里写着原因。`,"smartRouting.unreachable.title":`有调用方用不到某些档位的模型,这些请求改用了别的档位`,"smartRouting.unreachable.item":`{caller} 用不到「{grade}」档({where}):{reason}。`,"smartRouting.unreachable.where":`{provider} 的 {model}`,"smartRouting.unreachable.used":`{count} 次改用了「{used}」,最近一次 {time}。`,"smartRouting.unreachable.none":`也没有别的档位能用,{count} 次按它自己的路由发出,最近一次 {time}。`,"smartRouting.unusable.token_limited":`它的令牌限制了客户端,只能用它自己的提供商`,"smartRouting.unusable.token_limited.fix":`在“令牌”页让这个令牌允许所有客户端,或者在“客户端”页给它绑定这个提供商。`,"smartRouting.unusable.provider_missing":`这个提供商已经被删除`,"smartRouting.unusable.provider_missing.fix":`给这个档位重新选一个模型。`,"smartRouting.unusable.provider_off":`这个提供商已停用,或者没有接口地址`,"smartRouting.unusable.provider_off.fix":`到“提供商”页启用它(或补上接口地址),或者给这个档位换一个模型。`,"smartRouting.unusable.claude_code_only":`这个订阅只允许 Claude Code 使用`,"smartRouting.unusable.claude_code_only.fix":`给这个档位换一个模型,或者在这个订阅的设置里允许其他客户端。`,"smartRouting.unusable.model_not_served":`这个提供商现在不提供这个模型(没有这个模型,或模型已停用)`,"smartRouting.unusable.model_not_served.fix":`到“提供商”页检查这个模型还在不在、有没有启用,或者给这个档位换一个模型。`,"smartRouting.unusable.unknown":`原因没有记录(服务端版本较旧,重启后会显示)`,"smartRouting.unreachable.hint":`档位的请求会发往给它选的提供商。用不到时,要么是这个令牌限制了客户端(只能用它自己的提供商),要么是那个提供商停用了、不再提供这个模型,或者只允许 Claude Code 使用。可以在“令牌”页放开客户端限制、在“客户端”页给它绑定这个提供商,或者给这个档位换一个模型。`,"smartRouting.problems":`没能完成`,"smartRouting.toast.on":`智能路由已启用`,"smartRouting.toast.off":`智能路由已关闭`,"smartRouting.discard":`放弃修改`,"smartRouting.numberMissing":`有数值没有填写,补上之后才能保存。`,"smartRouting.judge.title":`① 判定模型`,"smartRouting.judge.footer":`判定模型只回答一道选择题——这条请求该用哪个档位——不生成文字。`,"smartRouting.judge.protocol":`接口协议`,"smartRouting.judge.protocol.typesafe":`TypeSafe Jev`,"smartRouting.judge.protocol.openai":`OpenAI Decisions`,"smartRouting.judge.protocol.typesafe.hint":`TypeSafe System One 接口(默认)。OpenRouter、Vercel 等托管的 Jev 也用这个协议。`,"smartRouting.judge.protocol.openai.hint":`OpenAI 的 Decisions 接口。`,"smartRouting.judge.openaiDraft":`OpenAI 这一路按第三方文档实现,还没用 OpenAI 官方文档核对。启用前先用下面的“试一试”确认。`,"smartRouting.judge.service":`服务`,"smartRouting.preset.typesafe":`TypeSafe 官方`,"smartRouting.preset.openrouter":`OpenRouter`,"smartRouting.preset.vercel":`Vercel AI Gateway`,"smartRouting.preset.openai":`OpenAI 官方`,"smartRouting.preset.custom":`自定义地址`,"smartRouting.judge.baseUrl":`服务地址`,"smartRouting.judge.baseUrlHint":`只写到域名(或网关前缀),不含 /v1/…。`,"smartRouting.judge.apiKey":`API 密钥`,"smartRouting.judge.keySaved":`已保存 {mask};留空表示不改。`,"smartRouting.judge.keyMissing":`还没有保存密钥。`,"smartRouting.judge.keyReplace":`要填这个服务自己的密钥。`,"smartRouting.judge.keyDropped":`更改服务地址会清除已保存的密钥(它只属于原来的服务)。请在这里填入新服务的密钥。`,"smartRouting.judge.model":`判定模型`,"smartRouting.judge.modelHint":`TypeSafe 调好阈值后建议固定版本号,例如 jev-1.13.0。`,"smartRouting.judge.timeout":`超时(毫秒)`,"smartRouting.judge.timeoutHint":`超时按失败处理,这条请求改用回退档位。需要先建立连接时多等 3 秒。`,"smartRouting.privacy.title":`会把什么发给判定服务`,"smartRouting.privacy.body":`只发送最近一条用户消息,以及之前最多 {turns} 条用户消息(合计不超过 {chars} 个字符),都已经过隐私护栏;不发送助手回复、工具结果、图片和系统提示。判定服务是第三方,请按需选择。`,"smartRouting.judge.nonEnglish":`TypeSafe 官方说明非英文文本的判定准确率较低。用中文提问的话,请先用“试一试”验证效果。`,"smartRouting.judge.instructions":`判定指令`,"smartRouting.judge.instructionsHint":`留空使用内置指令。因为非英文准确率较低,指令和档位描述建议写英文。`,"smartRouting.test.title":`试一试`,"smartRouting.test.hint":`用页面上现在的设置(不用先保存)判定一段话,看它会选哪个档位。会调用一次判定服务,按量计费。`,"smartRouting.test.placeholder":`例如:把计费模块重构成事件驱动`,"smartRouting.test.run":`判定`,"smartRouting.test.result":`判定为「{grade}」`,"smartRouting.test.model":`这个档位的模型:{model}`,"smartRouting.test.noModel":`这个档位还没有选模型`,"smartRouting.test.confidence":`把握 {percent}%`,"smartRouting.test.confident":`达到阈值,请求会走这个档位`,"smartRouting.test.notConfident":`低于阈值,请求会改用回退档位`,"smartRouting.test.meta":`{ms} 毫秒 · 输入 {input} / 输出 {output} token · {model}`,"smartRouting.test.failed":`判定失败:{reason}`,"smartRouting.test.slow":`用了 {ms} 毫秒,比真实请求最多等待的 {limit} 毫秒慢:真实请求遇到这种情况会改用回退档位。`,"smartRouting.test.connecting":`这次需要先建立连接,连接建立后通常快得多,可以再试一次。`,"smartRouting.failure.timeout":`超时`,"smartRouting.failure.network":`连不上服务`,"smartRouting.failure.auth":`密钥被拒绝`,"smartRouting.failure.rate_limited":`被限流`,"smartRouting.failure.overloaded":`服务繁忙或不可用`,"smartRouting.failure.bad_request":`请求被拒绝`,"smartRouting.failure.bad_response":`返回的内容无法识别`,"smartRouting.failure.low_confidence":`把握不够`,"smartRouting.failure.breaker":`连续失败后暂停调用`,"smartRouting.failure.no_text":`没有可读的用户文字`,"smartRouting.failure.not_configured":`密钥没有保存或读不出来`,"smartRouting.failure.error":`内部错误`,"smartRouting.grades.title":`② 档位与模型`,"smartRouting.grades.footer":`从省钱到强力排列。判定模型读每个档位的描述来选,所以要写清楚这一档的任务长什么样。`,"smartRouting.grade.name":`名称`,"smartRouting.grade.description":`描述(判定依据)`,"smartRouting.grade.descriptionPlaceholder":`用英文写这一档适合的任务(判定模型读的就是这段话)`,"smartRouting.grade.model":`模型`,"smartRouting.grade.pickModel":`选择模型`,"smartRouting.grade.unavailable":`{model}(选中的提供商现在不提供,请重新选择)`,"smartRouting.grade.up":`上移`,"smartRouting.grade.down":`下移`,"smartRouting.grade.remove":`删除这个档位`,"smartRouting.grade.add":`添加档位`,"smartRouting.grade.fallbackBadge":`回退档位`,"smartRouting.grade.noModels":`还没有可选的模型:先到“提供商”页面添加并启用模型。`,"smartRouting.rules.title":`③ 路由规则`,"smartRouting.rules.footer":`判定失败、把握不够或读不到内容时,请求走回退档位,而且不会被钉住。`,"smartRouting.rules.mode":`什么时候判定`,"smartRouting.rules.mode.session":`按会话(默认)`,"smartRouting.rules.mode.turn":`每次提问`,"smartRouting.rules.mode.session.hint":`一个会话判定一次,之后一直用同一个档位:少调用判定服务,也不会中途换模型。判成最低档(问候、简单问题)时不钉住,下一句再判定。`,"smartRouting.rules.mode.turn.hint":`每条新的用户消息判定一次;同一条消息里因工具结果产生的后续请求沿用它的档位。换模型会让提示缓存失效。`,"smartRouting.rules.ttl":`会话保持时间(分钟)`,"smartRouting.rules.ttlHint":`会话空闲超过这个时间后,下一次请求重新判定。`,"smartRouting.rules.fallback":`回退档位`,"smartRouting.rules.fallbackHint":`判定失败、把握不够或没有可读内容时使用。`,"smartRouting.rules.minConfidence":`最低把握(0–1)`,"smartRouting.rules.minConfidenceHint":`判定的把握低于它就用回退档位。TypeSafe 没有推荐值,可以先用 0.3,再用“试一试”调。`,"smartRouting.rules.contextTurns":`带上之前几条用户消息`,"smartRouting.rules.contextTurnsHint":`给判定模型一点上下文(“继续”这类很短的消息需要它);0 表示只发当前这一条。`,"smartRouting.rules.maxChars":`发送字数上限`,"smartRouting.rules.maxCharsHint":`一次判定最多发出去多少个字符的对话文字。`,"smartRouting.rules.advanced":`高级`,"smartRouting.rules.virtualModel":`虚拟模型名`,"smartRouting.rules.virtualModelHint":`客户端把模型选成它就走智能路由;不能和某个提供商的真实模型重名。`,"smartRouting.problem.virtual_model_invalid":`虚拟模型名只能用字母、数字、点、下划线和连字符,并以字母或数字开头。`,"smartRouting.problem.virtual_model_conflict":`虚拟模型名和某个提供商的模型重名了,换一个名字。`,"smartRouting.problem.judge_protocol_invalid":`不支持这个接口协议。`,"smartRouting.problem.judge_url_invalid":`服务地址必须是 http(s) 地址,不能带账号、查询串或片段。`,"smartRouting.problem.judge_key_invalid":`密钥只能包含可见的 ASCII 字符,不能有空格和换行。`,"smartRouting.problem.judge_key_missing":`还没有填写判定服务的密钥。`,"smartRouting.problem.judge_model_missing":`还没有填写判定模型。`,"smartRouting.problem.out_of_range":`有一项数值超出了允许的范围({field})。`,"smartRouting.problem.too_long":`有一项内容太长了({field})。`,"smartRouting.problem.grades_count":`档位要有 2 到 6 个。`,"smartRouting.problem.grade_id_invalid":`档位编号不合法。`,"smartRouting.problem.grade_id_duplicate":`有两个档位的编号重复了。`,"smartRouting.problem.grade_description_missing":`每个档位都要写描述:判定模型就是读它来选的。`,"smartRouting.problem.grade_model_missing":`档位「{grade}」还没有选模型。`,"smartRouting.problem.grade_model_unroutable":`档位「{grade}」选的模型,现在没有可用的提供商提供。`,"smartRouting.problem.fallback_grade_unknown":`回退档位必须是现有档位之一。`,"smartRouting.problem.mode_invalid":`“什么时候判定”的取值不对。`},sv={"common.cancel":`Cancel`,"common.confirm":`OK`,"common.close":`Close`,"common.save":`Save`,"common.saved":`Saved`,"common.revert":`Revert`,"common.apply":`Apply`,"common.delete":`Delete`,"common.edit":`Edit`,"common.add":`Add`,"common.create":`Create`,"common.back":`Back`,"common.done":`Done`,"common.more":`More`,"common.copy":`Copy`,"common.copied":`Copied to clipboard`,"common.refresh":`Refresh`,"common.enabled":`Enabled`,"common.yes":`Yes`,"common.no":`No`,"common.prev":`Previous page`,"common.next":`Next page`,"common.noData":`No data`,"common.selectAll":`Select all`,"common.unsaved":`Unsaved changes`,"common.invalidJson":`Invalid JSON`,"common.search":`Search`,"common.clearSearch":`Clear search`,"common.select":`Select an option`,"common.noResults":`No matches`,"common.error":`Something went wrong`,"pricing.tierMode":`Billing mode`,"pricing.outputPolicy":`Output price`,"pricing.editMode":`Editing mode`,"pricing.days":`Days`,"models.sync.change":`Change`,"models.sync.changeOne":`change`,"models.sync.changeOther":`changes`,"common.continue":`Continue`,"providers.step.template":`Choose a template`,"providers.step.details":`Enter details`,"clients.current":`Current provider`,"common.deleting":`Deleting`,"common.deleted":`Deleted`,"common.retry":`Retry`,"providers.modelIds":`Model IDs`,"nav.overview":`Overview`,"nav.requests":`Requests`,"nav.traces":`Traces`,"nav.clients":`Clients`,"nav.providers":`Providers`,"nav.models":`Models`,"nav.settings":`Settings`,"nav.privacy":`Privacy guard`,"nav.tokens":`Tokens`,"nav.group.config":`Configuration`,"nav.group.system":`System`,"shell.running":`Service running`,"shell.discord":`Discord community`,"shell.github":`GitHub repository`,"shell.connecting":`Connecting…`,"shell.disconnected":`Not connected`,"shell.startService":`Start service`,"shell.startFailed":`Failed to start the service`,"shell.collapseSidebar":`Collapse sidebar`,"shell.expandSidebar":`Expand sidebar`,"banner.downDesktop":`Cannot reach the Astra service. Start it here or from the menu bar icon.`,"banner.downWeb":"Cannot reach the Astra service. Reconnecting… (run `astra start` in a terminal)","banner.mismatch":"The server API version does not match this UI. Run `astra update` and restart.","banner.loginRequired":"The server refused this app’s admin requests (sign-in required), so pages cannot load data. The server is usually outdated: run `astra update` and restart.","banner.clientsOutdated":`{names} still use an old Astra address or setting (for example, Astra moved to another port). Update them to reconnect.`,"banner.clientsUpdate":`Update now`,"banner.clientsUpdated":`Updated {names}; some clients need a restart to pick it up`,"login.subtitle":`This server is reachable remotely. Enter the admin password.`,"login.password":`Admin password`,"login.submit":`Sign in`,"range.today":`Today`,"range.7d":`7 days`,"range.30d":`30 days`,"range.90d":`90 days`,"range.all":`All time`,"bill.generate":`Daily bill`,"bill.title":`Today's bill`,"bill.description":`Today's spending by provider and model, ready to copy or save as an image.`,"bill.style":`Bill style`,"bill.style.receipt":`Receipt`,"bill.style.manga":`Comic`,"bill.copy":`Copy image`,"bill.save":`Save PNG`,"bill.copied":`Bill image copied`,"bill.saved":`Bill image saved`,"bill.copyFailed":`Couldn't copy the image: {error}`,"bill.saveFailed":`Couldn't save the image: {error}`,"bill.subtitle":`Local AI gateway · daily receipt`,"bill.field.date":`Date`,"bill.field.window":`Period`,"bill.field.number":`No.`,"bill.field.currency":`Currency`,"bill.field.requests":`Requests`,"bill.field.successRate":`Success rate`,"bill.field.input":`Input tokens`,"bill.field.output":`Output tokens`,"bill.count":`{count} req`,"bill.modelLine":`{requests} req · in {input} / out {output}`,"bill.subtotal":`Subtotal`,"bill.total":`TOTAL`,"bill.estimate":`Estimated from model prices · for reference only`,"bill.thanks":`* THANKS FOR USING ASTRA GATE *`,"bill.empty":`— Nothing spent today —`,"bill.manga.kicker":`ASTRA GATE DAILY BILL`,"bill.manga.until":`as of {time}`,"bill.manga.say":`Spent {total} today!`,"bill.manga.top":`{provider} alone took {share}~`,"bill.manga.sayEmpty":`Not a cent spent today~`,"bill.manga.strip":`{requests} REQ · {tokens} TOKENS`,"bill.manga.facts":`{requests} requests · {rate} success`,"bill.manga.seal":`SETTLED`,"overview.cost":`Cost`,"overview.requests":`Requests`,"overview.successRate":`Success rate`,"overview.tokens":`Tokens`,"overview.avgTtft":`Avg TTFT`,"overview.costTrend":`Cost trend`,"overview.range":`Time range`,"overview.measure":`Measure`,"overview.trend":`Trend`,"overview.tokensContext":`{input} in · {output} out`,"overview.hourlyAverage":`Hourly average`,"overview.dailyAverage":`Daily average`,"overview.total":`Total`,"overview.hour":`Hour`,"overview.day":`Day`,"overview.by.model":`Model`,"overview.by.provider":`Provider`,"overview.by.client":`Client`,"overview.by.token":`Token`,"overview.other":`Other`,"overview.topModels":`Top models by cost`,"overview.topModelDetail":`{requests} requests · {tokens} tokens`,"overview.empty.title":`No requests yet`,"overview.empty.detail":`Enable a client under Clients, or point any OpenAI / Anthropic / Gemini compatible tool at the gateway address below.`,"overview.clientFilter":`Filter by client`,"overview.allClients":`All`,"overview.tokenFilter":`Filter by token`,"overview.allTokens":`All tokens`,"overview.clientEmpty.title":`No requests from {client}`,"overview.clientEmpty.detail":`This client sent no requests in the selected period ({range}). Pick another client or time range.`,"overview.tokenEmpty.title":`No requests with {token}`,"overview.tokenEmpty.detail":`No request used this token in the selected period ({range}). Pick another token or time range.`,"overview.totalCost":`Total cost`,"overview.totalRequests":`Total requests`,"overview.usageTrend":`Usage trend`,"overview.breakdown":`Breakdown`,"overview.viewAll":`View all`,"overview.col.input":`Input`,"overview.col.output":`Output`,"overview.col.cacheHit":`Cache hit`,"overview.col.speed":`Speed`,"overview.col.share":`Share`,"overview.activity":`Activity`,"overview.activitySummary":`{from} ~ {to} · {active} / {days} days active`,"overview.activityPeak":`{count}/day at most`,"overview.activityUnit":`requests`,"overview.activityNone":`no activity`,"overview.activityLegend.less":`Less`,"overview.activityLegend.more":`More`,"requests.total":`{count} total`,"requests.totalCost":`Total spend`,"requests.totalCost.hint":`Summed cost of every request matching the active filters, across all pages; in-flight requests count once they finish.`,"requests.rate.rpm":`RPM`,"requests.rate.tpm":`TPM`,"requests.rate.hint":`Requests (RPM), tokens (TPM, completed requests only) and the cache-hit ratio per minute over the last {window}s; follows the active filters, refreshes every 5s.`,"requests.elapsed":`Waiting (no first token yet)`,"requests.searchModel":`Search model IDs (keyword)`,"requests.noFilters":`No filters applied`,"requests.clearFilters":`Clear filters`,"requests.backToFilters":`Back to filter fields`,"requests.removeFilter":`Remove filter: {filter}`,"requests.filterAdded":`Added filter: {filter}`,"requests.filterChanged":`Changed filter: {filter}`,"requests.filterRemoved":`Removed filter: {filter}`,"requests.filtersCleared":`All filters cleared`,"requests.filteredEmpty":`No matching requests`,"requests.filteredEmpty.detail":`Try another model keyword or clear the filters.`,"requests.returnedModel":`Returned: {model}`,"requests.modelMatch":`Match`,"requests.modelMismatch":`Mismatch`,"requests.modelComparison":`Requested: {requested}; sent upstream: {upstream}; API returned: {returned}`,"requests.modelNotRecorded":`Not recorded`,"requests.modelNotRecorded.hint":`An older log or the API omitted the model ID; the requested model is not used as a substitute.`,"requests.modelPending":`Pending`,"requests.modelPending.hint":`The model ID the API returns is recorded when the request finishes.`,"requests.mappedModel.hint":`Sent upstream as {model} (a client role mapping or the provider’s model mapping)`,"requests.allClients":`All clients`,"requests.allTokens":`All tokens`,"requests.col.token":`Token`,"requests.detail.account":`Subscription account`,"requests.direct":`Direct`,"requests.allProviders":`All providers`,"requests.allStatus":`Any status`,"requests.col.time":`Time`,"requests.col.client":`Client`,"requests.col.model":`Model`,"requests.col.provider":`Provider`,"requests.col.status":`Status`,"requests.col.ttft":`TTFT`,"requests.col.tps":`TPS`,"requests.col.tokens":`In/Out`,"requests.col.cost":`Cost`,"requests.empty":`No requests`,"requests.empty.detail":`Every request through Astra is logged here with per-token-type billing details.`,"requests.page":`Page {page} of {pages}`,"requests.filters":`Active filters`,"requests.addFilter":`Add filter`,"requests.openDetail":`Open request details for {model}`,"requests.viewError":`Click to view the error`,"requests.detail.title":`Request details`,"requests.detail.summary":`Summary`,"requests.detail.protocol":`Protocol`,"requests.detail.requestedModel":`Requested model`,"requests.detail.upstreamModel":`Sent upstream model`,"requests.detail.responseModel":`API returned model`,"requests.detail.systemModel":`System model`,"requests.detail.stream":`Streaming`,"requests.detail.upstreamId":`Upstream request ID`,"requests.detail.timing":`Timing`,"requests.detail.generation":`Generation`,"requests.detail.total":`Total`,"requests.detail.tps":`Output speed`,"requests.detail.error":`Error`,"requests.detail.privacy":`Privacy guard`,"requests.detail.privacyBlocked":`Request blocked`,"requests.detail.privacyDryRun":`Dry run (not enforced)`,"requests.detail.privacyRedacted":`Redacted {count} place(s)`,"requests.detail.billing":`Billing`,"requests.detail.usageMissing":`The upstream returned no usage; this request was billed as 0.`,"requests.detail.usageRaw":`Raw usage`,"requests.detail.pricingSnapshot":`Pricing snapshot`,"requests.body.clientRequest":`Client request body`,"requests.body.upstreamRequest":`Upstream request body`,"requests.body.upstreamRequestHeaders":`Upstream request headers (as sent to the provider, credentials redacted)`,"requests.body.upstreamResponse":`Upstream response body`,"requests.body.clientResponse":`Response sent to client`,"requests.body.truncated":`Large body: showing the first {shown} of {total}`,"requests.body.loadAll":`Load all`,"requests.reasoning":`Reasoning`,"requests.routing.grade":`Grade`,"requests.routing.judgeMs":`Judge time`,"requests.routing.fallback":`fallback {grade} ({reason})`,"requests.routing.moved":`{from} → {grade} (out of reach)`,"requests.routing.hint.judge":`Judged “{grade}” ({percent}% sure), sent to {model}`,"requests.routing.hint.reused":`{source}: “{grade}”, sent to {model}`,"requests.routing.hint.fallback":`The judge’s grade was not used ({reason}): the fallback grade “{grade}” sent it to {model}`,"requests.routing.hint.moved":`Judged “{from}”, but it cannot be used ({reason}): “{grade}” sent it to {model}`,"requests.reasoning.notRecorded":`Not recorded`,"requests.reasoning.budget":`budget {tokens}`,"requests.reasoning.hint":`Reasoning settings the client explicitly sent; “Not recorded” means unset or an older log — never inferred from budgets or provider defaults.`,"requests.detail.reasoning":`Reasoning`,"status.success":`Success`,"status.blocked":`Blocked`,"status.upstream_error":`Upstream error`,"status.gateway_error":`Gateway error`,"status.client_cancelled":`Cancelled`,"status.pending":`In progress`,"billing.unpriced":`No price configured`,"billing.type":`Type`,"billing.tokens":`Amount`,"billing.unitPrice":`Unit /1M`,"billing.tier":`Tier`,"billing.cost":`Cost`,"pricingSource.override":`Provider custom price`,"pricingSource.provider":`Provider price · {key}`,"pricingSource.default":`Official default`,"pricingSource.none":`No price`,"simulator.official":`Official default price`,"simulator.serviceTier":`service_tier`,"simulator.time":`Request time (for time-of-day pricing)`,"simulator.run":`Calculate`,"simulator.pickDate":`Pick a date`,"simulator.pickTime":`Pick a time`,"simulator.selectedDate":`Selected {date}`,"simulator.clearDate":`Clear`,"pricing.none":`No pricing configured`,"pricing.add":`Add pricing`,"pricing.remove":`Remove pricing`,"pricing.mode.form":`Form`,"pricing.unit":`USD / 1M tokens`,"pricing.base":`Base prices`,"pricing.perRequest":`Per request`,"pricing.notes":`Notes`,"pricing.name":`Name`,"pricing.contextTiers":`Context tiers`,"pricing.contextTiers.hint":`Switch prices once input tokens exceed a threshold (e.g. Claude >200K).`,"pricing.addTier":`Add tier`,"pricing.threshold":`Threshold`,"pricing.mode.whole":`Whole request`,"pricing.mode.progressive":`Progressive`,"pricing.output.highest":`Output at highest tier`,"pricing.output.base":`Output at base price`,"pricing.timeWindows":`Time windows`,"pricing.timeWindows.hint":`Adjust prices by timezone and time of day (e.g. DeepSeek off-peak); holidays can be excluded.`,"pricing.addWindow":`Add window`,"pricing.excludeDates":`Exclude dates yyyy-MM-dd, …`,"pricing.serviceTiers":`Service tiers`,"pricing.serviceTiers.hint":`Adjust prices by service_tier (flex / priority).`,"pricing.addServiceTier":`Add tier`,"pricing.hasOwnPrices":`Has own prices (edit as JSON)`,"pricing.ruleNameTaken":`This service tier name already exists`,"pricing.timezone":`Timezone`,"pricing.invalidTimezone":`Enter a valid IANA timezone`,"pricing.start":`Start time`,"pricing.end":`End time`,"pricing.multiplier":`Multiplier`,"clients.subtitle":`Route the AI clients on this machine through Astra`,"clients.comingSoon":`Coming soon`,"clients.comingSoonDetail":`The configuration format for this client is not confirmed yet`,"clients.drifted":`Config changed`,"clients.search":`Search clients`,"clients.warning.drifted":`The client configuration differs from what Astra recorded. Review it before enabling or restoring.`,"clients.enabled":`Enabled`,"clients.filter.all":`All {count}`,"clients.filter.enabled":`Enabled {count}`,"clients.filter.attention":`Attention {count}`,"clients.filter.label":`Filter clients`,"clients.filter.empty":`No clients match`,"clients.tab.routing":`Routing`,"clients.tab.models":`Models & token`,"clients.tab.options":`Options`,"clients.tab.maintenance":`Version & backups`,"clients.addProvider":`Add provider`,"clients.searchProviders":`Search providers`,"clients.pending":`{count} change(s) not yet written to the client config`,"clients.pending.discard":`Discard`,"clients.pending.apply":`Write config`,"clients.drift.review":`Review and rewrite`,"clients.disabled":`Not enabled`,"clients.detected":`Detected {version}`,"clients.notDetected":`Not detected`,"clients.group.installed":`Installed`,"clients.group.notInstalled":`Not detected`,"clients.group.comingSoon":`Coming soon`,"clients.group.expand":`Expand {group}`,"clients.group.collapse":`Collapse {group}`,"clients.checkUpdates":`Check for updates`,"clients.updatesFound":`{count} client update(s) available`,"clients.allUpToDate":`All clients are up to date`,"clients.updateBadge":`Update`,"clients.shadowedBadge":`Fix PATH`,"clients.updateTo":`Update to {version}`,"clients.install":`Install`,"clients.download":`Download`,"clients.installRunning":`In progress…`,"clients.versionTitle":`Version and updates`,"clients.currentVersion":`Installed version`,"clients.latestVersion":`Latest version`,"clients.versionUnknown":`Unknown version`,"clients.notInstalled":`Not installed`,"clients.latestUnknown":`Not checked`,"clients.checkedAt":`Checked {time}`,"clients.installMethod":`Installed with`,"clients.method.npm":`Global npm package {package}`,"clients.method.vscode-extension":`VS Code extension {package}`,"clients.method.script":`Official vendor install script`,"clients.method.manual":`Download from the official site`,"clients.homepage":`Website`,"clients.blocker.npm-missing":`npm was not found. Install Node.js (it ships npm), then come back to install.`,"clients.blocker.vscode-missing":`VS Code's code command was not found. Install VS Code first.`,"clients.blocker.script-missing":`No install script for this system; install it from the official site.`,"clients.blocker.external-install":`{path} was not installed with npm. Update it the way you installed it.`,"clients.blocker.shadowed":`The latest version is already installed elsewhere; updating again won't change what the terminal runs. Fix PATH as described above.`,"clients.installLog":`Install log`,"clients.noInstallLog":`No install runs yet`,"clients.job.running":`Running…`,"clients.job.succeeded":`Finished`,"clients.job.failed":`Failed`,"clients.job.cancelled":`Stopped`,"clients.hint.permission-denied":`npm can't write to its global directory (usually because something was installed with sudo before, so the directory belongs to the administrator).`,"clients.hint.admin-cancelled":`Administrator authorization was cancelled. Nothing was changed.`,"clients.hint.shadowed":`The new version went to another location; the terminal still runs the old copy. See the log below for where.`,"clients.hint.unchanged":`The command succeeded, but the version did not change.`,"clients.hint.not-on-path":`The installed command is not on the terminal's PATH, so the terminal can't run it directly. See the log below for where.`,"clients.job.notEffective":`Finished, but not in effect`,"clients.notEffectiveToast":`{name}: the command succeeded but didn't take effect. Check the install log.`,"clients.otherCopy":`Other copy`,"clients.otherCopyNewer":`Newer`,"clients.shadowed.title":`Version {version} is installed, but the terminal does not use it`,"clients.shadowed.detail":`The terminal runs {path} ({version}); the newer copy at {other} comes later on PATH or isn't on it. Put {dir} first on PATH, or remove the old copy, to use the new version.`,"clients.notOnPath.title":`Not on the terminal's PATH`,"clients.notOnPath.detail":`This client is installed in {dir}, which is not on the terminal's PATH. Add it to PATH (e.g. in ~/.zshrc) to run it from a terminal.`,"clients.admin.badge":`Admin required`,"clients.admin.tip":`npm's global directory belongs to the administrator. macOS will ask for your login password.`,"clients.admin.tipManual":`npm's global directory belongs to the administrator. Run it with sudo in a terminal.`,"clients.admin.title":`Administrator rights needed`,"clients.admin.prompt":`npm's global directory belongs to the administrator. After you click “Authorize and start”, the system asks for your login password (or Touch ID); Astra never sees it.`,"clients.admin.manual":`npm's global directory belongs to the administrator and no authorization prompt is available here. Copy the command below and run it in a terminal.`,"clients.admin.start":`Authorize and start`,"clients.admin.copyCommand":`Copy command`,"clients.admin.retry":`Retry as administrator`,"clients.admin.retryHint":` Click “Retry as administrator” to get the system authorization prompt.`,"clients.admin.running":`Running as administrator. The output appears when the command ends, and it cannot be stopped midway.`,"clients.admin.fixTip":`To stop needing administrator rights for installs and updates, run this once in a terminal to give npm’s global directory back to your user:`,"clients.hint.timeout":`Stopped after 15 minutes without finishing.`,"clients.installTitle":`Install {name}`,"clients.updateTitle":`Update {name}`,"clients.installRunDetail":`Astra will run this command on this machine and show its output here.`,"clients.installStart":`Start`,"clients.installStop":`Stop`,"clients.installUnavailable":`This action is not available right now`,"clients.installNpmNote":`A global install writes to npm's global directory. Closing this window does not stop it.`,"clients.installedToast":`{name} installed`,"clients.updatedToast":`{name} updated`,"clients.uninstall":`Uninstall`,"clients.uninstallTitle":`Uninstall {name}`,"clients.uninstallRunDetail":`Astra will run this command on this machine to remove the client and show its output here.`,"clients.uninstallRestoreTitle":`The original config is restored first`,"clients.uninstallRestoreDetail":`Astra has taken over {name}'s config. Before uninstalling, it restores the config to how it was before (settings you changed by hand stay as they are), then runs the uninstall command.`,"clients.uninstallKeepsData":`Only the program is removed; the client's own data and config files are kept.`,"clients.uninstallManual":`This client was installed by the vendor's own installer. Astra does not uninstall it; follow the official site's instructions.`,"clients.uninstallExternal":`{path} was not installed with npm. Uninstall it the way you installed it.`,"clients.uninstallBuiltIn":`This extension ships with VS Code and cannot be uninstalled on its own.`,"clients.uninstalledToast":`{name} uninstalled`,"clients.hint.still-installed":`The uninstall command succeeded, but the client is still found (another copy, installed some other way). See the log below for where.`,"clients.enable":`Enable…`,"clients.disable":`Disable`,"clients.disableRestore":`Disable & restore`,"clients.pickProviderFirst":`Pick a provider below first`,"clients.appliedAt":`Config written {time}`,"clients.bound":`Switched to {provider}; effective immediately`,"clients.boundModelsSynced":`Switched to {provider} and updated the model list in the {client} config`,"clients.disableConfirm":`Disable {name}?`,"clients.disableDetail":`The entries Astra wrote are reverted to their state before enabling.`,"clients.disabledToast":`{name} disabled and config restored`,"clients.driftTitle":`Some settings were edited by hand`,"clients.driftDetail":`These entries changed after enabling and were not restored: {keys}. Force restore?`,"clients.forceRestore":`Force restore`,"clients.repair.title":`{name} can't read this config file: it isn't valid JSON`,"clients.repair.problem.trailing-comma":`extra comma on line {line}`,"clients.repair.problem.comment":`comment on line {line}`,"clients.repair.hint":`Repair removes only the extra commas and comments and leaves everything else as it is. The file is backed up first.`,"clients.repair.action":`Repair`,"clients.repair.done":`{name}'s config file repaired`,"clients.providerTitle":`Provider`,"clients.providerFooter":`Add several providers and drag to order them: a request goes to the first provider that offers its model (exact model ID match, or the provider's model mapping), else to the first one. Changes take effect immediately, and the client's model list includes every provider's models.`,"clients.primaryProvider":`Primary`,"clients.dragToReorder":`Drag to reorder {provider}`,"clients.removeProvider":`Remove {provider}`,"clients.providerDisabledBadge":`Disabled`,"clients.moreProvidersTitle":`Available providers`,"clients.providerAdded":`Added {provider}; effective immediately`,"clients.providerRemoved":`Removed {provider}`,"clients.providerOrderSaved":`Provider order updated; effective immediately`,"clients.providersModelsSynced":`Providers updated and the model list in the {client} config synced`,"clients.accountTitle":`Subscription account`,"clients.accountFooter":`Pin a specific account to attribute usage; leave empty for the provider default.`,"clients.account":`Account`,"clients.accountDefault":`Default account`,"clients.noProviders":`No providers yet`,"clients.noProvidersDetail":`Add an AI provider first, then choose it for this client.`,"clients.modelTitle":`Model`,"clients.modelFooter":`Default model written to the client config when enabling; leave unset to keep the client default.`,"clients.modelFooterEnabled":`Changing the default model rewrites the client config.`,"clients.modelSlotsFooter":`A chosen model is written into the Claude Code config (default model ANTHROPIC_MODEL, tiers ANTHROPIC_DEFAULT_*_MODEL); a slot left empty is never written, and an existing setting of the same name in the file is left alone.`,"clients.modelSlotsFooterEnabled":`Changing a model rewrites the client config.`,"clients.options.title":`Client options`,"clients.options.footer":`These apply to this client only: options written to the client config are written when you enable it, and gateway options are handled by Astra when forwarding this client's requests.`,"clients.options.footerEnabled":`Changes need to be applied again.`,"clients.options.unset":`Not set`,"clients.protocols.title":`Model protocols`,"clients.protocols.footer":`Each model uses its native protocol, which the gateway passes through untranslated; you can pick another protocol for a model, and the gateway translates. A protocol changed in the client’s own settings is recorded here too.`,"clients.protocols.footerEnabled":`Changes need to be applied again.`,"clients.protocols.auto":`Auto · {protocol}`,"clients.protocols.autoTranslated":`Auto · {protocol} (translated)`,"clients.protocols.native":`Native protocol: {protocols}`,"clients.protocols.noNative":`No native protocol this client speaks; the gateway translates`,"clients.option.context1m":`1M context`,"clients.option.context1m.hint":`Appends [1m] to Claude Code's model names (not the Haiku tier, nor models known to have a smaller window). The upstream must support 1M context.`,"clients.option.cacheTtl":`Cache TTL`,"clients.option.cacheTtl.hint":`Fills in a 5-minute or 1-hour ttl on the cache_control blocks the client already sends; never adds or removes breakpoints. 1-hour writes cost more and suit long sessions.`,"clients.option.maxThinkingTokens":`Max thinking tokens`,"clients.option.maxThinkingTokens.hint":`Writes MAX_THINKING_TOKENS; leave empty to not set it.`,"clients.option.disablePromptCaching":`Disable prompt caching`,"clients.option.disablePromptCaching.hint":`Writes DISABLE_PROMPT_CACHING=1 so the client stops sending cache breakpoints.`,"clients.option.autoModeServerOff":`Turn off auto mode server review`,"clients.option.autoModeServerOff.hint":`Writes CLAUDE_CODE_AUTO_MODE_SERVER=0 so auto mode stops asking the server to review actions and uses Claude Code's own classifier. Turn it on when the upstream cannot answer the server review and auto mode keeps asking you to confirm.`,"clients.option.contextWindow":`Context window`,"clients.option.contextWindow.hint":`Writes model_context_window; leave empty to use Codex's default.`,"clients.option.autoCompactTokenLimit":`Auto-compact threshold`,"clients.option.autoCompactTokenLimit.hint":`Writes model_auto_compact_token_limit, the size at which the session is compacted; leave empty to not set it.`,"clients.option.reasoningEffort":`Reasoning effort`,"clients.option.reasoningEffort.hint":`Writes model_reasoning_effort; Default leaves it unset.`,"clients.option.modelCatalog":`Write model catalog`,"clients.option.modelCatalog.hint":`Appends the bound providers' models to Codex's model catalog (~/.codex/astra-models.json, pointed to by model_catalog_json); every existing model is kept. Run Codex once first (it writes models_cache.json). Codex reads the catalog only at startup, so restart it after the models change.`,"clients.optionChoice.default":`Default`,"clients.optionChoice.5m":`5 minutes`,"clients.optionChoice.1h":`1 hour`,"clients.optionChoice.minimal":`Minimal`,"clients.optionChoice.low":`Low`,"clients.optionChoice.medium":`Medium`,"clients.optionChoice.high":`High`,"clients.modelSlot.ANTHROPIC_MODEL":`Default model`,"clients.modelSlot.ANTHROPIC_DEFAULT_FABLE_MODEL":`Fable tier`,"clients.modelSlot.ANTHROPIC_DEFAULT_OPUS_MODEL":`Opus tier`,"clients.modelSlot.ANTHROPIC_DEFAULT_SONNET_MODEL":`Sonnet tier`,"clients.modelSlot.ANTHROPIC_DEFAULT_HAIKU_MODEL":`Haiku tier (fast/background)`,"clients.defaultModel":`Default model`,"clients.modelPlaceholder":`Choose a model`,"clients.modelUnset":`Not set`,"clients.roleMapTitle":`Role mapping`,"clients.roleMapFooter":`Claude Desktop only accepts role models such as Sonnet, Opus and Haiku; Astra swaps them for the provider models chosen here. Set at least one; unset roles use the first one that is set.`,"clients.roleMapFooterEnabled":`The mapping takes effect in the gateway right away once you apply it.`,"clients.roleMapRequired":`Choose a model for at least one role`,"clients.roleMapHint":`Before enabling, choose a model for at least one role (Sonnet / Opus / Haiku) under Role mapping below`,"clients.roleMapGoto":`Set up role mapping`,"clients.role.sonnet":`Sonnet`,"clients.role.opus":`Opus`,"clients.role.haiku":`Haiku`,"clients.maintenance":`Maintenance`,"clients.openConfigDir":`Open config folder`,"clients.copyConfigPath":`Copy config file path`,"clients.backups":`Config backups`,"clients.backupsDetail":`Taken automatically before every change; restore any time.`,"clients.noBackups":`No backups yet`,"clients.firstWrite":`Before first change`,"clients.restore":`Restore`,"clients.restoreConfirm":`Overwrite the current config with this backup?`,"clients.restored":`Restored from backup`,"clients.tokenTitle":`Token`,"clients.token":`Token written to the config`,"clients.tokenFooter":`Enabling writes "token.client" into the client config; usage is counted per token. Several clients can share one token.`,"clients.tokenFooterEnabled":`Changing the token rewrites the client config.`,"clients.tokenDisabled":`{name} (disabled)`,"clients.manageTokens":`Manage tokens`,"clients.claudeDirect.configure":`Direct settings`,"clients.claudeDirect.modeTitle":`Connection (Astra launcher)`,"clients.claudeDirect.mode":`Connection`,"clients.claudeDirect.gateway":`Gateway`,"clients.claudeDirect.direct":`Official direct`,"clients.claudeDirect.gatewayDetail":`Use the existing gateway configuration. Once enabled, default Claude Code requests go through Astra. astra claude is only for direct mode.`,"clients.claudeDirect.directDetail":`Talk to Anthropic directly with the Claude subscription account selected below, not through the gateway.`,"clients.claudeDirect.modeNote":`This affects only the Astra launcher's own sessions; running claude directly still uses your default configuration.`,"clients.claudeDirect.modeFooter":`Switching only changes how you launch it. Running sessions are never switched live, and your default ~/.claude configuration is not modified.`,"clients.claudeDirect.loadFailed":`Could not read the direct settings`,"clients.claudeDirect.gatewayOnTitle":`Gateway take-over is on — direct would be overridden`,"clients.claudeDirect.gatewayOnDetail":`Astra currently takes this client over, so direct would be written straight back to the gateway configuration. To really go direct, use "Disable & restore" above first, then switch.`,"clients.claudeDirect.noAccount":`No Claude subscription account yet`,"clients.claudeDirect.noAccountDetail":`Direct uses the accounts already signed in under the "Claude subscription (Pro/Max)" provider; sign one in under Providers, then pick it here.`,"clients.claudeDirect.goProviders":`Sign in under Providers`,"clients.claudeDirect.needAccountToast":`Sign in a Claude subscription account under Providers first`,"clients.claudeDirect.accountsTitle":`Subscription account`,"clients.claudeDirect.accountsFooter":`Direct talks to Anthropic with this account's short-lived token, not through the gateway. The token stays on this machine: it is never written into the command or a client config.`,"clients.claudeDirect.account":`Account to use`,"clients.claudeDirect.accountDisabledSuffix":`{status} (disabled)`,"clients.claudeDirect.launchTitle":`Launch`,"clients.claudeDirect.launchNote":`Needs a recent Astra CLI on this machine (npm i -g astragate). The command launches the official Claude Code with the selected subscription account, talking to Anthropic directly, not through the gateway; Astra hands it only a short-lived token, the refresh token stays in Astra. Running claude directly still uses your own configuration. Once the token expires, run the command again — it cannot be renewed mid-session. With a token from the environment, features of the official client that rely on the claude.ai sign-in (connectors, /schedule, …) are unavailable.`,"clients.claudeDirect.statsTitle":`Local statistics`,"clients.claudeDirect.statsConsent":`Collect local statistics`,"clients.claudeDirect.statsConsentDetail":`Off by default. When on, Claude Code reports usage to the local Astra itself: model, time, token counts and its own cost estimate — no message bodies, prompts or tool content.`,"clients.claudeDirect.statsFooter":`Astra stores statistics locally under the request-log retention setting. Disabling stops ingestion immediately; running sessions may keep trying to export until restarted. Estimates are not subscription charges. Organization policies may override client settings; gateway blocking and redaction do not apply to direct traffic.`,"clients.claudeDirect.statsEmpty":`No statistics yet`,"clients.claudeDirect.statsEmptyDetail":`After turning statistics on, start a session with the command above; data shows up here within seconds.`,"clients.claudeDirect.statsFailed":`Could not read the statistics`,"clients.claudeDirect.statsTotals":`Latest {count}`,"clients.claudeDirect.statsInDetail":`Total input (cache read {cache}): {input} · total output: {output}`,"clients.claudeDirect.statsCost":`Estimated cost`,"clients.claudeDirect.statsCostDetail":`The client's own estimate, not what your subscription is actually billed.`,"clients.claudeDirect.statsFailedCount":`{count} of them failed`,"clients.claudeDirect.statusError":`Failed`,"clients.claudeDirect.tokensDetail":`In {input} / Out {output}`,"tokens.subtitle":`Clients and direct calls reach Astra with a token; usage is counted per token`,"tokens.add":`New token`,"tokens.default":`Default`,"tokens.disabledBadge":`Disabled`,"tokens.copy":`Copy token`,"tokens.copied":`Token copied`,"tokens.copyUrl":`Copy gateway URL`,"tokens.urlCopied":`Gateway URL copied`,"tokens.copyJoin":`Copy employee join command`,"connect.open":`Connect to a unified gateway`,"connect.title":`Connect to a unified gateway`,"connect.cta.title":`Got a join link or an API key from your admin?`,"connect.cta.detail":`Point this machine's AI clients at the unified gateway in one go: requests go to this machine first, then on to the gateway.`,"connect.link.title":`Join this unified gateway?`,"connect.link.detail":`You opened a join link.`,"connect.link.trust":`Only join an address you trust. Afterwards the chosen clients' requests pass through this machine to this gateway.`,"connect.link.continue":`Continue`,"connect.manual.detail":`Enter the gateway address your admin gave you and your own key.`,"connect.gateway":`Gateway address`,"connect.key":`API key`,"connect.keyHint":`Kept encrypted on this machine; it is never written into a client's config.`,"connect.useKey":`Use a key instead`,"connect.verify":`Verify and continue`,"connect.insecure":`This address is plain http, so the key would cross the network in the clear.`,"connect.joined":`Verified · token "{name}" · {count} models available`,"connect.pick.title":`Choose the clients to connect`,"connect.pick.detail":`Only the provider a client is bound to changes. Its old providers stay behind the gateway and still serve what it does not.`,"connect.pick.none":`No clients on this machine can be connected.`,"connect.pick.apply":`Connect {n} clients`,"connect.pick.skip":`Not now`,"connect.done.title":`Connected`,"connect.done.ok":`{name} is connected`,"connect.done.failed":`{name} was not connected: {error}`,"connect.done.restart":`Restart these clients for it to take effect.`,"connect.problem.dead":`This link is no longer valid: it was used, expired or revoked. Ask your admin for a new one, or use a key instead.`,"connect.problem.unknown":`This join link is not valid.`,"connect.problem.key":`This key is not valid.`,"connect.problem.disabled":`This token has been disabled. Contact your admin.`,"connect.problem.unreachable":`Cannot reach the unified gateway. Check the address and your network.`,"connect.problem.other":`Could not connect.`,"connect.banner.title":`Connected to a unified gateway`,"connect.banner.clients":`{n} clients use it`,"connect.banner.none":`No client uses it yet`,"connect.banner.manage":`Connect more clients`,"connect.banner.error":`Usage is unavailable right now: {error}`,"connect.leave":`Disconnect`,"connect.leave.confirm":`Disconnect from the unified gateway?`,"connect.leave.detail":`This removes the "Unified gateway" provider on this machine and the key it holds. Your token on the gateway is not affected. Clients that have other providers keep using them; clients that only used the gateway are disabled and their config restored.`,"connect.leave.done":`Disconnected from the unified gateway`,"tokens.invite.open":`Make an employee join link`,"tokens.invite.title":`Employee join link · {name}`,"tokens.invite.description":`The link works once and holds no key. When the employee opens it in the desktop app, their machine exchanges it for the key with this gateway.`,"tokens.invite.lifetime":`Valid for`,"tokens.invite.minutes":`{n} minutes`,"tokens.invite.hours":`{n} hours`,"tokens.invite.generate":`Generate and copy`,"tokens.invite.copied":`Join link copied: it works once, send it straight to the employee`,"tokens.invite.linkOnce":`The link you just made (shown only now)`,"tokens.invite.recent":`Recent links`,"tokens.invite.none":`No links made yet`,"tokens.invite.status.pending":`Waiting`,"tokens.invite.status.used":`Used`,"tokens.invite.status.expired":`Expired`,"tokens.invite.status.revoked":`Revoked`,"tokens.invite.usedAt":`Used {time} from {ip}`,"tokens.invite.expires":`Expires {time}`,"tokens.invite.revoke":`Revoke`,"tokens.copyUrlShort":`Gateway URL`,"tokens.copyJoinShort":`Join command`,"tokens.joinCopied":`Join command copied (it has no key): send it to your people, who run it in a terminal and enter their own key`,"tokens.copyFailed":`Copy failed — select and copy manually`,"tokens.clients":`Used by`,"tokens.noClients":`No client uses it yet`,"tokens.directProvider":`Direct-call provider`,"tokens.directNone":`Direct calls not allowed`,"tokens.directAccount":`Direct-call subscription account`,"tokens.detail.open":`Statistics`,"tokens.detail.viewLogs":`View requests`,"tokens.detail.byProvider":`By provider`,"tokens.detail.byProviderHint":`“Handed off” counts this provider’s failures that moved a request to the next one in the pool; “took over” counts requests it served after another failed.`,"tokens.detail.byModel":`By model`,"tokens.detail.recent":`Latest requests`,"tokens.detail.provider":`Provider`,"tokens.detail.model":`Model`,"tokens.detail.time":`Time`,"tokens.detail.status":`Status`,"tokens.detail.share":`Share`,"tokens.detail.failoversOut":`Handed off`,"tokens.detail.failoversIn":`Took over`,"tokens.pool.title":`Provider pool`,"tokens.pool.hint":`Direct calls (the bare token) are spread over these providers as set below; when one is rate limited or fails, the request moves to the next before any reply has started. Calls through a client still use the client’s bindings.`,"tokens.pool.empty":`None: this token cannot be used for direct calls.`,"tokens.pool.add":`Add a provider…`,"tokens.pool.remove":`Remove {provider}`,"tokens.pool.strategy":`Distribution`,"tokens.pool.weight":`Weight`,"tokens.pool.tier":`Tier`,"tokens.pool.tierN":`Tier {n}`,"tokens.pool.primary":`Primary`,"tokens.pool.backup":`Backup {n}`,"tokens.pool.share":`Expected share`,"tokens.pool.shareHint":`Assuming every provider is healthy and serves the requested model`,"tokens.pool.standby":`standby`,"tokens.pool.sticky":`Keep a conversation on one provider`,"tokens.pool.stickyHint":`Keeps the upstream prompt cache, which is never shared between providers. Without it an agent may rewrite its cache every turn, which raises input costs noticeably.`,"tokens.pool.failover":`Fail over to the next provider`,"tokens.pool.failoverHint":`On a 429, a 5xx, a timeout or a connection failure, the next provider is tried before any reply has started; an error after output began is not retried.`,"tokens.pool.maxAttempts":`Providers tried per request`,"tokens.pool.noModels":`{providers} has no enabled models: it gets no requests and cannot take over.`,"tokens.pool.summary":`{count} providers · {strategy}`,"tokens.strategy.failover":`Failover`,"tokens.strategy.failover.hint":`Always the first healthy provider in the list; the next one only when it fails. Drag to reorder.`,"tokens.strategy.round_robin":`Round robin`,"tokens.strategy.round_robin.hint":`Each new conversation goes to the next provider (each request, with sticky sessions off). Suits equivalent keys sharing a rate limit.`,"tokens.strategy.weighted":`Weighted`,"tokens.strategy.weighted.hint":`Interleaved in proportion to the weights, not at random. Start a new provider with a small weight to try it out.`,"tokens.strategy.tiered":`Tiered`,"tokens.strategy.tiered.hint":`Tier 1 first (shared by weight inside the tier); the next tier only when the whole tier is unavailable.`,"tokens.strategy.least_busy":`Least busy`,"tokens.strategy.least_busy.hint":`The provider with the fewest requests in progress goes first, so faster ones get more.`,"tokens.health.healthy":`Healthy`,"tokens.health.cooling":`Cooling until {time}`,"tokens.health.open":`Circuit open until {time}`,"tokens.health.half_open":`Probing`,"tokens.health.no_account":`No usable account`,"tokens.health.disabled":`Disabled`,"tokens.health.missing":`Deleted`,"tokens.directHint":`Point any other tool at {url} with this token to call Astra directly; requests go to the direct-call provider.`,"tokens.today":`Today`,"tokens.total":`Lifetime`,"tokens.cost":`Cost`,"tokens.requests":`Requests`,"tokens.cacheHit":`Cache hit rate`,"tokens.tps":`TPS`,"tokens.tpsContext":`Weighted output speed`,"tokens.tokens":`Tokens`,"tokens.inOut":`In / Out`,"tokens.details":`Show details`,"tokens.requestsContext":`{count} requests`,"tokens.lastUsedTitle":`Last used`,"tokens.limits":`Limits`,"tokens.limitsHint":`Once a limit is reached the gateway refuses this token: 429 with the reset time for a periodic limit, 403 for a total one. Requests in flight may push usage slightly past a limit. Periods follow the time zone in Settings.`,"tokens.unlimited":`Unlimited`,"tokens.addLimit":`Add limit`,"tokens.removeLimit":`Remove limit`,"tokens.limitMetric":`Metric`,"tokens.limitPeriod":`Period`,"tokens.limitValue":`Limit`,"tokens.metric.cost":`Cost (USD)`,"tokens.metric.requests":`Requests`,"tokens.metric.tokens":`Tokens`,"tokens.period.day":`Daily`,"tokens.period.week":`Weekly`,"tokens.period.month":`Monthly`,"tokens.period.total":`Total`,"tokens.rpm":`Requests per minute`,"tokens.rpmHint":`Leave empty for no limit.`,"tokens.rpmUsage":`Last minute {used} / {limit}`,"tokens.limitUsed":`{used} / {limit}`,"tokens.limitResets":`Resets {time}`,"tokens.limitExhausted":`Used up`,"tokens.limitDuplicate":`Each metric and period can be set once`,"tokens.allowedClients":`Allowed clients`,"tokens.allowedClientsAny":`Any client`,"tokens.allowedClientsOnly":`Only these clients`,"tokens.allowedClientsHint":`Restricts which clients the key suffix (token.client) may name. With none checked the token only works for direct calls (which also need a direct-call provider).`,"tokens.mcp":`MCP servers`,"tokens.mcpHint":`The servers this token may use through the MCP gateway. With none selected it cannot use MCP.`,"tokens.mcpNone":`There are no MCP servers yet; add some on the "MCP gateway" page first.`,"tokens.directOnly":`Direct calls only`,"tokens.selfService":`Self-service`,"tokens.selfServiceHint":`Whoever holds this token can look up its own limits and usage with it (nothing upstream is shown): open {url}/key, or call {url}/v1/astra/key — the legacy OpenAI balance API {url}/v1/dashboard/billing/subscription works too.`,"settings.tab.notifications":`Notifications`,"settings.quota.subscriptionInterval":`Subscription account interval`,"settings.quota.subscriptionIntervalHint":`Signed-in subscription accounts refresh their quota at this interval; 0 turns it off, minimum 10 minutes (the upstream endpoints rate-limit).`,"alerts.webhooks":`Webhooks`,"alerts.webhooks.hint":`Alerts are POSTed to these addresses as JSON. With a signing secret they carry X-Astra-Signature (HMAC-SHA256 over "timestamp.body").`,"alerts.webhooks.empty":`No webhooks yet`,"alerts.webhooks.add":`Add webhook`,"alerts.webhooks.edit":`Edit webhook`,"alerts.webhooks.name":`Name`,"alerts.webhooks.url":`URL`,"alerts.webhooks.timeout":`Timeout (seconds)`,"alerts.webhooks.useProxy":`Use the network proxy`,"alerts.webhooks.useProxyHint":`On: follows the proxy in Settings. Off: always direct.`,"alerts.webhooks.enabled":`Enabled`,"alerts.webhooks.headers":`Custom headers`,"alerts.webhooks.headersHint":`For example Authorization. Only names are shown once saved; leave a value empty when editing to keep it.`,"alerts.webhooks.addHeader":`Add header`,"alerts.webhooks.headerName":`Header name`,"alerts.webhooks.headerValue":`Header value`,"alerts.webhooks.headerKept":`Empty keeps the stored value`,"alerts.webhooks.signed":`Sign`,"alerts.webhooks.signedHint":`Generates a signing secret the receiver can use to verify a request came from Astra.`,"alerts.webhooks.secretTitle":`Signing secret`,"alerts.webhooks.secretShown":`Save this secret now — it is shown only once.`,"alerts.webhooks.resetSecret":`Regenerate signing secret`,"alerts.webhooks.resetSecretConfirm":`Regenerate the signing secret of {name}?`,"alerts.webhooks.resetSecretDetail":`The old secret stops working at once; the receiver needs the new one.`,"alerts.webhooks.test":`Send test`,"alerts.webhooks.testOk":`Test notification delivered (HTTP {status})`,"alerts.webhooks.testFailed":`Test failed: {error}`,"alerts.webhooks.deliveries":`Deliveries`,"alerts.webhooks.deleteConfirm":`Delete webhook {name}?`,"alerts.webhooks.deleteDetail":`Rules using it stop sending here; its deliveries are deleted too.`,"alerts.webhooks.deleted":`Deleted {name}`,"alerts.webhooks.disabledBadge":`Disabled`,"alerts.webhooks.unsigned":`Unsigned`,"alerts.webhooks.format":`Format`,"alerts.webhooks.format.generic":`Generic JSON`,"alerts.webhooks.format.generic.hint":`Astra's own JSON payload, signed with X-Astra-Signature — for a receiver you write yourself.`,"alerts.webhooks.format.feishu":`Feishu / Lark`,"alerts.webhooks.format.feishu.hint":`A Feishu group's custom bot: group settings → Bots → Add custom bot, then copy its webhook URL. With signature verification on, enter its signing secret.`,"alerts.webhooks.format.dingtalk":`DingTalk`,"alerts.webhooks.format.dingtalk.hint":`A DingTalk group's custom robot: group settings → Robots → Custom, then copy its webhook URL. With "sign" security, enter the SEC… secret; with custom keywords, include "Astra".`,"alerts.webhooks.format.wecom":`WeCom`,"alerts.webhooks.format.wecom.hint":`A WeCom group robot: group chat → Add group robot, then copy its webhook URL.`,"alerts.webhooks.format.slack":`Slack`,"alerts.webhooks.format.slack.hint":`A Slack incoming webhook URL.`,"alerts.webhooks.format.discord":`Discord`,"alerts.webhooks.format.discord.hint":`Discord channel settings → Integrations → Webhooks, then copy the webhook URL.`,"alerts.webhooks.botSecret":`Bot signing secret`,"alerts.webhooks.botSecretHint":`The signing secret from the bot's security settings; stored encrypted and never shown again.`,"alerts.webhooks.botSignedHint":`Turn on when the bot verifies signatures, and enter its signing secret.`,"alerts.delivery.status.pending":`Retrying`,"alerts.delivery.status.success":`Delivered`,"alerts.delivery.status.failed":`Failed`,"alerts.delivery.attempts":`{count} attempts`,"alerts.delivery.next":`Next try {time}`,"alerts.delivery.empty":`No deliveries yet`,"alerts.delivery.payload":`Payload`,"alerts.delivery.response":`Response`,"alerts.delivery.redeliver":`Redeliver`,"alerts.delivery.redelivered":`Queued for delivery again`,"alerts.rules":`Alert rules`,"alerts.rules.hint":`Each rule is an event + condition + scope → webhooks. A subject notifies once when it starts firing; repeats and recovery notices are optional.`,"alerts.rules.empty":`No alert rules yet`,"alerts.rules.add":`Add rule`,"alerts.rules.edit":`Edit rule`,"alerts.rules.name":`Name`,"alerts.rules.event":`Event`,"alerts.rules.subjects":`Scope`,"alerts.rules.subjectsAll":`All`,"alerts.rules.subjectsOnly":`Only selected`,"alerts.rules.webhooks":`Notify`,"alerts.rules.noWebhooks":`No webhooks yet — add one above first.`,"alerts.rules.notifyResolved":`Also notify on recovery`,"alerts.rules.repeat":`Repeat (minutes)`,"alerts.rules.repeatHint":`While still firing, notify again this often; leave empty to notify once.`,"alerts.rules.cooldown":`Cooldown (minutes)`,"alerts.rules.cooldownHint":`A new firing this soon after recovering is not notified, so flapping does not flood you.`,"alerts.rules.firing":`{count} firing`,"alerts.rules.deleteConfirm":`Delete alert rule {name}?`,"alerts.rules.deleted":`Deleted {name}`,"alerts.rules.disabledBadge":`Disabled`,"alerts.rules.enabled":`Enabled`,"alerts.firing":`Firing alerts`,"alerts.firing.empty":`Nothing is firing right now`,"alerts.event.provider.balance.low":`Provider balance low`,"alerts.event.provider.balance.low.hint":`An API-key provider with the usage query on: balance below the threshold (in the plan's unit) or used share reaching it.`,"alerts.event.provider.quota.failed":`Provider balance query failing`,"alerts.event.provider.quota.failed.hint":`The balance query failed this many times in a row.`,"alerts.event.account.quota.high":`Subscription quota running high`,"alerts.event.account.quota.high.hint":`A subscription account's 5-hour / weekly / credits window reached this used percentage.`,"alerts.event.account.auth.invalid":`Subscription account invalid`,"alerts.event.account.auth.invalid.hint":`The sign-in expired or was revoked; it needs to sign in again.`,"alerts.event.account.quota.failed":`Subscription quota query failing`,"alerts.event.account.quota.failed.hint":`The background quota sync failed this many times in a row.`,"alerts.event.token.usage.high":`Token limit running high`,"alerts.event.token.usage.high.hint":`A token budget reached this used percentage.`,"alerts.event.token.limit.reached":`Token limit reached`,"alerts.event.token.limit.reached.hint":`A token budget is used up, or requests were refused by its per-minute limit.`,"alerts.param.metric":`Compare`,"alerts.param.value":`Threshold`,"alerts.param.plan":`Plan`,"alerts.param.plan.placeholder":`Empty = the first plan with data`,"alerts.param.window":`Window`,"alerts.param.budget":`Budget`,"alerts.param.budget.placeholder":`Empty = any budget, e.g. cost:month`,"alerts.choice.metric.remaining":`Balance below`,"alerts.choice.metric.usedPercent":`Used percent at least`,"alerts.choice.window.any":`Any window`,"alerts.choice.window.session":`5-hour`,"alerts.choice.window.weekly":`Weekly`,"alerts.choice.window.credits":`Credits`,"alerts.subject.provider":`Providers`,"alerts.subject.account":`Subscription accounts`,"alerts.subject.token":`Tokens`,"key.title":`Token usage`,"key.subtitle":`Enter an Astra token to see its limits and usage. Only this token's own figures are shown.`,"key.placeholder":`sk-astra-…`,"key.submit":`Look up`,"key.invalid":`Unknown or invalid token`,"key.error":`Lookup failed: {error}`,"key.disabled":`This token is disabled`,"key.limits":`Limits`,"key.unlimited":`No limits`,"key.rpm":`Requests per minute: {used} / {limit} in the last minute`,"key.usage":`Usage`,"key.today":`Today`,"key.week":`This week`,"key.month":`This month`,"key.total":`Total`,"key.requests":`Requests`,"key.cost":`Cost`,"key.tokens":`Tokens`,"key.daily":`Cost, last 30 days`,"key.clients":`Clients`,"key.clientsAny":`Any client`,"key.directOnly":`Direct calls only`,"key.timeZone":`Periods follow {zone}`,"key.forget":`Use another token`,"key.resets":`Resets {time}`,"key.exhausted":`Used up`,"key.tab.overview":`Limits & usage`,"key.tab.stats":`Statistics`,"key.tab.requests":`Requests`,"key.stats.requests":`Requests`,"key.stats.successRate":`Success rate`,"key.stats.avgTtft":`Avg. first token`,"key.stats.trend":`Requests over time`,"key.stats.byModel":`By model`,"key.stats.byClient":`By client`,"key.stats.errors":`Why requests failed`,"key.stats.noErrors":`No failed requests in this period`,"key.stats.direct":`Direct calls`,"key.stats.retention":`The request log keeps the last {days} days only; limits and the totals above are not affected.`,"key.requests.empty":`No requests yet`,"key.requests.all":`All`,"key.requests.failed":`Failed`,"key.requests.more":`Load more`,"key.requests.time":`Time`,"key.requests.model":`Model`,"key.requests.client":`Client`,"key.requests.status":`Result`,"key.requests.tokens":`In / out`,"key.requests.latency":`First token / total`,"key.requests.success":`Succeeded`,"key.category.cancelled":`Cancelled by the client`,"key.category.blocked":`Blocked`,"key.category.limit":`Token limit reached`,"key.category.timeout":`Timed out`,"key.category.rate_limited":`Rate limited upstream`,"key.category.auth":`Not allowed for this token`,"key.category.unavailable":`Upstream unavailable`,"key.category.invalid_request":`Invalid request`,"key.category.unsupported":`Unsupported conversion`,"key.category.internal":`Gateway error`,"key.category.other":`Other error`,"tokens.neverUsed":`Never used`,"tokens.settings":`Settings`,"tokens.name":`Name`,"tokens.namePlaceholder":`e.g. Work laptop`,"tokens.enable":`Enable`,"tokens.disable":`Disable`,"tokens.disableConfirm":`Disable {name}?`,"tokens.disableDetail":`Clients and direct calls using this token are rejected until it is enabled again. Client configs are not changed.`,"tokens.reset":`Reset key`,"tokens.resetConfirm":`Reset the key of {name}?`,"tokens.resetDetail":`The old key stops working immediately. Enabled clients using this token get their config rewritten; configs edited by hand are skipped and need to be re-enabled.`,"tokens.resetDone":`Key reset; {count} client configs rewritten`,"tokens.skipped":`These clients could not be updated and need to be re-enabled on the Clients page: {clients}`,"tokens.delete":`Delete token`,"tokens.deleteConfirm":`Delete {name}?`,"tokens.deleteDetail":`Its clients switch to the default token and get their config rewritten. The request log keeps the token name.`,"tokens.deleted":`Deleted {name}`,"tokens.created":`Created {name}`,"tokens.createTitle":`New token`,"tokens.settingsTitle":`Token settings · {name}`,"tokens.empty":`No tokens yet`,"clients.enableTitle":`Enable {name}`,"clients.enableDetail":`These are the edits Astra will make. It only adds or changes its own entries and backs up the original file first.`,"clients.enabledToast":`{name} enabled`,"clients.enabledRestart":`{name} enabled — restart the client to apply`,"clients.noChanges":`The config is already up to date.`,"providers.add":`Add provider`,"providers.count":`{count} providers`,"providers.empty":`No providers yet`,"providers.emptyDetail":`Add OpenAI, Anthropic, DeepSeek, OpenRouter and more from built-in templates, or any compatible endpoint.`,"providers.import":`Import from other apps`,"import.title":`Import providers from other apps`,"import.detail":`Read-only scan of the local configuration of CC Switch, Alma, Claude Code, Codex and Magpie. Nothing there is modified; API keys are read and encrypted by the server and never pass through the browser.`,"import.search":`Search by name or address`,"import.path":`Read from: {path}`,"import.notFound":`Not found`,"import.sourceError":`Could not be read: {error}`,"import.noItems":`No providers to import`,"import.noMatch":`No matching providers`,"import.scanning":`Scanning…`,"import.status.new":`New`,"import.status.same":`Already added`,"import.status.sameHost":`Same address`,"import.status.off":`Disabled`,"import.status.skip":`Cannot import`,"import.existing":`Already added as "{name}"`,"import.sameHostHint":`"{name}" already uses this address; this will be imported as a new provider`,"import.noKey":`No key`,"import.models":`{count} models`,"import.template":`Template: {id}`,"import.ignored":`Will ignore: {fields}`,"import.skip.official-login":`Official login (tokens are bound to the source app)`,"import.skip.no-base-url":`No base URL`,"import.skip.unsupported-protocol":`Unsupported protocol`,"import.skip.points-to-astra":`Points at Astra itself`,"import.skip.invalid-base-url":`Invalid base URL`,"import.skip.no-inline-key":`Key comes from an environment variable and is not read`,"import.selected":`Import selected ({count})`,"import.done":`Imported {count} providers`,"import.doneSkipped":`Imported {count} providers, skipped {skipped}`,"import.footnote":`Routing, rate limits, balance queries, sessions and usage are not imported. Importing never changes any client configuration and makes no upstream requests.`,"import.rescan":`Rescan`,"providers.modelCount":`{count} models`,"providers.priceKeyShort":`Prices: {key}`,"providers.templateUpdate":`Template update`,"providers.noKey":`No API key`,"providers.card.active":`Active`,"providers.card.disabled":`Disabled`,"providers.card.subscription":`Subscription`,"providers.card.noAuth":`No key needed`,"providers.card.requests7d":`Requests, last 7 days`,"providers.card.noRequests":`No requests yet`,"providers.card.noRequests7d":`No requests in 7 days`,"providers.card.requestsUnit":`req`,"providers.card.lowSuccess":`Low success rate`,"providers.view.label":`List view`,"providers.view.grid":`Cards`,"providers.view.table":`Table`,"providers.overview.range":`Stats range`,"providers.overview.requests":`Requests`,"providers.overview.cost":`Cost`,"providers.overview.successRate":`Success rate`,"providers.overview.failoverCount":`{count} failovers`,"providers.overview.enabled":`Enabled / total`,"providers.overview.withTraffic":`{count} with traffic`,"providers.overview.share":`Request share`,"providers.overview.ranking":`Top by requests`,"providers.overview.costShare":`Cost share`,"providers.overview.noCost":`No cost in this period`,"providers.overview.noData":`No requests in this period`,"providers.overview.health":`Health`,"providers.overview.healthy":`Healthy`,"providers.overview.lowSuccess":`Success < 90%`,"providers.overview.others":`Other`,"providers.overview.showCharts":`Show charts`,"providers.overview.hideCharts":`Hide charts`,"providers.col.provider":`Provider`,"providers.col.status":`Status`,"providers.col.models":`Models`,"providers.col.trend":`7-day trend`,"providers.col.requests":`Requests`,"providers.col.successRate":`Success`,"providers.col.ttft":`TTFT`,"providers.col.tokens":`Tokens in / out`,"providers.col.cost":`Cost`,"providers.col.enabled":`Enabled`,"providers.created":`Added {name}`,"providers.addTitle":`Choose a provider template`,"providers.addTitleDetails":`Provider details`,"providers.addDetail":`Templates include endpoints, protocols and a default model list.`,"providers.custom":`Custom provider`,"providers.customDetail":`Any OpenAI / Anthropic / Gemini compatible endpoint`,"providers.searchTemplates":`Search templates`,"providers.category.recommended":`Recommended`,"providers.category.official":`Official`,"providers.category.subscription":`Subscriptions`,"providers.category.coding":`Coding plans`,"providers.category.cn":`China`,"providers.category.aggregator":`Aggregators`,"providers.category.inference":`Inference platforms`,"providers.category.local":`Local`,"providers.category.custom":`Other`,"providers.category.plugin":`Plugins`,"providers.pluginProvided":`From a plugin · open it to sign in`,"providers.pluginHint":`Install an OpenCode / magpie provider plugin and the providers it serves show up here.`,"providers.create":`Add`,"providers.name":`Name`,"providers.variant":`Region / edition`,"providers.variantDefault":`Default region`,"providers.baseUrl":`Base URL`,"providers.baseUrlHint":`Usually ends with /v1`,"providers.protocol":`Protocol`,"providers.authScheme":`Authentication`,"providers.apiKey":`API key`,"providers.apiKeyHint":`Stored encrypted on this machine`,"providers.subscriptionWizardHint":`No API key needed — sign in with your subscription`,"providers.subscriptionWizardDetail":`After creating the provider, click "Add account" on its Accounts tab and authorize in the browser. The vendor's terms and quotas apply.`,"providers.subscriptionAdded":`Added · add accounts inside the provider`,"providers.subscription.quotaSession":`5h used {percent}%`,"providers.subscription.quotaWeekly":`Weekly used {percent}%`,"providers.subscription.quotaCredits":`Credits used {percent}%`,"providers.subscription.quotaBalance":`Balance {balance}`,"providers.subscription.quotaRefresh":`Refresh quota`,"providers.subscription.quotaUnsupported":`Quota is not available for this subscription yet`,"providers.subscription.quotaResets":`resets {when}`,"providers.subscription.quotaLoading":`Fetching quota…`,"providers.subscription.quotaNoAccount":`Account is not usable — sign in again to see quota`,"providers.subscription.quotaWindowPremium":`Premium requests`,"providers.subscription.quotaPremiumCount":`{used} of {total} premium requests used`,"providers.subscription.quotaOverage":`{count} overage`,"providers.subscription.quotaOverageOff":`overage not enabled`,"providers.subscription.quotaFetchedAt":`updated {when}`,"providers.subscription.quotaNoWindows":`This account reports no quota windows`,"providers.subscription.quotaWindowSession":`Session window`,"providers.subscription.quotaWindowWeekly":`Weekly window`,"providers.subscription.quotaWindowCredits":`Credits`,"providers.quota.title":`Usage query`,"providers.quota.footer":`Queries this provider's balance or plan usage with a template; results appear on the provider card and in the tray. A failed query only shows an error and never affects the provider itself.`,"providers.quota.enable":`Enable usage query`,"providers.quota.enableHint":`Refreshed in the background once enabled`,"providers.quota.template":`Template`,"providers.quota.templateAuto":`Automatic ({name})`,"providers.quota.templateNone":`Automatic (no matching template)`,"providers.quota.custom":`Custom`,"providers.quota.kind.balance":`Balance`,"providers.quota.kind.plan":`Plan usage`,"providers.quota.param.userId":`User ID`,"providers.quota.param.accessToken":`System access token`,"providers.quota.paramsHint":`The system access token and user ID generated in New API / One API personal settings — not the sk- API key.`,"providers.quota.secretStored":`Saved — leave empty to keep`,"providers.quota.interval":`Auto refresh (minutes)`,"providers.quota.intervalHint":`Empty follows the global setting; 0 never refreshes in the background. Now: {value}`,"providers.quota.intervalEvery":`every {minutes} min`,"providers.quota.intervalOff":`no background refresh`,"providers.quota.timeout":`Timeout (seconds)`,"providers.quota.baseUrl":`Query address`,"providers.quota.baseUrlHint":`Empty uses the provider endpoint ({{origin}} / {{baseUrl}} come from it)`,"providers.quota.method":`Method`,"providers.quota.url":`URL`,"providers.quota.urlHint":`Placeholders: {{origin}}, {{baseUrl}}, {{host}}, {{apiKey}} and the parameter names above`,"providers.quota.auth":`Authentication`,"providers.quota.auth.provider":`Use the provider API key`,"providers.quota.auth.none":`Only the headers below`,"providers.quota.headers":`Headers (JSON)`,"providers.quota.extract":`Extraction rules (JSON)`,"providers.quota.extractHint":`A string is a path into the response (e.g. data.balance), a number is a constant; an array takes the first value present; supports $const, $add, $sub, $mul, $div, $scale, $pctUsed, $eq, $not, $case, $var, $time. Missing fields are never treated as 0.`,"providers.quota.invalidJson":`{field} is not a valid JSON object`,"providers.quota.test":`Test query`,"providers.quota.testDesc":`Sends one real request with the current (unsaved) configuration`,"providers.quota.fetch":`Query now`,"providers.quota.refresh":`Refresh balance`,"providers.quota.fetchedAt":`Updated {time}`,"providers.quota.never":`Not queried yet`,"providers.quota.off":`Usage query is off`,"providers.quota.rawResponse":`Raw response (redacted)`,"providers.quota.requestUrl":`Request URL`,"providers.quota.httpStatus":`HTTP status`,"providers.quota.testOk":`Query succeeded`,"providers.quota.testFailed":`Query failed`,"providers.quota.extracted":`Extracted`,"providers.quota.balance":`Balance {amount}`,"providers.quota.usedPercent":`{percent}% used`,"providers.quota.window":`{window}: {percent}% used`,"providers.quota.totalUsed":`{used} used of {total}`,"providers.quota.resets":`resets {time}`,"providers.quota.invalid":`Account unavailable`,"providers.quota.failed":`Usage query failed: {error}`,"providers.quota.lastGood":`Showing the last successful result`,"providers.quota.error.config":`The query configuration is incomplete`,"providers.quota.error.no_key":`This provider has no API key`,"providers.quota.error.unauthorized":`The upstream refused the quota query (invalid credentials or no permission)`,"providers.quota.error.no_endpoint":`No quota endpoint at this address; pick another template or use a custom query`,"providers.quota.error.rate_limited":`Rate limited upstream; use a longer interval`,"providers.quota.error.upstream":`The upstream returned an error`,"providers.quota.error.timeout":`The query timed out`,"providers.quota.error.network":`Could not reach the upstream`,"providers.quota.error.not_json":`The response is not JSON`,"providers.quota.error.too_large":`The response is too large`,"providers.quota.error.empty":`The query succeeded but no quota field was found`,"settings.proxy":`Network proxy`,"settings.proxy.footer":`Gateway forwarding, subscription sign-in, quota queries, update checks and client installs all connect through this setting. Local addresses always connect directly; a provider with its own proxy uses that instead.`,"settings.proxy.mode":`Proxy`,"settings.proxy.mode.system":`System`,"settings.proxy.mode.custom":`Custom`,"settings.proxy.mode.direct":`None`,"settings.proxy.mode.system.hint":`HTTPS_PROXY-style environment variables first, then the operating system proxy`,"settings.proxy.mode.custom.hint":`All outbound requests use the proxy below`,"settings.proxy.mode.direct.hint":`Ignore environment variables and the system proxy; always connect directly`,"settings.proxy.url":`Proxy URL`,"settings.proxy.urlHint":`http, https or socks5, including the port`,"settings.proxy.username":`Username`,"settings.proxy.password":`Password`,"settings.proxy.optional":`Optional`,"settings.proxy.passwordSaved":`Saved; leave blank to keep it`,"settings.proxy.bypass":`Bypass for`,"settings.proxy.bypassHint":`Comma separated; subdomains match too`,"settings.proxy.saved":`Proxy settings saved`,"settings.pluginMarket":`Plugin market`,"settings.pluginMarket.footer":`The plugin market reads the Astra site's registry by default (the community repository's plugins plus the packages published on the site). When the site can't be reached it uses the copy fetched last, then the built-in one. The ASTRA_PLUGIN_MARKET environment variable wins over this setting.`,"settings.pluginMarket.url":`Registry address`,"settings.pluginMarket.urlHint":`The http(s) address of the registry (registry.json); save it empty to go back to the default.`,"settings.pluginMarket.offline":`Use local copies only`,"settings.pluginMarket.offlineHint":`Never fetch the registry and no search: only the copy fetched last, or the built-in one, is shown.`,"settings.pluginMarket.saved":`Plugin market address saved`,"settings.pluginMarket.reset":`Reset to default`,"settings.quota":`Provider usage query`,"settings.quota.autoInterval":`Background refresh`,"settings.quota.autoIntervalHint":`Providers with the usage query enabled refresh their balance at this interval; 0 turns it off. A provider can set its own.`,"settings.usageTimeZone":`Token limit time zone`,"settings.usageTimeZone.system":`Server time zone ({zone})`,"settings.usageTimeZone.hint":`Tokens' daily, weekly and monthly limits reset at midnight in this zone, and daily usage is counted in it. Containers default to UTC.`,"settings.minutes":`min`,"tray.quotaBalance":`Balance`,"providers.subscription.relogin":`Sign in again`,"providers.getKey":`Get an API key ↗`,"providers.priceKey":`Price table`,"providers.priceKeyHint":`Which provider's model prices apply; the same model costs differently at different providers.`,"providers.priceKeyNone":`Official default prices only`,"providers.priceKeyDefault":`Default ({id})`,"providers.templateModels":`The template's {count} models will be added; you can change them later.`,"providers.moreOptions":`More options`,"providers.moreOptionsDetail":`All of these can be changed later under Settings.`,"providers.initialModels":`Initial models`,"providers.initialModelsTemplateHint":`One per line or comma separated; leave empty to add the template's {count} models.`,"providers.initialModelsCustomHint":`One per line or comma separated; leave empty to fetch them from upstream after creating.`,"providers.tab.models":`Models`,"providers.tab.settings":`Settings`,"providers.tab.accounts":`Accounts`,"providers.tab.apiKey":`API key`,"providers.test":`Test`,"providers.testDialog.title":`Test {name}`,"providers.testDialog.subtitle":`Applies the privacy policy and logs the request; never retried`,"providers.testDialog.modeSingle":`Single model`,"providers.testDialog.modeBatch":`Batch`,"providers.testDialog.config":`Test configuration`,"providers.testDialog.model":`Test model`,"providers.testDialog.modelPlaceholder":`Type any model ID`,"providers.testDialog.showModels":`Show model list`,"providers.testDialog.protocol":`Test protocol`,"providers.testDialog.stream":`Streamed response`,"providers.testDialog.maxTokens":`Max output tokens`,"providers.testDialog.imageSize":`Image size`,"providers.testDialog.imageSizeHint":`Left to the upstream when empty; use auto or WIDTHxHEIGHT, e.g. 1024x1024.`,"providers.testDialog.imageQuality":`Image quality`,"providers.testDialog.imageDefault":`Default (not sent)`,"providers.testDialog.imageCount":`Number of images`,"providers.testDialog.imageOperation":`Image ability`,"providers.testDialog.imageGenerate":`Generate`,"providers.testDialog.imageEdit":`Edit`,"providers.testDialog.imageEditHint":`An edit test uploads a built-in 128×128 red circle to images/edits by default (the default prompt turns the red blue); you can pick your own picture instead.`,"providers.testDialog.imageInput":`Test picture`,"providers.testDialog.imageInputDefault":`Built-in red circle (default)`,"providers.testDialog.imageInputLimits":`128×128 PNG, a few hundred bytes`,"providers.testDialog.imageInputPick":`Choose picture…`,"providers.testDialog.imageInputReset":`Use default`,"providers.testDialog.imageInputType":`Only PNG, JPEG and WebP pictures are supported`,"providers.testDialog.imageInputTooLarge":`The picture must be at most 4 MB`,"providers.testDialog.imageInputUnreadable":`Could not read this picture`,"providers.testDialog.imageAlt":`Result picture {n}`,"providers.testDialog.imageSave":`Save picture`,"providers.testDialog.imageSection":`Image models`,"providers.testDialog.batchAutoHint":`Image models go to the Images API on their own; every other model uses the protocol chosen here.`,"providers.testDialog.prompt":`Test prompt (optional)`,"providers.testDialog.promptHint":`The default prompt is used when left empty.`,"providers.testDialog.realRequest":`A real request; it may consume quota`,"providers.testDialog.savedCredentials":`Uses the connection and credentials saved for this provider.`,"providers.testDialog.start":`Start test`,"providers.testDialog.retest":`Test again`,"providers.testDialog.stop":`Stop`,"providers.testDialog.stopRest":`Stop the rest`,"providers.testDialog.testN":`Test {count} models`,"providers.testDialog.metrics.http":`HTTP response`,"providers.testDialog.metrics.firstWait":`First token wait`,"providers.testDialog.metrics.ttft":`First token total`,"providers.testDialog.metrics.total":`Total time`,"providers.testDialog.metricsHelp":`HTTP response: time to the upstream response headers. First token: time to the first piece of the answer. Wait is measured from the headers arriving, the total from the request being sent.`,"providers.testDialog.reply":`Provider reply`,"providers.testDialog.preview":`Preview`,"providers.testDialog.raw":`Raw`,"providers.testDialog.rawNote":`Response body as processed by the gateway (credentials redacted)`,"providers.testDialog.rawTruncated":`Truncated: the raw body was longer than 256 KiB`,"providers.testDialog.reasoning":`Reasoning`,"providers.testDialog.noText":`The upstream returned no text.`,"providers.testDialog.headers":`Response headers`,"providers.testDialog.headersCount":`{count} headers`,"providers.testDialog.headersEmpty":`The upstream returned no response headers.`,"providers.testDialog.emptyTitle":`No test yet`,"providers.testDialog.emptyDetail":`Start a test to send one real request to this provider.`,"providers.testDialog.status.idle":`Waiting for a test`,"providers.testDialog.status.running":`Testing`,"providers.testDialog.status.success":`Test succeeded`,"providers.testDialog.status.failed":`Test failed`,"providers.testDialog.selected":`Selected {n} / {total}`,"providers.testDialog.progress":`Finished {done} / {total} · {ok} succeeded · {failed} failed`,"providers.testDialog.progressDone":`This batch finished {total} / {total} · {ok} succeeded · {failed} failed`,"providers.testDialog.clearSelection":`Clear selection`,"providers.testDialog.searchModels":`Search or type a model ID`,"providers.testDialog.addModel":`Add "{id}"`,"providers.testDialog.view":`View`,"providers.testDialog.noModels":`This provider has no models yet; type an ID above to test one.`,"providers.testDialog.status.queued":`Queued`,"providers.testDialog.status.cancelled":`Cancelled`,"providers.testDialog.statusColumn":`Status`,"providers.testDialog.ownFilter":`Select all models of this provider`,"providers.duplicate":`Duplicate`,"providers.deleteConfirm":`Delete {name}?`,"providers.deleteDetail":`The provider and its model settings are removed; request history is kept.`,"providers.deleted":`Deleted`,"providers.deleteBound":`Still used by: {clients}. Switch them to another provider first.`,"providers.templateVersions":`Current version {current}, latest {latest}`,"providers.templateApplied":`Updated to the latest template`,"providers.templateUpToDate":`Already on the latest template.`,"providers.templateSwitch":`Change template`,"providers.templateSwitchDetail":`The endpoints and protocol order become the new template's; the key, models and settings you changed are kept.`,"providers.templateSwitchTarget":`New template`,"providers.templateSwitchEndpoints":`Endpoints after the change`,"providers.templateSwitchCurrent":`{name} (current)`,"providers.templateSwitched":`Switched to "{name}"`,"providers.templateSwitchConfirm":`Switch to "{alt}"?`,"providers.templateSwitchConfirmDetail":`The endpoints become {urls}; the key, models and settings you changed are kept.`,"providers.keyAlternative.title":`The key may not match this template`,"providers.keyAlternative.rejected":`The upstream refused this key. Keys for "{name}" and "{alt}" are not interchangeable: if this is a "{alt}" key, switch to that template.`,"providers.keyAlternative.switch":`Switch to "{alt}"`,"providers.keyAlternative.wizard":`Keys for "{name}" and "{alt}" are not interchangeable; make sure yours belongs to this one.`,"providers.keyAlternative.pick":`Choose "{alt}" instead`,"providers.searchModels":`Search models`,"providers.addModels":`Add models`,"providers.addModelsDetail":`Enter model IDs, one per line or comma separated; they are linked to system models to inherit parameters and prices.`,"providers.fetchRemote":`Fetch from upstream`,"providers.fetchRemoteDetail":`Reads the provider's model list and links models to the system catalog so they inherit parameters and prices.`,"providers.noModels":`No models yet`,"providers.noModelsDetail":`Fetch the model list from upstream, or enter model IDs manually.`,"providers.modelsFooter":`A model needs only an ID: fields you don't override are inherited from the linked system model, priced with this provider's price table.`,"providers.modelMap.title":`Model mapping`,"providers.modelMap.footer":`Turns a model ID clients ask for into one of this provider's models, e.g. deepseek-v4.1 → deepseek-chat. Mapped IDs appear in the clients' model lists, and clients bound to several providers route them here. Billing follows the model actually sent.`,"providers.modelMap.add":`Add mapping`,"providers.modelMap.addDetail":`When a client asks for the model ID on the left, Astra requests the model on the right from this provider instead.`,"providers.modelMap.needModels":`Add models to this provider first`,"providers.modelMap.from":`Requested model ID`,"providers.modelMap.to":`This provider's model`,"providers.modelMap.toPlaceholder":`Choose a model`,"providers.modelMap.remove":`Remove mapping {from}`,"providers.modelMap.saved":`Model mapping saved`,"providers.modelMap.missingTarget":`Target model missing`,"providers.unlinked":`Unlinked`,"providers.modelsAdded":`Added {count} models`,"providers.addSelected":`Add {count}`,"providers.linksTo":`Links to {id}`,"providers.noLink":`No system model`,"providers.added":`Added`,"providers.linkedModel":`Linked system model`,"providers.linkedModelHint":`Fields and prices that are not overridden are inherited from it.`,"providers.overrides":`Overrides`,"providers.price":`Price`,"providers.customPrice":`Custom price`,"providers.customPriceHint":`A custom price fully replaces the inherited one and is not scaled by the provider multiplier.`,"providers.inheritedPriceHint":`Effective price (inherited, resolved with this provider's price table):`,"providers.removeModel":`Remove {id} from this provider?`,"providers.removeModelShort":`Remove model`,"providers.selectAllModels":`Select every model in the list`,"providers.selectModel":`Select {id}`,"providers.selectedModels":`{n} selected`,"providers.removeSelected":`Remove selected`,"providers.removeSelectedConfirm":`Remove the {n} selected models from this provider?`,"providers.backup":`Backup and restore`,"backup.title":`Backup and restore`,"backup.detail":`Export providers and their models to one file, or restore from such a file. OAuth accounts, client bindings, tokens and MCP servers are not included.`,"backup.export.title":`Export`,"backup.export.secrets":`API keys`,"backup.secrets.none":`Without keys (recommended)`,"backup.secrets.passphrase":`Keys encrypted with a passphrase`,"backup.secrets.plaintext":`Plaintext keys`,"backup.secrets.hint":`An export with keys can only be made on this machine.`,"backup.passphrase":`Passphrase`,"backup.passphrase.hint":`At least 8 characters. The keys in the file cannot be recovered without it.`,"backup.plaintext.warn":`The keys in the file are plaintext: anyone holding the file can use them. Keep it somewhere only you control, and do not upload it to cloud storage.`,"backup.export.run":`Export`,"backup.export.done":`Exported {count} providers`,"backup.import.title":`Restore from a file`,"backup.import.choose":`Choose a backup file`,"backup.import.encrypted":`This backup has its keys encrypted with a passphrase. Enter it to preview.`,"backup.import.preview":`Preview`,"backup.import.run":`Import selected ({count})`,"backup.import.done":`Imported {count} providers`,"backup.import.doneSkipped":`Imported {count}, skipped {skipped}`,"backup.import.badFile":`This is not a valid backup file.`,"backup.import.noKeys":`The file has no keys; enter them again after importing.`,"backup.status.new":`New`,"backup.status.sameHost":`Address already used`,"backup.status.same":`Already there, skipped`,"backup.status.invalid":`Invalid`,"backup.models":`{count} models`,"backup.webdav.title":`Cloud backup (WebDAV)`,"backup.webdav.hint":`Keep the backup on your own WebDAV service (Nextcloud, Jianguoyun, ...). Only on this machine; plaintext keys are never uploaded, so choose no keys or a passphrase.`,"backup.webdav.url":`Server address`,"backup.webdav.username":`User name`,"backup.webdav.password":`Password`,"backup.webdav.passwordKept":`Saved; leave empty to keep it`,"backup.webdav.folder":`Folder`,"backup.webdav.save":`Save settings`,"backup.webdav.saved":`Saved`,"backup.webdav.forget":`Remove settings`,"backup.webdav.test":`Test connection`,"backup.webdav.testOk":`Connected; reading and writing works`,"backup.webdav.upload":`Back up now`,"backup.webdav.uploadDone":`Uploaded {count} providers`,"backup.webdav.restore":`Restore from the cloud`,"providers.section.basic":`Basics`,"providers.section.auth":`Authentication`,"providers.section.endpoints":`Endpoints`,"providers.section.billing":`Billing`,"providers.section.advanced":`Advanced`,"providers.section.info":`Info`,"providers.subscription":`Subscription accounts`,"providers.subscription.footer":`Tokens are stored encrypted on this machine and renewed on their next use after they expire.`,"providers.subscription.login":`Sign in`,"providers.subscription.loginDesc":`Finish the provider's authorization flow; tokens stay on this machine.`,"providers.subscription.logout":`Sign out & delete`,"providers.subscription.logoutConfirm":`Sign out account "{name}"? Clients pinned to it fall back to the default account.`,"providers.subscription.refreshToken":`Refresh token`,"providers.subscription.tokenRefreshed":`Token refreshed`,"providers.subscription.expires":`Expires`,"providers.subscription.status.active":`Active`,"providers.subscription.status.expired":`Expired`,"providers.subscription.status.revoked":`Revoked`,"providers.subscription.none":`No subscription account signed in yet`,"providers.subscription.openAuthorize":`Open authorization page`,"providers.subscription.doneAuthorize":`I've finished authorizing`,"providers.subscription.waiting":`Waiting for authorization…`,"providers.subscription.waitingDetail":`The authorization page opened in your browser; this page detects the new account automatically.`,"providers.subscription.cliDetail":`Finish the authorization in your browser; sign-in completes here automatically (server-side polling, no callback URL needed).`,"providers.subscription.checkNow":`I authorized — check now`,"providers.subscription.checkNowHint":`Click after finishing in the browser; this page also checks every few seconds on its own.`,"providers.subscription.pasteTitle":`Paste the code shown on the authorization page`,"providers.subscription.pasteDetail":`Claude's registered redirect URI is not a loopback address, so the browser cannot come back here: the authorization page displays a code instead. Open it, authorize, then paste the code below.`,"providers.subscription.pastePlaceholder":`Paste the authorization code (like xxxx#yyyy)`,"providers.subscription.pasteCode":`Authorization code`,"providers.subscription.pasteSubmit":`Finish sign-in`,"providers.subscription.stillWaiting":`No authorization yet — make sure you confirmed in the browser.`,"providers.subscription.deviceCode":`Device code`,"providers.subscription.visitPage":`Open verification page`,"providers.subscription.loginOk":`Authorized: {name}`,"providers.subscription.loginFailed":`Sign-in failed`,"providers.subscription.importCodex":`Import local Codex sign-in`,"providers.subscription.importCodexHint":`Adopt the codex sign-in already stored in ~/.codex/auth.json; no browser round-trip needed`,"providers.subscription.importOk":`Imported the local Codex account: {name}`,"providers.subscription.importCopilot":`Import local GitHub authorization`,"providers.subscription.importCopilotHint":`Adopt a GitHub authorization already on this machine (the VS Code GitHub session, GH_TOKEN, or the Copilot plugin config) as a Copilot account, instead of repeating the device flow`,"providers.subscription.importCopilotPlaceholder":`or paste a GitHub token (gho_…)`,"providers.subscription.importCopilotToken":`GitHub token`,"providers.subscription.localCopilotFound":`Found a local GitHub authorization: {source}`,"providers.subscription.importBatch":`Batch import tokens`,"providers.subscription.importBatchTitle":`Batch import GitHub tokens`,"providers.subscription.importBatchLabel":`GitHub tokens (one per line)`,"providers.subscription.importBatchDesc":`Paste GitHub tokens (gho_ / ghp_ / github_pat_), one per line. Each one becomes a Copilot account; duplicates and tokens without a Copilot subscription are reported, not imported. You can also paste a ready-to-use Copilot token (tid=…;exp=…): it is used as is, but cannot renew itself and must be re-imported after it expires.`,"providers.subscription.importBatchPlaceholder":`gho_xxxxxxxxxxxx
|
|
13
|
+
tid=xxxx;exp=1760000000;sku=...
|
|
14
|
+
# lines starting with # are ignored`,"providers.subscription.importBatchCount":`{n} token(s) recognised`,"providers.subscription.importBatchRun":`Import`,"providers.subscription.importBatchSummary":`Imported {ok}, duplicates {dup}, failed {fail}`,"providers.subscription.importBatchStatus.imported":`Imported`,"providers.subscription.importBatchStatus.duplicate":`Duplicate`,"providers.subscription.importBatchStatus.invalid_format":`Invalid format`,"providers.subscription.importBatchStatus.failed":`Failed`,"providers.subscription.importBatchStatus.updated":`Updated`,"providers.subscription.importBatchStatus.ready":`Ready`,"providers.accounts.statTotal":`{n} accounts`,"providers.accounts.statUsable":`{n} usable`,"providers.accounts.statCooling":`{n} cooling down`,"providers.accounts.statDead":`{n} signed out`,"providers.accounts.providerProxy":`Provider proxy: {proxy}`,"providers.accounts.filter.all":`All`,"providers.accounts.filter.usable":`Usable`,"providers.accounts.filter.cooling":`Cooling`,"providers.accounts.filter.dead":`Signed out`,"providers.accounts.filter.disabled":`Disabled`,"providers.accounts.filterLabel":`Filter by status`,"providers.accounts.search":`Search email / name / key`,"providers.accounts.add":`Add account`,"providers.accounts.addLogin":`Sign in with browser`,"providers.accounts.addLoginProxy":`Sign in through a proxy…`,"providers.accounts.addToken":`Paste a token…`,"providers.accounts.addApiKey":`Add API key…`,"providers.accounts.batchImport":`Batch import`,"providers.accounts.export":`Export`,"providers.accounts.exportConfirm":`Export every account credential of this provider?`,"providers.accounts.exportDetail":`Tokens / API keys are copied to the clipboard as plain text, one per line, ready to paste back into Batch import. Anyone holding them can use these accounts: keep them safe and clear the clipboard afterwards.`,"providers.accounts.exportDone":`Copied the credentials of {n} accounts to the clipboard`,"providers.accounts.exportSkipped":` ({n} more had nothing to export)`,"providers.accounts.exportNone":`Nothing to export`,"providers.accounts.exportCopyFailed":`Could not write to the clipboard; use this machine or an https address`,"providers.accounts.noMatch":`No accounts match`,"providers.accounts.select":`Select {name}`,"providers.accounts.selected":`{n} selected`,"providers.accounts.clearSelection":`Clear selection`,"providers.accounts.bulkDeleteConfirm":`Delete the {n} selected accounts?`,"providers.accounts.bulkDeleteDetail":`Their tokens are removed from this machine; clients bound to them fall back to the default account.`,"providers.accounts.bulkDone":`{n} accounts updated`,"providers.accounts.kind.oauth":`OAuth`,"providers.accounts.kind.api_key":`API key`,"providers.accounts.source.login":`Browser sign-in`,"providers.accounts.source.local":`Local import`,"providers.accounts.source.token":`Pasted`,"providers.accounts.source.batch":`Batch import`,"providers.accounts.source.plugin":`Plugin sign-in`,"providers.accounts.expiresAt":`expires {when}`,"providers.accounts.neverExpires":`never expires`,"providers.accounts.proxyBadge":`Own proxy`,"providers.accounts.signedOut":`Signed out`,"providers.accounts.quotaShortWeekly":`Week`,"providers.accounts.quotaShortSession":`Session`,"providers.accounts.quotaShortCredits":`Credits`,"providers.accounts.quotaShortPremium":`Premium`,"providers.accounts.order":`#{n}`,"providers.usage.title":`Request usage`,"providers.usage.today":`Today`,"providers.usage.total":`Total`,"providers.usage.requests":`Requests`,"providers.usage.tokens":`Tokens`,"providers.usage.cost":`Cost`,"providers.usage.hint":`Only requests through Astra are counted; tokens are input plus output. Costs use the model pricing at request time; subscriptions show equivalent costs.`,"providers.usage.dayHint":`Today follows calendar days in {zone}.`,"providers.usage.error":`Could not load usage statistics`,"providers.accounts.detail.identity":`Account`,"providers.accounts.detail.name":`Name`,"providers.accounts.detail.proxy":`Account proxy`,"providers.accounts.detail.proxyHint":`This account's requests, token refreshes and quota checks go through it; empty follows the provider ({fallback}).`,"providers.accounts.detail.quota":`Quota`,"providers.accounts.detail.credentials":`Credentials`,"providers.accounts.detail.kind":`Kind`,"providers.accounts.detail.source":`Source`,"providers.accounts.detail.status":`Status`,"providers.accounts.detail.expires":`Token expires`,"providers.accounts.detail.lastRefresh":`Last refresh`,"providers.accounts.detail.created":`Added`,"providers.accounts.detail.order":`Failover order`,"providers.accounts.detail.lastError":`Last error`,"providers.accounts.detail.key":`API key`,"providers.accounts.proxyFallbackSystem":`system proxy`,"providers.accounts.renamed":`Renamed`,"providers.accounts.proxySaved":`Account proxy saved`,"providers.accounts.loginProxyTitle":`Sign in through a proxy`,"providers.accounts.loginProxyDesc":`The new account reaches the upstream through this proxy from the sign-in on (code exchange, refreshes and requests). The authorization page still opens in your browser.`,"providers.accounts.loginProxyStart":`Start sign-in`,"providers.accounts.import.batchTitle":`Batch import accounts`,"providers.accounts.import.tokenTitle":`Paste a token`,"providers.accounts.import.apiKeyTitle":`Add API key`,"providers.accounts.import.desc":`Tokens are stored encrypted on this machine; results only show their first and last characters.`,"providers.accounts.import.label":`Tokens to import (one per line)`,"providers.accounts.import.apiKeyLabel":`API keys (one per line)`,"providers.accounts.import.formats":`Accepted: {formats}`,"providers.accounts.import.count":`{n} entries recognised`,"providers.accounts.import.preview":`Preview`,"providers.accounts.import.run":`Import`,"providers.accounts.import.proxy":`Account proxy (optional)`,"providers.accounts.import.summary":`{ok} imported, {dup} duplicates, {fail} failed`,"providers.accounts.import.previewSummary":`{ok} ready, {dup} duplicates, {fail} unrecognised`,"providers.accounts.import.rotateWarning":`Refresh tokens are usually single-use: after the import, the client that used it (Claude Code, Codex, …) may have to sign in again.`,"providers.accounts.credential.refresh_token":`refresh token`,"providers.accounts.credential.setup_token":`setup-token`,"providers.accounts.credential.api_key":`API key`,"providers.accounts.credential.github_token":`GitHub token`,"providers.accounts.credential.copilot_token":`Copilot token`,"providers.accounts.credential.claude_credentials":`.credentials.json`,"providers.accounts.credential.codex_auth_json":`auth.json`,"providers.accounts.format.claude-refresh-token":`refresh token (sk-ant-ort01-…)`,"providers.accounts.format.claude-setup-token":`claude setup-token (sk-ant-oat01-…)`,"providers.accounts.format.claude-credentials-json":`Claude Code's .credentials.json`,"providers.accounts.format.codex-auth-json":`the contents of ~/.codex/auth.json`,"providers.accounts.format.refresh-token":`refresh token`,"providers.accounts.format.grok-sso":`Grok Web SSO (sso cookie / email----password----…----sso)`,"providers.accounts.format.kimi-api-key":`Kimi Code API key (sk-kimi-…)`,"providers.accounts.format.zai-api-key":`Z.AI Coding Plan API key`,"providers.accounts.format.bigmodel-api-key":`Zhipu Coding Plan API key`,"providers.accounts.format.github-token":`GitHub token (gho_ / ghp_ / github_pat_)`,"providers.accounts.format.copilot-token":`Copilot token (tid=…;exp=…)`,"providers.subscription.localCopilotHint":`Import reads the VS Code entry in the system credential store (macOS shows a consent prompt); you can also paste a GitHub token directly`,"providers.subscription.localCodexFound":`Found a local Codex sign-in: {who}`,"providers.subscription.unknownAccount":`unknown account`,"providers.subscription.credits.title":`Rate-limit reset cards`,"providers.subscription.credits.footer":`codex reset cards: spending one clears the current rate-limit window immediately.`,"providers.subscription.credits.none":`This account has no reset cards`,"providers.subscription.credits.unavailable":`Reset cards are unavailable right now (signed out, or the upstream is unreachable).`,"providers.subscription.credits.availableCount":`{count} available`,"providers.subscription.credits.consume":`Use`,"providers.subscription.credits.consumeConfirm":`Use reset card “{title}”?`,"providers.subscription.credits.consumeDetail":`Clears the current rate-limit window immediately and cannot be undone.`,"providers.subscription.credits.consumed":`Reset card used; quota refreshed`,"providers.subscription.credits.consumeFailed":`Could not use the reset card`,"providers.subscription.credits.expires":`expires {when}`,"providers.subscription.credits.redeemedAt":`used {when}`,"providers.subscription.credits.notInPlan":`not in the current plan`,"providers.subscription.credits.status.available":`Available`,"providers.subscription.credits.status.redeemed":`Used`,"providers.subscription.credits.status.expired":`Expired`,"providers.subscription.needsVerification":`Coming soon: this subscription's sign-in flow has not been verified yet`,"providers.subscription.current":`In use`,"providers.subscription.disabled":`Disabled`,"providers.subscription.activate":`Switch to this account`,"providers.subscription.activated":`Switched to {name}; applies from the next request`,"providers.subscription.enable":`Enable`,"providers.subscription.disable":`Disable`,"providers.subscription.moveUp":`Move up`,"providers.subscription.moveDown":`Move down`,"providers.subscription.cooldown":`Rate-limited until {when}`,"providers.subscription.policy.title":`Usage policy`,"providers.subscription.policy.footer":`Switching accounts applies from the next request, no client restart needed. Requests from a client or token pinned to an account are not affected.`,"providers.subscription.policy.claudeCodeOnly":`Claude Code only`,"providers.subscription.policy.claudeCodeOnlyDetail":`Only requests from Claude Code (including its IDE extensions and Agent SDK) are accepted, with its headers forwarded as-is; other clients get a 403.`,"providers.subscription.policy.anyWarning":`Other clients are allowed: Astra only adds the headers OAuth requires and does not impersonate Claude Code. Anthropic may bill these requests as extra usage, reject them, or treat them as a terms-of-service violation.`,"providers.subscription.policy.mimic":`Other clients impersonate Claude Code`,"providers.subscription.policy.mimicDetail":`Requests from clients other than Claude Code carry the Claude Code identity (system identity blocks, the claude-cli User-Agent, X-Stainless fingerprints and the full beta set); without it the subscription token's non-Haiku models are rejected upstream. Off by default.`,"providers.subscription.policy.mimicWarning":`Claude Code impersonation is on: requests present the official CLI identity. This violates Anthropic’s terms of service and may get the account limited or banned — the risk is yours.`,"providers.subscription.policy.switchMode":`Account switching`,"providers.subscription.policy.manual":`Manual`,"providers.subscription.policy.failover":`Automatic failover`,"providers.subscription.policy.manualDetail":`Changes only when you switch, or when the current account dies or is disabled.`,"providers.subscription.policy.failoverDetail":`When the current account is rate-limited (429), cannot recover from an auth rejection (401/403), or its sign-in dies, the next usable account takes over and stays in use.`,"providers.subscription.policy.balanced":`Balanced`,"providers.subscription.policy.balancedDetail":`Spreads requests over all usable accounts, fewest in flight first. A conversation (same prompt_cache_key or Claude Code session) stays on one account so the upstream prompt cache keeps hitting; accounts that are rate-limited, cannot recover from an auth rejection, or have dead sign-ins are skipped. Bindings are kept in memory only.`,"providers.notes":`Notes`,"providers.apiKeyStored":`The API key is stored encrypted on this machine. Leave empty to keep it.`,"providers.replaceKey":`Enter a new key to replace`,"providers.endpointsFooter":`One URL per protocol; Astra translates when the client protocol differs from upstream.`,"providers.fullUrl":`Full URL`,"providers.addEndpoint":`Add endpoint`,"providers.preferred":`Upstream protocol order`,"providers.preferredHint":`Used to pick an upstream endpoint when translation is needed`,"providers.preferredMissing":`{protocol} has no endpoint address, so it is never selected from this order`,"providers.billingFooter":`The multiplier only scales inherited prices; custom model prices are not multiplied.`,"providers.multiplier":`Price multiplier`,"providers.multiplierHint":`e.g. a reseller charging official price ×1.1`,"providers.proxy":`HTTP proxy`,"providers.proxyHint":`This provider's requests, subscription sign-ins, token refreshes and quota checks; subscription accounts can override it under Accounts`,"providers.headers":`Extra headers`,"providers.mimicClaudeCode":`Impersonate Claude Code`,"providers.mimicClaudeCode.hint":`Anthropic requests to this upstream carry the Claude Code identity (claude-cli User-Agent, X-Stainless fingerprint, system identity block); real Claude Code requests are forwarded as they are. Off by default — use it only with upstreams that allow this.`,"providers.addHeader":`Add header`,"providers.addHeaderDetail":`Sent with every request to this provider; applied when you save.`,"providers.headerName":`Name`,"providers.headerValue":`Value`,"providers.addEndpointDetail":`The URL for one protocol; applied when you save.`,"providers.fullUrlHint":`The URL is the complete request URL; no path is appended`,"providers.adapterSettings":`Adapter settings (JSON)`,"providers.adapter":`Adapter`,"providers.boundClients":`Used by`,"origin.inherited":`Inherited`,"origin.overridden":`Overridden`,"origin.unset":`Unset`,"origin.reset":`Reset to inherited`,"models.count":`{count} models`,"models.search":`Search models, aliases`,"models.allVendors":`All vendors`,"models.sync":`Sync model catalog`,"models.syncDetail":`Fetch the latest parameters and prices from the official catalog (astra-gate.si). Fields you modified are never overwritten.`,"models.new":`New model`,"models.newDetail":`Add parameters and a default price for a model the catalog does not have.`,"models.col.model":`Model`,"models.col.vendor":`Vendor`,"models.col.context":`Context`,"models.col.price":`Input / output`,"models.col.providerPrices":`Provider prices`,"models.empty":`No matching models`,"models.source.seed":`Built-in`,"models.source.sync":`Synced`,"models.source.user":`Custom`,"models.modified":`Modified`,"models.providerPriceCount":`{count} providers`,"models.updated":`updated {time}`,"models.resetField":`Restore built-in value`,"models.fieldReset":`Restored built-in value`,"models.deleteConfirm":`Delete model {id}?`,"models.section.basic":`Parameters`,"models.section.capabilities":`Capabilities`,"models.section.pricing":`Official default price`,"models.section.providerPrices":`Prices by provider`,"models.section.overrides":`Provider custom prices`,"models.section.simulator":`Billing simulator`,"models.modifiedFooter":`Fields marked "Modified" are never overwritten by built-in data or syncs.`,"models.pricingHint":`The vendor's official price; used when a provider has no price of its own (scaled by the provider multiplier).`,"models.providerPricesFooter":`The same model priced at different AI providers (by price table); takes precedence over the official default.`,"models.overridesFooter":`These providers set their own price for this model; it has the highest priority.`,"models.noProviderPrices":`No provider-specific prices`,"models.hasTimeWindows":`time windows`,"models.hasTiers":`tiers`,"models.deletePrice":`Delete the {key} price?`,"models.addPrice":`Add provider price`,"models.editPrice":`Edit {key} price`,"models.priceSheetDetail":`Applies only to providers using this price table.`,"models.pickPriceKey":`Choose a price table`,"models.customPriceKey":`or enter a custom price table ID`,"models.upstreamId":`Provider's model ID`,"models.upstreamIdHint":`Set when it differs from the system ID; used for auto-linking`,"models.simulatorUnsaved":`Unsaved changes: simulating with the edited price.`,"models.field.id":`Model ID`,"models.field.idHint":`The name clients send`,"models.field.displayName":`Display name`,"models.field.vendor":`Vendor`,"models.field.family":`Family`,"models.field.aliases":`Aliases`,"models.field.contextWindow":`Context window`,"models.field.maxOutputTokens":`Max output`,"models.field.inputPrice":`Input /1M`,"models.field.outputPrice":`Output /1M`,"models.sync.newModel":`New model`,"models.sync.price":`Price · {key}`,"models.sync.field":`Field · {field}`,"models.sync.applied":`Applied {count} changes`,"models.sync.apply":`Apply {count}`,"models.sync.check":`Check for updates`,"models.sync.none":`Everything is up to date`,"models.sync.userModified":`Modified by you`,"models.sync.more":`+{n} more`,"models.sync.selectAll":`Select all`,"models.sync.selectedOf":`{n} / {total} selected · {models} models`,"models.sync.groupCount":`{n} changes`,"cap.vision":`Image input`,"cap.tools":`Tool calling`,"cap.reasoning":`Reasoning`,"cap.promptCache":`Prompt caching`,"cap.audio":`Audio`,"cap.pdf":`PDF`,"cap.structuredOutput":`Structured output`,"requests.col.cache":`Cache read / write`,"usage.title":`Token usage`,"usage.inputTotal":`Total input`,"usage.outputTotal":`Total output`,"usage.input":`Input`,"usage.output":`Output`,"usage.uncachedInput":`Uncached input`,"usage.regularOutput":`Non-reasoning output`,"usage.cacheRead":`Cache hit`,"usage.cacheWrite":`Cache write`,"usage.cacheWrite5m":`Cache write · 5 minutes`,"usage.cacheWrite30m":`Cache write · 30 minutes`,"usage.cacheWrite1h":`Cache write · 1 hour`,"usage.cacheWrite12h":`Cache write · 12 hours`,"usage.reasoning":`Reasoning / thinking`,"usage.inputAudio":`Audio input`,"usage.outputAudio":`Audio output`,"usage.inputImage":`Image input`,"usage.outputImage":`Image output`,"usage.hitShort":`Hit`,"usage.writeShort":`Write`,"usage.reasoningShort":`Think`,"usage.hitRate":`Cache hit rate`,"usage.noCache":`No cache read or write tokens reported by upstream`,"usage.missing":`No usage reported by upstream; the cache hit rate is unknown.`,"usage.hitTooltip":`Cache hits {read} / total input {total} tokens`,"usage.writeTooltip":`{tokens} tokens written; 5m / 1h are listed separately in details`,"usage.totalsHint":`Input already includes cache reads and writes; output includes reasoning. These counters are not added twice. Hit rate = cache read / total input.`,"usage.cacheAmounts":`Hit {read} · Write {write}`,"settings.appearance":`Appearance`,"settings.theme":`Theme`,"settings.theme.system":`System`,"settings.theme.light":`Light`,"settings.theme.dark":`Dark`,"settings.accent":`Accent color`,"settings.accent.system":`System`,"settings.accent.followingSystem":`Using the system accent color`,"settings.accent.systemUnavailable":`System accent unavailable; using default blue`,"settings.accent.blue":`Blue`,"settings.accent.purple":`Purple`,"settings.accent.pink":`Pink`,"settings.accent.red":`Red`,"settings.accent.orange":`Orange`,"settings.accent.yellow":`Yellow`,"settings.accent.green":`Green`,"settings.accent.graphite":`Graphite`,"settings.language":`Language`,"settings.languageHint":`Also the language of billing descriptions for new requests`,"settings.gateway":`Gateway`,"settings.requireKey":`Require access key`,"settings.requireKeyHint":`On by default. When off, requests from this machine without a key (or with an invalid one) are still served, through the default token's provider; LAN and remote requests always need a token.`,"settings.requireKeyOffConfirm":`Turn off access key verification?`,"settings.requireKeyOffDetail":`Once off, any program on this machine can use your provider quota without a key (LAN and remote requests still need a token). Only do this in a trusted environment.`,"settings.requireKeyOff":`Turn off anyway`,"settings.requireKeyOffNote":`Off: programs on this machine can use the gateway without a key`,"settings.gatewayFooter":`Change the port from a terminal: astra start --port <port>`,"settings.gatewayUrl":`Gateway URL`,"settings.listen":`Listening on`,"settings.listen.local":`This machine`,"settings.listen.lan":`LAN`,"settings.listen.pending":`Changed to {host}; takes effect after the service restarts`,"settings.listen.env":`{address} · set by the ASTRA_HOST environment variable, so it cannot be changed here`,"settings.listen.localOnly":`{address} · can only be changed on the computer running Astra`,"settings.listen.lanConfirm":`Allow LAN access?`,"settings.listen.lanDetail":`Devices on the same network will reach Astra at this machine's IP: gateway calls must carry a token, and the admin UI asks for the admin password. LAN traffic is not encrypted, so only allow this on a trusted network.`,"settings.listen.lanAction":`Allow`,"settings.listen.passwordTitle":`Set an admin password first`,"settings.listen.passwordDetail":`With LAN access on, other devices must sign in to open the admin UI. Without an admin password the service will not start on the LAN.`,"settings.listen.passwordRepeat":`Repeat the password`,"settings.listen.passwordMismatch":`The passwords do not match`,"settings.listen.passwordAction":`Set password and allow`,"settings.listen.saved":`Saved; takes effect after the service restarts`,"settings.listen.restart":`Restart service`,"settings.listen.restartHint":`Run astra restart in a terminal to apply the new address`,"settings.listen.restarted":`Service restarted`,"settings.listen.networkUrl":`LAN address`,"settings.startup":`Start at login`,"settings.startup.app":`Desktop app`,"settings.startup.appHint":`Opens in the tray / menu bar without a window when you log in, and starts the service with it`,"settings.startup.appUnsupported":`Available in the installed app only`,"settings.startup.service":`Background service`,"settings.startup.service.launchd":`Starts the gateway in the background when you log in, with no window (a LaunchAgent, same as astra autostart)`,"settings.startup.service.systemd":`A systemd user service starts the gateway when you log in (same as astra autostart)`,"settings.startup.service.registry":`Starts the gateway in the background when you sign in to Windows (the Run registry key, same as astra autostart)`,"settings.startup.entry":`Entry: {location}`,"settings.startup.saved":`On; takes effect the next time you log in`,"settings.startup.failed":`The system did not accept the change`,"settings.startup.localOnly":`Can only be changed on the computer running Astra`,"settings.startup.unsupported.container":`In a container, the container's restart policy starts the server (e.g. compose restart: unless-stopped)`,"settings.startup.unsupported.no-systemd":`This Linux system has no systemd, so Astra cannot register a login service`,"settings.startup.unsupported.platform":`Not supported on this system`,"settings.startup.macFooter":`macOS may ask you to allow Astra in System Settings › General › Login Items.`,"settings.dataDir":`Data folder`,"settings.openFolder":`Open folder`,"settings.streamIdle":`Stream idle timeout`,"settings.streamIdleHint":`Disconnect when the upstream sends nothing for this long`,"settings.requestCompression":`Upstream request compression`,"settings.requestCompressionHint":`Format for providers that compress request bodies (ChatGPT subscription defaults to zstd); other providers always get plain bodies`,"settings.requestCompression.default":`Provider default`,"settings.requestCompression.none":`No compression`,"settings.preventSleep":`Keep the system awake while requests are in flight`,"settings.preventSleepHint":`While the gateway is handling requests (streams included), the system does not go to sleep when idle; it may again about 30 seconds after the last one finishes, or at once when you turn this off or the server stops. The display still turns off and closing the lid still sleeps. Off by default; on Linux it needs systemd (systemd-inhibit) and has no effect in containers.`,"settings.clientFailover":`Switch provider automatically when one fails`,"settings.clientFailoverHint":`When a client is bound to several providers and a request hits a rate limit, rejected credentials, a 5xx or a network error before anything reached the client, the gateway retries it on the next bound provider that serves the model, in binding order; the client sees an error only when every one failed. On by default; off = only the first provider serving the model is used. A failing provider cools down briefly and is skipped meanwhile.`,"settings.logging":`Logging`,"settings.debugBodies":`Save request & response bodies`,"settings.sidebar":`Sidebar menu`,"settings.sidebar.footer":`A hidden entry leaves the left menu; its page still opens by address or from the command palette. Settings cannot be hidden.`,"settings.qualifiedModels":`Tell providers apart by model id`,"settings.qualifiedModels.footer":`When several providers serve the same model, a client's model list shows one entry per provider, as "model@provider alias", and a request for an entry goes to that provider. A model name without an alias still routes by provider priority, so existing configs keep working. Set a provider's alias on its detail page; it defaults to the provider's name.`,"settings.qualifiedModels.mode":`Append the provider alias to model ids`,"settings.qualifiedModels.modeHint":`Off by default; off, nothing changes. "Shared models only" tags just the models several providers serve and leaves the rest as they are; "All models" tags every entry. Changing it updates the model lists of enabled clients.`,"settings.qualifiedModels.mode.off":`Off`,"settings.qualifiedModels.mode.shared":`Shared models only`,"settings.qualifiedModels.mode.all":`All models`,"settings.qualifiedModels.separator":`Separator`,"settings.qualifiedModels.separatorHint":`Between the model name and the provider alias: 1–8 characters, no whitespace, "@" by default.`,"providers.alias.title":`Alias`,"providers.alias.footer":`With "Tell providers apart by model id" on, this provider's model ids read "model@alias". Aliases ignore case and spaces become "-"; when two providers share one, the earlier one in the list wins.`,"providers.alias.label":`Provider alias`,"providers.alias.hint":`Leave empty to use the provider's name`,"providers.alias.saved":`Alias saved`,"providers.timeout.title":`Response timeout`,"providers.timeout.label":`First-byte timeout (seconds)`,"providers.timeout.hint":`The longest the gateway waits for this provider to start answering; empty = no limit.`,"providers.timeout.footer":`A timeout counts as this provider failing: a client bound to several providers and a token's provider pool move on to the next one, otherwise the caller gets a 504. It only limits the wait before the response starts; after that the stream idle timeout in Settings applies. Up to 3600 seconds.`,"providers.timeout.saved":`Response timeout saved`,"settings.debugBodiesHint":`For troubleshooting. Stored in the local data folder, without secrets.`,"settings.traceContent":`Record conversation content in traces`,"settings.traceContentHint":`Keeps each tool call's arguments (up to 4 KB each) and the start of the user's prompt and the model's reply (300 characters each). Off by default; stored on this machine with the request log, and the arguments are not passed through the privacy guard.`,"settings.bodyRetention":`Keep bodies`,"settings.requestRetention":`Auto-delete request history`,"settings.keepForever":`Kept forever`,"settings.days":`days`,"settings.effort":`Reasoning effort mapping`,"settings.effortHint":`Used when translating OpenAI reasoning effort to Anthropic / Gemini thinking budgets and back.`,"settings.privacy":`Privacy guard`,"settings.privacy.footer":`Sensitive content is detected on this machine before requests leave. Original values live only in request memory and are never stored.`,"settings.privacy.enabled":`Enable privacy guard`,"settings.privacy.enabledHint":`When off, requests are forwarded untouched`,"settings.privacy.dryRun":`Detect only`,"settings.privacy.dryRunHint":`Record matches but let requests through, to observe the effect`,"settings.privacy.restore":`Restore placeholders in responses`,"settings.privacy.restoreHint":`Placeholders are swapped back to the original values; clients never notice`,"settings.privacy.recordSamples":`Record masked samples`,"settings.privacy.recordSamplesHint":`Logs keep masked samples (e.g. john••••om); originals are not saved by default`,"settings.privacy.recordFullSamples":`Show full matched content`,"settings.privacy.recordFullSamplesHint":`Logs keep the matched text itself (up to 256 characters each), useful when tuning rules; it puts a second copy of sensitive data in the log, so turn it off when done`,"settings.privacy.defaultAction":`Default action`,"settings.privacy.action.off":`Off`,"settings.privacy.action.warn":`Warn only`,"settings.privacy.action.block":`Block`,"settings.privacy.action.redact":`Redact`,"settings.privacy.categories":`Detection categories`,"settings.privacy.category.api_key":`API keys`,"settings.privacy.category.aws_key":`AWS keys`,"settings.privacy.category.jwt":`JWT tokens`,"settings.privacy.category.private_key":`Private keys`,"settings.privacy.category.email":`Email addresses`,"settings.privacy.category.phone":`Phone numbers`,"settings.privacy.category.intranet":`Intranet addresses`,"settings.privacy.category.custom":`Custom`,"settings.privacy.category.credit_card":`Card numbers`,"settings.privacy.category.national_id":`National IDs`,"settings.privacy.category.credential":`Credentials & connection strings`,"settings.privacy.enableCategory":`Enable`,"settings.privacy.customRules":`Custom rules`,"settings.privacy.noCustomRules":`No custom rules yet`,"settings.privacy.addRule":`Add rule`,"settings.privacy.ruleName":`Rule name`,"settings.privacy.rulePattern":`Regular expression`,"settings.privacy.rulePatternHint":`Matched against every string value in the request`,"settings.privacy.ruleTemplates":`Fill from template`,"settings.privacy.ruleTemplatesHint":`Pick a common template; name and pattern stay editable`,"settings.privacy.ruleTemplateNone":`Custom (enter manually)`,"settings.privacy.template.ipv4All":`All IPv4 addresses`,"settings.privacy.template.ipv4AllHint":`Includes public ranges; the built-in intranet rule covers private ranges only`,"settings.privacy.template.landline":`Landline numbers (China)`,"settings.privacy.template.licensePlate":`License plates (China)`,"settings.privacy.template.passportCn":`Passport numbers (China)`,"settings.privacy.template.uscc":`Unified social credit codes`,"settings.privacy.template.longToken":`Generic long tokens (32+ chars)`,"settings.privacy.template.longTokenHint":`Broad matches; pair with the "warn" action`,"settings.privacy.template.macAddress":`MAC addresses`,"settings.privacy.template.unixHome":`Unix / macOS home paths`,"settings.privacy.template.windowsProfile":`Windows profile paths`,"settings.privacy.template.unixHomeHint":`These paths expose the local username`,"settings.privacy.template.genericHint":`Adjust the expression as needed`,"settings.privacy.template.cloudAccessKey":`Cloud AccessKey IDs (Alibaba LTAI…, Tencent AKID…)`,"settings.privacy.template.awsSecretKey":`AWS secret access keys (40 chars)`,"settings.privacy.template.imWebhook":`IM bot webhooks (DingTalk / WeCom / Feishu / Slack)`,"settings.privacy.template.imWebhookHint":`A webhook URL is itself a credential — anyone holding it can post to the group`,"settings.privacy.template.internalService":`Internal service hosts (gitlab., jenkins., jira., …)`,"settings.privacy.template.jdbcConn":`JDBC connection strings with credentials`,"settings.privacy.template.jdbcHint":`Credentials inside connection strings are usually plain text`,"settings.privacy.template.smtpConn":`Mail server URLs with credentials (smtp://user:pass@…)`,"settings.privacy.template.keyFileRef":`Key file references (.pem / .key / .pfx / .jks)`,"settings.privacy.template.confidentialMarker":`Confidentiality markers (机密, Confidential, …)`,"settings.privacy.template.confidentialHint":`Warn or block on document classification markers`,"settings.privacy.template.employeeId":`Employee IDs (EMP-123456)`,"settings.privacy.template.labeledNumber":`Labeled numbers (contract / order / ticket numbers)`,"settings.privacy.invalidPattern":`Invalid regular expression`,"settings.privacy.deleteRuleConfirm":`Delete rule "{name}"?`,"settings.privacy.tester":`Dry run`,"settings.privacy.testerHint":`Check the text below against the current policy (no real request is affected)`,"settings.privacy.testerPlaceholder":`Paste request text or JSON…`,"settings.privacy.runTest":`Check`,"settings.privacy.noHits":`No rule matched`,"settings.privacy.wouldBlock":`Would block the request`,"settings.privacy.wouldRedact":`Would redact {count} place(s)`,"privacy.tab.overview":`Overview`,"privacy.tab.logs":`Interception log`,"privacy.tab.rules":`Detection rules`,"privacy.tab.tester":`Dry run`,"privacy.stats":`Guard statistics`,"privacy.stats.events":`Guard events`,"privacy.stats.blocked":`Blocked requests`,"privacy.stats.dryRun":`Detect-only requests`,"privacy.stats.redactions":`Redacted places`,"privacy.stats.byCategory":`Hits by category`,"privacy.stats.col.category":`Category`,"privacy.stats.col.requests":`Requests`,"privacy.stats.col.hits":`Hits`,"privacy.stats.col.warn":`Warn`,"privacy.stats.col.block":`Block`,"privacy.stats.col.redact":`Redact`,"privacy.logs.total":`{count} events`,"privacy.logs.empty":`No privacy events yet`,"privacy.logs.clear":`Clear log`,"privacy.logs.clearConfirm":`Clear the whole interception log?`,"privacy.logs.clearDetail":`Only the privacy guard's hit records are removed; the request log itself stays. This cannot be undone.`,"privacy.logs.cleared":`Cleared {count} interception events`,"privacy.logs.empty.detail":`Requests where the guard detected sensitive content show up here`,"privacy.logs.col.outcome":`Outcome`,"privacy.logs.col.action":`Hit action`,"privacy.logs.col.hits":`Hits`,"privacy.logs.outcome.blocked":`Blocked`,"privacy.logs.outcome.redacted":`{count} redacted`,"privacy.logs.outcome.dryRun":`Detect only`,"privacy.logs.blockedOnly":`Blocked only`,"privacy.logs.passedOnly":`Passed only`,"privacy.logs.moreHits":`+{count} more`,"privacy.logs.viewRequest":`View request {model}`,"settings.effort.low":`low`,"settings.effort.medium":`medium`,"settings.effort.high":`high`,"settings.about":`About`,"settings.serverVersion":`Server version`,"settings.desktopVersion":`Desktop version`,"settings.versionMismatch":`differs from the server version {server}`,"settings.logs":`Open logs folder`,"settings.logout":`Sign out`,"settings.checkUpdates":`Check for updates`,"settings.upToDate":`Up to date`,"settings.updateAvailable":`Update {version} available`,"settings.updateCheckFailed":`Check failed: {error}`,"settings.updateApplyHint":`Install from the Astra tray menu, or run astra update in a terminal`,"settings.updateApply":`Update now`,"settings.updateApplied":`Server updated and restarted`,"settings.updateDesktopRelaunch":`The desktop app will relaunch to finish the update`,"settings.updateDownloadOpened":`Opened the download page — install the new version to update (the bundled server comes with it)`,"settings.updateDownloading":`The new version is downloading in the background — you will be prompted to restart once it is ready`,"settings.lastChecked":`Last checked: {time}`,"settings.autoCheck":`Check for updates automatically`,"settings.previewUpdates":`Receive preview updates`,"settings.previewUpdatesHint":`Get the next release's features early; previews may be unstable. Turning this off never downgrades: you stay on your version until a newer stable release`,"settings.tab.general":`General`,"settings.tab.tray":`Tray panel`,"settings.tab.models":`Models`,"settings.tab.network":`Network`,"settings.tab.usage":`Usage`,"settings.tray.titleHeading":`Menu bar text`,"settings.tray.titleHint":`Shown next to the menu bar icon, visible without opening anything. On Windows and Linux it appears in the icon tooltip.`,"settings.tray.title.none":`Nothing`,"settings.tray.title.none.hint":`Icon only`,"settings.tray.title.requests":`Calls today`,"settings.tray.title.requests.hint":`e.g. 7`,"settings.tray.title.tokens":`Tokens today`,"settings.tray.title.tokens.hint":`e.g. 68.8K`,"settings.tray.title.cost":`Cost today`,"settings.tray.title.cost.hint":`e.g. $0.37`,"settings.tray.title.quota":`Subscription window`,"settings.tray.title.quota.hint":`The window with the least left, e.g. 64%`,"settings.tray.title.alerts":`Alerts only`,"settings.tray.title.alerts.hint":`Only on failed requests, low quota, or a stopped gateway`,"settings.tray.usageHeading":`Usage`,"settings.tray.clientsHeading":`Clients`,"settings.tray.section.overview":`Today at a glance`,"settings.tray.section.overview.hint":`Calls, tokens and failures`,"settings.tray.section.cost":`Estimated cost`,"settings.tray.section.cost.hint":`At official API prices; not a bill`,"settings.tray.section.chart":`Today's trend`,"settings.tray.section.chart.hint":`Calls per hour as bars`,"settings.tray.section.topModel":`Top model`,"settings.tray.section.topModel.hint":`The model with the largest share of today's tokens`,"settings.tray.section.compareYesterday":`Compare with yesterday`,"settings.tray.section.compareYesterday.hint":`Today's tokens against all of yesterday`,"settings.tray.section.cacheHitRate":`Cache hit rate`,"settings.tray.section.cacheHitRate.hint":`Cache reads as a share of input tokens`,"settings.tray.section.quota":`Quota & balance`,"settings.tray.section.quota.hint":`Window usage and reset times of Codex, Claude and other subscriptions, plus balances of API providers with the usage query on`,"settings.tray.section.clients":`Client providers`,"settings.tray.section.clients.hint":`The provider each enabled client uses; click to switch`,"settings.tray.previewHeading":`Panel preview`,"settings.tray.previewHint":`The panel that opens from the tray icon. Changes apply at once; the preview is what you get.`,"settings.tray.previewFooter":`Rendered with live data.`,"settings.tray.reset":`Restore defaults`,"tray.status.running":`Gateway running`,"tray.status.stopped":`Gateway not running`,"tray.status.starting":`Starting gateway…`,"tray.status.stopping":`Stopping gateway…`,"tray.status.restarting":`Restarting gateway…`,"tray.stoppedHint":`While the gateway is stopped, clients cannot reach models through Astra.`,"tray.mismatch":`API version mismatch`,"tray.update":`Update available`,"tray.copyAddress":`Copy gateway URL`,"tray.settings":`Tray panel settings`,"tray.more":`More actions`,"tray.today":`Today`,"tray.failures":`{count} failed`,"tray.justNow":`just now`,"tray.updated":`Updated {time}`,"tray.loadFailed":`Could not load usage`,"tray.requests":`calls`,"tray.tokens":`tokens`,"tray.cost":`Est. cost`,"tray.topModel":`Top model`,"tray.cacheHit":`Cache hits`,"tray.vsYesterday":`vs yesterday`,"tray.chartLabel":`Calls per hour today`,"tray.hourBar":`{hour} · {count} calls`,"tray.quota":`Quota & balance`,"tray.quotaRemaining":`Left`,"tray.quotaReset":`Resets`,"tray.quotaCredits":`Credits`,"tray.quotaPending":`Fetching quota…`,"tray.clients":`Clients`,"tray.unbound":`Not bound`,"tray.switchProvider":`Switch the provider of {client}`,"tray.disabledProvider":`{name} (disabled)`,"tray.restart":`Restart gateway`,"tray.stop":`Stop gateway`,"tray.quit":`Quit`,"tray.open":`Open Astra`,"tray.title.requests":`{count} calls today`,"tray.title.tokens":`{count} tokens today`,"tray.title.cost":`{amount} estimated today`,"tray.title.quota":`{plan} {window} window: {remaining} left`,"tray.title.failures":`{count} failed today`,"tray.tab.overview":`Overview`,"tray.tab.quota":`Quota`,"tray.alert.failures":`{count} failed · {share} of today`,"tray.alert.quota":`{plan} {window} window: only {remaining} left`,"tray.quotaTightest":`Quota · tightest`,"tray.viewAll":`View all`,"nav.plugins":`Plugins`,"providers.card.plugin":`Plugin sign-in`,"plugins.subtitle":`magpie-compatible plugins: provider plugins (OpenCode plugins, run in the Bun plugin host), gateway middleware and client (agent) plugins.`,"plugins.add":`Add plugin`,"plugins.updateAll":`Update all`,"plugins.tab.installed":`Installed`,"plugins.tab.market":`Market`,"plugins.tab.runtime":`Runtime`,"plugins.empty":`No plugins installed`,"plugins.emptyDetail":`Pick one in the Market, or add an npm package, a GitHub repository or a local folder.`,"plugins.orderHint":`The list order is the order gateway middleware runs in.`,"plugins.kind.provider":`Provider`,"plugins.kind.middleware":`Middleware`,"plugins.kind.agent":`Client`,"plugins.kind.pi":`pi extension`,"plugins.local":`Local`,"plugins.moveUp":`Move up`,"plugins.moveDown":`Move down`,"plugins.enabled":`Enabled`,"plugins.options":`Options`,"plugins.update":`Update`,"plugins.removeConfirm":`Remove plugin {name}?`,"plugins.removeDetail":`The plugin is uninstalled; a client it added gets its original configuration back first.`,"plugins.cantLoad":`The plugin can't load`,"plugins.hostCantLoad":`The plugin host couldn't load it`,"plugins.mw.error":`Middleware didn't load: {error}`,"plugins.mw.stats":`Middleware {hooks} · {calls} calls · {micros} µs avg · {failures} failures`,"plugins.mw.lastError":`Last failure: {error}`,"plugins.agent.adds":`Adds the client "{name}": enable it on the Clients page`,"plugins.agent.error":`The client didn't load: {error}`,"plugins.provides":`Signs in to: {providers}`,"plugins.servedBy":`{provider} is served by another plugin, {other}`,"plugins.useFor":`Use for {provider}`,"plugins.picked":`Picked to serve these providers.`,"plugins.optionsTitle":`Options of {name}`,"plugins.optionsExample":`Not set yet: this is the example the plugin gives.`,"plugins.optionsNone":`Not set. The plugin reads its options as a JSON object (ctx.options for middleware).`,"plugins.optionsClear":`Clear options`,"plugins.optionsSaved":`Options saved`,"plugins.optionsObject":`Options must be a JSON object`,"plugins.addTitle":`Add plugin`,"plugins.addDetail":`An npm package (optionally with a version), a git repository (github:owner/repo) or the absolute path to a file or folder.`,"plugins.spec":`Plugin`,"plugins.specHint":`e.g. @astragate-community/middleware-word-guard, github:someone/plugin, /Users/me/my-plugin`,"plugins.install":`Install`,"plugins.installed":`Installed`,"plugins.installConfirm":`Install {name}?`,"plugins.trustTitle":`Plugins run code with your permissions`,"plugins.trustDetail":`Provider plugins run with full permissions in the plugin host and see the requests that go through them; middleware can read and change every request and reply. Only install plugins you trust.`,"plugins.job.title":`Plugin task`,"plugins.job.running":`Working on {target}…`,"plugins.job.done":`{target} done`,"plugins.job.failed":`{target} failed`,"plugins.job.failedTitle":`It didn't finish`,"plugins.searchPlaceholder":`Search plugins on npm and GitHub…`,"plugins.searchResults":`Search results`,"plugins.noResults":`No plugins found`,"plugins.marketNote":`The market is the Astra site's registry (astra-gate.si): the community repository's plugins (astragate-community/astra-gate-plugins) plus those published there. Plugin packages are downloaded from the address the registry lists and checked against its hashes.`,"plugins.origin.astra":`Astra`,"plugins.minVersion":`Astra {version}+`,"plugins.linkInvalid":`The plugin named in that link isn't a package or a GitHub repository, so it was ignored.`,"plugins.bunDetail":`Provider plugins run on Bun. Astra downloads a pinned Bun the first time one is needed and checks its SHA-256; middleware and client plugins don't need Bun.`,"plugins.bunPath":`Location`,"plugins.bunMissing":`Not downloaded yet`,"plugins.bunVersion":`Version`,"plugins.bunTarget":`Build`,"plugins.bunNoBuild":`Bun has no build for this machine`,"plugins.bunFailed":`Downloading Bun failed`,"plugins.bunDownload":`Download Bun {version}`,"plugins.bunDownloading":`Downloading…`,"plugins.host":`Plugin host`,"plugins.hostDetail":`Provider plugins run in a separate Bun process (magpie's host.js), restarted when the plugins or the proxy change.`,"plugins.hostState":`State`,"plugins.hostRunning":`Running`,"plugins.hostStopped":`Not running (starts when needed)`,"plugins.hostStartFailed":`Failed to start`,"plugins.hostGone":`The host exited`,"plugins.hostPluginError":`Didn't load: {error}`,"pluginAccounts.noPlugin":`The plugin is unavailable`,"pluginAccounts.apiKey":`API key`,"pluginAccounts.browser":`Browser sign-in`,"pluginAccounts.empty":`No accounts signed in`,"pluginAccounts.emptyDetail":`Sign in with one of the methods above; the plugin keeps the sign-in.`,"pluginAccounts.current":`Current`,"pluginAccounts.active":`Usable`,"pluginAccounts.lapsed":`Sign in again`,"pluginAccounts.lapsedDetail":`The vendor refused this account's sign-in: sign in again.`,"pluginAccounts.usage":`Usage`,"pluginAccounts.signOut":`Sign out`,"pluginAccounts.signOutConfirm":`Sign {name} out?`,"pluginAccounts.plan":`Plan`,"pluginAccounts.until":`Until`,"pluginAccounts.resets":`resets {at}`,"pluginAccounts.signedIn":`Signed in`,"pluginAccounts.signInTitle":`Sign in to {name}`,"pluginAccounts.continue":`Continue`,"pluginAccounts.key":`Key`,"pluginAccounts.signIn":`Sign in`,"pluginAccounts.openPage":`Open the sign-in page`,"pluginAccounts.openAgain":`Open the sign-in page again`,"pluginAccounts.deviceCode":`Code to confirm`,"pluginAccounts.code":`The code the page shows`,"pluginAccounts.waiting":`Finish signing in in the browser; this continues on its own.`,"pluginAccounts.failed":`Sign-in failed`,"pluginAccounts.checkin":`Daily check-in`,"pluginAccounts.checkinOn":`Check in daily`,"pluginAccounts.checkinNow":`Check in now`,"pluginAccounts.checkinDetail":`The plugin checks each usable account in once a Beijing day; a failure is tried again after 30 minutes. Astra never solves captchas.`,"pluginAccounts.checkinNever":`Not checked in today`,"pluginAccounts.credit":`+{credit}`,"pluginAccounts.streak":`{days}-day streak`,"pluginAccounts.outcome.claimed":`Checked in`,"pluginAccounts.outcome.done":`Already in today`,"pluginAccounts.outcome.ineligible":`Not eligible`,"pluginAccounts.outcome.inactive":`No check-in running now`,"pluginAccounts.outcome.captcha":`Wants a captcha: check in in its own app`,"pluginAccounts.outcome.failed":`Failed`,"plugins.browseMarket":`Browse the market`,"plugins.off":`Plugins are switched off on the server`,"plugins.hostRecent":`Recent plugin messages`,"plugins.offDetail":`The server was started with ASTRA_PLUGINS=off: installed plugins don't run and none can be installed. Remove the variable and restart to bring them back.`,"plugins.bunReady":`Ready`,"plugins.kind.all":`All`,"plugins.kindFilter":`Filter by kind`,"plugins.magpie.banner":`magpie on this computer has {count} plugins Astra doesn't have yet.`,"plugins.magpie.import":`Import from magpie`,"plugins.magpie.off":`Off`,"plugins.magpie.signIns":`Also copy {count} sign-ins`,"plugins.magpie.title":`Import plugins from magpie`,"plugins.magpie.signInsDetail":`Copies the plugin sign-ins in magpie's plugin-auth.json into Astra's (both keep them as plain text); an account Astra already has under the same key is kept, and magpie's file isn't changed.`,"plugins.openProviders":`Sign in under Providers`,"plugins.searchNote":`Search results come from the market's own entries, npm and GitHub's magpie-plugin topic. The last two aren't reviewed: check where a plugin comes from before installing it.`,"settings.tab.remote":`Remote access`,"settings.remote.status":`Status`,"settings.remote.statusFooter":`Opens the gateway to the internet through a Cloudflare Tunnel — no public IP or port forwarding needed. Astra downloads cloudflared the first time and runs it for you.`,"settings.remote.enable":`Remote access`,"settings.remote.state.off":`Off`,"settings.remote.state.downloading":`Downloading cloudflared…`,"settings.remote.state.starting":`Connecting to Cloudflare…`,"settings.remote.state.connected":`Connected`,"settings.remote.state.reconnecting":`Connection lost, reconnecting…`,"settings.remote.connectedSince":`Connected {time}`,"settings.remote.publicUrl":`Remote gateway URL`,"settings.remote.publicUrlHint":`Use this address with an Astra token in clients on other devices.`,"settings.remote.openPage":`Open in browser`,"settings.remote.download":`Download`,"settings.remote.enableConfirm":`Turn on remote access?`,"settings.remote.enableDetail":`Anyone with the address can reach your gateway (calls still need an Astra token). Share the address and tokens only with people you trust.`,"settings.remote.enableAction":`Turn on`,"settings.remote.disableSelfConfirm":`Turn off remote access?`,"settings.remote.disableSelfDetail":`You are using this page through the remote address. Turning it off disconnects you at once; it can only be turned on again on this computer.`,"settings.remote.disableAction":`Turn off`,"settings.remote.cloudflaredMissing":`Downloads {version} the first time (about 20–55 MB)`,"settings.remote.cloudflaredUnsupported":`There is no cloudflared build for this machine`,"settings.remote.password":`Admin password`,"settings.remote.passwordSet":`Set`,"settings.remote.passwordMissing":`Not set · needed for LAN access or to open the admin UI remotely`,"settings.remote.passwordChange":`Change`,"settings.remote.passwordSetAction":`Set password`,"settings.remote.passwordNew":`New password (8+ characters)`,"settings.remote.passwordSaved":`Admin password saved`,"settings.remote.block.token":`A named tunnel needs its tunnel token.`,"settings.remote.block.hostname":`A named tunnel needs its public hostname.`,"settings.remote.block.password":`Set an admin password before opening the admin UI remotely.`,"settings.remote.mode":`Connection`,"settings.remote.modeLabel":`Tunnel type`,"settings.remote.mode.quick":`Temporary address`,"settings.remote.mode.named":`Your domain`,"settings.remote.mode.quick.hint":`No Cloudflare account; you get a *.trycloudflare.com address`,"settings.remote.mode.named.hint":`A tunnel you created in Cloudflare, on your own domain`,"settings.remote.quickWarning":`Temporary addresses don't carry streamed responses (SSE), so most coding clients won't work through them; the address changes on every start and has no uptime guarantee. Use it to try things out; for regular use pick your own domain.`,"settings.remote.token":`Tunnel token`,"settings.remote.tokenHint":`The value after --token in the install command`,"settings.remote.tokenSaved":`Saved; leave blank to keep it`,"settings.remote.hostname":`Public hostname`,"settings.remote.hostnameHint":`The hostname set up under the tunnel's public hostnames`,"settings.remote.origin":`Service URL`,"settings.remote.originHint":`Point the public hostname's service here`,"settings.remote.namedFooter":`Create a tunnel under Cloudflare Zero Trust → Networks → Tunnels and copy the token from its install command; then add a public hostname to the tunnel with its service pointing at the service URL above. Update it if the server port changes.`,"settings.remote.saved":`Remote access settings saved`,"settings.remote.guide":`Setup guide`,"settings.remote.scope":`What remote access reaches`,"settings.remote.scopeFooter":`Requests forwarded by Cloudflare are recognised as remote: the local "require token" switch never applies to them.`,"settings.remote.scope.gateway":`Gateway API`,"settings.remote.scope.gatewayHint":`/v1, /v1beta and the token self-service page /key`,"settings.remote.scope.gatewayBadge":`Token always required`,"settings.remote.scope.admin":`Admin UI`,"settings.remote.scope.adminHint":`Needs the admin password; failed sign-ins are rate-limited`,"settings.remote.adminConfirm":`Allow remote admin sign-in?`,"settings.remote.adminDetail":`Anyone with the address and the admin password can change every setting, provider and plugin. Make sure the password is strong.`,"settings.remote.adminAction":`Allow`,"settings.remote.log":`Output`,"settings.remote.logEmpty":`No output yet`,"settings.remote.unsupported":`Remote access isn't managed inside a container`,"settings.remote.unsupportedDetail":`With Docker, run cloudflared as a sidecar container and set an admin password. See "Docker" in the docs.`,"shell.remoteOn":`Remote access on`,"login.remoteBlocked":`Remote admin is off`,"login.remoteBlockedDetail":`This address only serves the gateway API. To manage Astra remotely, turn on "Admin UI" under Settings → Remote access on the computer running it.`,"settings.remote.connectedJustNow":`Connected just now`,"settings.remote.connectedFor":`Connected for {duration}`,"settings.remote.copyMenu":`Copy address`,"settings.remote.copy.openai":`OpenAI / Gemini base URL (with /v1)`,"settings.remote.copy.anthropic":`Anthropic base URL (no /v1, for Claude Code and others)`,"settings.remote.copy.key":`Token self-service page (/key)`,"settings.remote.logWithVersion":`Output · cloudflared {version}`,"settings.remote.err.token":`The tunnel token was rejected; copy it again from the Cloudflare dashboard.`,"settings.remote.err.tokenLost":`The saved tunnel token can no longer be read (the data directory's keys changed); enter it again.`,"settings.remote.err.network":`Can't reach Cloudflare; check the network or proxy (cloudflared needs Cloudflare's port 7844).`,"settings.remote.err.rate":`Cloudflare is not handing out temporary addresses right now (too many requests); it will retry shortly.`,"settings.remote.err.download":`Downloading cloudflared failed. Pick another download source under cloudflared below, or use an installed cloudflared.`,"settings.remote.err.generic":`Connection failed; retrying`,"settings.remote.err.origin":`Cloudflare can't reach Astra: make sure the service URL in the Cloudflare dashboard is {origin}.`,"settings.remote.modeSwitchConfirm":`Switch the connection?`,"settings.remote.modeSwitchDetail":`The tunnel reconnects and connections through the remote address drop; a temporary address changes every time.`,"settings.remote.modeSwitchStopDetail":`Your domain has no tunnel token or hostname yet, so switching turns remote access off.`,"settings.remote.modeSwitchAction":`Switch`,"settings.remote.savedRestart":`Saved; the tunnel is reconnecting`,"settings.remote.adminOffSelfConfirm":`Turn off remote admin?`,"settings.remote.adminOffSelfDetail":`You are using the admin UI through the remote address. Turning it off locks you out at once; it can only be turned on again on this computer.`,"tokens.remoteHint":`Remote access is on: other devices use {url}; token holders can open {key} for their limits and usage.`,"requests.col.origin":`Origin`,"requests.allOrigins":`All origins`,"requests.origin.remote":`Remote`,"requests.origin.local":`Local`,"requests.origin.remoteFrom":`Remote · {ip}`,"settings.remote.state.downloadingFrom":`Downloading cloudflared from {source}…`,"settings.remote.cf.footer":`Whatever the source, the file is checked against pinned SHA-256 checksums, so the source itself needn't be trusted.`,"settings.remote.cf.program":`Program`,"settings.remote.cf.downloaded":`Downloaded · {version}`,"settings.remote.cf.notDownloaded":`Downloads {version} the first time`,"settings.remote.cf.installedProgram":`Installed · {version}`,"settings.remote.cf.installedUnknown":`Installed · unknown version`,"settings.remote.cf.fromEnv":`Chosen by ASTRA_CLOUDFLARED; the settings below have no effect`,"settings.remote.cf.source":`Download source`,"settings.remote.cf.source.auto":`Automatic`,"settings.remote.cf.source.github":`GitHub`,"settings.remote.cf.source.astra":`Astra site mirror`,"settings.remote.cf.source.custom":`Custom address`,"settings.remote.cf.source.auto.hint":`GitHub first; the Astra site's mirror when it fails or stalls`,"settings.remote.cf.source.github.hint":`Only GitHub Releases`,"settings.remote.cf.source.astra.hint":`From astra-gate.si; often faster where GitHub is slow`,"settings.remote.cf.source.custom.hint":`From an address you choose, such as a GitHub proxy`,"settings.remote.cf.baseUrl":`Download address`,"settings.remote.cf.baseUrlHint":`Fetched as address/version/file, the same layout as GitHub Releases`,"settings.remote.cf.installed":`Installed cloudflared`,"settings.remote.cf.installedHint":`Run the cloudflared already on this computer instead of downloading one`,"settings.remote.cf.installedPath":`Path to cloudflared`,"settings.remote.cf.choose":`Use installed`,"settings.remote.cf.detect":`Find it`,"settings.remote.cf.detectNone":`No cloudflared on PATH`,"settings.remote.cf.use":`Use`,"settings.remote.cf.useDownloaded":`Use the downloaded one`,"settings.remote.cf.saved":`cloudflared settings saved`,"traces.subtitle":`Agent → Astra → provider: traffic, time, retries and rewrites at every hop`,"traces.tab.label":`Trace view`,"traces.tab.topology":`Topology`,"traces.tab.sessions":`Sessions`,"traces.tab.requests":`Requests`,"traces.range.label":`Time range`,"traces.range.live":`Live`,"traces.range.1h":`1 hour`,"traces.range.24h":`24 hours`,"traces.range.7d":`7 days`,"traces.canvas.hint":`Drag the background to pan · drag nodes to rearrange · ⌘/Ctrl + scroll to zoom`,"traces.canvas.details":`Details`,"traces.canvas.fit":`Fit`,"traces.canvas.resetLayout":`Reset layout`,"traces.canvas.zoomIn":`Zoom in`,"traces.canvas.zoomOut":`Zoom out`,"traces.canvas.close":`Close details`,"traces.canvas.minimap":`Minimap`,"traces.topology.legend":`Line width = volume · orange line = rate limits / failovers`,"traces.live.arriving":`Authenticating / routing`,"traces.live.upstream":`Sent upstream, waiting for the first byte`,"traces.live.streaming":`Upstream answered, streaming back`,"traces.live.done":`Done`,"traces.live.failed":`Failed`,"traces.live.badge":`{count} in flight`,"traces.live.legend.out":`Going upstream`,"traces.live.legend.back":`Streaming back`,"traces.live.legend.slow":`Waiting long`,"traces.live.legend.failed":`Failed`,"traces.live.legend.think":`Thinking`,"traces.live.legend.write":`Text`,"traces.live.legend.tool":`Tool call`,"traces.live.legend.retry":`Retry / switch`,"traces.topology.requestsIn":`requests ({window})`,"traces.topology.perMinute":`{count}/min`,"traces.topology.count":`{count}×`,"traces.topology.direct":`Direct calls`,"traces.topology.activeSessions":`{count} active sessions`,"traces.topology.idle":`Idle`,"traces.topology.accounts":`{count} accounts`,"traces.topology.cooling":`{count} cooling down`,"traces.topology.apiKey":`API key`,"traces.topology.empty":`No requests went through Astra in this window.`,"traces.topology.gateway":`Astra gateway`,"traces.topology.inFlightCount":`{count} in flight`,"traces.topology.overheadNoteTitle":`How overhead is measured`,"traces.topology.overheadNote":`First upstream send − arrival; upstream time and retries excluded.`,"traces.viewSessions":`View sessions`,"traces.kind.agent":`Agent`,"traces.kind.gateway":`Gateway`,"traces.kind.provider":`Provider`,"traces.kind.tool":`Agent-side tool`,"traces.kind.main":`Main agent`,"traces.kind.sidechain":`Sub-agent`,"traces.kind.aux":`Side call`,"traces.kv.requests":`Requests`,"traces.kv.errors":`Errors`,"traces.kv.errorRate":`Error rate`,"traces.kv.inFlight":`In flight`,"traces.kv.rate":`Requests/min`,"traces.kv.activeSessions":`Active sessions`,"traces.kv.attempts":`Upstream attempts`,"traces.kv.rateLimited":`429 responses`,"traces.kv.failovers":`Failovers`,"traces.kv.ttfbP95":`First byte P95`,"traces.kv.overheadP50":`Own overhead P50`,"traces.kv.overheadP95":`Astra overhead P95`,"traces.kv.calls":`Calls`,"traces.kv.cost":`Cost`,"traces.kv.status":`Status`,"traces.kv.duration":`Duration`,"traces.kv.firstToken":`First token`,"traces.kv.tokens":`Input / output`,"traces.kv.cacheRead":`Cache read`,"traces.kv.finish":`finish_reason`,"traces.kv.link":`Linked by`,"traces.kv.toolCalls":`Tool calls`,"traces.kv.gap":`Gap`,"traces.kv.session":`Session`,"traces.kv.step":`Step`,"traces.kv.protocols":`Protocols`,"traces.kv.traceparent":`traceparent`,"traces.kv.token":`Token`,"traces.kv.client":`Client`,"traces.kv.bytes":`Body`,"traces.kv.bodyTime":`Body read`,"traces.kv.rewritten":`Rewrote the request`,"traces.kv.hits":`Hits`,"traces.kv.categories":`Categories`,"traces.kv.restored":`Placeholders restored`,"traces.kv.dryRun":`Dry run`,"traces.kv.provider":`Provider`,"traces.kv.model":`Model`,"traces.kv.capabilities":`Capability lookup`,"traces.kv.lossy":`Lossy mappings`,"traces.kv.claudeMode":`Claude subscription headers`,"traces.kv.upstreamId":`Upstream request id`,"traces.kv.reads":`Reads`,"traces.kv.events":`Events`,"traces.kv.maxGap":`Longest pause`,"traces.kv.http":`HTTP status`,"traces.kv.ttfb":`First byte`,"traces.kv.credentials":`Credentials`,"traces.kv.refreshed":`token refreshed`,"traces.kv.retry":`Retried because`,"traces.kv.processing":`Upstream processing`,"traces.kv.rateLimitHeaders":`Upstream rate-limit headers`,"traces.stage.gateway.request":`Gateway request`,"traces.stage.gateway.route":`Auth · routing · limits`,"traces.stage.gateway.body":`Body read`,"traces.stage.gateway.middleware":`Middleware plugins`,"traces.stage.gateway.privacy":`Privacy guard`,"traces.stage.gateway.resolve":`Provider / model resolution`,"traces.stage.gateway.encode":`Protocol conversion`,"traces.stage.upstream.attempt":`Upstream attempt`,"traces.stage.gateway.response":`Response`,"traces.account.title":`Accounts (remaining quota from upstream rate-limit headers)`,"traces.account.ok":`OK`,"traces.account.cooldown":`Cooling down until {time}`,"traces.account.expired":`Sign in again`,"traces.account.revoked":`Revoked`,"traces.account.disabled":`Disabled`,"traces.account.remaining":`{count} left`,"traces.account.cooldownIn":`Cooling {time}`,"traces.account.attempts":`{count}×`,"traces.account.ready":`Ready`,"traces.hub.route":`→ {target}`,"traces.hub.switch":`{reason} → {target}`,"traces.switch.rate_limited_failover":`Rate limited, next account`,"traces.switch.auth_failover":`Sign-in refused, next account`,"traces.switch.auth_refresh":`Refreshed sign-in, retrying`,"traces.switch.provider_failover":`Next provider`,"traces.switch.compression_rejected":`Resending uncompressed`,"traces.cause.user":`User prompt`,"traces.cause.tool_result":`Tool result`,"traces.cause.results":`{count} tool results`,"traces.cause.chars":`{count} chars`,"traces.cause.failed":`failed`,"traces.cause.retry":`Retry`,"traces.output.think":`Thinking`,"traces.output.text":`Text`,"traces.output.tool":`Tool call`,"traces.output.thinkLine":`{time} · {chars} chars`,"traces.output.waiting":`Waiting for the first output…`,"traces.output.noArgs":`Arguments not recorded`,"traces.finish.stop":`Reply finished`,"traces.finish.tool_calls":`Waiting for tools`,"traces.finish.length":`Hit the length limit`,"traces.finish.content_filter":`Content filtered`,"traces.finish.error":`Error`,"traces.finish.other":`Ended`,"traces.activity.title":`Live activity`,"traces.activity.hint":`Newest first · hover to highlight the path`,"traces.activity.toggle":`Activity`,"traces.activity.empty":`No requests yet. They show up here as your agents send them.`,"traces.activity.cause":`Cause`,"traces.activity.route":`Route`,"traces.activity.output":`Output`,"traces.activity.content":`Record content`,"traces.activity.contentHint":`When on, new requests keep their tool arguments and the start of the prompt and reply (off by default)`,"traces.activity.contentOff":`Tool arguments and prompts are not recorded. Turn on Record content to keep them for new requests.`,"traces.activity.tokens":`In {input} · out {output}`,"traces.activity.open":`Open trace`,"traces.link.new_turn":`New turn (user input)`,"traces.link.tool_call":`Tool call id (exact)`,"traces.link.session":`Session fallback`,"traces.link.inferred":`Inferred`,"traces.retry.compression_rejected":`Upstream rejected the compressed body`,"traces.retry.auth_refresh":`Retried after refreshing the token (401/403)`,"traces.retry.rate_limited_failover":`Rate limited (429), switched account`,"traces.retry.auth_failover":`Account unavailable or authentication rejected, switched account`,"traces.retry.provider_failover":`Provider failed, moved to the next in the pool`,"traces.yes":`Yes`,"traces.no":`No`,"traces.node.entry":`Entry`,"traces.node.entryDetail":`Auth · routing · limits`,"traces.node.middleware":`Middleware`,"traces.node.rewritten":`Rewrote the request`,"traces.node.unchanged":`Unchanged`,"traces.node.privacy":`Privacy guard`,"traces.node.hits":`{count} hits`,"traces.node.resolve":`Resolve`,"traces.node.routing":`Smart routing`,"traces.route.source.judge":`Judged`,"traces.route.source.pin":`Session pin`,"traces.route.source.turn":`This turn`,"traces.route.source.fallback":`Fallback`,"traces.route.source.breaker":`Paused`,"traces.route.mode.session":`Per session`,"traces.route.mode.turn":`Per turn`,"traces.kv.routeSource":`Decided by`,"traces.kv.routeMode":`Rule`,"traces.kv.routeConfidence":`Confidence`,"traces.kv.routeFallback":`Fallback reason`,"traces.kv.routeAdjusted":`Grade first chosen (caller cannot reach it)`,"traces.kv.routeJudge":`Judge`,"traces.kv.routeJudgeTokens":`Judge tokens (in / out)`,"traces.kv.routeNewConnection":`Opened a new connection`,"traces.request.time.routing":`Routing judge`,"traces.session.routing":`Smart routing · {grade}`,"traces.node.passthrough":`Pass-through`,"traces.node.encode":`Conversion`,"traces.node.attempt":`Attempt {n}`,"traces.node.failedOver":`Failed, moved on`,"traces.node.decode":`Response decode`,"traces.node.maxGap":`Longest pause {ms}`,"traces.node.reencode":`Re-encode`,"traces.node.restore":`Restore placeholders`,"traces.node.restored":`{count} restored`,"traces.node.middlewareResponse":`Middleware · response`,"traces.node.events":`{count} events`,"traces.sessions.empty":`No sessions yet. They show up once an agent sends requests through Astra.`,"traces.sessions.active":`Active`,"traces.sessions.turnsCalls":`{turns} turns · {calls} calls`,"traces.sessions.errors":`{count} errors`,"traces.session.notFound":`Session not found — it may be older than the request-log retention.`,"traces.session.back":`Back to sessions`,"traces.session.empty":`No calls recorded for this turn.`,"traces.session.turn":`Turn {n}`,"traces.session.turnPicker":`Choose a turn`,"traces.session.viewLabel":`View`,"traces.session.view.canvas":`Canvas`,"traces.session.view.timeline":`Timeline`,"traces.session.legend.exact":`Linked by tool call id`,"traces.session.legend.inferred":`Inferred link`,"traces.session.legend.tool":`Line label: agent-side tools and the gap (click for details)`,"traces.session.tool":`Tool`,"traces.session.toolCount":`{count} tool calls`,"traces.session.tries":`{count} attempts`,"traces.session.inferredSub":`Inferred: sub-agent`,"traces.session.inferredAux":`Inferred: side call`,"traces.session.turnRow":`This turn`,"traces.session.toolGapRow":`Tools / waiting`,"traces.session.toolNoteTitle":`What happened here`,"traces.session.toolNote":`The gap between two calls: the agent ran tools or waited for you. Telling them apart needs agent telemetry.`,"traces.session.time.title":`Time in this turn`,"traces.session.time.model":`Model calls`,"traces.session.time.tools":`Tools / waiting`,"traces.session.time.retries":`Wasted on retries`,"traces.session.time.needsTelemetry":`Breakdown needs agent telemetry`,"traces.session.time.overhead":`Astra’s own overhead {ms}, included in the model calls.`,"traces.session.groupCalls":`{count} calls · {ms}`,"traces.session.groupTools":`{count} tool calls · click to expand`,"traces.session.expandAll":`Expand all`,"traces.session.nextAnomaly":`Jump to issue ({count})`,"traces.session.toolRow":`Tools · {names}`,"traces.phase.wait":`Before first output`,"traces.phase.think":`Thinking`,"traces.phase.write":`Writing`,"traces.phase.tool":`Writing tool calls`,"traces.flag.error":`Failed`,"traces.flag.retry":`Retried`,"traces.flag.slow":`Slow`,"traces.agent.label":`Agent`,"traces.agent.upstream":`Waiting for the model`,"traces.agent.waiting":`Model responding`,"traces.agent.thinking":`Thinking`,"traces.agent.writing":`Writing`,"traces.agent.tool":`Calling {name}`,"traces.agent.tools":`Running {names}`,"traces.agent.idle":`Waiting for you`,"traces.agent.failed":`Last call failed`,"traces.agent.retrying":`Retrying`,"traces.kv.phases":`Phases`,"traces.kv.reasoning":`Reasoning`,"traces.kv.chars":`Reasoning / text chars`,"traces.kv.tools":`Tools called`,"traces.kv.startAt":`Starts at`,"traces.kv.raw":`Everything recorded`,"traces.kv.messages":`Messages`,"traces.kv.toolDefs":`Tool definitions`,"traces.kv.systemChars":`System prompt`,"traces.kv.maxTokens":`Output cap`,"traces.kv.requestId":`Request id`,"traces.kv.reasoningTokens":`Reasoning tokens`,"traces.kv.generation":`Generation`,"traces.kv.speed":`Output speed`,"traces.unit.chars":`{count} chars`,"traces.request.time.generationOther":`Generation · other`,"traces.timeline.node":`Node`,"traces.timeline.duration":`Duration`,"traces.request.pick":`Pick a request to trace`,"traces.request.none":`No requests yet.`,"traces.request.notFound":`Request not found — it may be older than the request-log retention.`,"traces.request.pending":`In flight`,"traces.request.inFlight":`The request is still running; its full trace appears once it is done.`,"traces.request.openSession":`Open its session`,"traces.request.parent":`Previous step`,"traces.request.child":`Next step`,"traces.request.legend.request":`Request leg`,"traces.request.legend.response":`Response leg`,"traces.request.legend.failed":`Failed attempt`,"traces.request.time.title":`Where the time went`,"traces.request.time.astra":`Astra itself`,"traces.request.time.retries":`Wasted on retries`,"traces.request.time.ttfb":`Upstream first byte`,"traces.request.time.firstToken":`Waiting for the first token`,"traces.request.time.generation":`Generation`,"traces.openInLog":`Open in request log`,"traces.openRequest":`Open this request’s trace`,"traces.openTrace":`View trace`,"traces.error.title":`Could not load trace data`,"traces.error.unsupportedTitle":`The connected Astra server has no tracing`,"traces.error.unsupported":`The astra-server on this port is an older version without tracing. Stop it (for example, quit Astra Desktop) and start the new version.`,"nav.smartRouting":`Smart routing`,"nav.mcp":`MCP gateway`,"mcp.subtitle":`Put several MCP servers behind one address and decide per token which of them it may use.`,"mcp.gateway.title":`Gateway`,"mcp.clients.title":`Apply to clients`,"mcp.clients.hint":`Writes the gateway address and one token into the MCP settings of Claude Code or Codex, so the client needs this one entry to use every server here. The servers' own settings and sign-ins stay in Astra.`,"mcp.clients.token":`Token`,"mcp.clients.pickToken":`Choose a token`,"mcp.clients.noToken":`No token has MCP servers bound yet. Choose MCP servers for a token on the Tokens page first.`,"mcp.clients.apply":`Write`,"mcp.clients.replace":`Change token`,"mcp.clients.remove":`Remove`,"mcp.clients.state.missing":`Not written`,"mcp.clients.state.applied":`Written`,"mcp.clients.state.drifted":`Changed`,"mcp.clients.state.conflict":`Conflict`,"mcp.clients.usesToken":`Uses token {name}`,"mcp.clients.gatewayOff":`The gateway is off, so the client gets a 404. Turn on "Enable the MCP gateway" above first.`,"mcp.clients.drifted":`The entry was changed after Astra wrote it. Overwriting writes it again with the token chosen here.`,"mcp.clients.conflict":`The file already has an entry named astra that Astra did not write, and Astra will not overwrite it. Rename or remove it, then write again.`,"mcp.clients.unreadable":`The client's file cannot be read right now: {error}`,"mcp.clients.force":`Overwrite and write again`,"mcp.clients.forceRemove":`Force remove`,"mcp.clients.applied":`Written to {client}. Restart the client for it to take effect.`,"mcp.clients.removed":`Removed from {client}.`,"mcp.clients.stdio":`The gateway only forwards http MCP servers; stdio servers on this machine are not part of it.`,"mcp.gateway.enable":`Enable the MCP gateway`,"mcp.gateway.enableHint":`While off, /mcp answers 404 and exposes nothing new.`,"mcp.gateway.endpoint":`Aggregate address`,"mcp.gateway.endpointHint":`Clients use it as one MCP server with an Astra token as the bearer credential. Each server also has its own /mcp/<slug> address (tool names without the prefix).`,"mcp.gateway.origins":`Allowed browser origins`,"mcp.gateway.originsHint":`One per line, e.g. https://app.example.com. A request carrying an Origin header that is not listed is refused (DNS-rebinding defence); non-browser clients send none and are not affected.`,"mcp.gateway.originsSave":`Save origins`,"mcp.gateway.copyEndpoint":`Copy address`,"mcp.gateway.copied":`Copied`,"mcp.servers.title":`MCP servers`,"mcp.servers.add":`Add server`,"mcp.servers.emptyTitle":`No MCP servers yet`,"mcp.servers.emptyDetail":`Add a remote MCP server (Streamable HTTP or the older SSE) and choose, per token, which servers it may use.`,"mcp.servers.localOnly":`Servers can only be added, changed, tested and authorized on the machine running Astra.`,"mcp.server.addTitle":`Add an MCP server`,"mcp.server.editTitle":`Edit {name}`,"mcp.server.name":`Name`,"mcp.server.slug":`Slug`,"mcp.server.slugHint":`Lower-case letters, digits and single hyphens. It prefixes this server's tool names on the aggregate address (<slug>__<tool>); clients put those names in their allow-lists, so avoid changing it. Left empty it is made from the name.`,"mcp.server.url":`Address`,"mcp.server.urlHint":`Starts with http:// or https://. Do not put a secret in the address; use headers or OAuth for credentials.`,"mcp.server.transport":`Transport`,"mcp.server.transport.http":`Streamable HTTP`,"mcp.server.transport.sse":`Legacy SSE`,"mcp.server.transportHint":`Streamable HTTP finds out by itself whether the server speaks the new (2026-07-28) or the session-based older protocol. The older HTTP+SSE is deprecated: choose it only for a server that offers nothing else.`,"mcp.server.auth":`Authentication`,"mcp.server.auth.none":`None`,"mcp.server.auth.header":`Headers`,"mcp.server.auth.oauth":`OAuth`,"mcp.server.headers":`Request headers`,"mcp.server.headersHint":`For example Authorization: Bearer … Values are stored encrypted and never shown again; left empty while editing, a value is kept.`,"mcp.server.headerName":`Name`,"mcp.server.headerValue":`Value`,"mcp.server.headerKept":`Keep current value`,"mcp.server.addHeader":`Add header`,"mcp.server.removeHeader":`Remove this header`,"mcp.server.timeout":`Timeout (seconds)`,"mcp.server.timeoutHint":`The limit of one call to list or run a tool.`,"mcp.server.enabled":`Enabled`,"mcp.server.oauthNote":`After saving, click "Authorize" and sign in to the upstream service in your browser. What you grant is your own account's access, and every token bound to this server shares that identity.`,"mcp.server.created":`Added {name}`,"mcp.server.saved":`Saved {name}`,"mcp.server.deleted":`Deleted {name}`,"mcp.server.deleteConfirm":`Delete {name}?`,"mcp.server.deleteDetail":`Tokens bound to it lose the server, and any saved authorization is deleted with it.`,"mcp.status.unknown":`Not checked`,"mcp.status.ok":`Working`,"mcp.status.needs_auth":`Needs authorization`,"mcp.status.auth_error":`Credentials refused`,"mcp.status.unreachable":`Unreachable`,"mcp.status.version_unsupported":`Protocol version not supported`,"mcp.server.protocol":`Protocol {version}`,"mcp.server.boundTokens":`{count} tokens`,"mcp.server.disabledBadge":`Disabled`,"mcp.server.test":`Test connection`,"mcp.server.testOk":`Connected; {count} tools`,"mcp.server.testToolsTitle":`Tools of {name}`,"mcp.server.testFailed":`Connection failed: {message}`,"mcp.server.authorize":`Authorize`,"mcp.server.reauthorize":`Authorize again`,"mcp.server.authorizeOpened":`The authorization page opened in your browser. Come back here when you are done.`,"mcp.server.authorizeNotNeeded":`No further authorization is needed.`,"mcp.server.authorized":`Authorized`,"mcp.server.authorizedBy":`Issued by {issuer}`,"mcp.server.forget":`Forget authorization`,"mcp.server.forgetConfirm":`Forget the authorization of {name}?`,"mcp.server.forgetDetail":`The server cannot be used again until it is authorized again.`,"mcp.server.forgotten":`Authorization forgotten`,"mcp.calls.title":`Recent calls`,"mcp.calls.hint":`Records who called which tool, how long it took and how it ended; never the arguments or the reply. Kept for 30 days.`,"mcp.calls.empty":`No calls yet.`,"mcp.calls.time":`Time`,"mcp.calls.token":`Token`,"mcp.calls.tool":`Tool`,"mcp.calls.duration":`Duration`,"mcp.calls.result":`Result`,"mcp.calls.ok":`OK`,"mcp.calls.era.modern":`Modern`,"mcp.calls.era.legacy":`Legacy`,"mcp.calls.error.tool":`Tool error`,"mcp.calls.error.needs_auth":`Needs authorization`,"mcp.calls.error.unreachable":`Unreachable`,"mcp.calls.error.timeout":`Timed out`,"mcp.calls.error.needs_input":`Needs input`,"mcp.calls.error.protocol":`Protocol error`,"smartRouting.subtitle":`Pick a model by how demanding the task is: a small judge model reads the request, and it goes to the model of the matching grade`,"smartRouting.loadFailed":`Could not load the smart routing settings`,"smartRouting.status":`Status`,"smartRouting.statusFooter":`The switch saves any unsaved changes on this page along with it. While it is off, a client that asks for the virtual model is told smart routing is not enabled.`,"smartRouting.enable":`Enable smart routing`,"smartRouting.state.on":`On`,"smartRouting.state.off":`Off. Finish the three steps below, then switch it on.`,"smartRouting.state.pins":`{count} sessions holding a grade`,"smartRouting.state.breaker":`The judge kept failing; the fallback grade is used for now`,"smartRouting.use":`Pick this model in the client`,"smartRouting.useHint":`Choose it as the client’s model to use smart routing; any other model is left alone.`,"smartRouting.recent":`Recent decisions`,"smartRouting.recent.none":`No fresh decision since the settings were saved.`,"smartRouting.recent.judged":`{count} of the last {total} routed by the judge`,"smartRouting.recent.fallback":`{reason} ×{count}`,"smartRouting.recent.median":`median judge time {ms} ms`,"smartRouting.recent.failing":`Most recent decisions fell back: those requests went to the “{grade}” grade`,"smartRouting.recent.last":`Latest: {reason}, {time}`,"smartRouting.recent.hint.timeout":`The judge did not answer within the timeout. Opening a connection is the slow part: through a proxy it can take several seconds (Astra waits 3 s more when it has to connect). Check the network and the proxy — let the judge’s address bypass the proxy when it can be reached directly — or raise the timeout.`,"smartRouting.recent.hint.network":`The judge could not be reached: check its address, the network and the proxy settings.`,"smartRouting.recent.hint.auth":`The judge refused the key: enter this service’s own key again.`,"smartRouting.recent.hint.rate_limited":`The judge is rate limiting: it recovers by itself; if it keeps happening, check its quota and rate limits.`,"smartRouting.recent.hint.overloaded":`The judge is busy or down for now: it recovers by itself.`,"smartRouting.recent.hint.bad_request":`The judge refused the request: check that the judge model and the interface protocol match this service.`,"smartRouting.recent.hint.bad_response":`The judge’s answer could not be read: check that the interface protocol matches the service address.`,"smartRouting.recent.hint.low_confidence":`The judge was less sure than the least confidence: lower it, or make the grade descriptions more specific and more distinct from each other.`,"smartRouting.recent.hint.breaker":`The judge kept failing, so Astra is leaving it alone for a while. See why it failed before.`,"smartRouting.recent.hint.no_text":`Those requests held no user text to read (only tool results or images, say): with nothing to judge, they used the fallback grade.`,"smartRouting.recent.hint.not_configured":`No key is saved, or the saved one can no longer be read (the data folder moved to another machine, say): enter the key again.`,"smartRouting.recent.hint.error":`Astra hit an internal error while judging; the server log has the details.`,"smartRouting.recent.hint.other":`Check the judge with “Try it” below; each request’s “Smart routing” node in Traces records the reason.`,"smartRouting.unreachable.title":`Some callers cannot reach a grade’s model, so their requests were given another grade`,"smartRouting.unreachable.item":`{caller} cannot use “{grade}” ({where}): {reason}.`,"smartRouting.unreachable.where":`{model} on {provider}`,"smartRouting.unreachable.used":`Given “{used}” instead {count}×, latest at {time}.`,"smartRouting.unreachable.none":`No other grade was usable either: sent by its own routing {count}×, latest at {time}.`,"smartRouting.unusable.token_limited":`its token is limited to some clients and keeps to its own providers`,"smartRouting.unusable.token_limited.fix":`Let the token allow any client on the Tokens page, or bind the provider to the client on the Clients page.`,"smartRouting.unusable.provider_missing":`the provider has been deleted`,"smartRouting.unusable.provider_missing.fix":`Choose the grade a model again.`,"smartRouting.unusable.provider_off":`the provider is switched off or has no address`,"smartRouting.unusable.provider_off.fix":`Switch it on (or give it an address) on the Providers page, or give the grade another model.`,"smartRouting.unusable.claude_code_only":`the subscription only accepts Claude Code`,"smartRouting.unusable.claude_code_only.fix":`Give the grade another model, or let other clients use the subscription in its settings.`,"smartRouting.unusable.model_not_served":`the provider does not serve this model now (it is gone or switched off)`,"smartRouting.unusable.model_not_served.fix":`Check on the Providers page that the model is still there and switched on, or give the grade another model.`,"smartRouting.unusable.unknown":`reason not recorded (an older server; restart it to see one)`,"smartRouting.unreachable.hint":`A grade’s requests go to the provider it was given. A caller cannot use it when its token is limited to some clients (it keeps to its own providers), or when that provider is switched off, no longer serves the model or only accepts Claude Code. Lift the token’s client limit on the Tokens page, bind the provider to the client on the Clients page, or give the grade another model.`,"smartRouting.problems":`Could not finish`,"smartRouting.toast.on":`Smart routing is on`,"smartRouting.toast.off":`Smart routing is off`,"smartRouting.discard":`Discard changes`,"smartRouting.numberMissing":`A number is missing; fill it in to save.`,"smartRouting.judge.title":`1 · Judge model`,"smartRouting.judge.footer":`The judge answers one multiple-choice question — which grade this request needs — and writes no text.`,"smartRouting.judge.protocol":`Protocol`,"smartRouting.judge.protocol.typesafe":`TypeSafe Jev`,"smartRouting.judge.protocol.openai":`OpenAI Decisions`,"smartRouting.judge.protocol.typesafe.hint":`TypeSafe System One (default). Jev hosted by OpenRouter, Vercel and others uses the same protocol.`,"smartRouting.judge.protocol.openai.hint":`OpenAI’s Decisions API.`,"smartRouting.judge.openaiDraft":`This protocol follows third-party documentation and has not been checked against OpenAI’s own reference. Try it below before switching on.`,"smartRouting.judge.service":`Service`,"smartRouting.preset.typesafe":`TypeSafe`,"smartRouting.preset.openrouter":`OpenRouter`,"smartRouting.preset.vercel":`Vercel AI Gateway`,"smartRouting.preset.openai":`OpenAI`,"smartRouting.preset.custom":`Custom address`,"smartRouting.judge.baseUrl":`Service address`,"smartRouting.judge.baseUrlHint":`Up to the host (or gateway prefix), without /v1/…`,"smartRouting.judge.apiKey":`API key`,"smartRouting.judge.keySaved":`Saved {mask}; leave empty to keep it.`,"smartRouting.judge.keyMissing":`No key saved yet.`,"smartRouting.judge.keyReplace":`Enter this service’s own key.`,"smartRouting.judge.keyDropped":`Changing the service address clears the saved key (it belongs to the old service). Enter the new service’s key here.`,"smartRouting.judge.model":`Judge model`,"smartRouting.judge.modelHint":`Pin a version such as jev-1.13.0 once you have tuned thresholds.`,"smartRouting.judge.timeout":`Timeout (ms)`,"smartRouting.judge.timeoutHint":`A slower answer counts as a failure and the fallback grade is used. A call that has to open its connection first gets 3 s more.`,"smartRouting.privacy.title":`What the judge service receives`,"smartRouting.privacy.body":`Only the latest user message and up to {turns} earlier ones (at most {chars} characters in all), after the privacy guard; never assistant replies, tool results, images or system prompts. The judge service is a third party — choose accordingly.`,"smartRouting.judge.nonEnglish":`TypeSafe documents lower accuracy on non-English text. If you write in another language, try it below before relying on it.`,"smartRouting.judge.instructions":`Judge instructions`,"smartRouting.judge.instructionsHint":`Leave empty for the built-in question. Accuracy is lower on non-English text, so write the question and the grade descriptions in English.`,"smartRouting.test.title":`Try it`,"smartRouting.test.hint":`Judges a text with the settings on this page (no need to save first) to see which grade it picks. It calls the judge service once and may cost a little.`,"smartRouting.test.placeholder":`e.g. Redesign the billing module as event-driven`,"smartRouting.test.run":`Judge`,"smartRouting.test.result":`Judged as “{grade}”`,"smartRouting.test.model":`Model of this grade: {model}`,"smartRouting.test.noModel":`This grade has no model yet`,"smartRouting.test.confidence":`Confidence {percent}%`,"smartRouting.test.confident":`Reaches the threshold: a request would use this grade`,"smartRouting.test.notConfident":`Below the threshold: a request would use the fallback grade`,"smartRouting.test.meta":`{ms} ms · {input} in / {output} out tokens · {model}`,"smartRouting.test.failed":`The judge failed: {reason}`,"smartRouting.test.slow":`Took {ms} ms, longer than the {limit} ms a request waits: a request would have used the fallback grade.`,"smartRouting.test.connecting":`This call had to open its connection first; once open it is usually much faster — try again.`,"smartRouting.failure.timeout":`timed out`,"smartRouting.failure.network":`could not reach the service`,"smartRouting.failure.auth":`the key was refused`,"smartRouting.failure.rate_limited":`rate limited`,"smartRouting.failure.overloaded":`service busy or down`,"smartRouting.failure.bad_request":`the request was refused`,"smartRouting.failure.bad_response":`an answer it could not read`,"smartRouting.failure.low_confidence":`not confident enough`,"smartRouting.failure.breaker":`paused after repeated failures`,"smartRouting.failure.no_text":`no user text to read`,"smartRouting.failure.not_configured":`no readable key saved`,"smartRouting.failure.error":`internal error`,"smartRouting.grades.title":`2 · Grades and models`,"smartRouting.grades.footer":`Ordered cheapest first. The judge reads each description to choose, so say what a task of that grade looks like.`,"smartRouting.grade.name":`Name`,"smartRouting.grade.description":`Description (what the judge reads)`,"smartRouting.grade.descriptionPlaceholder":`Describe the kind of request that belongs to this grade (the judge reads this)`,"smartRouting.grade.model":`Model`,"smartRouting.grade.pickModel":`Choose a model`,"smartRouting.grade.unavailable":`{model} (the chosen provider does not serve it now — choose again)`,"smartRouting.grade.up":`Move up`,"smartRouting.grade.down":`Move down`,"smartRouting.grade.remove":`Remove this grade`,"smartRouting.grade.add":`Add a grade`,"smartRouting.grade.fallbackBadge":`Fallback`,"smartRouting.grade.noModels":`No models to choose from yet: add and enable models under Providers first.`,"smartRouting.rules.title":`3 · Routing rules`,"smartRouting.rules.footer":`When the judge fails, is not confident enough or has nothing to read, the request uses the fallback grade and nothing is pinned.`,"smartRouting.rules.mode":`When to judge`,"smartRouting.rules.mode.session":`Per session (default)`,"smartRouting.rules.mode.turn":`Every question`,"smartRouting.rules.mode.session.hint":`One judgement per session; the session keeps its grade — fewer calls to the judge, and no switching halfway. A session judged at the lowest grade (a greeting, a simple question) is not held there: its next message is judged again.`,"smartRouting.rules.mode.turn.hint":`Every new user message is judged; follow-up requests that only answer tool calls keep that grade. Switching models drops the prompt cache.`,"smartRouting.rules.ttl":`Session lifetime (minutes)`,"smartRouting.rules.ttlHint":`After a session has been idle this long, its next request is judged again.`,"smartRouting.rules.fallback":`Fallback grade`,"smartRouting.rules.fallbackHint":`Used when the judge fails, is not confident enough or has nothing to read.`,"smartRouting.rules.minConfidence":`Least confidence (0–1)`,"smartRouting.rules.minConfidenceHint":`Below this the fallback grade is used. TypeSafe gives no recommended value; start at 0.3 and tune with “Try it”.`,"smartRouting.rules.contextTurns":`Earlier user messages to include`,"smartRouting.rules.contextTurnsHint":`Gives the judge some context (a very short message like “continue” needs it); 0 sends only the current one.`,"smartRouting.rules.maxChars":`Characters sent, at most`,"smartRouting.rules.maxCharsHint":`The most conversation text sent in one judgement.`,"smartRouting.rules.advanced":`Advanced`,"smartRouting.rules.virtualModel":`Virtual model name`,"smartRouting.rules.virtualModelHint":`A client that picks it gets smart routing; it must not be the name of a real model a provider serves.`,"smartRouting.problem.virtual_model_invalid":`The virtual model name may only use letters, digits, “.”, “_” and “-”, and must start with a letter or digit.`,"smartRouting.problem.virtual_model_conflict":`The virtual model name is already a model a provider serves; choose another one.`,"smartRouting.problem.judge_protocol_invalid":`This protocol is not supported.`,"smartRouting.problem.judge_url_invalid":`The service address must be an http(s) address without credentials, query or fragment.`,"smartRouting.problem.judge_key_invalid":`The key may only contain visible ASCII characters, no spaces or line breaks.`,"smartRouting.problem.judge_key_missing":`The judge service’s key has not been entered yet.`,"smartRouting.problem.judge_model_missing":`The judge model has not been entered yet.`,"smartRouting.problem.out_of_range":`A number is outside the allowed range ({field}).`,"smartRouting.problem.too_long":`Some text is too long ({field}).`,"smartRouting.problem.grades_count":`There must be 2 to 6 grades.`,"smartRouting.problem.grade_id_invalid":`A grade id is not valid.`,"smartRouting.problem.grade_id_duplicate":`Two grades have the same id.`,"smartRouting.problem.grade_description_missing":`Every grade needs a description: it is what the judge reads to choose.`,"smartRouting.problem.grade_model_missing":`Grade “{grade}” has no model yet.`,"smartRouting.problem.grade_model_unroutable":`No enabled provider serves the model chosen for grade “{grade}”.`,"smartRouting.problem.fallback_grade_unknown":`The fallback grade must be one of the grades.`,"smartRouting.problem.mode_invalid":`The value of “when to judge” is not valid.`},cv=`astra.locale`,lv={zh:ov,en:sv};function uv(){try{let e=localStorage.getItem(cv);if(e===`zh`||e===`en`)return e}catch{}return(globalThis.navigator?.language??`zh`).toLowerCase().startsWith(`zh`)?`zh`:`en`}function dv(e,t){return t?e.replace(/\{(\w+)\}/g,(e,n)=>n in t?String(t[n]):e):e}function fv(e,t,n){return dv(lv[e][t]??lv.zh[t]??t,n)}var pv=(0,m.createContext)(null);function mv({children:e}){let[t,n]=(0,m.useState)(uv),r=(0,m.useCallback)(e=>{n(e),document.documentElement.lang=e===`zh`?`zh-CN`:`en`;try{localStorage.setItem(cv,e)}catch{}},[]),i=(0,m.useMemo)(()=>({locale:t,setLocale:r,t:(e,n)=>fv(t,e,n)}),[t,r]);return(0,h.jsx)(pv.Provider,{value:i,children:e})}function hv(){let e=(0,m.useContext)(pv);if(!e)throw Error(`useI18n outside I18nProvider`);return e}function gv(){return hv().t}function _v(e){var t,n,r=``;if(typeof e==`string`||typeof e==`number`)r+=e;else if(typeof e==`object`){if(Array.isArray(e)){var i=e.length;for(t=0;t<i;t++)e[t]&&(n=_v(e[t]))&&(r&&(r+=` `),r+=n)}else for(n in e)e[n]&&(r&&(r+=` `),r+=n)}return r}function vv(){for(var e,t,n=0,r=``,i=arguments.length;n<i;n++)(e=arguments[n])&&(t=_v(e))&&(r&&(r+=` `),r+=t);return r}function yv(...e){return vv(e)}var bv=1e9;function xv(e){return e/bv}function Sv(e,t={}){if(e==null||Number.isNaN(e))return`—`;let n=Math.abs(e);return n===0?`$0`:t.compact&&n>=1e3?`$${new Intl.NumberFormat(`en-US`,{notation:`compact`,maximumFractionDigits:1}).format(e)}`:n>=1?`$${new Intl.NumberFormat(`en-US`,{minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}`:`$${new Intl.NumberFormat(`en-US`,{maximumSignificantDigits:3,maximumFractionDigits:10}).format(e)}`}function Cv(e){return e===0?`$0`:Math.abs(e)>=1e3?Sv(e,{compact:!0}):`$${new Intl.NumberFormat(`en-US`,{maximumSignificantDigits:2,maximumFractionDigits:10}).format(e)}`}function wv(e){return e==null?`—`:Sv(xv(e))}function Tv(e){if(e==null||e===``)return`—`;let t=typeof e==`string`?Number(e):e;return Number.isNaN(t)?String(e):`$${Number(t.toPrecision(8))}`}function Ev(e,t=!1){return e==null?`—`:t&&Math.abs(e)>=1e4?new Intl.NumberFormat(`en-US`,{notation:`compact`,maximumFractionDigits:1}).format(e):new Intl.NumberFormat(`en-US`).format(e)}function Dv(e){return e==null?`—`:e>=1e4?`${(e/1e3).toFixed(1)} s`:`${Math.round(e)} ms`}function Ov(e){return e==null||!Number.isFinite(e)||e<0?`—`:`${e.toFixed(1)} tok/s`}function kv(e){return e==null||Number.isNaN(e)?`—`:`${(e*100).toFixed(e>=.999||e===0?0:1)}%`}function Av(e){return e?e>=1e6?`${Number((e/1e6).toFixed(2))}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e):`—`}function jv(e,t){let n=new Date(e),r=new Date,i=n.toDateString()===r.toDateString();return new Intl.DateTimeFormat(t===`zh`?`zh-CN`:`en-US`,{...i?{second:`2-digit`}:{month:`2-digit`,day:`2-digit`},hour:`2-digit`,minute:`2-digit`,hour12:!1}).format(n)}function Mv(e,t){let n=Math.max(1,Math.floor(e/6e4)),[r,i]=n<120?[n,`minute`]:n<2880?[Math.floor(n/60),`hour`]:[Math.floor(n/1440),`day`];return new Intl.NumberFormat(t===`zh`?`zh-CN`:`en-US`,{style:`unit`,unit:i,unitDisplay:`long`}).format(r)}function Nv(e,t){return e?new Intl.DateTimeFormat(t===`zh`?`zh-CN`:`en-US`,{year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`,hour12:!1}).format(new Date(e)):`—`}var Pv=e=>e===`zh`?`zh-CN`:`en-US`;function Fv(e){let[t,n,r]=e.split(`-`).map(Number);return new Date(t,n-1,r)}function Iv(e,t,n,r,i){return`${new Intl.DateTimeFormat(Pv(n),{weekday:`short`,month:`short`,day:`numeric`,year:`numeric`}).format(Fv(e))} · ${t>0?`${t} ${r}`:i}`}var Lv=(e,t)=>new Intl.DateTimeFormat(Pv(t),{month:`short`}).format(new Date(2026,e-1,1)),Rv=(e,t,n)=>new Intl.DateTimeFormat(Pv(n),{month:`short`,year:`numeric`}).format(new Date(t,e-1,1)),zv=(e,t)=>new Intl.DateTimeFormat(Pv(t),{weekday:`short`}).format(new Date(2026,7,3+e));function Bv(e){if(!e?.base)return`—`;let t=e.base.input,n=e.base.output;return t==null&&n==null?`—`:`${Tv(t)} / ${Tv(n)}`}function Vv(e){return e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(+(e<10240))} KB`:`${(e/1048576).toFixed(1)} MB`}function Hv(e){if(e==null)return``;if(typeof e==`string`)try{return JSON.stringify(JSON.parse(e),null,2)}catch{return e}return JSON.stringify(e,null,2)}var Uv=Object.defineProperty,Y=(e,t)=>Uv(e,`name`,{value:t,configurable:!0});function Wv(e,t){let n=m.createContext(t);n.displayName=e+`Context`;let r=Y(e=>{let{children:t,...r}=e,i=m.useMemo(()=>r,Object.values(r));return(0,h.jsx)(n.Provider,{value:i,children:t})},`Provider`);r.displayName=e+`Provider`;function i(r,i={}){let{optional:a=!1}=i,o=m.useContext(n);if(o)return o;if(t!==void 0)return t;if(!a)throw Error(`\`${r}\` must be used within \`${e}\``)}return Y(i,`useContext`),[r,i]}Y(Wv,`createContext`);function Gv(e,t=[]){let n=[];function r(t,r){let i=m.createContext(r);i.displayName=t+`Context`;let a=n.length;n=[...n,r];let o=Y(t=>{let{scope:n,children:r,...o}=t,s=n?.[e]?.[a]||i,c=m.useMemo(()=>o,Object.values(o));return(0,h.jsx)(s.Provider,{value:c,children:r})},`Provider`);o.displayName=t+`Provider`;function s(n,o,s={}){let{optional:c=!1}=s,l=o?.[e]?.[a]||i,u=m.useContext(l);if(u)return u;if(r!==void 0)return r;if(!c)throw Error(`\`${n}\` must be used within \`${t}\``)}return Y(s,`useContext`),[o,s]}Y(r,`createContext`);let i=Y(()=>{let t=n.map(e=>m.createContext(e));return Y(function(n){let r=n?.[e]||t;return m.useMemo(()=>({[`__scope${e}`]:{...n,[e]:r}}),[n,r])},`useScope`)},`createScope`);return i.scopeName=e,[r,Kv(i,...t)]}Y(Gv,`createContextScope`);function Kv(...e){let t=e[0];if(e.length===1)return t;let n=Y(()=>{let n=e.map(e=>({useScope:e(),scopeName:e.scopeName}));return Y(function(e){let r=n.reduce((t,{useScope:n,scopeName:r})=>{let i=n(e)[`__scope${r}`];return{...t,...i}},{});return m.useMemo(()=>({[`__scope${t.scopeName}`]:r}),[r])},`useComposedScopes`)},`createScope`);return n.scopeName=t.scopeName,n}Y(Kv,`composeContextScopes`);var qv=Object.defineProperty,Jv=(e,t)=>qv(e,`name`,{value:t,configurable:!0});function Yv(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}Jv(Yv,`setRef`);function Xv(...e){return t=>{let n=!1,r=e.map(e=>{let r=Yv(e,t);return!n&&typeof r==`function`&&(n=!0),r});if(n)return()=>{for(let t=0;t<r.length;t++){let n=r[t];typeof n==`function`?n():Yv(e[t],null)}}}}Jv(Xv,`composeRefs`);function Zv(...e){return m.useCallback(Xv(...e),e)}Jv(Zv,`useComposedRefs`);var Qv=Object.defineProperty,$v=(e,t)=>Qv(e,`name`,{value:t,configurable:!0});function ey(e){let t=m.forwardRef((t,n)=>{let{children:r,...i}=t,a=null,o=!1,s=[];cy(r)&&typeof py==`function`&&(r=py(r._payload)),m.Children.forEach(r,e=>{if(oy(e)){o=!0;let t=e,n=`child`in t.props?t.props.child:t.props.children;cy(n)&&typeof py==`function`&&(n=py(n._payload)),a=ry(t,n),s.push(a?.props?.children)}else s.push(e)}),a?a=m.cloneElement(a,void 0,s):!o&&m.Children.count(r)===1&&m.isValidElement(r)&&(a=r);let c=a?ay(a):void 0,l=Zv(n,c);if(!a){if(r||r===0)throw Error(o?fy(e):dy(e));return r}let u=iy(i,a.props??{});return a.type!==m.Fragment&&(u.ref=n?l:c),m.cloneElement(a,u)});return t.displayName=`${e}.Slot`,t}$v(ey,`createSlot`);var ty=Symbol.for(`radix.slottable`);function ny(e){let t=$v(e=>`child`in e?e.children(e.child):e.children,`Slottable`);return t.displayName=`${e}.Slottable`,t.__radixId=ty,t}$v(ny,`createSlottable`);var ry=$v((e,t)=>{if(`child`in e.props){let t=e.props.child;return m.isValidElement(t)?m.cloneElement(t,void 0,e.props.children(t.props.children)):null}return m.isValidElement(t)?t:null},`getSlottableElementFromSlottable`);function iy(e,t){let n={...t};for(let r in t){let i=e[r],a=t[r];/^on[A-Z]/.test(r)?i&&a?n[r]=(...e)=>{let t=a(...e);return i(...e),t}:i&&(n[r]=i):r===`style`?n[r]={...i,...a}:r===`className`?n[r]=[i,a].filter(Boolean).join(` `):r===`aria-describedby`&&(n[r]=uy(a,i))}return{...e,...n}}$v(iy,`mergeProps`);function ay(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}$v(ay,`getElementRef`);function oy(e){return m.isValidElement(e)&&typeof e.type==`function`&&`__radixId`in e.type&&e.type.__radixId===ty}$v(oy,`isSlottable`);var sy=Symbol.for(`react.lazy`);function cy(e){return typeof e==`object`&&!!e&&`$$typeof`in e&&e.$$typeof===sy&&`_payload`in e&&ly(e._payload)}$v(cy,`isLazyComponent`);function ly(e){return typeof e==`object`&&!!e&&`then`in e}$v(ly,`isPromiseLike`);function uy(...e){let t=new Set;for(let n of e)if(typeof n==`string`)for(let e of String(n).trim().split(/\s+/))e&&t.add(e);return t.size>0?Array.from(t).join(` `):void 0}$v(uy,`concatAriaDescribedby`);var dy=$v(e=>`${e} failed to slot onto its children. Expected a single React element child or \`Slottable\`.`,`createSlotError`),fy=$v(e=>`${e} failed to slot onto its \`Slottable\`. Expected \`Slottable\` to receive a single React element child.`,`createSlottableError`),py=m.use,my=Object.defineProperty,X=(e,t)=>my(e,`name`,{value:t,configurable:!0});function hy(e){let t=e+`CollectionProvider`,[n,r]=Gv(t),[i,a]=n(t,{collectionRef:{current:null},itemMap:new Map}),o=X(e=>{let{scope:t,children:n}=e,r=m.useRef(null),a=m.useRef(new Map).current;return(0,h.jsx)(i,{scope:t,itemMap:a,collectionRef:r,children:n})},`CollectionProvider`);o.displayName=t;let s=e+`CollectionSlot`,c=ey(s),l=m.forwardRef((e,t)=>{let{scope:n,children:r}=e,i=Zv(t,a(s,n).collectionRef);return(0,h.jsx)(c,{ref:i,children:r})});l.displayName=s;let u=e+`CollectionItemSlot`,d=`data-radix-collection-item`,f=ey(u),p=m.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=m.useRef(null),s=Zv(t,o),c=a(u,n);return m.useEffect(()=>(c.itemMap.set(o,{ref:o,...i}),()=>void c.itemMap.delete(o))),(0,h.jsx)(f,{[d]:``,ref:s,children:r})});p.displayName=u;function g(t){let n=a(e+`CollectionConsumer`,t);return m.useCallback(()=>{let e=n.collectionRef.current;if(!e)return[];let t=Array.from(e.querySelectorAll(`[${d}]`));return Array.from(n.itemMap.values()).sort((e,n)=>t.indexOf(e.ref.current)-t.indexOf(n.ref.current))},[n.collectionRef,n.itemMap])}return X(g,`useCollection`),[{Provider:o,Slot:l,ItemSlot:p},g,r]}X(hy,`createCollection`);var gy=new WeakMap,_y=class e extends Map{static{X(this,`OrderedDict`)}#e;constructor(e){super(e),this.#e=[...super.keys()],gy.set(this,!0)}set(e,t){return gy.get(this)&&(this.has(e)?this.#e[this.#e.indexOf(e)]=e:this.#e.push(e)),super.set(e,t),this}insert(e,t,n){let r=this.has(t),i=this.#e.length,a=by(e),o=a>=0?a:i+a,s=o<0||o>=i?-1:o;if(s===this.size||r&&s===this.size-1||s===-1)return this.set(t,n),this;let c=this.size+ +!r;a<0&&o++;let l=[...this.#e],u,d=!1;for(let e=o;e<c;e++)if(o===e){let i=l[e];l[e]===t&&(i=l[e+1]),r&&this.delete(t),u=this.get(i),this.set(t,n)}else{!d&&l[e-1]===t&&(d=!0);let n=l[d?e:e-1],r=u;u=this.get(n),this.delete(n),this.set(n,r)}return this}with(t,n,r){let i=new e(this);return i.insert(t,n,r),i}before(e){let t=this.#e.indexOf(e)-1;if(!(t<0))return this.entryAt(t)}setBefore(e,t,n){let r=this.#e.indexOf(e);return r===-1?this:this.insert(r,t,n)}after(e){let t=this.#e.indexOf(e);if(t=t===-1||t===this.size-1?-1:t+1,t!==-1)return this.entryAt(t)}setAfter(e,t,n){let r=this.#e.indexOf(e);return r===-1?this:this.insert(r+1,t,n)}first(){return this.entryAt(0)}last(){return this.entryAt(-1)}clear(){return this.#e=[],super.clear()}delete(e){let t=super.delete(e);return t&&this.#e.splice(this.#e.indexOf(e),1),t}deleteAt(e){let t=this.keyAt(e);return t!==void 0&&this.delete(t)}at(e){let t=vy(this.#e,e);if(t!==void 0)return this.get(t)}entryAt(e){let t=vy(this.#e,e);if(t!==void 0)return[t,this.get(t)]}indexOf(e){return this.#e.indexOf(e)}keyAt(e){return vy(this.#e,e)}from(e,t){let n=this.indexOf(e);if(n===-1)return;let r=n+t;return r<0&&(r=0),r>=this.size&&(r=this.size-1),this.at(r)}keyFrom(e,t){let n=this.indexOf(e);if(n===-1)return;let r=n+t;return r<0&&(r=0),r>=this.size&&(r=this.size-1),this.keyAt(r)}find(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return r;n++}}findIndex(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return n;n++}return-1}filter(t,n){let r=[],i=0;for(let e of this)Reflect.apply(t,n,[e,i,this])&&r.push(e),i++;return new e(r)}map(t,n){let r=[],i=0;for(let e of this)r.push([e[0],Reflect.apply(t,n,[e,i,this])]),i++;return new e(r)}reduce(...e){let[t,n]=e,r=0,i=n??this.at(0);for(let n of this)i=r===0&&e.length===1?n:Reflect.apply(t,this,[i,n,r,this]),r++;return i}reduceRight(...e){let[t,n]=e,r=n??this.at(-1);for(let n=this.size-1;n>=0;n--){let i=this.at(n);r=n===this.size-1&&e.length===1?i:Reflect.apply(t,this,[r,i,n,this])}return r}toSorted(t){let n=[...this.entries()].sort(t);return new e(n)}toReversed(){let t=new e;for(let e=this.size-1;e>=0;e--){let n=this.keyAt(e),r=this.get(n);t.set(n,r)}return t}toSpliced(...t){let n=[...this.entries()];return n.splice(...t),new e(n)}slice(t,n){let r=new e,i=this.size-1;if(t===void 0)return r;t<0&&(t+=this.size),n!==void 0&&n>0&&(i=n-1);for(let e=t;e<=i;e++){let t=this.keyAt(e),n=this.get(t);r.set(t,n)}return r}every(e,t){let n=0;for(let r of this){if(!Reflect.apply(e,t,[r,n,this]))return!1;n++}return!0}some(e,t){let n=0;for(let r of this){if(Reflect.apply(e,t,[r,n,this]))return!0;n++}return!1}};function vy(e,t){if(`at`in Array.prototype)return Array.prototype.at.call(e,t);let n=yy(e,t);return n===-1?void 0:e[n]}X(vy,`at`);function yy(e,t){let n=e.length,r=by(t),i=r>=0?r:n+r;return i<0||i>=n?-1:i}X(yy,`toSafeIndex`);function by(e){return e!==e||e===0?0:Math.trunc(e)}X(by,`toSafeInteger`);function xy(e){let t=e+`CollectionProvider`,[n,r]=Gv(t),[i,a]=n(t,{collectionElement:null,collectionRef:{current:null},collectionRefObject:{current:null},itemMap:new _y,setItemMap:X(()=>void 0,`setItemMap`)}),o=X(({state:e,...t})=>e?(0,h.jsx)(c,{...t,state:e}):(0,h.jsx)(s,{...t}),`CollectionProvider`);o.displayName=t;let s=X(e=>{let t=_();return(0,h.jsx)(c,{...e,state:t})},`CollectionInit`);s.displayName=t+`Init`;let c=X(e=>{let{scope:t,children:n,state:r}=e,a=m.useRef(null),[o,s]=m.useState(null),c=Zv(a,s),[l,u]=r;return m.useEffect(()=>{if(!o)return;let e=Ty(()=>{});return e.observe(o,{childList:!0,subtree:!0}),()=>{e.disconnect()}},[o]),(0,h.jsx)(i,{scope:t,itemMap:l,setItemMap:u,collectionRef:c,collectionRefObject:a,collectionElement:o,children:n})},`CollectionProviderImpl`);c.displayName=t+`Impl`;let l=e+`CollectionSlot`,u=ey(l),d=m.forwardRef((e,t)=>{let{scope:n,children:r}=e,i=Zv(t,a(l,n).collectionRef);return(0,h.jsx)(u,{ref:i,children:r})});d.displayName=l;let f=e+`CollectionItemSlot`,p=ey(f),g=m.forwardRef((e,t)=>{let{scope:n,children:r,...i}=e,o=m.useRef(null),[s,c]=m.useState(null),l=Zv(t,o,c),{setItemMap:u}=a(f,n),d=m.useRef(i);Sy(d.current,i)||(d.current=i);let g=d.current;return m.useEffect(()=>{let e=g;return u(t=>s?t.has(s)?t.set(s,{...e,element:s}).toSorted(wy):(t.set(s,{...e,element:s}),t.toSorted(wy)):t),()=>{u(e=>!s||!e.has(s)?e:(e.delete(s),new _y(e)))}},[s,g,u]),(0,h.jsx)(p,{"data-radix-collection-item":``,ref:l,children:r})});g.displayName=f;function _(){return m.useState(new _y)}X(_,`useInitCollection`);function v(t){let{itemMap:n}=a(e+`CollectionConsumer`,t);return n}return X(v,`useCollection`),[{Provider:o,Slot:d,ItemSlot:g},{createCollectionScope:r,useCollection:v,useInitCollection:_}]}X(xy,`createCollection`);function Sy(e,t){if(e===t)return!0;if(typeof e!=`object`||typeof t!=`object`||e==null||t==null)return!1;let n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(!Object.prototype.hasOwnProperty.call(t,r)||e[r]!==t[r])return!1;return!0}X(Sy,`shallowEqual`);function Cy(e,t){return!!(t.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_PRECEDING)}X(Cy,`isElementPreceding`);function wy(e,t){return!e[1].element||!t[1].element?0:Cy(e[1].element,t[1].element)?-1:1}X(wy,`sortByDocumentPosition`);function Ty(e){return new MutationObserver(t=>{for(let n of t)if(n.type===`childList`){e();return}})}X(Ty,`getChildListObserver`);var Ey=Object.defineProperty,Dy=(e,t)=>Ey(e,`name`,{value:t,configurable:!0}),Oy=!!(typeof window<`u`&&window.document&&window.document.createElement);function ky(e,t,{checkForDefaultPrevented:n=!0}={}){return Dy(function(r){if(e?.(r),n===!1||!r||!r.defaultPrevented)return t?.(r)},`handleEvent`)}Dy(ky,`composeEventHandlers`);function Ay(e){if(!Oy)throw Error(`Cannot access window outside of the DOM`);return e?.ownerDocument?.defaultView??window}Dy(Ay,`getOwnerWindow`);function jy(e){if(!Oy)throw Error(`Cannot access document outside of the DOM`);return e?.ownerDocument??document}Dy(jy,`getOwnerDocument`);function My(e,t=!1){let{activeElement:n}=jy(e);if(!n?.nodeName)return null;if(Ny(n)&&n.contentDocument)return My(n.contentDocument.body,t);if(t){let e=n.getAttribute(`aria-activedescendant`);if(e){let t=jy(n).getElementById(e);if(t)return t}}return n}Dy(My,`getActiveElement`);function Ny(e){return e.tagName===`IFRAME`}Dy(Ny,`isFrame`);var Py=globalThis?.document?m.useLayoutEffect:()=>{},Fy=Object.defineProperty,Iy=(e,t)=>Fy(e,`name`,{value:t,configurable:!0}),Ly=m.useEffectEvent,Ry=m.useInsertionEffect;function zy(e){if(typeof Ly==`function`)return Ly(e);let t=m.useRef(()=>{throw Error(`Cannot call an event handler while rendering.`)});return typeof Ry==`function`?Ry(()=>{t.current=e}):Py(()=>{t.current=e}),m.useMemo(()=>((...e)=>t.current?.(...e)),[])}Iy(zy,`useEffectEvent`);var By=Object.defineProperty,Vy=(e,t)=>By(e,`name`,{value:t,configurable:!0}),Hy=m.useInsertionEffect||Py;function Uy({prop:e,defaultProp:t,onChange:n=Vy(()=>{},`onChange`),caller:r}){let[i,a,o]=Wy({defaultProp:t,onChange:n}),s=e!==void 0;return[s?e:i,m.useCallback(t=>{if(s){let n=Gy(t)?t(e):t;n!==e&&o.current?.(n)}else a(t)},[s,e,a,o])]}Vy(Uy,`useControllableState`);function Wy({defaultProp:e,onChange:t}){let[n,r]=m.useState(e),i=m.useRef(n),a=m.useRef(t);return Hy(()=>{a.current=t},[t]),m.useEffect(()=>{i.current!==n&&(a.current?.(n),i.current=n)},[n,i]),[n,r,a]}Vy(Wy,`useUncontrolledState`);function Gy(e){return typeof e==`function`}Vy(Gy,`isFunction`);var Ky=Symbol(`RADIX:SYNC_STATE`);function qy(e,t,n,r){let{prop:i,defaultProp:a,onChange:o,caller:s}=t,c=i!==void 0,l=zy(o),u=[{...n,state:a}];r&&u.push(r);let[d,f]=m.useReducer((t,n)=>{if(n.type===Ky)return{...t,state:n.state};let r=e(t,n);return c&&!Object.is(r.state,t.state)&&l(r.state),r},...u),p=d.state,h=m.useRef(p);m.useEffect(()=>{h.current!==p&&(h.current=p,c||l(p))},[p,h,c]);let g=m.useMemo(()=>i===void 0?d:{...d,state:i},[d,i]);return m.useEffect(()=>{c&&!Object.is(i,d.state)&&f({type:Ky,state:i})},[i,d.state,c]),[g,f]}Vy(qy,`useControllableStateReducer`);var Jy=l(op(),1),Yy=Object.defineProperty,Xy=(e,t)=>Yy(e,`name`,{value:t,configurable:!0}),Zy=[`a`,`button`,`div`,`form`,`h2`,`h3`,`img`,`input`,`label`,`li`,`nav`,`ol`,`p`,`select`,`span`,`svg`,`ul`].reduce((e,t)=>{let n=ey(`Primitive.${t}`),r=m.forwardRef((e,r)=>{let{asChild:i,...a}=e,o=i?n:t;return typeof window<`u`&&(window[Symbol.for(`radix-ui`)]=!0),(0,h.jsx)(o,{...a,ref:r})});return r.displayName=`Primitive.${t}`,{...e,[t]:r}},{});function Qy(e,t){e&&Jy.flushSync(()=>e.dispatchEvent(t))}Xy(Qy,`dispatchDiscreteCustomEvent`);var $y=Object.defineProperty,eb=(e,t)=>$y(e,`name`,{value:t,configurable:!0});function tb(e,t){return m.useReducer((e,n)=>t[e][n]??e,e)}eb(tb,`useStateMachine`);var nb=eb(e=>{let{present:t,children:n}=e,r=rb(t),i=typeof n==`function`?n({present:r.isPresent}):m.Children.only(n),a=ab(r.ref,sb(i));return typeof n==`function`||r.isPresent?m.cloneElement(i,{ref:a}):null},`Presence`);function rb(e){let[t,n]=m.useState(),r=m.useRef(null),i=m.useRef(e),a=m.useRef(`none`),o=m.useRef(void 0),[s,c]=tb(e?`mounted`:`unmounted`,{mounted:{UNMOUNT:`unmounted`,ANIMATION_OUT:`unmountSuspended`},unmountSuspended:{MOUNT:`mounted`,ANIMATION_END:`unmounted`},unmounted:{MOUNT:`mounted`}});return m.useEffect(()=>{s===`mounted`?(a.current=o.current??ob(r.current),o.current=void 0):a.current=`none`},[s]),Py(()=>{let t=r.current,n=i.current;if(n!==e){let r=a.current,s=ob(t);e?(o.current=s,c(`MOUNT`)):s===`none`||t?.display===`none`?c(`UNMOUNT`):c(n&&r!==s?`ANIMATION_OUT`:`UNMOUNT`),i.current=e}},[e,c]),Py(()=>{if(t){let e,n=t.ownerDocument.defaultView??window,o=eb(a=>{let o=ob(r.current).includes(CSS.escape(a.animationName));if(a.target===t&&o&&(c(`ANIMATION_END`),!i.current)){let r=t.style.animationFillMode;t.style.animationFillMode=`forwards`,e=n.setTimeout(()=>{t.style.animationFillMode===`forwards`&&(t.style.animationFillMode=r)})}},`handleAnimationEnd`),s=eb(e=>{e.target===t&&(a.current=ob(r.current))},`handleAnimationStart`);return t.addEventListener(`animationstart`,s),t.addEventListener(`animationcancel`,o),t.addEventListener(`animationend`,o),()=>{n.clearTimeout(e),t.removeEventListener(`animationstart`,s),t.removeEventListener(`animationcancel`,o),t.removeEventListener(`animationend`,o)}}c(`ANIMATION_END`)},[t,c]),{isPresent:[`mounted`,`unmountSuspended`].includes(s),ref:m.useCallback(e=>{if(e){let t=getComputedStyle(e);r.current=t,o.current=ob(t)}else r.current=null;n(e)},[])}}eb(rb,`usePresence`);function ib(e,t){if(typeof e==`function`)return e(t);e!=null&&(e.current=t)}eb(ib,`setRef`);function ab(...e){let t=m.useRef(e);return t.current=e,m.useCallback(e=>{let n=t.current,r=!1,i=n.map(t=>{let n=ib(t,e);return!r&&typeof n==`function`&&(r=!0),n});if(r)return()=>{for(let e=0;e<i.length;e++){let t=i[e];typeof t==`function`?t():ib(n[e],null)}}},[])}eb(ab,`useStableComposedRefs`);function ob(e){return e?.animationName||`none`}eb(ob,`getAnimationName`);function sb(e){let t=Object.getOwnPropertyDescriptor(e.props,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning;return n?e.ref:(t=Object.getOwnPropertyDescriptor(e,`ref`)?.get,n=t&&`isReactWarning`in t&&t.isReactWarning,n?e.props.ref:e.props.ref||e.ref)}eb(sb,`getElementRef`);var cb=Object.defineProperty,lb=(e,t)=>cb(e,`name`,{value:t,configurable:!0}),ub=m.useId||(()=>void 0),db=0;function fb(e){let[t,n]=m.useState(ub());return Py(()=>{e||n(e=>e??String(db++))},[e]),e||(t?`radix-${t}`:``)}lb(fb,`useId`);var pb=Object.defineProperty,mb=(e,t)=>pb(e,`name`,{value:t,configurable:!0}),hb=`Collapsible`,[gb,_b]=Gv(hb),[vb,yb]=gb(hb),bb=m.forwardRef(mb(function(e,t){let{__scopeCollapsible:n,open:r,defaultOpen:i,disabled:a,onOpenChange:o,...s}=e,[c,l]=Uy({prop:r,defaultProp:i??!1,onChange:o,caller:hb});return(0,h.jsx)(vb,{scope:n,disabled:a,contentId:fb(),open:c,onOpenToggle:m.useCallback(()=>l(e=>!e),[l]),children:(0,h.jsx)(Zy.div,{"data-state":Eb(c),"data-disabled":a?``:void 0,...s,ref:t})})},`Collapsible`)),xb=`CollapsibleTrigger`,Sb=m.forwardRef(mb(function(e,t){let{__scopeCollapsible:n,...r}=e,i=yb(xb,n);return(0,h.jsx)(Zy.button,{type:`button`,"aria-controls":i.open?i.contentId:void 0,"aria-expanded":i.open||!1,"data-state":Eb(i.open),"data-disabled":i.disabled?``:void 0,disabled:i.disabled,...r,ref:t,onClick:ky(e.onClick,i.onOpenToggle)})},`CollapsibleTrigger`)),Cb=`CollapsibleContent`,wb=m.forwardRef(mb(function(e,t){let{forceMount:n,...r}=e,i=yb(Cb,e.__scopeCollapsible);return(0,h.jsx)(nb,{present:n||i.open,children:({present:e})=>(0,h.jsx)(Tb,{...r,ref:t,present:e})})},`CollapsibleContent`)),Tb=m.forwardRef(mb(function(e,t){let{__scopeCollapsible:n,present:r,children:i,...a}=e,o=yb(Cb,n),[s,c]=m.useState(r),l=m.useRef(null),u=Zv(t,l),d=m.useRef(0),f=d.current,p=m.useRef(0),g=p.current,_=o.open||s,v=m.useRef(_),y=m.useRef(void 0);return m.useEffect(()=>{let e=requestAnimationFrame(()=>v.current=!1);return()=>cancelAnimationFrame(e)},[]),Py(()=>{let e=l.current;if(e){y.current=y.current||{transitionDuration:e.style.transitionDuration,animationName:e.style.animationName},e.style.transitionDuration=`0s`,e.style.animationName=`none`;let t=e.getBoundingClientRect();d.current=t.height,p.current=t.width,v.current||(e.style.transitionDuration=y.current.transitionDuration,e.style.animationName=y.current.animationName),c(r)}},[o.open,r]),(0,h.jsx)(Zy.div,{"data-state":Eb(o.open),"data-disabled":o.disabled?``:void 0,id:o.contentId,hidden:!_,...a,ref:u,style:{"--radix-collapsible-content-height":f?`${f}px`:void 0,"--radix-collapsible-content-width":g?`${g}px`:void 0,...e.style},children:_&&i})},`CollapsibleContentImpl`));function Eb(e){return e?`open`:`closed`}mb(Eb,`getState`);var Db=Object.defineProperty,Ob=(e,t)=>Db(e,`name`,{value:t,configurable:!0}),kb={LTR:`ltr`,RTL:`rtl`},Ab=m.createContext(void 0);function jb(e){let t=m.useContext(Ab);return e||t||kb.LTR}Ob(jb,`useDirection`);var Mb=Object.defineProperty,Z=(e,t)=>Mb(e,`name`,{value:t,configurable:!0}),Nb={Single:`single`,Multiple:`multiple`},Pb={Vertical:`vertical`,Horizontal:`horizontal`},Fb={LTR:`ltr`,RTL:`rtl`},Ib=`Accordion`,Lb=[`Home`,`End`,`ArrowDown`,`ArrowUp`,`ArrowLeft`,`ArrowRight`],[Rb,zb,Bb]=hy(Ib),[Vb,Hb]=Gv(Ib,[Bb,_b]),Ub=_b(),Wb=m.forwardRef(Z(function(e,t){let{type:n,...r}=e,i=r,a=r;return(0,h.jsx)(Rb.Provider,{scope:e.__scopeAccordion,children:n===Nb.Multiple?(0,h.jsx)(Xb,{...a,ref:t}):(0,h.jsx)(Yb,{...i,ref:t})})},`Accordion`)),[Gb,Kb]=Vb(Ib),[qb,Jb]=Vb(Ib,{collapsible:!1}),Yb=m.forwardRef(Z(function(e,t){let{value:n,defaultValue:r,onValueChange:i=Z(()=>{},`onValueChange`),collapsible:a=!1,...o}=e,[s,c]=Uy({prop:n,defaultProp:r??``,onChange:i,caller:Ib});return(0,h.jsx)(Gb,{scope:e.__scopeAccordion,value:m.useMemo(()=>s?[s]:[],[s]),onItemOpen:c,onItemClose:m.useCallback(()=>a&&c(``),[a,c]),children:(0,h.jsx)(qb,{scope:e.__scopeAccordion,collapsible:a,children:(0,h.jsx)($b,{...o,ref:t})})})},`AccordionImplSingle`)),Xb=m.forwardRef(Z(function(e,t){let{value:n,defaultValue:r,onValueChange:i=Z(()=>{},`onValueChange`),...a}=e,[o,s]=Uy({prop:n,defaultProp:r??[],onChange:i,caller:Ib}),c=m.useCallback(e=>s((t=[])=>[...t,e]),[s]),l=m.useCallback(e=>s((t=[])=>t.filter(t=>t!==e)),[s]);return(0,h.jsx)(Gb,{scope:e.__scopeAccordion,value:o,onItemOpen:c,onItemClose:l,children:(0,h.jsx)(qb,{scope:e.__scopeAccordion,collapsible:!0,children:(0,h.jsx)($b,{...a,ref:t})})})},`AccordionImplMultiple`)),[Zb,Qb]=Vb(Ib),$b=m.forwardRef(Z(function(e,t){let{__scopeAccordion:n,disabled:r,dir:i,orientation:a=Pb.Vertical,...o}=e,s=Zv(m.useRef(null),t),c=zb(n),l=jb(i)===Fb.LTR,u=ky(e.onKeyDown,e=>{if(!Lb.includes(e.key))return;let t=e.target,n=c().filter(e=>!e.ref.current?.disabled),r=n.findIndex(e=>e.ref.current===t),i=n.length;if(r===-1)return;e.preventDefault();let o=r,s=i-1,u=Z(()=>{o=r+1,o>s&&(o=0)},`moveNext`),d=Z(()=>{o=r-1,o<0&&(o=s)},`movePrev`);switch(e.key){case`Home`:o=0;break;case`End`:o=s;break;case`ArrowRight`:a===Pb.Horizontal&&(l?u():d());break;case`ArrowDown`:a===Pb.Vertical&&u();break;case`ArrowLeft`:a===Pb.Horizontal&&(l?d():u());break;case`ArrowUp`:a===Pb.Vertical&&d()}n[o%i].ref.current?.focus()});return(0,h.jsx)(Zb,{scope:n,disabled:r,direction:i,orientation:a,children:(0,h.jsx)(Rb.Slot,{scope:n,children:(0,h.jsx)(Zy.div,{...o,"data-orientation":a,ref:s,onKeyDown:r?void 0:u})})})},`AccordionImpl`)),ex=`AccordionItem`,[tx,nx]=Vb(ex),rx=m.forwardRef(Z(function(e,t){let{__scopeAccordion:n,value:r,...i}=e,a=Qb(ex,n),o=Kb(ex,n),s=Ub(n),c=fb(),l=r&&o.value.includes(r)||!1,u=a.disabled||e.disabled;return(0,h.jsx)(tx,{scope:n,open:l,disabled:u,triggerId:c,children:(0,h.jsx)(bb,{"data-orientation":a.orientation,"data-state":ux(l),...s,...i,ref:t,disabled:u,open:l,onOpenChange:e=>{e?o.onItemOpen(r):o.onItemClose(r)}})})},`AccordionItem`)),ix=`AccordionHeader`,ax=m.forwardRef(Z(function(e,t){let{__scopeAccordion:n,...r}=e,i=Qb(Ib,n),a=nx(ix,n);return(0,h.jsx)(Zy.h3,{"data-orientation":i.orientation,"data-state":ux(a.open),"data-disabled":a.disabled?``:void 0,...r,ref:t})},`AccordionHeader`)),ox=`AccordionTrigger`,sx=m.forwardRef(Z(function(e,t){let{__scopeAccordion:n,...r}=e,i=Qb(Ib,n),a=nx(ox,n),o=Jb(ox,n),s=Ub(n);return(0,h.jsx)(Rb.ItemSlot,{scope:n,children:(0,h.jsx)(Sb,{"aria-disabled":a.open&&!o.collapsible||void 0,"data-orientation":i.orientation,id:a.triggerId,...s,...r,ref:t})})},`AccordionTrigger`)),cx=`AccordionContent`,lx=m.forwardRef(Z(function(e,t){let{__scopeAccordion:n,...r}=e,i=Qb(Ib,n),a=nx(cx,n),o=Ub(n);return(0,h.jsx)(wb,{role:`region`,"aria-labelledby":a.triggerId,"data-orientation":i.orientation,...o,...r,ref:t,style:{"--radix-accordion-content-height":`var(--radix-collapsible-content-height)`,"--radix-accordion-content-width":`var(--radix-collapsible-content-width)`,...e.style}})},`AccordionContent`));function ux(e){return e?`open`:`closed`}Z(ux,`getState`);var Q={duration:{instant:.12,fast:.16,exit:.18,standard:.24,considered:.48},ease:{enter:[.16,1,.3,1],exit:[.7,0,.84,0],standard:[.22,1,.36,1],inOut:[.65,0,.35,1]},spring:{responsive:{type:`spring`,stiffness:520,damping:38},gentle:{type:`spring`,stiffness:340,damping:34},snappy:{type:`spring`,visualDuration:.26,bounce:.12},smooth:{type:`spring`,visualDuration:.4,bounce:0},morph:{type:`spring`,visualDuration:.42,bounce:.16}},stagger:{char:.016,word:.04,line:.08,item:.035},blur:{subtle:2,soft:4,text:8}},dx={accordion:`_accordion_17mmv_1`,item:`_item_17mmv_2`,header:`_header_17mmv_3`,trigger:`_trigger_17mmv_4`,icon:`_icon_17mmv_5`,panel:`_panel_17mmv_9`,panelInner:`_panelInner_17mmv_10`,lg:`_lg_17mmv_11`},fx={height:`auto`,opacity:1,visibility:`visible`},px={height:0,opacity:0,transitionEnd:{visibility:`hidden`}},mx={y:0,filter:`blur(0px)`,transitionEnd:{filter:`none`}},hx={y:-6,filter:`blur(${Q.blur.subtle}px)`},gx={open:{...fx,transition:{height:Q.spring.smooth,opacity:{duration:Q.duration.standard,ease:[...Q.ease.enter]}}},closed:{...px,transition:{height:Q.spring.smooth,opacity:{duration:Q.duration.fast,ease:[...Q.ease.standard]}}}},_x={open:{...mx,transition:{y:Q.spring.smooth,filter:{duration:Q.duration.standard,ease:[...Q.ease.enter]}}},closed:{...hx,transition:{duration:Q.duration.fast,ease:[...Q.ease.standard]}}},vx={open:{...fx,transition:{duration:0}},closed:{...px,transition:{duration:0}}},yx={open:{...mx,transition:{duration:0}},closed:{...hx,transition:{duration:0}}};function bx({items:e,defaultOpen:t=0,size:n=`md`}){let r=t>=0&&t<e.length?String(t):``,[i,a]=(0,m.useState)(r),[o,s]=(0,m.useState)(()=>new Set(r?[r]:[])),c=e=>{a(e),e&&!o.has(e)&&s(new Set(o).add(e))},l=H();return(0,h.jsx)(Wb,{className:[dx.accordion,n===`lg`?dx.lg:``].filter(Boolean).join(` `),type:`single`,collapsible:!0,value:i,onValueChange:c,children:e.map((e,t)=>{let n=i===String(t);return(0,h.jsxs)(rx,{className:dx.item,value:String(t),children:[(0,h.jsx)(ax,{className:dx.header,children:(0,h.jsxs)(sx,{className:dx.trigger,children:[(0,h.jsx)(`span`,{children:e.title}),(0,h.jsx)(U.span,{className:dx.icon,initial:!1,animate:{rotate:n?180:0},transition:l?{duration:0}:Q.spring.snappy,children:(0,h.jsx)(L_,{width:17,height:17,"aria-hidden":`true`})})]})}),(0,h.jsx)(lx,{forceMount:!0,asChild:!0,children:(0,h.jsx)(U.div,{className:dx.panel,initial:!1,animate:n?`open`:`closed`,variants:l?vx:gx,children:(0,h.jsx)(U.div,{className:dx.panelInner,variants:l?yx:_x,children:o.has(String(t))?e.content:null})})})]},`${e.title}-${t}`)})})}var xx={badge:`_badge_qjt90_1`,sm:`_sm_qjt90_23`,md:`_md_qjt90_24`,body:`_body_qjt90_26`,content:`_content_qjt90_27`,label:`_label_qjt90_29`,glyph:`_glyph_qjt90_29`,text:`_text_qjt90_30`,icon:`_icon_qjt90_32`,neutral:`_neutral_qjt90_44`,success:`_success_qjt90_45`,info:`_info_qjt90_46`,warning:`_warning_qjt90_47`,danger:`_danger_qjt90_48`},Sx={duration:Q.duration.fast,ease:[...Q.ease.standard]},Cx={opacity:0,y:`0.3em`,filter:`blur(${Q.blur.soft}px)`},wx={opacity:0,y:`-0.3em`,filter:`blur(${Q.blur.subtle}px)`,transition:Sx},Tx={opacity:0,scale:.6,filter:`blur(${Q.blur.subtle}px)`},Ex={opacity:1,y:`0em`,scale:1,filter:`blur(0px)`},Dx={opacity:0,transition:{duration:Q.duration.instant}};function Ox(e){let t=Mu();return(0,h.jsx)(U.span,{...e,"aria-hidden":!t||e[`aria-hidden`]})}function kx(e){if(!(0,m.isValidElement)(e))return`icon`;let t=e.type;return typeof t==`string`?t:t.displayName??t.name??`icon`}function Ax({tone:e=`neutral`,size:t=`md`,icon:n,className:r,children:i,...a}){let o=H(),s=typeof i==`string`||typeof i==`number`?String(i):null,c=n?kx(n):``,l=(0,m.useRef)(null),u=(0,m.useRef)(null),d=Ff(`auto`),f=(0,m.useRef)(0);(0,m.useLayoutEffect)(()=>{f.current=performance.now()},[s,c]),(0,m.useEffect)(()=>{let e=u.current;if(!e||typeof ResizeObserver>`u`)return;let t,n,r=()=>{d.jump(`auto`),l.current&&(l.current.style.width=`auto`)},i=new ResizeObserver(([i])=>{let a=i.borderBoxSize?.[0]?.inlineSize??e.offsetWidth,s=d.get(),c=typeof s==`number`?s:t;if(t=a,n?.stop(),o||c===void 0||c===a||performance.now()-f.current>120)return r();l.current&&(l.current.style.width=`${c}px`),n=ip(d,[c,a],{...Q.spring.morph,onComplete:r})});return i.observe(e),()=>{i.disconnect(),n?.stop()}},[d,o]);let p=o?{duration:Q.duration.instant}:{duration:Q.duration.standard,ease:[...Q.ease.enter]},g=[xx.badge,xx[e],xx[t],r].filter(Boolean).join(` `);return(0,h.jsx)(`span`,{...a,className:g,children:(0,h.jsx)(U.span,{ref:l,className:xx.body,style:{width:d},children:(0,h.jsxs)(`span`,{ref:u,className:xx.content,children:[n?(0,h.jsx)(`span`,{className:xx.icon,"aria-hidden":`true`,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(Ox,{className:xx.glyph,initial:o?{opacity:0}:Tx,animate:Ex,exit:o?Dx:{...Tx,transition:Sx},transition:o?p:Q.spring.snappy,children:n},c)})}):null,s===null?i:(0,h.jsx)(`span`,{className:xx.label,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(Ox,{className:xx.text,initial:o?{opacity:0}:Cx,animate:Ex,exit:o?Dx:wx,transition:p,children:s},s)})})]})})})}var jx={button:`_button_14khe_1`,labelSlot:`_labelSlot_14khe_8`,labelContent:`_labelContent_14khe_10`,labelPhase:`_labelPhase_14khe_11`,primary:`_primary_14khe_13`,secondary:`_secondary_14khe_14`,ghost:`_ghost_14khe_15`,danger:`_danger_14khe_16`,sm:`_sm_14khe_27`,md:`_md_14khe_28`,lg:`_lg_14khe_29`,loader:`_loader_14khe_30`,spinner:`_spinner_14khe_31`,spin:`_spin_14khe_31`,loadingLabel:`_loadingLabel_14khe_32`},Mx={pressed:e=>{let t=e.current?.offsetWidth??0;return{scale:t>220?.985:t&&t<=48?.96:.97,transition:{duration:Q.duration.instant,ease:[...Q.ease.standard]}}}},Nx={opacity:1,y:0,scale:1,filter:`blur(0px)`},Px={opacity:0,y:4,filter:`blur(${Q.blur.soft}px)`},Fx={opacity:0,y:-3,filter:`blur(${Q.blur.soft}px)`,transition:{duration:Q.duration.fast,ease:[...Q.ease.standard]}},Ix={opacity:0,scale:.6,filter:`blur(${Q.blur.subtle}px)`},Lx={opacity:0,scale:.6,filter:`blur(${Q.blur.subtle}px)`,transition:{duration:Q.duration.fast,ease:[...Q.ease.standard]}},Rx={...Nx,opacity:0},zx={opacity:0,transition:{duration:Q.duration.instant}},Bx={...Q.spring.snappy,opacity:{duration:Q.duration.fast,ease:[...Q.ease.enter]},filter:{duration:Q.duration.fast,ease:[...Q.ease.enter]}};function Vx(e){if(e==null||typeof e==`boolean`)return``;if(typeof e==`string`||typeof e==`number`||typeof e==`bigint`)return String(e);if(Array.isArray(e))return e.map(Vx).join(``);if(!(0,m.isValidElement)(e))return``;let t=e.type;return`<${typeof t==`string`?t:t?.displayName??t?.name??``}>${Vx(e.props.children)}`}function Hx(e,t,n){let r=Ff(`auto`),i=(0,m.useRef)(t),a=(0,m.useRef)(0);return(0,m.useLayoutEffect)(()=>{i.current!==t&&(i.current=t,a.current=performance.now()+700)},[t]),(0,m.useEffect)(()=>{let t=e.current,i=t?.parentElement;if(!t||!i||typeof ResizeObserver>`u`)return;let o=!1,s=new ResizeObserver(([e])=>{let t=e.contentRect.width;if(!t||!o||n||performance.now()>a.current){o=t>0,r.jump(t||`auto`),delete i.dataset.morphing;return}i.dataset.morphing=``,ip(r,t,{...Q.spring.morph,onComplete:()=>{delete i.dataset.morphing}})});return s.observe(t),()=>s.disconnect()},[e,n,r]),r}function Ux({children:e,icon:t,reduced:n,ref:r}){let i=Mu();return(0,h.jsx)(U.span,{ref:r,className:jx.labelPhase,"aria-hidden":!i||void 0,initial:n?Rx:t?Ix:Px,animate:Nx,exit:n?zx:t?Lx:Fx,transition:n?{duration:Q.duration.instant}:t?Bx:{duration:Q.duration.standard,ease:[...Q.ease.enter]},children:e})}var Wx=(0,m.forwardRef)(function({className:e,variant:t=`primary`,size:n=`md`,loading:r=!1,disabled:i,children:a,onClick:o,...s},c){let l=H()??!1,u=(0,m.useRef)(null),d=(0,m.useRef)(null),f=Vx(a),p=Hx(d,f,l),g=(0,m.useCallback)(e=>{u.current=e,typeof c==`function`?c(e):c&&(c.current=e)},[c]),_=s[`aria-haspopup`],v=_!==void 0&&_!==!1&&_!==`false`||s.role===`combobox`||s[`data-state`]!==void 0,y=i||r||s[`aria-disabled`]===!0||s[`aria-disabled`]===`true`,b=[jx.button,jx[t],jx[n],e].filter(Boolean).join(` `);return(0,h.jsxs)(U.button,{ref:g,tabIndex:s.tabIndex??0,className:b,disabled:i,"aria-busy":r||void 0,custom:u,variants:Mx,whileTap:l||v||y?void 0:`pressed`,transition:Q.spring.snappy,...s,"aria-disabled":r||s[`aria-disabled`]||void 0,onClick:r?e=>e.preventDefault():o,children:[(0,h.jsx)(V,{initial:!1,children:r?(0,h.jsx)(U.span,{className:jx.loader,"aria-hidden":`true`,initial:l?{opacity:0}:{opacity:0,scale:.6},animate:{opacity:1,scale:1},exit:l?zx:{...Lx,scale:.8},transition:l?{duration:Q.duration.instant}:Bx,children:(0,h.jsx)(`span`,{className:jx.spinner})},`loader`):null}),(0,h.jsx)(U.span,{className:[jx.labelSlot,r?jx.loadingLabel:``].filter(Boolean).join(` `),style:{width:p},children:(0,h.jsx)(`span`,{ref:d,className:jx.labelContent,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(Ux,{icon:!/\S/.test(f.replace(/<[^>]*>/g,``)),reduced:l,children:a},f)})})})]})});Wx.displayName=`Button`;function Gx(e=1900){let[t,n]=(0,m.useState)(`idle`),[r,i]=(0,m.useState)(null),a=(0,m.useRef)(null),o=(0,m.useCallback)(()=>{a.current&&clearTimeout(a.current),a.current=null,n(`idle`),i(null)},[]);return(0,m.useEffect)(()=>()=>{a.current&&clearTimeout(a.current)},[]),{state:t,activeKey:r,copy:(0,m.useCallback)(async(t,r=`default`)=>{a.current&&clearTimeout(a.current),i(r);try{return await navigator.clipboard.writeText(t),n(`copied`),a.current=setTimeout(o,e),!0}catch{return n(`error`),a.current=setTimeout(o,e),!1}},[e,o]),reset:o}}var Kx={button:`_button_17pbi_1`,iconOnly:`_iconOnly_17pbi_3`,plain:`_plain_17pbi_4`,icon:`_icon_17pbi_3`,iconInner:`_iconInner_17pbi_8`,label:`_label_17pbi_12`,measure:`_measure_17pbi_13`,glyphs:`_glyphs_17pbi_13`,glyph:`_glyph_17pbi_13`,srOnly:`_srOnly_17pbi_19`},qx={type:`spring`,visualDuration:.5,bounce:.06},Jx={duration:.36,ease:[...Q.ease.enter]},Yx={duration:.2,ease:[...Q.ease.standard]},Xx={duration:Q.duration.instant},Zx=`blur(${Q.blur.soft}px)`,Qx={opacity:1,y:0,scale:1,filter:`blur(0px)`},$x={...Qx,opacity:0},eS={opacity:0,transition:Xx},tS={opacity:0,scale:.6,filter:Zx},nS={opacity:0,scale:.6,filter:Zx,transition:{duration:.24,ease:[...Q.ease.standard]}},rS={scale:qx,opacity:{...Jx,delay:.03},filter:{...Jx,delay:.03}},iS={opacity:0,y:4,filter:Zx},aS={opacity:0,y:-3,filter:Zx,transition:Yx};function oS({reduced:e}){return(0,h.jsx)(`svg`,{width:16,height:16,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:1.75,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,h.jsx)(U.path,{d:`M4 12l5 5L20 6`,initial:!e&&{pathLength:0,opacity:0},animate:{pathLength:1,opacity:1},transition:{pathLength:{duration:.5,ease:[...Q.ease.standard],delay:.05},opacity:{duration:.01,delay:.05}}})})}var sS=(e,t)=>e.map((e,n)=>({id:`${t}:${n}`,char:e,order:n}));function cS(e){let[t,n]=(0,m.useState)(()=>({text:e,seq:0,glyphs:sS([...e],0)}));if(t.text===e)return t.glyphs;let r=[...t.text],i=[...e],a=0,o=0;for(;a<r.length&&a<i.length&&r[a]===i[a];)a++;for(;o<r.length-a&&o<i.length-a&&r[r.length-1-o]===i[i.length-1-o];)o++;a<2&&(a=0),o<2&&(o=0);let s=t.seq+1,c=[...t.glyphs.slice(0,a),...sS(i.slice(a,i.length-o),s),...t.glyphs.slice(t.glyphs.length-o)];return n({text:e,seq:s,glyphs:c}),c}function lS({text:e,reduced:t}){let n=cS(e);return(0,h.jsx)(U.span,{className:Kx.glyphs,layoutRoot:!0,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:n.map(n=>(0,h.jsx)(U.span,{className:Kx.glyph,layout:!t&&`position`,layoutDependency:e,initial:t?$x:iS,animate:Qx,exit:t?eS:aS,transition:t?Xx:{...Jx,delay:Math.min(n.order*.02,.12),layout:qx},children:n.char},n.id))})})}function uS({value:e,label:t=`Copy`,className:n,iconOnly:r=!1,variant:i=`outline`,disabled:a,onCopied:o}){let{state:s,copy:c}=Gx(),l=H()??!1,u=s===`copied`?`Copied`:s===`error`?`Failed`:t;async function d(){await c(e)&&o?.()}return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsxs)(`button`,{type:`button`,className:[Kx.button,r&&Kx.iconOnly,i===`plain`&&Kx.plain,n].filter(Boolean).join(` `),onClick:()=>void d(),"aria-label":t,"data-copy-state":s,disabled:a,children:[(0,h.jsx)(`span`,{className:Kx.icon,"aria-hidden":`true`,children:(0,h.jsx)(V,{initial:!1,children:(0,h.jsx)(U.span,{className:Kx.iconInner,"data-state":s,initial:l?$x:tS,animate:Qx,exit:l?eS:nS,transition:l?Xx:rS,children:s===`copied`?(0,h.jsx)(oS,{reduced:l}):s===`error`?(0,h.jsx)(z_,{size:16,strokeWidth:1.75}):(0,h.jsx)(U_,{size:16,strokeWidth:1.75})},s)})}),!r&&(0,h.jsxs)(`span`,{className:Kx.label,"aria-hidden":`true`,children:[(0,h.jsx)(`span`,{className:Kx.measure,children:t}),(0,h.jsx)(`span`,{className:Kx.measure,children:`Copied`}),(0,h.jsx)(`span`,{className:Kx.measure,children:`Failed`}),(0,h.jsx)(lS,{text:u,reduced:l})]})]}),(0,h.jsx)(`span`,{className:Kx.srOnly,role:`status`,"aria-live":`polite`,children:s===`idle`?``:s===`error`?`${t}: Could not copy`:`${t}: Copied`})]})}var $={block:`_block_zsn8w_1`,header:`_header_zsn8w_2`,file:`_file_zsn8w_4`,filename:`_filename_zsn8w_6`,swap:`_swap_zsn8w_8`,swapStack:`_swapStack_zsn8w_9`,swapText:`_swapText_zsn8w_11`,reserve:`_reserve_zsn8w_12`,sizer:`_sizer_zsn8w_13`,srOnly:`_srOnly_zsn8w_14`,language:`_language_zsn8w_15`,viewport:`_viewport_zsn8w_18`,pre:`_pre_zsn8w_19`,code:`_code_zsn8w_21`,expand:`_expand_zsn8w_22`,chevron:`_chevron_zsn8w_23`,comment:`_comment_zsn8w_25`,string:`_string_zsn8w_26`,number:`_number_zsn8w_27`,keyword:`_keyword_zsn8w_28`,type:`_type_zsn8w_29`,function:`_function_zsn8w_30`,property:`_property_zsn8w_31`,tag:`_tag_zsn8w_32`,punctuation:`_punctuation_zsn8w_33`},dS=/^(?:abstract|as|async|await|break|case|catch|class|const|continue|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|of|private|protected|public|readonly|return|set|static|switch|throw|try|type|typeof|var|void|while|with|yield|SELECT|FROM|WHERE|INSERT|UPDATE|DELETE)$/,fS=/^(?:true|false|null|undefined|NaN|Infinity)$/,pS=/^(?:Array|Boolean|Date|Error|Map|Number|Promise|Record|Set|String|ReactNode|HTMLElement|HTMLButtonElement|Event|unknown|never|void|any|boolean|number|string|object)$/,mS=/\/\*[\s\S]*?\*\/|\/\/[^\n]*|<!--[\s\S]*?-->|`(?:\\.|[^`\\])*`|"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\b\d+(?:\.\d+)?\b|\b[A-Za-z_$][\w$-]*\b|[{}[\]();,.<>:=+*/!?|&-]/g;function hS(e){return e.toLowerCase().replace(/^\./,``)}function gS(e,t,n,r){if(e.startsWith(`//`)||e.startsWith(`/*`)||e.startsWith(`<!--`))return`comment`;if(e.startsWith(`"`)||e.startsWith(`'`)||e.startsWith("`"))return r===`json`&&/^\s*:/.test(t.slice(n+e.length))?`property`:`string`;if(/^\d/.test(e))return`number`;if(dS.test(e)||fS.test(e))return`keyword`;if(pS.test(e))return`type`;if(/^[{}[\]();,.<>:=+*/!?|&-]$/.test(e))return`punctuation`;let i=t.slice(0,n),a=t.slice(n+e.length);if((r===`tsx`||r===`jsx`||r===`html`||r===`vue`)&&/<\/?$/.test(i))return`tag`;if(/^\s*\(/.test(a)&&r!==`json`)return`function`;if((r===`css`||r===`tsx`||r===`jsx`)&&/^\s*[:=]/.test(a))return`property`}var _S=1e5;function vS(e,t){if(e.length>_S)return[e];let n=[],r=0;for(let i of e.matchAll(mS)){let a=i[0],o=i.index??0;r<o&&n.push(e.slice(r,o));let s=gS(a,e,o,t);n.push(s?(0,h.jsx)(`span`,{className:$[s],children:a},`${o}-${a}`):(0,h.jsx)(m.Fragment,{children:a},`${o}-${a}`)),r=o+a.length}return r<e.length&&n.push(e.slice(r)),n}var yS={duration:Q.duration.standard,ease:[...Q.ease.enter]},bS={duration:Q.duration.instant,ease:[...Q.ease.standard]};function xS({value:e,reduced:t}){return(0,h.jsx)(V,{initial:!1,children:(0,h.jsx)(U.span,{className:$.swapText,initial:!t&&{opacity:0,y:`0.3em`,filter:`blur(${Q.blur.soft}px)`},animate:{opacity:1,y:0,filter:`blur(0px)`},exit:t?{opacity:0,transition:{duration:0}}:{opacity:0,y:`-0.3em`,filter:`blur(${Q.blur.subtle}px)`,transition:bS},transition:t?{duration:0}:yS,children:e},e)})}function SS({name:e,reduced:t}){let n=(0,m.useRef)(null),r=(0,m.useRef)(0),i=Ff(`auto`);return(0,m.useEffect)(()=>{let e=n.current;if(!e)return;let t=new ResizeObserver(()=>{r.current=e.offsetWidth});return t.observe(e),()=>t.disconnect()},[]),(0,m.useLayoutEffect)(()=>{let e=i.get(),a=n.current?.offsetWidth??0,o=typeof e==`number`?e:r.current;if(r.current=a,t||!o||!a||Math.abs(o-a)<1){i.jump(`auto`);return}i.jump(o);let s=ip(i,a,{...Q.spring.morph,onComplete:()=>i.jump(`auto`)});return()=>s.stop()},[e,t,i]),(0,h.jsxs)(U.span,{className:`${$.swap} ${$.filename}`,style:{width:i},children:[(0,h.jsx)(`span`,{ref:n,className:$.sizer,"aria-hidden":`true`,children:e}),(0,h.jsx)(`span`,{className:$.swapStack,"aria-hidden":`true`,children:(0,h.jsx)(xS,{value:e,reduced:t})}),(0,h.jsx)(`span`,{className:$.srOnly,children:e})]})}function CS({code:e,filename:t,language:n=`tsx`,maxLines:r}){let i=hS(n),a=H()??!1,o=(0,m.useId)(),s=(0,m.useMemo)(()=>e.split(`
|
|
15
|
+
`).length,[e]),c=(0,m.useMemo)(()=>vS(e,i),[e,i]),l=r!=null&&r>0&&s>r,[u,d]=(0,m.useState)(!1),f=!l||u,p=(0,m.useRef)(null),g=(0,m.useRef)(null),_=Ff(f?`auto`:`var(--code-collapsed)`),v=(0,m.useRef)({open:f,reduced:a}),y=(0,m.useRef)(()=>{});(0,m.useLayoutEffect)(()=>{let e=p.current;if(!e)return;let t=e=>{let t=g.current;if(!t)return;let n=v.current.open?t.full:t.collapsed;e||v.current.reduced||typeof _.get()!=`number`?_.jump(n):ip(_,n,Q.spring.smooth)},n=new ResizeObserver(()=>{let n=getComputedStyle(e),i=e.offsetHeight,a=r?Math.min(i,Math.round(r*parseFloat(n.lineHeight)+parseFloat(n.paddingTop)+parseFloat(n.paddingBottom))):i,o=!g.current;g.current={full:i,collapsed:a},t(o)});return n.observe(e),y.current=t,()=>n.disconnect()},[_,r]),(0,m.useLayoutEffect)(()=>{v.current={open:f,reduced:a},y.current(!1)},[f,a]);let b=[`Show all ${s} lines`,`Show fewer lines`];return(0,h.jsxs)(`section`,{className:$.block,"aria-label":t?`${t} source code`:`${i} source code`,style:r?{"--code-lines":r}:void 0,children:[(0,h.jsxs)(`header`,{className:$.header,children:[(0,h.jsxs)(`div`,{className:$.file,children:[(0,h.jsx)(G_,{size:16,strokeWidth:1.75,"aria-hidden":`true`}),(0,h.jsx)(SS,{name:t??`Source code`,reduced:a}),(0,h.jsx)(`span`,{className:$.language,children:i})]}),(0,h.jsx)(uS,{value:e,label:`Copy code`})]}),(0,h.jsx)(U.div,{className:$.viewport,style:{height:_},children:(0,h.jsx)(`pre`,{ref:p,id:o,className:$.pre,tabIndex:0,"aria-label":`Selectable source code`,children:(0,h.jsx)(V,{initial:!1,mode:`popLayout`,children:(0,h.jsx)(U.code,{className:$.code,initial:!a&&{opacity:0,y:4},animate:{opacity:1,y:0},exit:a?{opacity:0,transition:{duration:0}}:{opacity:0,transition:bS},transition:a?{duration:0}:yS,children:c},e)})})}),l&&(0,h.jsxs)(`button`,{type:`button`,className:$.expand,"aria-expanded":u,"aria-controls":o,onClick:()=>d(e=>!e),children:[(0,h.jsxs)(`span`,{className:$.swap,"aria-hidden":`true`,children:[b.map(e=>(0,h.jsx)(`span`,{className:$.reserve,children:e},e)),(0,h.jsx)(`span`,{className:$.swapStack,children:(0,h.jsx)(xS,{value:b[+!!u],reduced:a})})]}),(0,h.jsx)(`span`,{className:$.srOnly,children:b[+!!u]}),(0,h.jsx)(U.span,{className:$.chevron,"aria-hidden":`true`,initial:!1,animate:{rotate:u?180:0},transition:a?{duration:0}:Q.spring.snappy,children:(0,h.jsx)(L_,{size:16,strokeWidth:1.75})})]})]})}var wS={root:`_root_1uufz_1`,icon:`_icon_1uufz_2`,"empty-state-icon":`_empty-state-icon_1uufz_1`,glyph:`_glyph_1uufz_3`,frame:`_frame_1uufz_4`,copy:`_copy_1uufz_5`,line:`_line_1uufz_9`,action:`_action_1uufz_10`},TS={duration:Q.duration.fast,ease:[...Q.ease.standard]},ES={opacity:0,y:`0.3em`,filter:`blur(${Q.blur.soft}px)`},DS={opacity:0,y:`-0.3em`,filter:`blur(${Q.blur.subtle}px)`,transition:TS},OS={opacity:0,scale:.6,filter:`blur(${Q.blur.subtle}px)`},kS={opacity:1,y:`0em`,scale:1,filter:`blur(0px)`},AS={opacity:0,transition:{duration:Q.duration.instant}};function jS(e){let t=Mu();return(0,h.jsx)(U.span,{...e,"aria-hidden":!t||e[`aria-hidden`]})}function MS(e){if(!(0,m.isValidElement)(e))return`icon`;let t=e.type;return typeof t==`string`?t:t.displayName??t.name??`icon`}function NS({reduce:e,morphKey:t,children:n}){let r=(0,m.useRef)(null),i=(0,m.useRef)(null),a=Ff(`auto`),o=(0,m.useRef)(0);return(0,m.useLayoutEffect)(()=>{o.current=performance.now()},[t]),(0,m.useEffect)(()=>{let t=i.current;if(!t||typeof ResizeObserver>`u`)return;let n,s,c=()=>{a.jump(`auto`),r.current&&Object.assign(r.current.style,{overflow:``,height:`auto`})},l=new ResizeObserver(([i])=>{let l=i.borderBoxSize?.[0]?.blockSize??t.offsetHeight,u=a.get(),d=typeof u==`number`?u:n;if(n=l,s?.stop(),e||d===void 0||d===l||performance.now()-o.current>120)return c();r.current&&Object.assign(r.current.style,{overflow:`hidden`,height:`${d}px`}),s=ip(a,[d,l],{...Q.spring.smooth,onComplete:c})});return l.observe(t),()=>{l.disconnect(),s?.stop()}},[a,e]),(0,h.jsx)(U.div,{ref:r,className:wS.frame,style:{height:a},children:(0,h.jsx)(`div`,{ref:i,className:wS.copy,children:n})})}function PS({title:e,description:t,action:n,icon:r,className:i,label:a}){let o=H(),s=r??(0,h.jsx)(q_,{width:24,height:24,strokeWidth:1.5}),c=o?{duration:Q.duration.instant}:{duration:Q.duration.standard,ease:[...Q.ease.enter]},l={initial:o?{opacity:0}:ES,animate:kS,exit:o?AS:DS,transition:c};return(0,h.jsxs)(`section`,{className:[wS.root,i].filter(Boolean).join(` `),"aria-label":a,children:[(0,h.jsx)(`div`,{className:wS.icon,"aria-hidden":`true`,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(jS,{className:wS.glyph,initial:o?{opacity:0}:OS,animate:kS,exit:o?AS:{...OS,transition:TS},transition:o?c:Q.spring.snappy,children:s},MS(s))})}),(0,h.jsxs)(NS,{reduce:o,morphKey:`${e}\n${t}`,children:[(0,h.jsx)(`h3`,{children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(jS,{className:wS.line,...l,children:e},e)})}),(0,h.jsx)(`p`,{children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(jS,{className:wS.line,...l,children:t},t)})})]}),n&&(0,h.jsx)(`div`,{className:wS.action,children:n})]})}var FS={field:`_field_6ayfd_1`,label:`_label_6ayfd_2`,input:`_input_6ayfd_4`,messageSlot:`_messageSlot_6ayfd_11`,description:`_description_6ayfd_12`,error:`_error_6ayfd_12`,words:`_words_6ayfd_15`,word:`_word_6ayfd_15`,column:`_column_6ayfd_18`,srOnly:`_srOnly_6ayfd_20`},IS={enter:e=>({opacity:0,y:`${e*.6}em`,filter:`blur(${Q.blur.subtle}px)`}),center:{opacity:1,y:0,filter:`blur(0px)`},exit:e=>({opacity:0,y:`${e*-.6}em`,filter:`blur(${Q.blur.subtle}px)`})},LS=e=>/^\d[\d.,/:]*%?$/.test(e);function RS({word:e}){let t=H(),[n,r]=(0,m.useState)({word:e,direction:1});n.word!==e&&r({word:e,direction:parseFloat(e.replace(/,/g,``))<parseFloat(n.word.replace(/,/g,``))?-1:1});let i=e.split(``),a=t?{duration:0}:{y:Q.spring.snappy,width:Q.spring.morph,opacity:{duration:Q.duration.fast},filter:{duration:Q.duration.fast}};return(0,h.jsx)(V,{initial:!1,children:i.map((e,t)=>(0,h.jsx)(U.span,{className:FS.column,initial:{width:0,opacity:0},animate:{width:`auto`,opacity:1},exit:{width:0,opacity:0},transition:a,children:(0,h.jsx)(V,{initial:!1,mode:`popLayout`,custom:n.direction,children:(0,h.jsx)(U.span,{custom:n.direction,variants:IS,initial:`enter`,animate:`center`,exit:`exit`,transition:a,children:e},e)})},i.length-t))})}function zS({text:e}){let t=H(),n=e.split(` `);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:FS.srOnly,children:e}),(0,h.jsx)(`span`,{className:FS.words,"aria-hidden":`true`,children:(0,h.jsx)(V,{initial:!1,mode:`popLayout`,children:n.map((e,r)=>(0,h.jsxs)(U.span,{className:FS.word,initial:t?{opacity:0}:{opacity:0,y:`0.35em`,filter:`blur(${Q.blur.soft}px)`},animate:{opacity:1,y:0,filter:`blur(0px)`},exit:t?{opacity:0,transition:{duration:0}}:{opacity:0,y:`-0.35em`,filter:`blur(${Q.blur.subtle}px)`,transition:{duration:Q.duration.exit,ease:[...Q.ease.standard]}},transition:t?{duration:Q.duration.instant}:{duration:Q.duration.standard,ease:[...Q.ease.enter]},children:[LS(e)?(0,h.jsx)(RS,{word:e}):e,r<n.length-1?` `:null]},`${r}:${LS(e)?`#`:e}`))})})]})}function BS({id:e,text:t,className:n,alert:r}){return(0,h.jsx)(V,{initial:!1,children:t?(0,h.jsx)(VS,{id:e,text:t,className:n,alert:r},`message`):null})}function VS({id:e,text:t,className:n,alert:r}){let i=H(),a=(0,m.useRef)(null),[o,s]=(0,m.useState)(`auto`);return(0,m.useEffect)(()=>{let e=a.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(([t])=>s(t.borderBoxSize?.[0]?.blockSize??e.offsetHeight));return t.observe(e),()=>t.disconnect()},[]),(0,h.jsx)(U.span,{className:FS.messageSlot,initial:!i&&{height:0,opacity:0},animate:{height:o,opacity:1},exit:{height:0,opacity:0,transition:i?{duration:0}:{height:Q.spring.smooth,opacity:{duration:Q.duration.instant}}},transition:i?{duration:0}:{height:Q.spring.smooth,opacity:{duration:Q.duration.fast}},children:(0,h.jsx)(U.span,{ref:a,id:e,className:n,role:r?`alert`:void 0,initial:!i&&{y:`0.35em`,filter:`blur(${Q.blur.soft}px)`},animate:{y:0,filter:`blur(0px)`},transition:{duration:i?0:Q.duration.standard,ease:[...Q.ease.enter]},children:(0,h.jsx)(zS,{text:t})})})}var HS=(0,m.forwardRef)(function({label:e,description:t,error:n,id:r,className:i,...a},o){let s=(0,m.useId)(),c=r??s,l=t?`${c}-description`:void 0,u=n?`${c}-error`:void 0,d=[a[`aria-describedby`],l,u].filter(Boolean).join(` `)||void 0;return(0,h.jsxs)(`div`,{className:FS.field,children:[(0,h.jsx)(`label`,{className:FS.label,htmlFor:c,children:e}),(0,h.jsx)(`input`,{...a,id:c,ref:o,className:[FS.input,i].filter(Boolean).join(` `),"aria-invalid":n?!0:a[`aria-invalid`],"aria-describedby":d}),(0,h.jsx)(BS,{id:l,text:t,className:FS.description}),(0,h.jsx)(BS,{id:u,text:n,className:FS.error,alert:!0})]})});HS.displayName=`Input`;var US={field:`_field_1t891_1`,shell:`_shell_1t891_4`,input:`_input_1t891_10`,clearSlot:`_clearSlot_1t891_14`},WS=(0,m.forwardRef)(function({label:e,value:t,onValueChange:n,clearLabel:r=`Clear search`,id:i,className:a,...o},s){let c=(0,m.useId)(),l=i??c,u=H(),d=(0,m.useRef)(null),f=e=>{d.current=e,typeof s==`function`?s(e):s&&(s.current=e)};function p(){n(``),d.current?.focus()}return(0,h.jsxs)(`div`,{className:US.field,children:[(0,h.jsx)(`label`,{htmlFor:l,children:e}),(0,h.jsxs)(`div`,{className:US.shell,"data-filled":t?`true`:void 0,children:[(0,h.jsx)(tv,{width:18,height:18,"aria-hidden":`true`}),(0,h.jsx)(`input`,{...o,ref:f,id:l,type:`search`,value:t,onChange:e=>n(e.target.value),className:[US.input,a].filter(Boolean).join(` `)}),(0,h.jsx)(`span`,{className:US.clearSlot,children:(0,h.jsx)(V,{initial:!1,children:t?(0,h.jsx)(U.button,{type:`button`,tabIndex:0,onClick:p,"aria-label":r,initial:u?{opacity:0}:{opacity:0,scale:.8,filter:`blur(${Q.blur.subtle}px)`},animate:{opacity:1,scale:1,filter:`blur(0px)`},exit:u?{opacity:0,transition:{duration:0}}:{opacity:0,scale:.8,filter:`blur(${Q.blur.subtle}px)`,transition:{duration:Q.duration.instant,ease:[...Q.ease.standard]}},whileTap:u?void 0:{scale:.96,transition:{duration:Q.duration.instant,ease:[...Q.ease.standard]}},transition:u?{duration:Q.duration.instant}:{...Q.spring.snappy,opacity:{duration:Q.duration.fast},filter:{duration:Q.duration.fast}},children:(0,h.jsx)(av,{width:16,height:16,"aria-hidden":`true`})},`clear`):null})})]})]})}),GS={root:`_root_1ftc5_1`,track:`_track_1ftc5_3`,button:`_button_1ftc5_8`,selection:`_selection_1ftc5_11`,label:`_label_1ftc5_12`};function KS({options:e,value:t,onValueChange:n,label:r,onOptionIntent:i,className:a}){let o=(0,m.useId)(),s=H(),c=(0,m.useRef)(null);(0,m.useLayoutEffect)(()=>{let e=c.current;if(!e)return;let t=()=>{let t=e.scrollWidth-e.clientWidth-e.scrollLeft;e.toggleAttribute(`data-fade-start`,e.scrollLeft>1),e.toggleAttribute(`data-fade-end`,t>1)};t(),e.addEventListener(`scroll`,t,{passive:!0});let n=typeof ResizeObserver>`u`?null:new ResizeObserver(t);return n?.observe(e),()=>{e.removeEventListener(`scroll`,t),n?.disconnect()}},[e.length]);let l=(0,m.useRef)(!0);(0,m.useEffect)(()=>{let e=c.current,t=e?.querySelector(`[aria-pressed="true"]`);if(!e||!t||e.scrollWidth<=e.clientWidth){l.current=!1;return}let n=t.offsetLeft-20,r=t.offsetLeft+t.offsetWidth+20-e.clientWidth,i=e.scrollLeft>n?n:e.scrollLeft<r?r:e.scrollLeft;i!==e.scrollLeft&&e.scrollTo({left:Math.max(0,i),behavior:l.current||s?`auto`:`smooth`}),l.current=!1},[t,s]);let u=Math.max(0,e.findIndex(e=>e.value===t)),d=t=>{let r=e.length-1,i=t.key===`ArrowRight`||t.key===`ArrowDown`?u===r?0:u+1:t.key===`ArrowLeft`||t.key===`ArrowUp`?u===0?r:u-1:t.key===`Home`?0:t.key===`End`?r:-1;i<0||!e[i]||(t.preventDefault(),n(e[i].value),c.current?.querySelector(`[data-value="${CSS.escape(e[i].value)}"]`)?.focus({preventScroll:!0}))};return(0,h.jsx)(`div`,{className:`${GS.root} ${a??``}`,role:`group`,"aria-label":r,children:(0,h.jsx)(Vu,{id:o,children:(0,h.jsx)(U.div,{ref:c,layoutScroll:!0,className:GS.track,children:e.map((e,r)=>(0,h.jsxs)(`button`,{id:`${o}-${e.value}`,className:GS.button,type:`button`,"data-value":e.value,"aria-pressed":t===e.value,tabIndex:r===u?0:-1,onClick:()=>n(e.value),onKeyDown:d,onPointerEnter:i?()=>i(e.value):void 0,onFocus:i?()=>i(e.value):void 0,children:[t===e.value&&(0,h.jsx)(U.span,{className:GS.selection,layoutId:`selection`,layoutDependency:t,transition:s?{duration:0}:Q.spring.morph,"aria-hidden":`true`}),(0,h.jsxs)(`span`,{className:GS.label,children:[e.label,e.accessory]})]},e.value))})})})}var qS={root:`_root_zuvxk_1`,avatar:`_avatar_zuvxk_3`,line:`_line_zuvxk_3`,"skeleton-pulse":`_skeleton-pulse_zuvxk_1`,lines:`_lines_zuvxk_5`,frame:`_frame_zuvxk_9`};function JS({className:e,busy:t,reduce:n,children:r}){let i=(0,m.useRef)(null),a=(0,m.useRef)(null),o=Ff(`auto`),s=(0,m.useRef)(0);return(0,m.useLayoutEffect)(()=>{s.current=performance.now()},[t]),(0,m.useEffect)(()=>{let e=a.current;if(!e||typeof ResizeObserver>`u`)return;let t,r,c=()=>{o.jump(`auto`),i.current&&Object.assign(i.current.style,{overflow:``,height:`auto`})},l=new ResizeObserver(([a])=>{let l=a.borderBoxSize?.[0]?.blockSize??e.offsetHeight,u=o.get(),d=typeof u==`number`?u:t;if(t=l,r?.stop(),n||d===void 0||d===l||performance.now()-s.current>120)return c();i.current&&Object.assign(i.current.style,{overflow:`hidden`,height:`${d}px`}),r=ip(o,[d,l],{...Q.spring.smooth,onComplete:c})});return l.observe(e),()=>{l.disconnect(),r?.stop()}},[o,n]),(0,h.jsx)(U.div,{ref:i,className:e,"aria-busy":t,style:{height:o},children:(0,h.jsx)(`div`,{ref:a,className:qS.frame,children:r})})}function YS({label:e=`Loading content`,lines:t=3,avatar:n=!1,className:r,children:i,loading:a=!0}){let o=H(),s=Math.min(Math.max(Math.floor(t),1),6),c=t=>(0,h.jsxs)(`div`,{className:[qS.root,t].filter(Boolean).join(` `),role:`status`,"aria-label":e,"aria-busy":`true`,children:[n&&(0,h.jsx)(`span`,{className:qS.avatar,"aria-hidden":`true`}),(0,h.jsx)(`span`,{className:qS.lines,"aria-hidden":`true`,children:Array.from({length:s},(e,t)=>(0,h.jsx)(`span`,{className:qS.line,style:{"--index":t+ +!!n}},t))})]});return i===void 0?c(r):(0,h.jsx)(JS,{className:r,busy:a,reduce:o,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:a?(0,h.jsx)(U.div,{initial:{opacity:0},animate:{opacity:1},transition:{duration:o?Q.duration.instant:Q.duration.fast,ease:[...Q.ease.standard]},exit:{opacity:0,transition:{duration:o?Q.duration.instant:Q.duration.fast}},children:c()},`placeholder`):(0,h.jsx)(U.div,{initial:o?{opacity:0}:{opacity:0,y:4},animate:{opacity:1,y:0},exit:{opacity:0,transition:{duration:o?Q.duration.instant:Q.duration.fast}},transition:{duration:o?Q.duration.instant:Q.duration.standard,ease:[...Q.ease.enter]},children:i},`content`)})})}var XS=Object.defineProperty,ZS=(e,t)=>XS(e,`name`,{value:t,configurable:!0});function QS(e){let[t,n]=m.useState(void 0);return Py(()=>{if(e){n({width:e.offsetWidth,height:e.offsetHeight});let t=0,r=new ResizeObserver(r=>{if(!Array.isArray(r)||!r.length)return;let i=r[0];window.cancelAnimationFrame(t),t=window.requestAnimationFrame(()=>{let t,r;if(`borderBoxSize`in i){let e=i.borderBoxSize,n=Array.isArray(e)?e[0]:e;t=n.inlineSize,r=n.blockSize}else t=e.offsetWidth,r=e.offsetHeight;n({width:t,height:r})})});return r.observe(e,{box:`border-box`}),()=>{window.cancelAnimationFrame(t),r.unobserve(e)}}n(void 0)},[e]),t}ZS(QS,`useSize`);var $S=Object.defineProperty,eC=(e,t)=>$S(e,`name`,{value:t,configurable:!0}),tC=`Switch`,[nC,rC]=Gv(tC),[iC,aC]=nC(tC);function oC(e){let{__scopeSwitch:t,checked:n,children:r,defaultChecked:i,disabled:a,form:o,name:s,onCheckedChange:c,required:l,value:u=`on`,internal_do_not_use_render:d}=e,[f,p]=Uy({prop:n,defaultProp:i??!1,onChange:c,caller:tC}),[g,_]=m.useState(null),[v,y]=m.useState(null),b=m.useRef(!1),[x,S]=m.useReducer(e=>e+1,0),C={checked:f,setChecked:p,disabled:a,control:g,setControl:_,name:s,form:o,value:u,hasConsumerStoppedPropagationRef:b,userInteractionCount:x,onUserInteraction:S,required:l,defaultChecked:i,isFormControl:!g||!!o||!!g.closest(`form`),bubbleInput:v,setBubbleInput:y};return(0,h.jsx)(iC,{scope:t,...C,children:fC(d)?d(C):r})}eC(oC,`SwitchProvider`);var sC=`SwitchTrigger`,cC=m.forwardRef(eC(function({__scopeSwitch:e,onClick:t,...n},r){let{control:i,form:a,value:o,disabled:s,checked:c,required:l,setControl:u,setChecked:d,hasConsumerStoppedPropagationRef:f,onUserInteraction:p,isFormControl:g,bubbleInput:_}=aC(sC,e),v=Zv(r,u),y=m.useRef(c);return m.useEffect(()=>{let e=a?i?.ownerDocument.getElementById(a):i?.form;if(e instanceof HTMLFormElement){let t=eC(()=>d(y.current),`reset`);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[i,a,d]),(0,h.jsx)(Zy.button,{type:`button`,role:`switch`,"aria-checked":c,"aria-required":l,"data-state":pC(c),"data-disabled":s?``:void 0,disabled:s,value:o,...n,ref:v,onClick:ky(t,e=>{p(),d(e=>!e),_&&g&&(f.current=e.isPropagationStopped(),f.current||e.stopPropagation())})})},`SwitchTrigger`)),lC=m.forwardRef(eC(function(e,t){let{__scopeSwitch:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,h.jsx)(oC,{__scopeSwitch:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(cC,{...d,ref:t,__scopeSwitch:n}),e&&(0,h.jsx)(dC,{__scopeSwitch:n})]})})},`Switch`)),uC=`SwitchBubbleInput`,dC=m.forwardRef(eC(function({__scopeSwitch:e,onClick:t,...n},r){let{control:i,hasConsumerStoppedPropagationRef:a,userInteractionCount:o,checked:s,defaultChecked:c,required:l,disabled:u,name:d,value:f,form:p,bubbleInput:g,setBubbleInput:_}=aC(uC,e),v=Zv(r,_),y=QS(i),b=m.useRef(!1),x=m.useRef(s),S=m.useRef(o);m.useEffect(()=>{let e=g;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=o!==S.current;S.current=o;let i=x.current!==s;x.current=s;let c=!(r&&a.current);if(i&&n){b.current=!r;let t=new Event(`click`,{bubbles:c});n.call(e,s),e.dispatchEvent(t),b.current=!1}},[g,s,a,o]);let C=m.useRef(s);return(0,h.jsx)(Zy.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:c??C.current,required:l,disabled:u,name:d,value:f,form:p,...n,tabIndex:-1,ref:v,onClick:ky(t,e=>{b.current&&e.stopPropagation()}),style:{...n.style,...y,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})},`SwitchBubbleInput`));function fC(e){return typeof e==`function`}eC(fC,`isFunction`);function pC(e){return e?`checked`:`unchecked`}eC(pC,`getState`);var mC={switch:`_switch_ktcw0_1`,track:`_track_ktcw0_4`,thumb:`_thumb_ktcw0_7`,label:`_label_ktcw0_11`},hC=18,gC=18,_C=5,vC={type:`spring`,visualDuration:.3,bounce:0},yC=(0,m.forwardRef)(function({label:e,className:t,checked:n,defaultChecked:r,onCheckedChange:i,onPointerDown:a,onPointerUp:o,onPointerLeave:s,onPointerCancel:c,onKeyDown:l,onKeyUp:u,onBlur:d,...f},p){let g=H(),[_,v]=(0,m.useState)(r??!1),[y,b]=(0,m.useState)(!1),x=n??_,S=Ff(1),C=(0,m.useRef)(x),w=(0,m.useRef)(-1/0);(0,m.useEffect)(()=>{if(C.current===x)return;C.current=x;let e=performance.now()-w.current<250;if(g||e)return;let t=ip(S,[1,1.16,1],{duration:.34,times:[0,.4,1],ease:[`easeOut`,`easeInOut`]});return()=>t.stop()},[x,g,S]);let T=y&&!g&&!f.disabled?_C:0,ee=[mC.switch,t].filter(Boolean).join(` `);return(0,h.jsxs)(lC,{...f,ref:p,checked:x,onCheckedChange:e=>{n===void 0&&v(e),i?.(e)},onPointerDown:e=>{a?.(e),e.button===0&&b(!0)},onPointerUp:e=>{o?.(e),y&&!f.disabled&&(w.current=performance.now()),b(!1)},onPointerLeave:e=>{s?.(e),b(!1)},onPointerCancel:e=>{c?.(e),b(!1)},onKeyDown:e=>{l?.(e),e.key===` `&&b(!0)},onKeyUp:e=>{u?.(e),y&&!f.disabled&&(w.current=performance.now()),b(!1)},onBlur:e=>{d?.(e),b(!1)},className:ee,"aria-label":f[`aria-label`]??e,children:[(0,h.jsx)(`span`,{className:mC.track,children:(0,h.jsx)(U.span,{className:mC.thumb,style:{scaleX:S},initial:!1,animate:{x:x?gC-T:0,width:hC+T},transition:g?{duration:0}:{x:vC,width:Q.spring.snappy}})}),e?(0,h.jsx)(`span`,{className:mC.label,children:e}):null]})});yC.displayName=`Switch`;var bC={field:`_field_mxljp_1`,control:`_control_mxljp_4`,messageSlot:`_messageSlot_mxljp_11`,hint:`_hint_mxljp_12`,error:`_error_mxljp_12`,words:`_words_mxljp_15`,word:`_word_mxljp_15`,column:`_column_mxljp_18`,srOnly:`_srOnly_mxljp_20`},xC={enter:e=>({opacity:0,y:`${e*.6}em`,filter:`blur(${Q.blur.subtle}px)`}),center:{opacity:1,y:0,filter:`blur(0px)`},exit:e=>({opacity:0,y:`${e*-.6}em`,filter:`blur(${Q.blur.subtle}px)`})},SC=e=>/^\d[\d.,/:]*%?$/.test(e);function CC({word:e}){let t=H(),[n,r]=(0,m.useState)({word:e,direction:1});n.word!==e&&r({word:e,direction:parseFloat(e.replace(/,/g,``))<parseFloat(n.word.replace(/,/g,``))?-1:1});let i=e.split(``),a=t?{duration:0}:{y:Q.spring.snappy,width:Q.spring.morph,opacity:{duration:Q.duration.fast},filter:{duration:Q.duration.fast}};return(0,h.jsx)(V,{initial:!1,children:i.map((e,t)=>(0,h.jsx)(U.span,{className:bC.column,initial:{width:0,opacity:0},animate:{width:`auto`,opacity:1},exit:{width:0,opacity:0},transition:a,children:(0,h.jsx)(V,{initial:!1,mode:`popLayout`,custom:n.direction,children:(0,h.jsx)(U.span,{custom:n.direction,variants:xC,initial:`enter`,animate:`center`,exit:`exit`,transition:a,children:e},e)})},i.length-t))})}function wC({text:e}){let t=H(),n=e.split(` `);return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(`span`,{className:bC.srOnly,children:e}),(0,h.jsx)(`span`,{className:bC.words,"aria-hidden":`true`,children:(0,h.jsx)(V,{initial:!1,mode:`popLayout`,children:n.map((e,r)=>(0,h.jsxs)(U.span,{className:bC.word,initial:t?{opacity:0}:{opacity:0,y:`0.35em`,filter:`blur(${Q.blur.soft}px)`},animate:{opacity:1,y:0,filter:`blur(0px)`},exit:t?{opacity:0,transition:{duration:0}}:{opacity:0,y:`-0.35em`,filter:`blur(${Q.blur.subtle}px)`,transition:{duration:Q.duration.fast,ease:[...Q.ease.standard]}},transition:t?{duration:Q.duration.instant}:{duration:Q.duration.standard,ease:[...Q.ease.enter]},children:[SC(e)?(0,h.jsx)(CC,{word:e}):e,r<n.length-1?` `:null]},`${r}:${SC(e)?`#`:e}`))})})]})}function TC({id:e,text:t,className:n,alert:r}){return(0,h.jsx)(V,{initial:!1,children:t?(0,h.jsx)(EC,{id:e,text:t,className:n,alert:r},`message`):null})}function EC({id:e,text:t,className:n,alert:r}){let i=H(),a=(0,m.useRef)(null),[o,s]=(0,m.useState)(`auto`);return(0,m.useEffect)(()=>{let e=a.current;if(!e||typeof ResizeObserver>`u`)return;let t=new ResizeObserver(([t])=>s(t.borderBoxSize?.[0]?.blockSize??e.offsetHeight));return t.observe(e),()=>t.disconnect()},[]),(0,h.jsx)(U.span,{className:bC.messageSlot,initial:!i&&{height:0,opacity:0},animate:{height:o,opacity:1},exit:{height:0,opacity:0,transition:i?{duration:0}:{height:Q.spring.smooth,opacity:{duration:Q.duration.instant}}},transition:i?{duration:0}:{height:Q.spring.smooth,opacity:{duration:Q.duration.fast}},children:(0,h.jsx)(U.span,{ref:a,id:e,className:n,role:r?`alert`:void 0,initial:!i&&{y:`0.35em`,filter:`blur(${Q.blur.soft}px)`},animate:{y:0,filter:`blur(0px)`},transition:{duration:i?0:Q.duration.standard,ease:[...Q.ease.enter]},children:(0,h.jsx)(wC,{text:t})})})}var DC=(0,m.forwardRef)(function({label:e,description:t,error:n,id:r,className:i,...a},o){let s=(0,m.useId)(),c=r??s,l=t?`${c}-description`:void 0,u=n?`${c}-error`:void 0;return(0,h.jsxs)(`div`,{className:bC.field,children:[(0,h.jsx)(`label`,{htmlFor:c,children:e}),(0,h.jsx)(`textarea`,{...a,id:c,ref:o,className:[bC.control,i].filter(Boolean).join(` `),"aria-invalid":n?!0:a[`aria-invalid`],"aria-describedby":[a[`aria-describedby`],l,u].filter(Boolean).join(` `)||void 0}),(0,h.jsx)(TC,{id:l,text:t,className:bC.hint}),(0,h.jsx)(TC,{id:u,text:n,className:bC.error,alert:!0})]})}),OC=(0,m.createContext)(null);function kC(e,t){let n=(0,m.useContext)(OC);return{field:n,label:e??n?.label??t??``,hidden:e===void 0&&n===null}}function AC({label:e,hint:t,error:n,children:r,className:i}){let a=typeof t==`string`?t:void 0;return(0,h.jsxs)(`div`,{className:yv(`flex min-w-0 flex-col`,i),children:[(0,h.jsx)(OC.Provider,{value:{label:e,description:a,error:n},children:r}),t!==void 0&&a===void 0&&!n&&(0,h.jsx)(`div`,{className:`mt-2 text-[11px] text-[var(--text-muted)]`,children:t})]})}var jC={primary:`primary`,glass:`secondary`,plain:`ghost`,destructive:`danger`},MC=(0,m.forwardRef)(function({variant:e=`glass`,size:t=`md`,icon:n,children:r,style:i,type:a=`button`,...o},s){let c=r==null||r===!1,l={...e===`primary`&&{background:`var(--accent)`,borderColor:`var(--accent)`,color:`var(--on-accent)`},...c&&{paddingInline:0,width:t===`sm`?`var(--control-height-sm)`:`var(--control-height-md)`},...i};return(0,h.jsxs)(Wx,{ref:s,type:a,variant:jC[e],size:t,style:l,...o,children:[n,r]})});function NC({items:e,value:t,onChange:n,className:r,ariaLabel:i}){return(0,h.jsx)(KS,{className:r,label:i,value:t,onValueChange:e=>n(e),options:e.map(e=>({value:e.value,label:e.label,accessory:e.accessory}))})}function PC({checked:e,onChange:t,disabled:n,label:r}){return(0,h.jsx)(yC,{checked:e,onCheckedChange:t,disabled:n,"aria-label":r,onClick:e=>e.stopPropagation()})}function FC({title:e,footer:t,children:n,className:r}){return(0,h.jsxs)(`section`,{className:yv(`mb-5`,r),children:[e&&(0,h.jsx)(`h3`,{className:`mb-2 px-1 text-[12px] font-medium text-[var(--text-secondary)]`,children:e}),(0,h.jsx)(`div`,{className:`card divide-y divide-[var(--border)]`,children:n}),t&&(0,h.jsx)(`p`,{className:`mt-2 px-1 text-[11px] text-[var(--text-muted)]`,children:t})]})}function IC({label:e,detail:t,icon:n,children:r,onClick:i,selected:a,className:o}){return(0,h.jsxs)(`div`,{...i?{role:`button`,tabIndex:0,onClick:i,onKeyDown:e=>{e.target===e.currentTarget&&(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),i())}}:{},className:yv(`flex min-h-11 w-full items-center gap-3 px-4 py-2 text-left`,i&&`cursor-default transition-colors hover:bg-[var(--surface-muted)]`,a&&`bg-[var(--accent-subtle)]`,o),children:[n,(0,h.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,h.jsx)(`div`,{className:`truncate text-[13px]`,children:e}),t&&(0,h.jsx)(`div`,{className:`truncate text-[11px] text-[var(--text-secondary)]`,children:t})]}),r!==void 0&&(0,h.jsx)(`div`,{className:`flex shrink-0 items-center gap-2`,children:r})]})}var LC={fontFamily:`var(--font-mono)`,fontSize:`12px`},RC=(0,m.forwardRef)(function({className:e,invalid:t,label:n,mono:r,style:i,...a},o){let s=kC(n,a[`aria-label`]??a.placeholder);return(0,h.jsx)(`div`,{className:yv(`min-w-0`,s.hidden&&`astra-label-hidden`,e),children:(0,h.jsx)(HS,{ref:o,label:s.label,description:s.field?.description,error:s.field?.error,"aria-invalid":t||void 0,style:r?{...LC,...i}:i,...a})})}),zC=(0,m.forwardRef)(function({className:e,invalid:t,label:n,mono:r,style:i,...a},o){let s=kC(n,a[`aria-label`]??a.placeholder);return(0,h.jsx)(`div`,{className:yv(`min-w-0`,s.hidden&&`astra-label-hidden`,e),children:(0,h.jsx)(DC,{ref:o,label:s.label,description:s.field?.description,error:s.field?.error,"aria-invalid":t||void 0,style:r?{...LC,...i}:i,...a})})});function BC({value:e,onChange:t,className:n,placeholder:r,step:i,min:a,label:o}){return(0,h.jsx)(RC,{type:`number`,inputMode:`decimal`,step:i??`any`,min:a,"aria-label":o,placeholder:r,className:n,style:{fontVariantNumeric:`tabular-nums`,textAlign:`right`},value:e??``,onChange:e=>{let n=e.target.value;if(n===``)return t(null);let r=Number(n);Number.isNaN(r)||t(r)}})}function VC({value:e,onChange:t,placeholder:n,inputRef:r,className:i,clearLabel:a}){return(0,h.jsx)(`div`,{className:yv(`astra-label-hidden min-w-0`,i),children:(0,h.jsx)(WS,{ref:r,label:n??`Search`,placeholder:n,value:e,onValueChange:t,clearLabel:a})})}var HC={neutral:`neutral`,accent:`info`,green:`success`,orange:`warning`,red:`danger`};function UC({tone:e=`neutral`,children:t,className:n,title:r}){return(0,h.jsx)(Ax,{tone:HC[e],size:`sm`,className:yv(`shrink-0`,n),title:r,children:t})}function WC({tone:e}){let t={green:`var(--success)`,orange:`var(--warning)`,red:`var(--danger)`,neutral:`var(--text-muted)`}[e];return(0,h.jsx)(`span`,{className:`inline-block size-2 shrink-0 rounded-full`,style:{background:t}})}function GC({children:e,size:t=20,className:n}){return(0,h.jsx)(`span`,{className:yv(`inline-flex shrink-0 items-center justify-center text-[var(--text-secondary)]`,n),style:{width:t,height:t},children:e})}function KC({label:e,children:t,mono:n}){return(0,h.jsxs)(`div`,{className:`flex items-baseline justify-between gap-3 py-1 text-[12px]`,children:[(0,h.jsx)(`span`,{className:`shrink-0 text-[var(--text-secondary)]`,children:e}),(0,h.jsx)(`span`,{className:yv(`min-w-0 truncate text-right selectable`,n&&`font-mono text-[11px]`),children:t})]})}function qC({children:e,maxHeight:t=320,language:n=`json`,filename:r}){return(0,h.jsx)(CS,{code:e,language:n,filename:r,maxLines:Math.max(4,Math.round(t/22))})}function JC({className:e,lines:t=2}){return(0,h.jsx)(YS,{className:e,lines:t})}function YC({icon:e,title:t,detail:n,action:r}){return(0,h.jsx)(`div`,{className:`px-6 py-12`,children:(0,h.jsx)(PS,{icon:e,title:t,description:n??``,action:r})})}function XC({children:e,action:t}){return(0,h.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2 px-1`,children:[(0,h.jsx)(`h2`,{className:`text-[13px] font-medium`,children:e}),t]})}function ZC({title:e,action:t,children:n,className:r}){return(0,h.jsxs)(`section`,{className:r,children:[(0,h.jsxs)(`div`,{className:`mb-2 flex items-center justify-between gap-2`,children:[(0,h.jsx)(`h3`,{className:`text-[12px] font-medium text-[var(--text-secondary)]`,children:e}),t]}),n]})}function QC({title:e,children:t}){return(0,h.jsx)(bx,{items:[{title:e,content:t}],defaultOpen:-1})}var $C={presence:`_presence_1m2d3_1`,alert:`_alert_1m2d3_2`,icon:`_icon_1m2d3_3`,glyph:`_glyph_1m2d3_3`,copy:`_copy_1m2d3_6`,content:`_content_1m2d3_7`,title:`_title_1m2d3_8`,line:`_line_1m2d3_9`,description:`_description_1m2d3_10`,info:`_info_1m2d3_11`,success:`_success_1m2d3_11`,warning:`_warning_1m2d3_11`,danger:`_danger_1m2d3_11`,dismiss:`_dismiss_1m2d3_12`},ew={info:Z_,success:F_,warning:rv,danger:V_},tw={duration:Q.duration.fast,ease:[...Q.ease.standard]},nw={opacity:0,y:`0.3em`,filter:`blur(${Q.blur.soft}px)`},rw={opacity:0,y:`-0.3em`,filter:`blur(${Q.blur.subtle}px)`,transition:tw},iw={opacity:0,scale:.6,filter:`blur(${Q.blur.subtle}px)`},aw={opacity:1,y:`0em`,scale:1,filter:`blur(0px)`},ow={opacity:0,transition:{duration:Q.duration.instant}};function sw(e){let t=Mu();return(0,h.jsx)(U.span,{...e,"aria-hidden":!t||e[`aria-hidden`]})}function cw({className:e,reduce:t,morphKey:n,children:r}){let i=(0,m.useRef)(null),a=(0,m.useRef)(null),o=Ff(`auto`),s=(0,m.useRef)(0);return(0,m.useLayoutEffect)(()=>{s.current=performance.now()},[n]),(0,m.useEffect)(()=>{let e=a.current;if(!e||typeof ResizeObserver>`u`)return;let n,r,c=()=>{o.jump(`auto`),i.current&&Object.assign(i.current.style,{overflow:``,height:`auto`})},l=new ResizeObserver(([a])=>{let l=a.borderBoxSize?.[0]?.blockSize??e.offsetHeight,u=o.get(),d=typeof u==`number`?u:n;if(n=l,r?.stop(),t||d===void 0||d===l||performance.now()-s.current>120)return c();i.current&&Object.assign(i.current.style,{overflow:`hidden`,height:`${d}px`}),r=ip(o,[d,l],{...Q.spring.smooth,onComplete:c})});return l.observe(e),()=>{l.disconnect(),r?.stop()}},[o,t]),(0,h.jsx)(U.div,{ref:i,className:e,style:{height:o},children:(0,h.jsx)(`div`,{ref:a,className:$C.content,children:r})})}function lw({tone:e=`info`,title:t,children:n,className:r,reduce:i,onDismiss:a,animateIcon:o=!1,...s}){let c=ew[e],l=typeof n==`string`||typeof n==`number`?String(n):null,u=n!=null&&n!==!1&&n!==``,d=i?{duration:Q.duration.instant}:{duration:Q.duration.standard,ease:[...Q.ease.enter]},f={initial:i?{opacity:0}:nw,animate:aw,exit:i?ow:rw,transition:d};return(0,h.jsxs)(`div`,{...s,className:[$C.alert,$C[e],r].filter(Boolean).join(` `),role:e===`danger`?`alert`:`status`,children:[(0,h.jsx)(U.span,{className:$C.icon,initial:o&&!i?iw:!1,animate:aw,transition:Q.spring.snappy,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(sw,{className:$C.glyph,initial:i?{opacity:0}:iw,animate:aw,exit:i?ow:{...iw,transition:tw},transition:i?d:Q.spring.snappy,children:(0,h.jsx)(c,{width:18,height:18,"aria-hidden":`true`})},e)})}),(0,h.jsxs)(cw,{className:$C.copy,reduce:i,morphKey:`${t}\n${u}\n${l??``}`,children:[(0,h.jsx)(`strong`,{className:$C.title,children:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(sw,{className:$C.line,...f,children:t},t)})}),(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:u&&(0,h.jsx)(U.p,{className:$C.description,...f,children:l===null?n:(0,h.jsx)(V,{mode:`popLayout`,initial:!1,children:(0,h.jsx)(sw,{className:$C.line,...f,children:l},l)})},`details`)})]}),a&&(0,h.jsx)(`button`,{type:`button`,className:$C.dismiss,"aria-label":`Dismiss: ${t}`,onClick:a,children:(0,h.jsx)(av,{width:16,height:16,strokeWidth:1.75,"aria-hidden":`true`})})]})}function uw({open:e,onDismiss:t,...n}){let r=H(),[i,a]=(0,m.useState)(!1),o=(0,m.useRef)(null),s=e=>{o.current&&(o.current.style.overflow=e)};if(e===void 0&&!t)return(0,h.jsx)(lw,{...n,reduce:r});let c=e??!i,l=t&&(()=>e===void 0?a(!0):t()),u=r?{duration:0}:{height:Q.spring.smooth,opacity:{duration:Q.duration.standard,ease:[...Q.ease.enter]}},d={height:0,opacity:0,transition:r?{duration:0}:{height:Q.spring.smooth,opacity:tw}};return(0,h.jsx)(V,{initial:!1,onExitComplete:()=>{e===void 0&&t?.()},children:c&&(0,h.jsx)(U.div,{className:$C.presence,initial:{height:0,opacity:0},animate:{height:`auto`,opacity:1},exit:d,transition:u,ref:o,onAnimationStart:()=>s(`hidden`),onAnimationComplete:()=>s(``),children:(0,h.jsx)(lw,{...n,reduce:r,onDismiss:l,animateIcon:!0})},`alert`)})}export{Cv as $,ne as $a,mm as $i,Wg as $n,Ch as $r,lh as $t,Zy as A,I as Aa,m_ as Ai,Dp as An,Eg as Ar,fh as At,Vv as B,tt as Ba,xm as Bi,sh as Bn,Uh as Br,kp as Bt,QS as C,ju as Ca,zh as Ci,mh as Cn,om as Cr,c_ as Ct,jb as D,Sa as Da,p_ as Di,Dh as Dn,Xm as Dr,Pg as Dt,Q as E,Ta as Ea,gg as Ei,Em as En,t_ as Er,q as Et,hy as F,rt as Fa,rg as Fi,pm as Fn,dg as Fr,n_ as Ft,Dv as G,Ie as Ga,Wp as Gi,cg as Gn,qh as Gr,Gp as Gt,Nv as H,Xe as Ha,Rm as Hi,Ap as Hn,kh as Hr,bh as Ht,ey as I,at as Ia,Xh as Ii,um as In,fg as Ir,r_ as It,jv as J,Ce as Ja,Vp as Ji,qp as Jn,hm as Jr,Km as Jt,wv as K,De as Ka,rh as Ki,eg as Kn,b_ as Kr,Fh as Kt,ny as L,it as La,Zp as Li,lm as Ln,lg as Lr,i_ as Lt,Uy as M,ct as Ma,Bp as Mi,ch as Mn,th as Mr,vg as Mt,Py as N,O as Na,o_ as Ni,dh as Nn,Oh as Nr,wg as Nt,fb as O,Mr as Oa,g_ as Oi,sg as On,jm as Or,Fg as Ot,ky as P,D as Pa,Ip as Pi,Kg as Pn,ug as Pr,Lm as Pt,Sv as Q,re as Qa,Op as Qi,Ug as Qn,Sh as Qr,_h as Qt,Zv as R,et as Ra,Tg as Ri,Ag as Rn,hh as Rr,Qh as Rt,kC as S,Mu as Sa,Up as Si,Th as Sn,Jm as Sr,d_ as St,bx as T,Co as Ta,Rh as Ti,Zm as Tn,vh as Tr,u_ as Tt,Iv as U,Ke as Ua,Np as Ui,jp as Un,ym as Ur,Nh as Ut,Av as V,$e as Va,eh as Vi,uh as Vn,Qg as Vr,Lp as Vt,Mv as W,Be as Wa,v_ as Wi,Gg as Wn,Jh as Wr,Ah as Wt,Ov as X,w as Xa,vm as Xi,Dg as Xn,Pp as Xr,Zh as Xt,Ev as Y,Se as Ya,Xg as Yi,Kp as Yn,Ih as Yr,jh as Yt,Tv as Z,ie as Za,em as Zi,Bg as Zn,Rp as Zr,yh as Zt,NC as _,ip as _a,Om as _i,Wh as _n,Wm as _r,V_ as _t,ZC as a,K as aa,og as ai,Vh as an,ce as ao,Rg as ar,zv as at,zC as b,Vu as ba,$g as bi,Eh as bn,Fm as br,F_ as bt,YC as c,vp as ca,mg as ci,yg as cn,_ as co,bg as cr,hv as ct,RC as d,gp as da,Pm as di,Qp as dn,o as do,wh as dr,av as dt,e_ as ea,Sm as ei,gh as en,te as eo,xg as er,Lv as et,KC as f,yp as fa,rm as fi,tm as fn,s as fo,fm as fr,rv as ft,XC as g,U as ga,ag as gi,Bm as gn,Gm as gr,U_ as gt,VC as h,op as ha,am as hi,zm as hn,Um as hr,Y_ as ht,qC as i,Tp as ia,Mh as ii,bm as in,E as io,Mg as ir,xv as it,Qy as j,lt as ja,f_ as ji,ph as jn,Og as jr,$m as jt,nb as k,fr as ka,h_ as ki,gm as kn,$h as kr,Am as kt,AC as l,lp as la,zg as li,s_ as ln,p as lo,oh as lr,gv as lt,IC as m,_p as ma,Mm as mi,ih as mn,Vm as mr,$_ as mt,UC as n,bp as na,im as ni,ng as nn,ae as no,jg as nr,Hv as nt,QC as o,cp as oa,Lg as oi,Kh as on,ge as oo,Vg as or,yv as ot,BC as p,mp as pa,nm as pi,Cm as pn,l as po,Jp as pr,tv as pt,kv as q,Ee as qa,Hh as qi,Yh as qn,Dm as qr,Lh as qt,MC as r,W as ra,__ as ri,Xp as rn,se as ro,Ng as rr,Bv as rt,WC as s,sp as sa,ah as si,Yg as sn,v as so,Hg as sr,mv as st,uw as t,qg as ta,Mp as ti,a_ as tn,C as to,Sg as tr,Rv as tt,FC as u,hp as ua,nh as ui,ig as un,d as uo,kg as ur,ov as ut,JC as v,H as va,y_ as vi,Zg as vn,sm as vr,z_ as vt,uS as w,Cu as wa,Gh as wi,dm as wn,wm as wr,l_ as wt,GC as x,V as xa,hg as xi,km as xn,_g as xr,J as xt,PC as y,Ff as ya,_m as yi,Hp as yn,qm as yr,L_ as yt,Gv as z,nt as za,Hm as zi,Fp as zn,$p as zr,Nm as zt};
|