@weppy/roblox-mcp 2.7.0 → 2.7.2

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.
Files changed (53) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +22 -14
  3. package/install.sh +3 -4
  4. package/package.json +1 -1
  5. package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
  6. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogDetailPage-CIarzJIx.js → ChangelogDetailPage-BWM0bhGw.js} +1 -1
  7. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-DOXmMWDc.js +1 -0
  8. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConfirmModal-BDWSInRi.js → ConfirmModal-Dak7jVJo.js} +1 -1
  9. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CNtjimlm.css +1 -0
  10. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-Cds2YIvI.js +1 -0
  11. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{GameChangeDetail-Be32PRgR.css → GameChangeDetail-C1XtdYwk.css} +1 -1
  12. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{GameChangeDetail-Bk8YUy4G.js → GameChangeDetail-MfVogSqQ.js} +5 -5
  13. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{InfoLabel-BJIFNYA5.js → InfoLabel-BDieYXVe.js} +1 -1
  14. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{OverviewPage-Di0p7YY2.js → OverviewPage-CTH7jUzQ.js} +1 -1
  15. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-BHQoeC4V.js +11 -0
  16. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-DjjsIkke.css +1 -0
  17. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-BL3qgVfn.js +1 -0
  18. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-Du8-FZAO.css +1 -0
  19. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{StatusBadge-ilvVufN2.js → StatusBadge-MxsMOCZ3.js} +1 -1
  20. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-Dm7Ni3j_.css +1 -0
  21. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-IZEcPmIw.js +4 -0
  22. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{Tabs-pDS5zzr9.js → Tabs-CuTJuL80.js} +1 -1
  23. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierComparison-DvuMctLJ.js +1 -0
  24. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-ByA_a1TP.js +1 -0
  25. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-Dq7uIer6.css +1 -0
  26. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TooltipText-bSKcc3-P.js → TooltipText-DgxJjq91.js} +1 -1
  27. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/UiStudioPage-DVFz_q9v.js +16 -0
  28. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/UiStudioPage-eSinjpOX.css +1 -0
  29. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{WhatsNewPage-ErpENbsZ.js → WhatsNewPage-CcELayE3.js} +1 -1
  30. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-CX4MHzNt.css +1 -0
  31. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{index-BPAvjNNu.js → index-CjBiayQg.js} +44 -44
  32. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{sample-requests-DDQ3XchF.js → sample-requests-BrVQkhcR.js} +1 -1
  33. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/sample-requests-CygerZZ_.css +1 -0
  34. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{useLiveUptime-HYmdQdHf.js → useLiveUptime-s_CjVcUM.js} +1 -1
  35. package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +2 -2
  36. package/plugins/weppy-roblox-mcp/dist/index.js +76 -76
  37. package/plugins/weppy-roblox-mcp/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
  38. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-C1uCKyqh.js +0 -1
  39. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CWDwVCKg.js +0 -1
  40. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-D_mEFudd.css +0 -1
  41. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-CYSu0pfO.css +0 -1
  42. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-Dxgz0SKW.js +0 -11
  43. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-Cc9Wnj8M.css +0 -1
  44. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-DVgxRsfC.js +0 -1
  45. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-BmMeN4N9.css +0 -1
  46. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-IICMnq8v.js +0 -4
  47. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierComparison-BXMCd1IB.js +0 -2
  48. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-B3fMk-22.css +0 -1
  49. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-DEhsoa36.js +0 -1
  50. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/UiStudioPage-BHhd3zUv.js +0 -16
  51. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/UiStudioPage-DQOd5VrU.css +0 -1
  52. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-Gu7et1DX.css +0 -1
  53. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/sample-requests-Bx1zpYdG.css +0 -1
@@ -1,5 +1,5 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-Di0p7YY2.js","assets/InfoLabel-BJIFNYA5.js","assets/StatusBadge-ilvVufN2.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-bSKcc3-P.js","assets/GameChangeDetail-Bk8YUy4G.js","assets/GameChangeDetail-Be32PRgR.css","assets/useLiveUptime-HYmdQdHf.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-CWDwVCKg.js","assets/ConfirmModal-BDWSInRi.js","assets/ConnectionPage-D_mEFudd.css","assets/SyncPage-IICMnq8v.js","assets/TierComparison-BXMCd1IB.js","assets/TierComparison-DGh9vLz0.css","assets/SyncPage-BmMeN4N9.css","assets/ChangelogPage-C1uCKyqh.js","assets/Tabs-pDS5zzr9.js","assets/Tabs-876h0_zB.css","assets/ChangelogPage-CNxAGfwG.css","assets/PlaytestPage-Dxgz0SKW.js","assets/PlaytestPage-CYSu0pfO.css","assets/UiStudioPage-BHhd3zUv.js","assets/sample-requests-DDQ3XchF.js","assets/sample-requests-Bx1zpYdG.css","assets/UiStudioPage-DQOd5VrU.css","assets/ToolsPage-DEhsoa36.js","assets/ToolsPage-B3fMk-22.css","assets/WhatsNewPage-ErpENbsZ.js","assets/WhatsNewPage-Lxgj0StO.css","assets/ChangelogDetailPage-CIarzJIx.js","assets/ChangelogDetailPage-D6Tqz7ut.css","assets/SettingsPage-DVgxRsfC.js","assets/SettingsPage-Cc9Wnj8M.css"])))=>i.map(i=>d[i]);
2
- var Ph=Object.defineProperty;var Ch=(a,r,s)=>r in a?Ph(a,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[r]=s;var xo=(a,r,s)=>Ch(a,typeof r!="symbol"?r+"":r,s);function sp(a,r){for(var s=0;s<r.length;s++){const u=r[s];if(typeof u!="string"&&!Array.isArray(u)){for(const d in u)if(d!=="default"&&!(d in a)){const p=Object.getOwnPropertyDescriptor(u,d);p&&Object.defineProperty(a,d,p.get?p:{enumerable:!0,get:()=>u[d]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))u(d);new MutationObserver(d=>{for(const p of d)if(p.type==="childList")for(const g of p.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&u(g)}).observe(document,{childList:!0,subtree:!0});function s(d){const p={};return d.integrity&&(p.integrity=d.integrity),d.referrerPolicy&&(p.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?p.credentials="include":d.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function u(d){if(d.ep)return;d.ep=!0;const p=s(d);fetch(d.href,p)}})();function lp(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var gl={exports:{}},Za={},hl={exports:{}},Pe={};/**
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-CTH7jUzQ.js","assets/InfoLabel-BDieYXVe.js","assets/StatusBadge-MxsMOCZ3.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-DgxJjq91.js","assets/GameChangeDetail-MfVogSqQ.js","assets/GameChangeDetail-C1XtdYwk.css","assets/useLiveUptime-s_CjVcUM.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-Cds2YIvI.js","assets/ConfirmModal-Dak7jVJo.js","assets/ConnectionPage-CNtjimlm.css","assets/SyncPage-IZEcPmIw.js","assets/TierComparison-DvuMctLJ.js","assets/TierComparison-DGh9vLz0.css","assets/SyncPage-Dm7Ni3j_.css","assets/ChangelogPage-DOXmMWDc.js","assets/Tabs-CuTJuL80.js","assets/Tabs-876h0_zB.css","assets/ChangelogPage-CNxAGfwG.css","assets/PlaytestPage-BHQoeC4V.js","assets/PlaytestPage-DjjsIkke.css","assets/UiStudioPage-DVFz_q9v.js","assets/sample-requests-BrVQkhcR.js","assets/sample-requests-CygerZZ_.css","assets/UiStudioPage-eSinjpOX.css","assets/ToolsPage-ByA_a1TP.js","assets/ToolsPage-Dq7uIer6.css","assets/WhatsNewPage-CcELayE3.js","assets/WhatsNewPage-Lxgj0StO.css","assets/ChangelogDetailPage-BWM0bhGw.js","assets/ChangelogDetailPage-D6Tqz7ut.css","assets/SettingsPage-BL3qgVfn.js","assets/SettingsPage-Du8-FZAO.css"])))=>i.map(i=>d[i]);
2
+ var Ph=Object.defineProperty;var Ch=(a,r,s)=>r in a?Ph(a,r,{enumerable:!0,configurable:!0,writable:!0,value:s}):a[r]=s;var To=(a,r,s)=>Ch(a,typeof r!="symbol"?r+"":r,s);function sp(a,r){for(var s=0;s<r.length;s++){const u=r[s];if(typeof u!="string"&&!Array.isArray(u)){for(const c in u)if(c!=="default"&&!(c in a)){const p=Object.getOwnPropertyDescriptor(u,c);p&&Object.defineProperty(a,c,p.get?p:{enumerable:!0,get:()=>u[c]})}}}return Object.freeze(Object.defineProperty(a,Symbol.toStringTag,{value:"Module"}))}(function(){const r=document.createElement("link").relList;if(r&&r.supports&&r.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))u(c);new MutationObserver(c=>{for(const p of c)if(p.type==="childList")for(const g of p.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&u(g)}).observe(document,{childList:!0,subtree:!0});function s(c){const p={};return c.integrity&&(p.integrity=c.integrity),c.referrerPolicy&&(p.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?p.credentials="include":c.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function u(c){if(c.ep)return;c.ep=!0;const p=s(c);fetch(c.href,p)}})();function lp(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var hl={exports:{}},Za={},ml={exports:{}},Pe={};/**
3
3
  * @license React
4
4
  * react.production.min.js
5
5
  *
@@ -7,7 +7,7 @@ var Ph=Object.defineProperty;var Ch=(a,r,s)=>r in a?Ph(a,r,{enumerable:!0,config
7
7
  *
8
8
  * This source code is licensed under the MIT license found in the
9
9
  * LICENSE file in the root directory of this source tree.
10
- */var Sd;function xh(){if(Sd)return Pe;Sd=1;var a=Symbol.for("react.element"),r=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),d=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),P=Symbol.for("react.lazy"),C=Symbol.iterator;function j(w){return w===null||typeof w!="object"?null:(w=C&&w[C]||w["@@iterator"],typeof w=="function"?w:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},F=Object.assign,N={};function H(w,D,ge){this.props=w,this.context=D,this.refs=N,this.updater=ge||_}H.prototype.isReactComponent={},H.prototype.setState=function(w,D){if(typeof w!="object"&&typeof w!="function"&&w!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,w,D,"setState")},H.prototype.forceUpdate=function(w){this.updater.enqueueForceUpdate(this,w,"forceUpdate")};function re(){}re.prototype=H.prototype;function W(w,D,ge){this.props=w,this.context=D,this.refs=N,this.updater=ge||_}var J=W.prototype=new re;J.constructor=W,F(J,H.prototype),J.isPureReactComponent=!0;var te=Array.isArray,Se=Object.prototype.hasOwnProperty,Ae={current:null},A={key:!0,ref:!0,__self:!0,__source:!0};function K(w,D,ge){var fe,me={},ve=null,xe=null;if(D!=null)for(fe in D.ref!==void 0&&(xe=D.ref),D.key!==void 0&&(ve=""+D.key),D)Se.call(D,fe)&&!A.hasOwnProperty(fe)&&(me[fe]=D[fe]);var Re=arguments.length-2;if(Re===1)me.children=ge;else if(1<Re){for(var Ue=Array(Re),ue=0;ue<Re;ue++)Ue[ue]=arguments[ue+2];me.children=Ue}if(w&&w.defaultProps)for(fe in Re=w.defaultProps,Re)me[fe]===void 0&&(me[fe]=Re[fe]);return{$$typeof:a,type:w,key:ve,ref:xe,props:me,_owner:Ae.current}}function be(w,D){return{$$typeof:a,type:w.type,key:D,ref:w.ref,props:w.props,_owner:w._owner}}function le(w){return typeof w=="object"&&w!==null&&w.$$typeof===a}function ke(w){var D={"=":"=0",":":"=2"};return"$"+w.replace(/[=:]/g,function(ge){return D[ge]})}var we=/\/+/g;function _e(w,D){return typeof w=="object"&&w!==null&&w.key!=null?ke(""+w.key):D.toString(36)}function Fe(w,D,ge,fe,me){var ve=typeof w;(ve==="undefined"||ve==="boolean")&&(w=null);var xe=!1;if(w===null)xe=!0;else switch(ve){case"string":case"number":xe=!0;break;case"object":switch(w.$$typeof){case a:case r:xe=!0}}if(xe)return xe=w,me=me(xe),w=fe===""?"."+_e(xe,0):fe,te(me)?(ge="",w!=null&&(ge=w.replace(we,"$&/")+"/"),Fe(me,D,ge,"",function(ue){return ue})):me!=null&&(le(me)&&(me=be(me,ge+(!me.key||xe&&xe.key===me.key?"":(""+me.key).replace(we,"$&/")+"/")+w)),D.push(me)),1;if(xe=0,fe=fe===""?".":fe+":",te(w))for(var Re=0;Re<w.length;Re++){ve=w[Re];var Ue=fe+_e(ve,Re);xe+=Fe(ve,D,ge,Ue,me)}else if(Ue=j(w),typeof Ue=="function")for(w=Ue.call(w),Re=0;!(ve=w.next()).done;)ve=ve.value,Ue=fe+_e(ve,Re++),xe+=Fe(ve,D,ge,Ue,me);else if(ve==="object")throw D=String(w),Error("Objects are not valid as a React child (found: "+(D==="[object Object]"?"object with keys {"+Object.keys(w).join(", ")+"}":D)+"). If you meant to render a collection of children, use an array instead.");return xe}function Qe(w,D,ge){if(w==null)return w;var fe=[],me=0;return Fe(w,fe,"","",function(ve){return D.call(ge,ve,me++)}),fe}function ot(w){if(w._status===-1){var D=w._result;D=D(),D.then(function(ge){(w._status===0||w._status===-1)&&(w._status=1,w._result=ge)},function(ge){(w._status===0||w._status===-1)&&(w._status=2,w._result=ge)}),w._status===-1&&(w._status=0,w._result=D)}if(w._status===1)return w._result.default;throw w._result}var Le={current:null},O={transition:null},se={ReactCurrentDispatcher:Le,ReactCurrentBatchConfig:O,ReactCurrentOwner:Ae};function Y(){throw Error("act(...) is not supported in production builds of React.")}return Pe.Children={map:Qe,forEach:function(w,D,ge){Qe(w,function(){D.apply(this,arguments)},ge)},count:function(w){var D=0;return Qe(w,function(){D++}),D},toArray:function(w){return Qe(w,function(D){return D})||[]},only:function(w){if(!le(w))throw Error("React.Children.only expected to receive a single React element child.");return w}},Pe.Component=H,Pe.Fragment=s,Pe.Profiler=d,Pe.PureComponent=W,Pe.StrictMode=u,Pe.Suspense=f,Pe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=se,Pe.act=Y,Pe.cloneElement=function(w,D,ge){if(w==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+w+".");var fe=F({},w.props),me=w.key,ve=w.ref,xe=w._owner;if(D!=null){if(D.ref!==void 0&&(ve=D.ref,xe=Ae.current),D.key!==void 0&&(me=""+D.key),w.type&&w.type.defaultProps)var Re=w.type.defaultProps;for(Ue in D)Se.call(D,Ue)&&!A.hasOwnProperty(Ue)&&(fe[Ue]=D[Ue]===void 0&&Re!==void 0?Re[Ue]:D[Ue])}var Ue=arguments.length-2;if(Ue===1)fe.children=ge;else if(1<Ue){Re=Array(Ue);for(var ue=0;ue<Ue;ue++)Re[ue]=arguments[ue+2];fe.children=Re}return{$$typeof:a,type:w.type,key:me,ref:ve,props:fe,_owner:xe}},Pe.createContext=function(w){return w={$$typeof:g,_currentValue:w,_currentValue2:w,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},w.Provider={$$typeof:p,_context:w},w.Consumer=w},Pe.createElement=K,Pe.createFactory=function(w){var D=K.bind(null,w);return D.type=w,D},Pe.createRef=function(){return{current:null}},Pe.forwardRef=function(w){return{$$typeof:m,render:w}},Pe.isValidElement=le,Pe.lazy=function(w){return{$$typeof:P,_payload:{_status:-1,_result:w},_init:ot}},Pe.memo=function(w,D){return{$$typeof:y,type:w,compare:D===void 0?null:D}},Pe.startTransition=function(w){var D=O.transition;O.transition={};try{w()}finally{O.transition=D}},Pe.unstable_act=Y,Pe.useCallback=function(w,D){return Le.current.useCallback(w,D)},Pe.useContext=function(w){return Le.current.useContext(w)},Pe.useDebugValue=function(){},Pe.useDeferredValue=function(w){return Le.current.useDeferredValue(w)},Pe.useEffect=function(w,D){return Le.current.useEffect(w,D)},Pe.useId=function(){return Le.current.useId()},Pe.useImperativeHandle=function(w,D,ge){return Le.current.useImperativeHandle(w,D,ge)},Pe.useInsertionEffect=function(w,D){return Le.current.useInsertionEffect(w,D)},Pe.useLayoutEffect=function(w,D){return Le.current.useLayoutEffect(w,D)},Pe.useMemo=function(w,D){return Le.current.useMemo(w,D)},Pe.useReducer=function(w,D,ge){return Le.current.useReducer(w,D,ge)},Pe.useRef=function(w){return Le.current.useRef(w)},Pe.useState=function(w){return Le.current.useState(w)},Pe.useSyncExternalStore=function(w,D,ge){return Le.current.useSyncExternalStore(w,D,ge)},Pe.useTransition=function(){return Le.current.useTransition()},Pe.version="18.3.1",Pe}var vd;function Ll(){return vd||(vd=1,hl.exports=xh()),hl.exports}/**
10
+ */var Sd;function xh(){if(Sd)return Pe;Sd=1;var a=Symbol.for("react.element"),r=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),u=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),f=Symbol.for("react.forward_ref"),m=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),k=Symbol.for("react.lazy"),w=Symbol.iterator;function j(P){return P===null||typeof P!="object"?null:(P=w&&P[w]||P["@@iterator"],typeof P=="function"?P:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},F=Object.assign,L={};function H(P,D,pe){this.props=P,this.context=D,this.refs=L,this.updater=pe||_}H.prototype.isReactComponent={},H.prototype.setState=function(P,D){if(typeof P!="object"&&typeof P!="function"&&P!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,P,D,"setState")},H.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,"forceUpdate")};function re(){}re.prototype=H.prototype;function W(P,D,pe){this.props=P,this.context=D,this.refs=L,this.updater=pe||_}var Z=W.prototype=new re;Z.constructor=W,F(Z,H.prototype),Z.isPureReactComponent=!0;var te=Array.isArray,ye=Object.prototype.hasOwnProperty,je={current:null},I={key:!0,ref:!0,__self:!0,__source:!0};function K(P,D,pe){var fe,he={},be=null,Re=null;if(D!=null)for(fe in D.ref!==void 0&&(Re=D.ref),D.key!==void 0&&(be=""+D.key),D)ye.call(D,fe)&&!I.hasOwnProperty(fe)&&(he[fe]=D[fe]);var Te=arguments.length-2;if(Te===1)he.children=pe;else if(1<Te){for(var Ne=Array(Te),ct=0;ct<Te;ct++)Ne[ct]=arguments[ct+2];he.children=Ne}if(P&&P.defaultProps)for(fe in Te=P.defaultProps,Te)he[fe]===void 0&&(he[fe]=Te[fe]);return{$$typeof:a,type:P,key:be,ref:Re,props:he,_owner:je.current}}function ve(P,D){return{$$typeof:a,type:P.type,key:D,ref:P.ref,props:P.props,_owner:P._owner}}function se(P){return typeof P=="object"&&P!==null&&P.$$typeof===a}function _e(P){var D={"=":"=0",":":"=2"};return"$"+P.replace(/[=:]/g,function(pe){return D[pe]})}var we=/\/+/g;function Ue(P,D){return typeof P=="object"&&P!==null&&P.key!=null?_e(""+P.key):D.toString(36)}function ke(P,D,pe,fe,he){var be=typeof P;(be==="undefined"||be==="boolean")&&(P=null);var Re=!1;if(P===null)Re=!0;else switch(be){case"string":case"number":Re=!0;break;case"object":switch(P.$$typeof){case a:case r:Re=!0}}if(Re)return Re=P,he=he(Re),P=fe===""?"."+Ue(Re,0):fe,te(he)?(pe="",P!=null&&(pe=P.replace(we,"$&/")+"/"),ke(he,D,pe,"",function(ct){return ct})):he!=null&&(se(he)&&(he=ve(he,pe+(!he.key||Re&&Re.key===he.key?"":(""+he.key).replace(we,"$&/")+"/")+P)),D.push(he)),1;if(Re=0,fe=fe===""?".":fe+":",te(P))for(var Te=0;Te<P.length;Te++){be=P[Te];var Ne=fe+Ue(be,Te);Re+=ke(be,D,pe,Ne,he)}else if(Ne=j(P),typeof Ne=="function")for(P=Ne.call(P),Te=0;!(be=P.next()).done;)be=be.value,Ne=fe+Ue(be,Te++),Re+=ke(be,D,pe,Ne,he);else if(be==="object")throw D=String(P),Error("Objects are not valid as a React child (found: "+(D==="[object Object]"?"object with keys {"+Object.keys(P).join(", ")+"}":D)+"). If you meant to render a collection of children, use an array instead.");return Re}function $e(P,D,pe){if(P==null)return P;var fe=[],he=0;return ke(P,fe,"","",function(be){return D.call(pe,be,he++)}),fe}function Xe(P){if(P._status===-1){var D=P._result;D=D(),D.then(function(pe){(P._status===0||P._status===-1)&&(P._status=1,P._result=pe)},function(pe){(P._status===0||P._status===-1)&&(P._status=2,P._result=pe)}),P._status===-1&&(P._status=0,P._result=D)}if(P._status===1)return P._result.default;throw P._result}var Le={current:null},O={transition:null},le={ReactCurrentDispatcher:Le,ReactCurrentBatchConfig:O,ReactCurrentOwner:je};function Y(){throw Error("act(...) is not supported in production builds of React.")}return Pe.Children={map:$e,forEach:function(P,D,pe){$e(P,function(){D.apply(this,arguments)},pe)},count:function(P){var D=0;return $e(P,function(){D++}),D},toArray:function(P){return $e(P,function(D){return D})||[]},only:function(P){if(!se(P))throw Error("React.Children.only expected to receive a single React element child.");return P}},Pe.Component=H,Pe.Fragment=s,Pe.Profiler=c,Pe.PureComponent=W,Pe.StrictMode=u,Pe.Suspense=m,Pe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=le,Pe.act=Y,Pe.cloneElement=function(P,D,pe){if(P==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+P+".");var fe=F({},P.props),he=P.key,be=P.ref,Re=P._owner;if(D!=null){if(D.ref!==void 0&&(be=D.ref,Re=je.current),D.key!==void 0&&(he=""+D.key),P.type&&P.type.defaultProps)var Te=P.type.defaultProps;for(Ne in D)ye.call(D,Ne)&&!I.hasOwnProperty(Ne)&&(fe[Ne]=D[Ne]===void 0&&Te!==void 0?Te[Ne]:D[Ne])}var Ne=arguments.length-2;if(Ne===1)fe.children=pe;else if(1<Ne){Te=Array(Ne);for(var ct=0;ct<Ne;ct++)Te[ct]=arguments[ct+2];fe.children=Te}return{$$typeof:a,type:P.type,key:he,ref:be,props:fe,_owner:Re}},Pe.createContext=function(P){return P={$$typeof:g,_currentValue:P,_currentValue2:P,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},P.Provider={$$typeof:p,_context:P},P.Consumer=P},Pe.createElement=K,Pe.createFactory=function(P){var D=K.bind(null,P);return D.type=P,D},Pe.createRef=function(){return{current:null}},Pe.forwardRef=function(P){return{$$typeof:f,render:P}},Pe.isValidElement=se,Pe.lazy=function(P){return{$$typeof:k,_payload:{_status:-1,_result:P},_init:Xe}},Pe.memo=function(P,D){return{$$typeof:v,type:P,compare:D===void 0?null:D}},Pe.startTransition=function(P){var D=O.transition;O.transition={};try{P()}finally{O.transition=D}},Pe.unstable_act=Y,Pe.useCallback=function(P,D){return Le.current.useCallback(P,D)},Pe.useContext=function(P){return Le.current.useContext(P)},Pe.useDebugValue=function(){},Pe.useDeferredValue=function(P){return Le.current.useDeferredValue(P)},Pe.useEffect=function(P,D){return Le.current.useEffect(P,D)},Pe.useId=function(){return Le.current.useId()},Pe.useImperativeHandle=function(P,D,pe){return Le.current.useImperativeHandle(P,D,pe)},Pe.useInsertionEffect=function(P,D){return Le.current.useInsertionEffect(P,D)},Pe.useLayoutEffect=function(P,D){return Le.current.useLayoutEffect(P,D)},Pe.useMemo=function(P,D){return Le.current.useMemo(P,D)},Pe.useReducer=function(P,D,pe){return Le.current.useReducer(P,D,pe)},Pe.useRef=function(P){return Le.current.useRef(P)},Pe.useState=function(P){return Le.current.useState(P)},Pe.useSyncExternalStore=function(P,D,pe){return Le.current.useSyncExternalStore(P,D,pe)},Pe.useTransition=function(){return Le.current.useTransition()},Pe.version="18.3.1",Pe}var vd;function Ll(){return vd||(vd=1,ml.exports=xh()),ml.exports}/**
11
11
  * @license React
12
12
  * react-jsx-runtime.production.min.js
13
13
  *
@@ -15,7 +15,7 @@ var Ph=Object.defineProperty;var Ch=(a,r,s)=>r in a?Ph(a,r,{enumerable:!0,config
15
15
  *
16
16
  * This source code is licensed under the MIT license found in the
17
17
  * LICENSE file in the root directory of this source tree.
18
- */var bd;function Rh(){if(bd)return Za;bd=1;var a=Ll(),r=Symbol.for("react.element"),s=Symbol.for("react.fragment"),u=Object.prototype.hasOwnProperty,d=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function g(m,f,y){var P,C={},j=null,_=null;y!==void 0&&(j=""+y),f.key!==void 0&&(j=""+f.key),f.ref!==void 0&&(_=f.ref);for(P in f)u.call(f,P)&&!p.hasOwnProperty(P)&&(C[P]=f[P]);if(m&&m.defaultProps)for(P in f=m.defaultProps,f)C[P]===void 0&&(C[P]=f[P]);return{$$typeof:r,type:m,key:j,ref:_,props:C,_owner:d.current}}return Za.Fragment=s,Za.jsx=g,Za.jsxs=g,Za}var wd;function Th(){return wd||(wd=1,gl.exports=Rh()),gl.exports}var z=Th(),Sr={},ml={exports:{}},It={},fl={exports:{}},yl={};/**
18
+ */var bd;function Rh(){if(bd)return Za;bd=1;var a=Ll(),r=Symbol.for("react.element"),s=Symbol.for("react.fragment"),u=Object.prototype.hasOwnProperty,c=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};function g(f,m,v){var k,w={},j=null,_=null;v!==void 0&&(j=""+v),m.key!==void 0&&(j=""+m.key),m.ref!==void 0&&(_=m.ref);for(k in m)u.call(m,k)&&!p.hasOwnProperty(k)&&(w[k]=m[k]);if(f&&f.defaultProps)for(k in m=f.defaultProps,m)w[k]===void 0&&(w[k]=m[k]);return{$$typeof:r,type:f,key:j,ref:_,props:w,_owner:c.current}}return Za.Fragment=s,Za.jsx=g,Za.jsxs=g,Za}var wd;function Th(){return wd||(wd=1,hl.exports=Rh()),hl.exports}var z=Th(),br={},fl={exports:{}},zt={},yl={exports:{}},Sl={};/**
19
19
  * @license React
20
20
  * scheduler.production.min.js
21
21
  *
@@ -23,7 +23,7 @@ var Ph=Object.defineProperty;var Ch=(a,r,s)=>r in a?Ph(a,r,{enumerable:!0,config
23
23
  *
24
24
  * This source code is licensed under the MIT license found in the
25
25
  * LICENSE file in the root directory of this source tree.
26
- */var kd;function Ah(){return kd||(kd=1,(function(a){function r(O,se){var Y=O.length;O.push(se);e:for(;0<Y;){var w=Y-1>>>1,D=O[w];if(0<d(D,se))O[w]=se,O[Y]=D,Y=w;else break e}}function s(O){return O.length===0?null:O[0]}function u(O){if(O.length===0)return null;var se=O[0],Y=O.pop();if(Y!==se){O[0]=Y;e:for(var w=0,D=O.length,ge=D>>>1;w<ge;){var fe=2*(w+1)-1,me=O[fe],ve=fe+1,xe=O[ve];if(0>d(me,Y))ve<D&&0>d(xe,me)?(O[w]=xe,O[ve]=Y,w=ve):(O[w]=me,O[fe]=Y,w=fe);else if(ve<D&&0>d(xe,Y))O[w]=xe,O[ve]=Y,w=ve;else break e}}return se}function d(O,se){var Y=O.sortIndex-se.sortIndex;return Y!==0?Y:O.id-se.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;a.unstable_now=function(){return p.now()}}else{var g=Date,m=g.now();a.unstable_now=function(){return g.now()-m}}var f=[],y=[],P=1,C=null,j=3,_=!1,F=!1,N=!1,H=typeof setTimeout=="function"?setTimeout:null,re=typeof clearTimeout=="function"?clearTimeout:null,W=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function J(O){for(var se=s(y);se!==null;){if(se.callback===null)u(y);else if(se.startTime<=O)u(y),se.sortIndex=se.expirationTime,r(f,se);else break;se=s(y)}}function te(O){if(N=!1,J(O),!F)if(s(f)!==null)F=!0,ot(Se);else{var se=s(y);se!==null&&Le(te,se.startTime-O)}}function Se(O,se){F=!1,N&&(N=!1,re(K),K=-1),_=!0;var Y=j;try{for(J(se),C=s(f);C!==null&&(!(C.expirationTime>se)||O&&!ke());){var w=C.callback;if(typeof w=="function"){C.callback=null,j=C.priorityLevel;var D=w(C.expirationTime<=se);se=a.unstable_now(),typeof D=="function"?C.callback=D:C===s(f)&&u(f),J(se)}else u(f);C=s(f)}if(C!==null)var ge=!0;else{var fe=s(y);fe!==null&&Le(te,fe.startTime-se),ge=!1}return ge}finally{C=null,j=Y,_=!1}}var Ae=!1,A=null,K=-1,be=5,le=-1;function ke(){return!(a.unstable_now()-le<be)}function we(){if(A!==null){var O=a.unstable_now();le=O;var se=!0;try{se=A(!0,O)}finally{se?_e():(Ae=!1,A=null)}}else Ae=!1}var _e;if(typeof W=="function")_e=function(){W(we)};else if(typeof MessageChannel<"u"){var Fe=new MessageChannel,Qe=Fe.port2;Fe.port1.onmessage=we,_e=function(){Qe.postMessage(null)}}else _e=function(){H(we,0)};function ot(O){A=O,Ae||(Ae=!0,_e())}function Le(O,se){K=H(function(){O(a.unstable_now())},se)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(O){O.callback=null},a.unstable_continueExecution=function(){F||_||(F=!0,ot(Se))},a.unstable_forceFrameRate=function(O){0>O||125<O?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):be=0<O?Math.floor(1e3/O):5},a.unstable_getCurrentPriorityLevel=function(){return j},a.unstable_getFirstCallbackNode=function(){return s(f)},a.unstable_next=function(O){switch(j){case 1:case 2:case 3:var se=3;break;default:se=j}var Y=j;j=se;try{return O()}finally{j=Y}},a.unstable_pauseExecution=function(){},a.unstable_requestPaint=function(){},a.unstable_runWithPriority=function(O,se){switch(O){case 1:case 2:case 3:case 4:case 5:break;default:O=3}var Y=j;j=O;try{return se()}finally{j=Y}},a.unstable_scheduleCallback=function(O,se,Y){var w=a.unstable_now();switch(typeof Y=="object"&&Y!==null?(Y=Y.delay,Y=typeof Y=="number"&&0<Y?w+Y:w):Y=w,O){case 1:var D=-1;break;case 2:D=250;break;case 5:D=1073741823;break;case 4:D=1e4;break;default:D=5e3}return D=Y+D,O={id:P++,callback:se,priorityLevel:O,startTime:Y,expirationTime:D,sortIndex:-1},Y>w?(O.sortIndex=Y,r(y,O),s(f)===null&&O===s(y)&&(N?(re(K),K=-1):N=!0,Le(te,Y-w))):(O.sortIndex=D,r(f,O),F||_||(F=!0,ot(Se))),O},a.unstable_shouldYield=ke,a.unstable_wrapCallback=function(O){var se=j;return function(){var Y=j;j=se;try{return O.apply(this,arguments)}finally{j=Y}}}})(yl)),yl}var Pd;function Ih(){return Pd||(Pd=1,fl.exports=Ah()),fl.exports}/**
26
+ */var kd;function Ah(){return kd||(kd=1,(function(a){function r(O,le){var Y=O.length;O.push(le);e:for(;0<Y;){var P=Y-1>>>1,D=O[P];if(0<c(D,le))O[P]=le,O[Y]=D,Y=P;else break e}}function s(O){return O.length===0?null:O[0]}function u(O){if(O.length===0)return null;var le=O[0],Y=O.pop();if(Y!==le){O[0]=Y;e:for(var P=0,D=O.length,pe=D>>>1;P<pe;){var fe=2*(P+1)-1,he=O[fe],be=fe+1,Re=O[be];if(0>c(he,Y))be<D&&0>c(Re,he)?(O[P]=Re,O[be]=Y,P=be):(O[P]=he,O[fe]=Y,P=fe);else if(be<D&&0>c(Re,Y))O[P]=Re,O[be]=Y,P=be;else break e}}return le}function c(O,le){var Y=O.sortIndex-le.sortIndex;return Y!==0?Y:O.id-le.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;a.unstable_now=function(){return p.now()}}else{var g=Date,f=g.now();a.unstable_now=function(){return g.now()-f}}var m=[],v=[],k=1,w=null,j=3,_=!1,F=!1,L=!1,H=typeof setTimeout=="function"?setTimeout:null,re=typeof clearTimeout=="function"?clearTimeout:null,W=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function Z(O){for(var le=s(v);le!==null;){if(le.callback===null)u(v);else if(le.startTime<=O)u(v),le.sortIndex=le.expirationTime,r(m,le);else break;le=s(v)}}function te(O){if(L=!1,Z(O),!F)if(s(m)!==null)F=!0,Xe(ye);else{var le=s(v);le!==null&&Le(te,le.startTime-O)}}function ye(O,le){F=!1,L&&(L=!1,re(K),K=-1),_=!0;var Y=j;try{for(Z(le),w=s(m);w!==null&&(!(w.expirationTime>le)||O&&!_e());){var P=w.callback;if(typeof P=="function"){w.callback=null,j=w.priorityLevel;var D=P(w.expirationTime<=le);le=a.unstable_now(),typeof D=="function"?w.callback=D:w===s(m)&&u(m),Z(le)}else u(m);w=s(m)}if(w!==null)var pe=!0;else{var fe=s(v);fe!==null&&Le(te,fe.startTime-le),pe=!1}return pe}finally{w=null,j=Y,_=!1}}var je=!1,I=null,K=-1,ve=5,se=-1;function _e(){return!(a.unstable_now()-se<ve)}function we(){if(I!==null){var O=a.unstable_now();se=O;var le=!0;try{le=I(!0,O)}finally{le?Ue():(je=!1,I=null)}}else je=!1}var Ue;if(typeof W=="function")Ue=function(){W(we)};else if(typeof MessageChannel<"u"){var ke=new MessageChannel,$e=ke.port2;ke.port1.onmessage=we,Ue=function(){$e.postMessage(null)}}else Ue=function(){H(we,0)};function Xe(O){I=O,je||(je=!0,Ue())}function Le(O,le){K=H(function(){O(a.unstable_now())},le)}a.unstable_IdlePriority=5,a.unstable_ImmediatePriority=1,a.unstable_LowPriority=4,a.unstable_NormalPriority=3,a.unstable_Profiling=null,a.unstable_UserBlockingPriority=2,a.unstable_cancelCallback=function(O){O.callback=null},a.unstable_continueExecution=function(){F||_||(F=!0,Xe(ye))},a.unstable_forceFrameRate=function(O){0>O||125<O?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):ve=0<O?Math.floor(1e3/O):5},a.unstable_getCurrentPriorityLevel=function(){return j},a.unstable_getFirstCallbackNode=function(){return s(m)},a.unstable_next=function(O){switch(j){case 1:case 2:case 3:var le=3;break;default:le=j}var Y=j;j=le;try{return O()}finally{j=Y}},a.unstable_pauseExecution=function(){},a.unstable_requestPaint=function(){},a.unstable_runWithPriority=function(O,le){switch(O){case 1:case 2:case 3:case 4:case 5:break;default:O=3}var Y=j;j=O;try{return le()}finally{j=Y}},a.unstable_scheduleCallback=function(O,le,Y){var P=a.unstable_now();switch(typeof Y=="object"&&Y!==null?(Y=Y.delay,Y=typeof Y=="number"&&0<Y?P+Y:P):Y=P,O){case 1:var D=-1;break;case 2:D=250;break;case 5:D=1073741823;break;case 4:D=1e4;break;default:D=5e3}return D=Y+D,O={id:k++,callback:le,priorityLevel:O,startTime:Y,expirationTime:D,sortIndex:-1},Y>P?(O.sortIndex=Y,r(v,O),s(m)===null&&O===s(v)&&(L?(re(K),K=-1):L=!0,Le(te,Y-P))):(O.sortIndex=D,r(m,O),F||_||(F=!0,Xe(ye))),O},a.unstable_shouldYield=_e,a.unstable_wrapCallback=function(O){var le=j;return function(){var Y=j;j=le;try{return O.apply(this,arguments)}finally{j=Y}}}})(Sl)),Sl}var Pd;function Ih(){return Pd||(Pd=1,yl.exports=Ah()),yl.exports}/**
27
27
  * @license React
28
28
  * react-dom.production.min.js
29
29
  *
@@ -31,14 +31,14 @@ var Ph=Object.defineProperty;var Ch=(a,r,s)=>r in a?Ph(a,r,{enumerable:!0,config
31
31
  *
32
32
  * This source code is licensed under the MIT license found in the
33
33
  * LICENSE file in the root directory of this source tree.
34
- */var Cd;function Eh(){if(Cd)return It;Cd=1;var a=Ll(),r=Ih();function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,o=1;o<arguments.length;o++)t+="&args[]="+encodeURIComponent(arguments[o]);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."}var u=new Set,d={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(d[e]=t,e=0;e<t.length;e++)u.add(t[e])}var m=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),f=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,P={},C={};function j(e){return f.call(C,e)?!0:f.call(P,e)?!1:y.test(e)?C[e]=!0:(P[e]=!0,!1)}function _(e,t,o,i){if(o!==null&&o.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return i?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function F(e,t,o,i){if(t===null||typeof t>"u"||_(e,t,o,i))return!0;if(i)return!1;if(o!==null)switch(o.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function N(e,t,o,i,n,l,c){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=i,this.attributeNamespace=n,this.mustUseProperty=o,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=c}var H={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){H[e]=new N(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];H[t]=new N(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){H[e]=new N(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){H[e]=new N(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){H[e]=new N(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){H[e]=new N(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){H[e]=new N(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){H[e]=new N(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){H[e]=new N(e,5,!1,e.toLowerCase(),null,!1,!1)});var re=/[\-:]([a-z])/g;function W(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(re,W);H[t]=new N(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(re,W);H[t]=new N(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(re,W);H[t]=new N(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){H[e]=new N(e,1,!1,e.toLowerCase(),null,!1,!1)}),H.xlinkHref=new N("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){H[e]=new N(e,1,!1,e.toLowerCase(),null,!0,!0)});function J(e,t,o,i){var n=H.hasOwnProperty(t)?H[t]:null;(n!==null?n.type!==0:i||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(F(t,o,n,i)&&(o=null),i||n===null?j(t)&&(o===null?e.removeAttribute(t):e.setAttribute(t,""+o)):n.mustUseProperty?e[n.propertyName]=o===null?n.type===3?!1:"":o:(t=n.attributeName,i=n.attributeNamespace,o===null?e.removeAttribute(t):(n=n.type,o=n===3||n===4&&o===!0?"":""+o,i?e.setAttributeNS(i,t,o):e.setAttribute(t,o))))}var te=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Se=Symbol.for("react.element"),Ae=Symbol.for("react.portal"),A=Symbol.for("react.fragment"),K=Symbol.for("react.strict_mode"),be=Symbol.for("react.profiler"),le=Symbol.for("react.provider"),ke=Symbol.for("react.context"),we=Symbol.for("react.forward_ref"),_e=Symbol.for("react.suspense"),Fe=Symbol.for("react.suspense_list"),Qe=Symbol.for("react.memo"),ot=Symbol.for("react.lazy"),Le=Symbol.for("react.offscreen"),O=Symbol.iterator;function se(e){return e===null||typeof e!="object"?null:(e=O&&e[O]||e["@@iterator"],typeof e=="function"?e:null)}var Y=Object.assign,w;function D(e){if(w===void 0)try{throw Error()}catch(o){var t=o.stack.trim().match(/\n( *(at )?)/);w=t&&t[1]||""}return`
35
- `+w+e}var ge=!1;function fe(e,t){if(!e||ge)return"";ge=!0;var o=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(I){var i=I}Reflect.construct(e,[],t)}else{try{t.call()}catch(I){i=I}e.call(t.prototype)}else{try{throw Error()}catch(I){i=I}e()}}catch(I){if(I&&i&&typeof I.stack=="string"){for(var n=I.stack.split(`
34
+ */var Cd;function Eh(){if(Cd)return zt;Cd=1;var a=Ll(),r=Ih();function s(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,o=1;o<arguments.length;o++)t+="&args[]="+encodeURIComponent(arguments[o]);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."}var u=new Set,c={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(c[e]=t,e=0;e<t.length;e++)u.add(t[e])}var f=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),m=Object.prototype.hasOwnProperty,v=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,k={},w={};function j(e){return m.call(w,e)?!0:m.call(k,e)?!1:v.test(e)?w[e]=!0:(k[e]=!0,!1)}function _(e,t,o,i){if(o!==null&&o.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return i?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function F(e,t,o,i){if(t===null||typeof t>"u"||_(e,t,o,i))return!0;if(i)return!1;if(o!==null)switch(o.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function L(e,t,o,i,n,l,d){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=i,this.attributeNamespace=n,this.mustUseProperty=o,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=d}var H={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){H[e]=new L(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];H[t]=new L(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){H[e]=new L(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){H[e]=new L(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){H[e]=new L(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){H[e]=new L(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){H[e]=new L(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){H[e]=new L(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){H[e]=new L(e,5,!1,e.toLowerCase(),null,!1,!1)});var re=/[\-:]([a-z])/g;function W(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(re,W);H[t]=new L(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(re,W);H[t]=new L(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(re,W);H[t]=new L(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){H[e]=new L(e,1,!1,e.toLowerCase(),null,!1,!1)}),H.xlinkHref=new L("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){H[e]=new L(e,1,!1,e.toLowerCase(),null,!0,!0)});function Z(e,t,o,i){var n=H.hasOwnProperty(t)?H[t]:null;(n!==null?n.type!==0:i||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(F(t,o,n,i)&&(o=null),i||n===null?j(t)&&(o===null?e.removeAttribute(t):e.setAttribute(t,""+o)):n.mustUseProperty?e[n.propertyName]=o===null?n.type===3?!1:"":o:(t=n.attributeName,i=n.attributeNamespace,o===null?e.removeAttribute(t):(n=n.type,o=n===3||n===4&&o===!0?"":""+o,i?e.setAttributeNS(i,t,o):e.setAttribute(t,o))))}var te=a.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,ye=Symbol.for("react.element"),je=Symbol.for("react.portal"),I=Symbol.for("react.fragment"),K=Symbol.for("react.strict_mode"),ve=Symbol.for("react.profiler"),se=Symbol.for("react.provider"),_e=Symbol.for("react.context"),we=Symbol.for("react.forward_ref"),Ue=Symbol.for("react.suspense"),ke=Symbol.for("react.suspense_list"),$e=Symbol.for("react.memo"),Xe=Symbol.for("react.lazy"),Le=Symbol.for("react.offscreen"),O=Symbol.iterator;function le(e){return e===null||typeof e!="object"?null:(e=O&&e[O]||e["@@iterator"],typeof e=="function"?e:null)}var Y=Object.assign,P;function D(e){if(P===void 0)try{throw Error()}catch(o){var t=o.stack.trim().match(/\n( *(at )?)/);P=t&&t[1]||""}return`
35
+ `+P+e}var pe=!1;function fe(e,t){if(!e||pe)return"";pe=!0;var o=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(t,[])}catch(A){var i=A}Reflect.construct(e,[],t)}else{try{t.call()}catch(A){i=A}e.call(t.prototype)}else{try{throw Error()}catch(A){i=A}e()}}catch(A){if(A&&i&&typeof A.stack=="string"){for(var n=A.stack.split(`
36
36
  `),l=i.stack.split(`
37
- `),c=n.length-1,h=l.length-1;1<=c&&0<=h&&n[c]!==l[h];)h--;for(;1<=c&&0<=h;c--,h--)if(n[c]!==l[h]){if(c!==1||h!==1)do if(c--,h--,0>h||n[c]!==l[h]){var v=`
38
- `+n[c].replace(" at new "," at ");return e.displayName&&v.includes("<anonymous>")&&(v=v.replace("<anonymous>",e.displayName)),v}while(1<=c&&0<=h);break}}}finally{ge=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?D(e):""}function me(e){switch(e.tag){case 5:return D(e.type);case 16:return D("Lazy");case 13:return D("Suspense");case 19:return D("SuspenseList");case 0:case 2:case 15:return e=fe(e.type,!1),e;case 11:return e=fe(e.type.render,!1),e;case 1:return e=fe(e.type,!0),e;default:return""}}function ve(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case A:return"Fragment";case Ae:return"Portal";case be:return"Profiler";case K:return"StrictMode";case _e:return"Suspense";case Fe:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ke:return(e.displayName||"Context")+".Consumer";case le:return(e._context.displayName||"Context")+".Provider";case we:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Qe:return t=e.displayName||null,t!==null?t:ve(e.type)||"Memo";case ot:t=e._payload,e=e._init;try{return ve(e(t))}catch{}}return null}function xe(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ve(t);case 8:return t===K?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Re(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Ue(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ue(e){var t=Ue(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),i=""+e[t];if(!e.hasOwnProperty(t)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var n=o.get,l=o.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return n.call(this)},set:function(c){i=""+c,l.call(this,c)}}),Object.defineProperty(e,t,{enumerable:o.enumerable}),{getValue:function(){return i},setValue:function(c){i=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function et(e){e._valueTracker||(e._valueTracker=ue(e))}function Ne(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var o=t.getValue(),i="";return e&&(i=Ue(e)?e.checked?"true":"false":e.value),e=i,e!==o?(t.setValue(e),!0):!1}function wt(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function jo(e,t){var o=t.checked;return Y({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function sn(e,t){var o=t.defaultValue==null?"":t.defaultValue,i=t.checked!=null?t.checked:t.defaultChecked;o=Re(t.value!=null?t.value:o),e._wrapperState={initialChecked:i,initialValue:o,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function to(e,t){t=t.checked,t!=null&&J(e,"checked",t,!1)}function ca(e,t){to(e,t);var o=Re(t.value),i=t.type;if(o!=null)i==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(i==="submit"||i==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?zi(e,t.type,o):t.hasOwnProperty("defaultValue")&&zi(e,t.type,Re(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ln(e,t,o){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var i=t.type;if(!(i!=="submit"&&i!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,o||t===e.value||(e.value=t),e.defaultValue=t}o=e.name,o!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,o!==""&&(e.name=o)}function zi(e,t,o){(t!=="number"||wt(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var li=Array.isArray;function zo(e,t,o,i){if(e=e.options,t){t={};for(var n=0;n<o.length;n++)t["$"+o[n]]=!0;for(o=0;o<e.length;o++)n=t.hasOwnProperty("$"+e[o].value),e[o].selected!==n&&(e[o].selected=n),n&&i&&(e[o].defaultSelected=!0)}else{for(o=""+Re(o),t=null,n=0;n<e.length;n++){if(e[n].value===o){e[n].selected=!0,i&&(e[n].defaultSelected=!0);return}t!==null||e[n].disabled||(t=e[n])}t!==null&&(t.selected=!0)}}function da(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(s(91));return Y({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function un(e,t){var o=t.value;if(o==null){if(o=t.children,t=t.defaultValue,o!=null){if(t!=null)throw Error(s(92));if(li(o)){if(1<o.length)throw Error(s(93));o=o[0]}t=o}t==null&&(t=""),o=t}e._wrapperState={initialValue:Re(o)}}function oo(e,t){var o=Re(t.value),i=Re(t.defaultValue);o!=null&&(o=""+o,o!==e.value&&(e.value=o),t.defaultValue==null&&e.defaultValue!==o&&(e.defaultValue=o)),i!=null&&(e.defaultValue=""+i)}function Do(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function pa(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function ui(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?pa(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var jt,Nt=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,o,i,n){MSApp.execUnsafeLocalFunction(function(){return e(t,o,i,n)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(jt=jt||document.createElement("div"),jt.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=jt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Mo(e,t){if(t){var o=e.firstChild;if(o&&o===e.lastChild&&o.nodeType===3){o.nodeValue=t;return}}e.textContent=t}var io={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},zr=["Webkit","ms","Moz","O"];Object.keys(io).forEach(function(e){zr.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),io[t]=io[e]})});function Wt(e,t,o){return t==null||typeof t=="boolean"||t===""?"":o||typeof t!="number"||t===0||io.hasOwnProperty(e)&&io[e]?(""+t).trim():t+"px"}function ga(e,t){e=e.style;for(var o in t)if(t.hasOwnProperty(o)){var i=o.indexOf("--")===0,n=Wt(o,t[o],i);o==="float"&&(o="cssFloat"),i?e.setProperty(o,n):e[o]=n}}var cn=Y({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Di(e,t){if(t){if(cn[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(s(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(s(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(t.style!=null&&typeof t.style!="object")throw Error(s(62))}}function ha(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Mi=null;function _o(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var _i=null,ao=null,no=null;function dn(e){if(e=La(e)){if(typeof _i!="function")throw Error(s(280));var t=e.stateNode;t&&(t=Dn(t),_i(e.stateNode,e.type,t))}}function ma(e){ao?no?no.push(e):no=[e]:ao=e}function pn(){if(ao){var e=ao,t=no;if(no=ao=null,dn(e),t)for(e=0;e<t.length;e++)dn(t[e])}}function fa(e,t){return e(t)}function ci(){}var Lo=!1;function gn(e,t,o){if(Lo)return e(t,o);Lo=!0;try{return fa(e,t,o)}finally{Lo=!1,(ao!==null||no!==null)&&(ci(),pn())}}function di(e,t){var o=e.stateNode;if(o===null)return null;var i=Dn(o);if(i===null)return null;o=i[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(i=!i.disabled)||(e=e.type,i=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!i;break e;default:e=!1}if(e)return null;if(o&&typeof o!="function")throw Error(s(231,t,typeof o));return o}var S=!1;if(m)try{var k={};Object.defineProperty(k,"passive",{get:function(){S=!0}}),window.addEventListener("test",k,k),window.removeEventListener("test",k,k)}catch{S=!1}function E(e,t,o,i,n,l,c,h,v){var I=Array.prototype.slice.call(arguments,3);try{t.apply(o,I)}catch(U){this.onError(U)}}var M=!1,V=null,ne=!1,pe=null,X={onError:function(e){M=!0,V=e}};function oe(e,t,o,i,n,l,c,h,v){M=!1,V=null,E.apply(X,arguments)}function $(e,t,o,i,n,l,c,h,v){if(oe.apply(this,arguments),M){if(M){var I=V;M=!1,V=null}else throw Error(s(198));ne||(ne=!0,pe=I)}}function Z(e){var t=e,o=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(o=t.return),e=t.return;while(e)}return t.tag===3?o:null}function ye(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function Te(e){if(Z(e)!==e)throw Error(s(188))}function st(e){var t=e.alternate;if(!t){if(t=Z(e),t===null)throw Error(s(188));return t!==e?null:e}for(var o=e,i=t;;){var n=o.return;if(n===null)break;var l=n.alternate;if(l===null){if(i=n.return,i!==null){o=i;continue}break}if(n.child===l.child){for(l=n.child;l;){if(l===o)return Te(n),e;if(l===i)return Te(n),t;l=l.sibling}throw Error(s(188))}if(o.return!==i.return)o=n,i=l;else{for(var c=!1,h=n.child;h;){if(h===o){c=!0,o=n,i=l;break}if(h===i){c=!0,i=n,o=l;break}h=h.sibling}if(!c){for(h=l.child;h;){if(h===o){c=!0,o=l,i=n;break}if(h===i){c=!0,i=l,o=n;break}h=h.sibling}if(!c)throw Error(s(189))}}if(o.alternate!==i)throw Error(s(190))}if(o.tag!==3)throw Error(s(188));return o.stateNode.current===o?e:t}function He(e){return e=st(e),e!==null?Ee(e):null}function Ee(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Ee(e);if(t!==null)return t;e=e.sibling}return null}var Ve=r.unstable_scheduleCallback,ho=r.unstable_cancelCallback,pi=r.unstable_shouldYield,Vt=r.unstable_requestPaint,ze=r.unstable_now,ya=r.unstable_getCurrentPriorityLevel,mo=r.unstable_ImmediatePriority,ro=r.unstable_UserBlockingPriority,fo=r.unstable_NormalPriority,Li=r.unstable_LowPriority,Ie=r.unstable_IdlePriority,qe=null,gt=null;function gi(e){if(gt&&typeof gt.onCommitFiberRoot=="function")try{gt.onCommitFiberRoot(qe,e,void 0,(e.current.flags&128)===128)}catch{}}var De=Math.clz32?Math.clz32:Dr,No=Math.log,hn=Math.LN2;function Dr(e){return e>>>=0,e===0?32:31-(No(e)/hn|0)|0}var mn=64,fn=4194304;function Sa(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function yn(e,t){var o=e.pendingLanes;if(o===0)return 0;var i=0,n=e.suspendedLanes,l=e.pingedLanes,c=o&268435455;if(c!==0){var h=c&~n;h!==0?i=Sa(h):(l&=c,l!==0&&(i=Sa(l)))}else c=o&~n,c!==0?i=Sa(c):l!==0&&(i=Sa(l));if(i===0)return 0;if(t!==0&&t!==i&&(t&n)===0&&(n=i&-i,l=t&-t,n>=l||n===16&&(l&4194240)!==0))return t;if((i&4)!==0&&(i|=o&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=i;0<t;)o=31-De(t),n=1<<o,i|=e[o],t&=~n;return i}function Fp(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function qp(e,t){for(var o=e.suspendedLanes,i=e.pingedLanes,n=e.expirationTimes,l=e.pendingLanes;0<l;){var c=31-De(l),h=1<<c,v=n[c];v===-1?((h&o)===0||(h&i)!==0)&&(n[c]=Fp(h,t)):v<=t&&(e.expiredLanes|=h),l&=~h}}function Mr(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function $l(){var e=mn;return mn<<=1,(mn&4194240)===0&&(mn=64),e}function _r(e){for(var t=[],o=0;31>o;o++)t.push(e);return t}function va(e,t,o){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-De(t),e[t]=o}function Wp(e,t){var o=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var i=e.eventTimes;for(e=e.expirationTimes;0<o;){var n=31-De(o),l=1<<n;t[n]=0,i[n]=-1,e[n]=-1,o&=~l}}function Lr(e,t){var o=e.entangledLanes|=t;for(e=e.entanglements;o;){var i=31-De(o),n=1<<i;n&t|e[i]&t&&(e[i]|=t),o&=~n}}var Be=0;function Ql(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var Zl,Nr,Jl,Xl,eu,Ur=!1,Sn=[],Uo=null,Ho=null,Bo=null,ba=new Map,wa=new Map,Oo=[],Vp="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function tu(e,t){switch(e){case"focusin":case"focusout":Uo=null;break;case"dragenter":case"dragleave":Ho=null;break;case"mouseover":case"mouseout":Bo=null;break;case"pointerover":case"pointerout":ba.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":wa.delete(t.pointerId)}}function ka(e,t,o,i,n,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:o,eventSystemFlags:i,nativeEvent:l,targetContainers:[n]},t!==null&&(t=La(t),t!==null&&Nr(t)),e):(e.eventSystemFlags|=i,t=e.targetContainers,n!==null&&t.indexOf(n)===-1&&t.push(n),e)}function Yp(e,t,o,i,n){switch(t){case"focusin":return Uo=ka(Uo,e,t,o,i,n),!0;case"dragenter":return Ho=ka(Ho,e,t,o,i,n),!0;case"mouseover":return Bo=ka(Bo,e,t,o,i,n),!0;case"pointerover":var l=n.pointerId;return ba.set(l,ka(ba.get(l)||null,e,t,o,i,n)),!0;case"gotpointercapture":return l=n.pointerId,wa.set(l,ka(wa.get(l)||null,e,t,o,i,n)),!0}return!1}function ou(e){var t=hi(e.target);if(t!==null){var o=Z(t);if(o!==null){if(t=o.tag,t===13){if(t=ye(o),t!==null){e.blockedOn=t,eu(e.priority,function(){Jl(o)});return}}else if(t===3&&o.stateNode.current.memoizedState.isDehydrated){e.blockedOn=o.tag===3?o.stateNode.containerInfo:null;return}}}e.blockedOn=null}function vn(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var o=Br(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(o===null){o=e.nativeEvent;var i=new o.constructor(o.type,o);Mi=i,o.target.dispatchEvent(i),Mi=null}else return t=La(o),t!==null&&Nr(t),e.blockedOn=o,!1;t.shift()}return!0}function iu(e,t,o){vn(e)&&o.delete(t)}function Kp(){Ur=!1,Uo!==null&&vn(Uo)&&(Uo=null),Ho!==null&&vn(Ho)&&(Ho=null),Bo!==null&&vn(Bo)&&(Bo=null),ba.forEach(iu),wa.forEach(iu)}function Pa(e,t){e.blockedOn===t&&(e.blockedOn=null,Ur||(Ur=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Kp)))}function Ca(e){function t(n){return Pa(n,e)}if(0<Sn.length){Pa(Sn[0],e);for(var o=1;o<Sn.length;o++){var i=Sn[o];i.blockedOn===e&&(i.blockedOn=null)}}for(Uo!==null&&Pa(Uo,e),Ho!==null&&Pa(Ho,e),Bo!==null&&Pa(Bo,e),ba.forEach(t),wa.forEach(t),o=0;o<Oo.length;o++)i=Oo[o],i.blockedOn===e&&(i.blockedOn=null);for(;0<Oo.length&&(o=Oo[0],o.blockedOn===null);)ou(o),o.blockedOn===null&&Oo.shift()}var Ni=te.ReactCurrentBatchConfig,bn=!0;function Gp(e,t,o,i){var n=Be,l=Ni.transition;Ni.transition=null;try{Be=1,Hr(e,t,o,i)}finally{Be=n,Ni.transition=l}}function $p(e,t,o,i){var n=Be,l=Ni.transition;Ni.transition=null;try{Be=4,Hr(e,t,o,i)}finally{Be=n,Ni.transition=l}}function Hr(e,t,o,i){if(bn){var n=Br(e,t,o,i);if(n===null)is(e,t,i,wn,o),tu(e,i);else if(Yp(n,e,t,o,i))i.stopPropagation();else if(tu(e,i),t&4&&-1<Vp.indexOf(e)){for(;n!==null;){var l=La(n);if(l!==null&&Zl(l),l=Br(e,t,o,i),l===null&&is(e,t,i,wn,o),l===n)break;n=l}n!==null&&i.stopPropagation()}else is(e,t,i,null,o)}}var wn=null;function Br(e,t,o,i){if(wn=null,e=_o(i),e=hi(e),e!==null)if(t=Z(e),t===null)e=null;else if(o=t.tag,o===13){if(e=ye(t),e!==null)return e;e=null}else if(o===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return wn=e,null}function au(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(ya()){case mo:return 1;case ro:return 4;case fo:case Li:return 16;case Ie:return 536870912;default:return 16}default:return 16}}var Fo=null,Or=null,kn=null;function nu(){if(kn)return kn;var e,t=Or,o=t.length,i,n="value"in Fo?Fo.value:Fo.textContent,l=n.length;for(e=0;e<o&&t[e]===n[e];e++);var c=o-e;for(i=1;i<=c&&t[o-i]===n[l-i];i++);return kn=n.slice(e,1<i?1-i:void 0)}function Pn(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Cn(){return!0}function ru(){return!1}function zt(e){function t(o,i,n,l,c){this._reactName=o,this._targetInst=n,this.type=i,this.nativeEvent=l,this.target=c,this.currentTarget=null;for(var h in e)e.hasOwnProperty(h)&&(o=e[h],this[h]=o?o(l):l[h]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Cn:ru,this.isPropagationStopped=ru,this}return Y(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var o=this.nativeEvent;o&&(o.preventDefault?o.preventDefault():typeof o.returnValue!="unknown"&&(o.returnValue=!1),this.isDefaultPrevented=Cn)},stopPropagation:function(){var o=this.nativeEvent;o&&(o.stopPropagation?o.stopPropagation():typeof o.cancelBubble!="unknown"&&(o.cancelBubble=!0),this.isPropagationStopped=Cn)},persist:function(){},isPersistent:Cn}),t}var Ui={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Fr=zt(Ui),xa=Y({},Ui,{view:0,detail:0}),Qp=zt(xa),qr,Wr,Ra,xn=Y({},xa,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Yr,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Ra&&(Ra&&e.type==="mousemove"?(qr=e.screenX-Ra.screenX,Wr=e.screenY-Ra.screenY):Wr=qr=0,Ra=e),qr)},movementY:function(e){return"movementY"in e?e.movementY:Wr}}),su=zt(xn),Zp=Y({},xn,{dataTransfer:0}),Jp=zt(Zp),Xp=Y({},xa,{relatedTarget:0}),Vr=zt(Xp),eg=Y({},Ui,{animationName:0,elapsedTime:0,pseudoElement:0}),tg=zt(eg),og=Y({},Ui,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),ig=zt(og),ag=Y({},Ui,{data:0}),lu=zt(ag),ng={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},rg={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},sg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function lg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=sg[e])?!!t[e]:!1}function Yr(){return lg}var ug=Y({},xa,{key:function(e){if(e.key){var t=ng[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=Pn(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?rg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Yr,charCode:function(e){return e.type==="keypress"?Pn(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Pn(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),cg=zt(ug),dg=Y({},xn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),uu=zt(dg),pg=Y({},xa,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Yr}),gg=zt(pg),hg=Y({},Ui,{propertyName:0,elapsedTime:0,pseudoElement:0}),mg=zt(hg),fg=Y({},xn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),yg=zt(fg),Sg=[9,13,27,32],Kr=m&&"CompositionEvent"in window,Ta=null;m&&"documentMode"in document&&(Ta=document.documentMode);var vg=m&&"TextEvent"in window&&!Ta,cu=m&&(!Kr||Ta&&8<Ta&&11>=Ta),du=" ",pu=!1;function gu(e,t){switch(e){case"keyup":return Sg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function hu(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Hi=!1;function bg(e,t){switch(e){case"compositionend":return hu(t);case"keypress":return t.which!==32?null:(pu=!0,du);case"textInput":return e=t.data,e===du&&pu?null:e;default:return null}}function wg(e,t){if(Hi)return e==="compositionend"||!Kr&&gu(e,t)?(e=nu(),kn=Or=Fo=null,Hi=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return cu&&t.locale!=="ko"?null:t.data;default:return null}}var kg={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function mu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!kg[e.type]:t==="textarea"}function fu(e,t,o,i){ma(i),t=En(t,"onChange"),0<t.length&&(o=new Fr("onChange","change",null,o,i),e.push({event:o,listeners:t}))}var Aa=null,Ia=null;function Pg(e){Mu(e,0)}function Rn(e){var t=Wi(e);if(Ne(t))return e}function Cg(e,t){if(e==="change")return t}var yu=!1;if(m){var Gr;if(m){var $r="oninput"in document;if(!$r){var Su=document.createElement("div");Su.setAttribute("oninput","return;"),$r=typeof Su.oninput=="function"}Gr=$r}else Gr=!1;yu=Gr&&(!document.documentMode||9<document.documentMode)}function vu(){Aa&&(Aa.detachEvent("onpropertychange",bu),Ia=Aa=null)}function bu(e){if(e.propertyName==="value"&&Rn(Ia)){var t=[];fu(t,Ia,e,_o(e)),gn(Pg,t)}}function xg(e,t,o){e==="focusin"?(vu(),Aa=t,Ia=o,Aa.attachEvent("onpropertychange",bu)):e==="focusout"&&vu()}function Rg(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Rn(Ia)}function Tg(e,t){if(e==="click")return Rn(t)}function Ag(e,t){if(e==="input"||e==="change")return Rn(t)}function Ig(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Yt=typeof Object.is=="function"?Object.is:Ig;function Ea(e,t){if(Yt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(i=0;i<o.length;i++){var n=o[i];if(!f.call(t,n)||!Yt(e[n],t[n]))return!1}return!0}function wu(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ku(e,t){var o=wu(e);e=0;for(var i;o;){if(o.nodeType===3){if(i=e+o.textContent.length,e<=t&&i>=t)return{node:o,offset:t-e};e=i}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=wu(o)}}function Pu(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Pu(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Cu(){for(var e=window,t=wt();t instanceof e.HTMLIFrameElement;){try{var o=typeof t.contentWindow.location.href=="string"}catch{o=!1}if(o)e=t.contentWindow;else break;t=wt(e.document)}return t}function Qr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Eg(e){var t=Cu(),o=e.focusedElem,i=e.selectionRange;if(t!==o&&o&&o.ownerDocument&&Pu(o.ownerDocument.documentElement,o)){if(i!==null&&Qr(o)){if(t=i.start,e=i.end,e===void 0&&(e=t),"selectionStart"in o)o.selectionStart=t,o.selectionEnd=Math.min(e,o.value.length);else if(e=(t=o.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var n=o.textContent.length,l=Math.min(i.start,n);i=i.end===void 0?l:Math.min(i.end,n),!e.extend&&l>i&&(n=i,i=l,l=n),n=ku(o,l);var c=ku(o,i);n&&c&&(e.rangeCount!==1||e.anchorNode!==n.node||e.anchorOffset!==n.offset||e.focusNode!==c.node||e.focusOffset!==c.offset)&&(t=t.createRange(),t.setStart(n.node,n.offset),e.removeAllRanges(),l>i?(e.addRange(t),e.extend(c.node,c.offset)):(t.setEnd(c.node,c.offset),e.addRange(t)))}}for(t=[],e=o;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;o<t.length;o++)e=t[o],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var jg=m&&"documentMode"in document&&11>=document.documentMode,Bi=null,Zr=null,ja=null,Jr=!1;function xu(e,t,o){var i=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;Jr||Bi==null||Bi!==wt(i)||(i=Bi,"selectionStart"in i&&Qr(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),ja&&Ea(ja,i)||(ja=i,i=En(Zr,"onSelect"),0<i.length&&(t=new Fr("onSelect","select",null,t,o),e.push({event:t,listeners:i}),t.target=Bi)))}function Tn(e,t){var o={};return o[e.toLowerCase()]=t.toLowerCase(),o["Webkit"+e]="webkit"+t,o["Moz"+e]="moz"+t,o}var Oi={animationend:Tn("Animation","AnimationEnd"),animationiteration:Tn("Animation","AnimationIteration"),animationstart:Tn("Animation","AnimationStart"),transitionend:Tn("Transition","TransitionEnd")},Xr={},Ru={};m&&(Ru=document.createElement("div").style,"AnimationEvent"in window||(delete Oi.animationend.animation,delete Oi.animationiteration.animation,delete Oi.animationstart.animation),"TransitionEvent"in window||delete Oi.transitionend.transition);function An(e){if(Xr[e])return Xr[e];if(!Oi[e])return e;var t=Oi[e],o;for(o in t)if(t.hasOwnProperty(o)&&o in Ru)return Xr[e]=t[o];return e}var Tu=An("animationend"),Au=An("animationiteration"),Iu=An("animationstart"),Eu=An("transitionend"),ju=new Map,zu="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function qo(e,t){ju.set(e,t),p(t,[e])}for(var es=0;es<zu.length;es++){var ts=zu[es],zg=ts.toLowerCase(),Dg=ts[0].toUpperCase()+ts.slice(1);qo(zg,"on"+Dg)}qo(Tu,"onAnimationEnd"),qo(Au,"onAnimationIteration"),qo(Iu,"onAnimationStart"),qo("dblclick","onDoubleClick"),qo("focusin","onFocus"),qo("focusout","onBlur"),qo(Eu,"onTransitionEnd"),g("onMouseEnter",["mouseout","mouseover"]),g("onMouseLeave",["mouseout","mouseover"]),g("onPointerEnter",["pointerout","pointerover"]),g("onPointerLeave",["pointerout","pointerover"]),p("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),p("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),p("onBeforeInput",["compositionend","keypress","textInput","paste"]),p("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var za="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Mg=new Set("cancel close invalid load scroll toggle".split(" ").concat(za));function Du(e,t,o){var i=e.type||"unknown-event";e.currentTarget=o,$(i,t,void 0,e),e.currentTarget=null}function Mu(e,t){t=(t&4)!==0;for(var o=0;o<e.length;o++){var i=e[o],n=i.event;i=i.listeners;e:{var l=void 0;if(t)for(var c=i.length-1;0<=c;c--){var h=i[c],v=h.instance,I=h.currentTarget;if(h=h.listener,v!==l&&n.isPropagationStopped())break e;Du(n,h,I),l=v}else for(c=0;c<i.length;c++){if(h=i[c],v=h.instance,I=h.currentTarget,h=h.listener,v!==l&&n.isPropagationStopped())break e;Du(n,h,I),l=v}}}if(ne)throw e=pe,ne=!1,pe=null,e}function Ye(e,t){var o=t[us];o===void 0&&(o=t[us]=new Set);var i=e+"__bubble";o.has(i)||(_u(t,e,2,!1),o.add(i))}function os(e,t,o){var i=0;t&&(i|=4),_u(o,e,i,t)}var In="_reactListening"+Math.random().toString(36).slice(2);function Da(e){if(!e[In]){e[In]=!0,u.forEach(function(o){o!=="selectionchange"&&(Mg.has(o)||os(o,!1,e),os(o,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[In]||(t[In]=!0,os("selectionchange",!1,t))}}function _u(e,t,o,i){switch(au(t)){case 1:var n=Gp;break;case 4:n=$p;break;default:n=Hr}o=n.bind(null,t,o,e),n=void 0,!S||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(n=!0),i?n!==void 0?e.addEventListener(t,o,{capture:!0,passive:n}):e.addEventListener(t,o,!0):n!==void 0?e.addEventListener(t,o,{passive:n}):e.addEventListener(t,o,!1)}function is(e,t,o,i,n){var l=i;if((t&1)===0&&(t&2)===0&&i!==null)e:for(;;){if(i===null)return;var c=i.tag;if(c===3||c===4){var h=i.stateNode.containerInfo;if(h===n||h.nodeType===8&&h.parentNode===n)break;if(c===4)for(c=i.return;c!==null;){var v=c.tag;if((v===3||v===4)&&(v=c.stateNode.containerInfo,v===n||v.nodeType===8&&v.parentNode===n))return;c=c.return}for(;h!==null;){if(c=hi(h),c===null)return;if(v=c.tag,v===5||v===6){i=l=c;continue e}h=h.parentNode}}i=i.return}gn(function(){var I=l,U=_o(o),B=[];e:{var L=ju.get(e);if(L!==void 0){var G=Fr,ee=e;switch(e){case"keypress":if(Pn(o)===0)break e;case"keydown":case"keyup":G=cg;break;case"focusin":ee="focus",G=Vr;break;case"focusout":ee="blur",G=Vr;break;case"beforeblur":case"afterblur":G=Vr;break;case"click":if(o.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":G=su;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":G=Jp;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":G=gg;break;case Tu:case Au:case Iu:G=tg;break;case Eu:G=mg;break;case"scroll":G=Qp;break;case"wheel":G=yg;break;case"copy":case"cut":case"paste":G=ig;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":G=uu}var ie=(t&4)!==0,it=!ie&&e==="scroll",x=ie?L!==null?L+"Capture":null:L;ie=[];for(var b=I,T;b!==null;){T=b;var q=T.stateNode;if(T.tag===5&&q!==null&&(T=q,x!==null&&(q=di(b,x),q!=null&&ie.push(Ma(b,q,T)))),it)break;b=b.return}0<ie.length&&(L=new G(L,ee,null,o,U),B.push({event:L,listeners:ie}))}}if((t&7)===0){e:{if(L=e==="mouseover"||e==="pointerover",G=e==="mouseout"||e==="pointerout",L&&o!==Mi&&(ee=o.relatedTarget||o.fromElement)&&(hi(ee)||ee[yo]))break e;if((G||L)&&(L=U.window===U?U:(L=U.ownerDocument)?L.defaultView||L.parentWindow:window,G?(ee=o.relatedTarget||o.toElement,G=I,ee=ee?hi(ee):null,ee!==null&&(it=Z(ee),ee!==it||ee.tag!==5&&ee.tag!==6)&&(ee=null)):(G=null,ee=I),G!==ee)){if(ie=su,q="onMouseLeave",x="onMouseEnter",b="mouse",(e==="pointerout"||e==="pointerover")&&(ie=uu,q="onPointerLeave",x="onPointerEnter",b="pointer"),it=G==null?L:Wi(G),T=ee==null?L:Wi(ee),L=new ie(q,b+"leave",G,o,U),L.target=it,L.relatedTarget=T,q=null,hi(U)===I&&(ie=new ie(x,b+"enter",ee,o,U),ie.target=T,ie.relatedTarget=it,q=ie),it=q,G&&ee)t:{for(ie=G,x=ee,b=0,T=ie;T;T=Fi(T))b++;for(T=0,q=x;q;q=Fi(q))T++;for(;0<b-T;)ie=Fi(ie),b--;for(;0<T-b;)x=Fi(x),T--;for(;b--;){if(ie===x||x!==null&&ie===x.alternate)break t;ie=Fi(ie),x=Fi(x)}ie=null}else ie=null;G!==null&&Lu(B,L,G,ie,!1),ee!==null&&it!==null&&Lu(B,it,ee,ie,!0)}}e:{if(L=I?Wi(I):window,G=L.nodeName&&L.nodeName.toLowerCase(),G==="select"||G==="input"&&L.type==="file")var ae=Cg;else if(mu(L))if(yu)ae=Ag;else{ae=Rg;var ce=xg}else(G=L.nodeName)&&G.toLowerCase()==="input"&&(L.type==="checkbox"||L.type==="radio")&&(ae=Tg);if(ae&&(ae=ae(e,I))){fu(B,ae,o,U);break e}ce&&ce(e,L,I),e==="focusout"&&(ce=L._wrapperState)&&ce.controlled&&L.type==="number"&&zi(L,"number",L.value)}switch(ce=I?Wi(I):window,e){case"focusin":(mu(ce)||ce.contentEditable==="true")&&(Bi=ce,Zr=I,ja=null);break;case"focusout":ja=Zr=Bi=null;break;case"mousedown":Jr=!0;break;case"contextmenu":case"mouseup":case"dragend":Jr=!1,xu(B,o,U);break;case"selectionchange":if(jg)break;case"keydown":case"keyup":xu(B,o,U)}var de;if(Kr)e:{switch(e){case"compositionstart":var he="onCompositionStart";break e;case"compositionend":he="onCompositionEnd";break e;case"compositionupdate":he="onCompositionUpdate";break e}he=void 0}else Hi?gu(e,o)&&(he="onCompositionEnd"):e==="keydown"&&o.keyCode===229&&(he="onCompositionStart");he&&(cu&&o.locale!=="ko"&&(Hi||he!=="onCompositionStart"?he==="onCompositionEnd"&&Hi&&(de=nu()):(Fo=U,Or="value"in Fo?Fo.value:Fo.textContent,Hi=!0)),ce=En(I,he),0<ce.length&&(he=new lu(he,e,null,o,U),B.push({event:he,listeners:ce}),de?he.data=de:(de=hu(o),de!==null&&(he.data=de)))),(de=vg?bg(e,o):wg(e,o))&&(I=En(I,"onBeforeInput"),0<I.length&&(U=new lu("onBeforeInput","beforeinput",null,o,U),B.push({event:U,listeners:I}),U.data=de))}Mu(B,t)})}function Ma(e,t,o){return{instance:e,listener:t,currentTarget:o}}function En(e,t){for(var o=t+"Capture",i=[];e!==null;){var n=e,l=n.stateNode;n.tag===5&&l!==null&&(n=l,l=di(e,o),l!=null&&i.unshift(Ma(e,l,n)),l=di(e,t),l!=null&&i.push(Ma(e,l,n))),e=e.return}return i}function Fi(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Lu(e,t,o,i,n){for(var l=t._reactName,c=[];o!==null&&o!==i;){var h=o,v=h.alternate,I=h.stateNode;if(v!==null&&v===i)break;h.tag===5&&I!==null&&(h=I,n?(v=di(o,l),v!=null&&c.unshift(Ma(o,v,h))):n||(v=di(o,l),v!=null&&c.push(Ma(o,v,h)))),o=o.return}c.length!==0&&e.push({event:t,listeners:c})}var _g=/\r\n?/g,Lg=/\u0000|\uFFFD/g;function Nu(e){return(typeof e=="string"?e:""+e).replace(_g,`
39
- `).replace(Lg,"")}function jn(e,t,o){if(t=Nu(t),Nu(e)!==t&&o)throw Error(s(425))}function zn(){}var as=null,ns=null;function rs(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var ss=typeof setTimeout=="function"?setTimeout:void 0,Ng=typeof clearTimeout=="function"?clearTimeout:void 0,Uu=typeof Promise=="function"?Promise:void 0,Ug=typeof queueMicrotask=="function"?queueMicrotask:typeof Uu<"u"?function(e){return Uu.resolve(null).then(e).catch(Hg)}:ss;function Hg(e){setTimeout(function(){throw e})}function ls(e,t){var o=t,i=0;do{var n=o.nextSibling;if(e.removeChild(o),n&&n.nodeType===8)if(o=n.data,o==="/$"){if(i===0){e.removeChild(n),Ca(t);return}i--}else o!=="$"&&o!=="$?"&&o!=="$!"||i++;o=n}while(o);Ca(t)}function Wo(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Hu(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="$"||o==="$!"||o==="$?"){if(t===0)return e;t--}else o==="/$"&&t++}e=e.previousSibling}return null}var qi=Math.random().toString(36).slice(2),so="__reactFiber$"+qi,_a="__reactProps$"+qi,yo="__reactContainer$"+qi,us="__reactEvents$"+qi,Bg="__reactListeners$"+qi,Og="__reactHandles$"+qi;function hi(e){var t=e[so];if(t)return t;for(var o=e.parentNode;o;){if(t=o[yo]||o[so]){if(o=t.alternate,t.child!==null||o!==null&&o.child!==null)for(e=Hu(e);e!==null;){if(o=e[so])return o;e=Hu(e)}return t}e=o,o=e.parentNode}return null}function La(e){return e=e[so]||e[yo],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Wi(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(s(33))}function Dn(e){return e[_a]||null}var cs=[],Vi=-1;function Vo(e){return{current:e}}function Ke(e){0>Vi||(e.current=cs[Vi],cs[Vi]=null,Vi--)}function We(e,t){Vi++,cs[Vi]=e.current,e.current=t}var Yo={},yt=Vo(Yo),Ct=Vo(!1),mi=Yo;function Yi(e,t){var o=e.type.contextTypes;if(!o)return Yo;var i=e.stateNode;if(i&&i.__reactInternalMemoizedUnmaskedChildContext===t)return i.__reactInternalMemoizedMaskedChildContext;var n={},l;for(l in o)n[l]=t[l];return i&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=n),n}function xt(e){return e=e.childContextTypes,e!=null}function Mn(){Ke(Ct),Ke(yt)}function Bu(e,t,o){if(yt.current!==Yo)throw Error(s(168));We(yt,t),We(Ct,o)}function Ou(e,t,o){var i=e.stateNode;if(t=t.childContextTypes,typeof i.getChildContext!="function")return o;i=i.getChildContext();for(var n in i)if(!(n in t))throw Error(s(108,xe(e)||"Unknown",n));return Y({},o,i)}function _n(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Yo,mi=yt.current,We(yt,e),We(Ct,Ct.current),!0}function Fu(e,t,o){var i=e.stateNode;if(!i)throw Error(s(169));o?(e=Ou(e,t,mi),i.__reactInternalMemoizedMergedChildContext=e,Ke(Ct),Ke(yt),We(yt,e)):Ke(Ct),We(Ct,o)}var So=null,Ln=!1,ds=!1;function qu(e){So===null?So=[e]:So.push(e)}function Fg(e){Ln=!0,qu(e)}function Ko(){if(!ds&&So!==null){ds=!0;var e=0,t=Be;try{var o=So;for(Be=1;e<o.length;e++){var i=o[e];do i=i(!0);while(i!==null)}So=null,Ln=!1}catch(n){throw So!==null&&(So=So.slice(e+1)),Ve(mo,Ko),n}finally{Be=t,ds=!1}}return null}var Ki=[],Gi=0,Nn=null,Un=0,Ut=[],Ht=0,fi=null,vo=1,bo="";function yi(e,t){Ki[Gi++]=Un,Ki[Gi++]=Nn,Nn=e,Un=t}function Wu(e,t,o){Ut[Ht++]=vo,Ut[Ht++]=bo,Ut[Ht++]=fi,fi=e;var i=vo;e=bo;var n=32-De(i)-1;i&=~(1<<n),o+=1;var l=32-De(t)+n;if(30<l){var c=n-n%5;l=(i&(1<<c)-1).toString(32),i>>=c,n-=c,vo=1<<32-De(t)+n|o<<n|i,bo=l+e}else vo=1<<l|o<<n|i,bo=e}function ps(e){e.return!==null&&(yi(e,1),Wu(e,1,0))}function gs(e){for(;e===Nn;)Nn=Ki[--Gi],Ki[Gi]=null,Un=Ki[--Gi],Ki[Gi]=null;for(;e===fi;)fi=Ut[--Ht],Ut[Ht]=null,bo=Ut[--Ht],Ut[Ht]=null,vo=Ut[--Ht],Ut[Ht]=null}var Dt=null,Mt=null,Ge=!1,Kt=null;function Vu(e,t){var o=qt(5,null,null,0);o.elementType="DELETED",o.stateNode=t,o.return=e,t=e.deletions,t===null?(e.deletions=[o],e.flags|=16):t.push(o)}function Yu(e,t){switch(e.tag){case 5:var o=e.type;return t=t.nodeType!==1||o.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Dt=e,Mt=Wo(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Dt=e,Mt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(o=fi!==null?{id:vo,overflow:bo}:null,e.memoizedState={dehydrated:t,treeContext:o,retryLane:1073741824},o=qt(18,null,null,0),o.stateNode=t,o.return=e,e.child=o,Dt=e,Mt=null,!0):!1;default:return!1}}function hs(e){return(e.mode&1)!==0&&(e.flags&128)===0}function ms(e){if(Ge){var t=Mt;if(t){var o=t;if(!Yu(e,t)){if(hs(e))throw Error(s(418));t=Wo(o.nextSibling);var i=Dt;t&&Yu(e,t)?Vu(i,o):(e.flags=e.flags&-4097|2,Ge=!1,Dt=e)}}else{if(hs(e))throw Error(s(418));e.flags=e.flags&-4097|2,Ge=!1,Dt=e}}}function Ku(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Dt=e}function Hn(e){if(e!==Dt)return!1;if(!Ge)return Ku(e),Ge=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!rs(e.type,e.memoizedProps)),t&&(t=Mt)){if(hs(e))throw Gu(),Error(s(418));for(;t;)Vu(e,t),t=Wo(t.nextSibling)}if(Ku(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(s(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="/$"){if(t===0){Mt=Wo(e.nextSibling);break e}t--}else o!=="$"&&o!=="$!"&&o!=="$?"||t++}e=e.nextSibling}Mt=null}}else Mt=Dt?Wo(e.stateNode.nextSibling):null;return!0}function Gu(){for(var e=Mt;e;)e=Wo(e.nextSibling)}function $i(){Mt=Dt=null,Ge=!1}function fs(e){Kt===null?Kt=[e]:Kt.push(e)}var qg=te.ReactCurrentBatchConfig;function Na(e,t,o){if(e=o.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(o._owner){if(o=o._owner,o){if(o.tag!==1)throw Error(s(309));var i=o.stateNode}if(!i)throw Error(s(147,e));var n=i,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(c){var h=n.refs;c===null?delete h[l]:h[l]=c},t._stringRef=l,t)}if(typeof e!="string")throw Error(s(284));if(!o._owner)throw Error(s(290,e))}return e}function Bn(e,t){throw e=Object.prototype.toString.call(t),Error(s(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function $u(e){var t=e._init;return t(e._payload)}function Qu(e){function t(x,b){if(e){var T=x.deletions;T===null?(x.deletions=[b],x.flags|=16):T.push(b)}}function o(x,b){if(!e)return null;for(;b!==null;)t(x,b),b=b.sibling;return null}function i(x,b){for(x=new Map;b!==null;)b.key!==null?x.set(b.key,b):x.set(b.index,b),b=b.sibling;return x}function n(x,b){return x=ti(x,b),x.index=0,x.sibling=null,x}function l(x,b,T){return x.index=T,e?(T=x.alternate,T!==null?(T=T.index,T<b?(x.flags|=2,b):T):(x.flags|=2,b)):(x.flags|=1048576,b)}function c(x){return e&&x.alternate===null&&(x.flags|=2),x}function h(x,b,T,q){return b===null||b.tag!==6?(b=sl(T,x.mode,q),b.return=x,b):(b=n(b,T),b.return=x,b)}function v(x,b,T,q){var ae=T.type;return ae===A?U(x,b,T.props.children,q,T.key):b!==null&&(b.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===ot&&$u(ae)===b.type)?(q=n(b,T.props),q.ref=Na(x,b,T),q.return=x,q):(q=cr(T.type,T.key,T.props,null,x.mode,q),q.ref=Na(x,b,T),q.return=x,q)}function I(x,b,T,q){return b===null||b.tag!==4||b.stateNode.containerInfo!==T.containerInfo||b.stateNode.implementation!==T.implementation?(b=ll(T,x.mode,q),b.return=x,b):(b=n(b,T.children||[]),b.return=x,b)}function U(x,b,T,q,ae){return b===null||b.tag!==7?(b=xi(T,x.mode,q,ae),b.return=x,b):(b=n(b,T),b.return=x,b)}function B(x,b,T){if(typeof b=="string"&&b!==""||typeof b=="number")return b=sl(""+b,x.mode,T),b.return=x,b;if(typeof b=="object"&&b!==null){switch(b.$$typeof){case Se:return T=cr(b.type,b.key,b.props,null,x.mode,T),T.ref=Na(x,null,b),T.return=x,T;case Ae:return b=ll(b,x.mode,T),b.return=x,b;case ot:var q=b._init;return B(x,q(b._payload),T)}if(li(b)||se(b))return b=xi(b,x.mode,T,null),b.return=x,b;Bn(x,b)}return null}function L(x,b,T,q){var ae=b!==null?b.key:null;if(typeof T=="string"&&T!==""||typeof T=="number")return ae!==null?null:h(x,b,""+T,q);if(typeof T=="object"&&T!==null){switch(T.$$typeof){case Se:return T.key===ae?v(x,b,T,q):null;case Ae:return T.key===ae?I(x,b,T,q):null;case ot:return ae=T._init,L(x,b,ae(T._payload),q)}if(li(T)||se(T))return ae!==null?null:U(x,b,T,q,null);Bn(x,T)}return null}function G(x,b,T,q,ae){if(typeof q=="string"&&q!==""||typeof q=="number")return x=x.get(T)||null,h(b,x,""+q,ae);if(typeof q=="object"&&q!==null){switch(q.$$typeof){case Se:return x=x.get(q.key===null?T:q.key)||null,v(b,x,q,ae);case Ae:return x=x.get(q.key===null?T:q.key)||null,I(b,x,q,ae);case ot:var ce=q._init;return G(x,b,T,ce(q._payload),ae)}if(li(q)||se(q))return x=x.get(T)||null,U(b,x,q,ae,null);Bn(b,q)}return null}function ee(x,b,T,q){for(var ae=null,ce=null,de=b,he=b=0,pt=null;de!==null&&he<T.length;he++){de.index>he?(pt=de,de=null):pt=de.sibling;var Me=L(x,de,T[he],q);if(Me===null){de===null&&(de=pt);break}e&&de&&Me.alternate===null&&t(x,de),b=l(Me,b,he),ce===null?ae=Me:ce.sibling=Me,ce=Me,de=pt}if(he===T.length)return o(x,de),Ge&&yi(x,he),ae;if(de===null){for(;he<T.length;he++)de=B(x,T[he],q),de!==null&&(b=l(de,b,he),ce===null?ae=de:ce.sibling=de,ce=de);return Ge&&yi(x,he),ae}for(de=i(x,de);he<T.length;he++)pt=G(de,x,he,T[he],q),pt!==null&&(e&&pt.alternate!==null&&de.delete(pt.key===null?he:pt.key),b=l(pt,b,he),ce===null?ae=pt:ce.sibling=pt,ce=pt);return e&&de.forEach(function(oi){return t(x,oi)}),Ge&&yi(x,he),ae}function ie(x,b,T,q){var ae=se(T);if(typeof ae!="function")throw Error(s(150));if(T=ae.call(T),T==null)throw Error(s(151));for(var ce=ae=null,de=b,he=b=0,pt=null,Me=T.next();de!==null&&!Me.done;he++,Me=T.next()){de.index>he?(pt=de,de=null):pt=de.sibling;var oi=L(x,de,Me.value,q);if(oi===null){de===null&&(de=pt);break}e&&de&&oi.alternate===null&&t(x,de),b=l(oi,b,he),ce===null?ae=oi:ce.sibling=oi,ce=oi,de=pt}if(Me.done)return o(x,de),Ge&&yi(x,he),ae;if(de===null){for(;!Me.done;he++,Me=T.next())Me=B(x,Me.value,q),Me!==null&&(b=l(Me,b,he),ce===null?ae=Me:ce.sibling=Me,ce=Me);return Ge&&yi(x,he),ae}for(de=i(x,de);!Me.done;he++,Me=T.next())Me=G(de,x,he,Me.value,q),Me!==null&&(e&&Me.alternate!==null&&de.delete(Me.key===null?he:Me.key),b=l(Me,b,he),ce===null?ae=Me:ce.sibling=Me,ce=Me);return e&&de.forEach(function(kh){return t(x,kh)}),Ge&&yi(x,he),ae}function it(x,b,T,q){if(typeof T=="object"&&T!==null&&T.type===A&&T.key===null&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case Se:e:{for(var ae=T.key,ce=b;ce!==null;){if(ce.key===ae){if(ae=T.type,ae===A){if(ce.tag===7){o(x,ce.sibling),b=n(ce,T.props.children),b.return=x,x=b;break e}}else if(ce.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===ot&&$u(ae)===ce.type){o(x,ce.sibling),b=n(ce,T.props),b.ref=Na(x,ce,T),b.return=x,x=b;break e}o(x,ce);break}else t(x,ce);ce=ce.sibling}T.type===A?(b=xi(T.props.children,x.mode,q,T.key),b.return=x,x=b):(q=cr(T.type,T.key,T.props,null,x.mode,q),q.ref=Na(x,b,T),q.return=x,x=q)}return c(x);case Ae:e:{for(ce=T.key;b!==null;){if(b.key===ce)if(b.tag===4&&b.stateNode.containerInfo===T.containerInfo&&b.stateNode.implementation===T.implementation){o(x,b.sibling),b=n(b,T.children||[]),b.return=x,x=b;break e}else{o(x,b);break}else t(x,b);b=b.sibling}b=ll(T,x.mode,q),b.return=x,x=b}return c(x);case ot:return ce=T._init,it(x,b,ce(T._payload),q)}if(li(T))return ee(x,b,T,q);if(se(T))return ie(x,b,T,q);Bn(x,T)}return typeof T=="string"&&T!==""||typeof T=="number"?(T=""+T,b!==null&&b.tag===6?(o(x,b.sibling),b=n(b,T),b.return=x,x=b):(o(x,b),b=sl(T,x.mode,q),b.return=x,x=b),c(x)):o(x,b)}return it}var Qi=Qu(!0),Zu=Qu(!1),On=Vo(null),Fn=null,Zi=null,ys=null;function Ss(){ys=Zi=Fn=null}function vs(e){var t=On.current;Ke(On),e._currentValue=t}function bs(e,t,o){for(;e!==null;){var i=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,i!==null&&(i.childLanes|=t)):i!==null&&(i.childLanes&t)!==t&&(i.childLanes|=t),e===o)break;e=e.return}}function Ji(e,t){Fn=e,ys=Zi=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(Rt=!0),e.firstContext=null)}function Bt(e){var t=e._currentValue;if(ys!==e)if(e={context:e,memoizedValue:t,next:null},Zi===null){if(Fn===null)throw Error(s(308));Zi=e,Fn.dependencies={lanes:0,firstContext:e}}else Zi=Zi.next=e;return t}var Si=null;function ws(e){Si===null?Si=[e]:Si.push(e)}function Ju(e,t,o,i){var n=t.interleaved;return n===null?(o.next=o,ws(t)):(o.next=n.next,n.next=o),t.interleaved=o,wo(e,i)}function wo(e,t){e.lanes|=t;var o=e.alternate;for(o!==null&&(o.lanes|=t),o=e,e=e.return;e!==null;)e.childLanes|=t,o=e.alternate,o!==null&&(o.childLanes|=t),o=e,e=e.return;return o.tag===3?o.stateNode:null}var Go=!1;function ks(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Xu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function ko(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function $o(e,t,o){var i=e.updateQueue;if(i===null)return null;if(i=i.shared,(je&2)!==0){var n=i.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),i.pending=t,wo(e,o)}return n=i.interleaved,n===null?(t.next=t,ws(i)):(t.next=n.next,n.next=t),i.interleaved=t,wo(e,o)}function qn(e,t,o){if(t=t.updateQueue,t!==null&&(t=t.shared,(o&4194240)!==0)){var i=t.lanes;i&=e.pendingLanes,o|=i,t.lanes=o,Lr(e,o)}}function ec(e,t){var o=e.updateQueue,i=e.alternate;if(i!==null&&(i=i.updateQueue,o===i)){var n=null,l=null;if(o=o.firstBaseUpdate,o!==null){do{var c={eventTime:o.eventTime,lane:o.lane,tag:o.tag,payload:o.payload,callback:o.callback,next:null};l===null?n=l=c:l=l.next=c,o=o.next}while(o!==null);l===null?n=l=t:l=l.next=t}else n=l=t;o={baseState:i.baseState,firstBaseUpdate:n,lastBaseUpdate:l,shared:i.shared,effects:i.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=t:e.next=t,o.lastBaseUpdate=t}function Wn(e,t,o,i){var n=e.updateQueue;Go=!1;var l=n.firstBaseUpdate,c=n.lastBaseUpdate,h=n.shared.pending;if(h!==null){n.shared.pending=null;var v=h,I=v.next;v.next=null,c===null?l=I:c.next=I,c=v;var U=e.alternate;U!==null&&(U=U.updateQueue,h=U.lastBaseUpdate,h!==c&&(h===null?U.firstBaseUpdate=I:h.next=I,U.lastBaseUpdate=v))}if(l!==null){var B=n.baseState;c=0,U=I=v=null,h=l;do{var L=h.lane,G=h.eventTime;if((i&L)===L){U!==null&&(U=U.next={eventTime:G,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,next:null});e:{var ee=e,ie=h;switch(L=t,G=o,ie.tag){case 1:if(ee=ie.payload,typeof ee=="function"){B=ee.call(G,B,L);break e}B=ee;break e;case 3:ee.flags=ee.flags&-65537|128;case 0:if(ee=ie.payload,L=typeof ee=="function"?ee.call(G,B,L):ee,L==null)break e;B=Y({},B,L);break e;case 2:Go=!0}}h.callback!==null&&h.lane!==0&&(e.flags|=64,L=n.effects,L===null?n.effects=[h]:L.push(h))}else G={eventTime:G,lane:L,tag:h.tag,payload:h.payload,callback:h.callback,next:null},U===null?(I=U=G,v=B):U=U.next=G,c|=L;if(h=h.next,h===null){if(h=n.shared.pending,h===null)break;L=h,h=L.next,L.next=null,n.lastBaseUpdate=L,n.shared.pending=null}}while(!0);if(U===null&&(v=B),n.baseState=v,n.firstBaseUpdate=I,n.lastBaseUpdate=U,t=n.shared.interleaved,t!==null){n=t;do c|=n.lane,n=n.next;while(n!==t)}else l===null&&(n.shared.lanes=0);wi|=c,e.lanes=c,e.memoizedState=B}}function tc(e,t,o){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var i=e[t],n=i.callback;if(n!==null){if(i.callback=null,i=o,typeof n!="function")throw Error(s(191,n));n.call(i)}}}var Ua={},lo=Vo(Ua),Ha=Vo(Ua),Ba=Vo(Ua);function vi(e){if(e===Ua)throw Error(s(174));return e}function Ps(e,t){switch(We(Ba,t),We(Ha,e),We(lo,Ua),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:ui(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=ui(t,e)}Ke(lo),We(lo,t)}function Xi(){Ke(lo),Ke(Ha),Ke(Ba)}function oc(e){vi(Ba.current);var t=vi(lo.current),o=ui(t,e.type);t!==o&&(We(Ha,e),We(lo,o))}function Cs(e){Ha.current===e&&(Ke(lo),Ke(Ha))}var Ze=Vo(0);function Vn(e){for(var t=e;t!==null;){if(t.tag===13){var o=t.memoizedState;if(o!==null&&(o=o.dehydrated,o===null||o.data==="$?"||o.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var xs=[];function Rs(){for(var e=0;e<xs.length;e++)xs[e]._workInProgressVersionPrimary=null;xs.length=0}var Yn=te.ReactCurrentDispatcher,Ts=te.ReactCurrentBatchConfig,bi=0,Je=null,lt=null,ct=null,Kn=!1,Oa=!1,Fa=0,Wg=0;function St(){throw Error(s(321))}function As(e,t){if(t===null)return!1;for(var o=0;o<t.length&&o<e.length;o++)if(!Yt(e[o],t[o]))return!1;return!0}function Is(e,t,o,i,n,l){if(bi=l,Je=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Yn.current=e===null||e.memoizedState===null?Gg:$g,e=o(i,n),Oa){l=0;do{if(Oa=!1,Fa=0,25<=l)throw Error(s(301));l+=1,ct=lt=null,t.updateQueue=null,Yn.current=Qg,e=o(i,n)}while(Oa)}if(Yn.current=Qn,t=lt!==null&&lt.next!==null,bi=0,ct=lt=Je=null,Kn=!1,t)throw Error(s(300));return e}function Es(){var e=Fa!==0;return Fa=0,e}function uo(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ct===null?Je.memoizedState=ct=e:ct=ct.next=e,ct}function Ot(){if(lt===null){var e=Je.alternate;e=e!==null?e.memoizedState:null}else e=lt.next;var t=ct===null?Je.memoizedState:ct.next;if(t!==null)ct=t,lt=e;else{if(e===null)throw Error(s(310));lt=e,e={memoizedState:lt.memoizedState,baseState:lt.baseState,baseQueue:lt.baseQueue,queue:lt.queue,next:null},ct===null?Je.memoizedState=ct=e:ct=ct.next=e}return ct}function qa(e,t){return typeof t=="function"?t(e):t}function js(e){var t=Ot(),o=t.queue;if(o===null)throw Error(s(311));o.lastRenderedReducer=e;var i=lt,n=i.baseQueue,l=o.pending;if(l!==null){if(n!==null){var c=n.next;n.next=l.next,l.next=c}i.baseQueue=n=l,o.pending=null}if(n!==null){l=n.next,i=i.baseState;var h=c=null,v=null,I=l;do{var U=I.lane;if((bi&U)===U)v!==null&&(v=v.next={lane:0,action:I.action,hasEagerState:I.hasEagerState,eagerState:I.eagerState,next:null}),i=I.hasEagerState?I.eagerState:e(i,I.action);else{var B={lane:U,action:I.action,hasEagerState:I.hasEagerState,eagerState:I.eagerState,next:null};v===null?(h=v=B,c=i):v=v.next=B,Je.lanes|=U,wi|=U}I=I.next}while(I!==null&&I!==l);v===null?c=i:v.next=h,Yt(i,t.memoizedState)||(Rt=!0),t.memoizedState=i,t.baseState=c,t.baseQueue=v,o.lastRenderedState=i}if(e=o.interleaved,e!==null){n=e;do l=n.lane,Je.lanes|=l,wi|=l,n=n.next;while(n!==e)}else n===null&&(o.lanes=0);return[t.memoizedState,o.dispatch]}function zs(e){var t=Ot(),o=t.queue;if(o===null)throw Error(s(311));o.lastRenderedReducer=e;var i=o.dispatch,n=o.pending,l=t.memoizedState;if(n!==null){o.pending=null;var c=n=n.next;do l=e(l,c.action),c=c.next;while(c!==n);Yt(l,t.memoizedState)||(Rt=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),o.lastRenderedState=l}return[l,i]}function ic(){}function ac(e,t){var o=Je,i=Ot(),n=t(),l=!Yt(i.memoizedState,n);if(l&&(i.memoizedState=n,Rt=!0),i=i.queue,Ds(sc.bind(null,o,i,e),[e]),i.getSnapshot!==t||l||ct!==null&&ct.memoizedState.tag&1){if(o.flags|=2048,Wa(9,rc.bind(null,o,i,n,t),void 0,null),dt===null)throw Error(s(349));(bi&30)!==0||nc(o,t,n)}return n}function nc(e,t,o){e.flags|=16384,e={getSnapshot:t,value:o},t=Je.updateQueue,t===null?(t={lastEffect:null,stores:null},Je.updateQueue=t,t.stores=[e]):(o=t.stores,o===null?t.stores=[e]:o.push(e))}function rc(e,t,o,i){t.value=o,t.getSnapshot=i,lc(t)&&uc(e)}function sc(e,t,o){return o(function(){lc(t)&&uc(e)})}function lc(e){var t=e.getSnapshot;e=e.value;try{var o=t();return!Yt(e,o)}catch{return!0}}function uc(e){var t=wo(e,1);t!==null&&Zt(t,e,1,-1)}function cc(e){var t=uo();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:qa,lastRenderedState:e},t.queue=e,e=e.dispatch=Kg.bind(null,Je,e),[t.memoizedState,e]}function Wa(e,t,o,i){return e={tag:e,create:t,destroy:o,deps:i,next:null},t=Je.updateQueue,t===null?(t={lastEffect:null,stores:null},Je.updateQueue=t,t.lastEffect=e.next=e):(o=t.lastEffect,o===null?t.lastEffect=e.next=e:(i=o.next,o.next=e,e.next=i,t.lastEffect=e)),e}function dc(){return Ot().memoizedState}function Gn(e,t,o,i){var n=uo();Je.flags|=e,n.memoizedState=Wa(1|t,o,void 0,i===void 0?null:i)}function $n(e,t,o,i){var n=Ot();i=i===void 0?null:i;var l=void 0;if(lt!==null){var c=lt.memoizedState;if(l=c.destroy,i!==null&&As(i,c.deps)){n.memoizedState=Wa(t,o,l,i);return}}Je.flags|=e,n.memoizedState=Wa(1|t,o,l,i)}function pc(e,t){return Gn(8390656,8,e,t)}function Ds(e,t){return $n(2048,8,e,t)}function gc(e,t){return $n(4,2,e,t)}function hc(e,t){return $n(4,4,e,t)}function mc(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function fc(e,t,o){return o=o!=null?o.concat([e]):null,$n(4,4,mc.bind(null,t,e),o)}function Ms(){}function yc(e,t){var o=Ot();t=t===void 0?null:t;var i=o.memoizedState;return i!==null&&t!==null&&As(t,i[1])?i[0]:(o.memoizedState=[e,t],e)}function Sc(e,t){var o=Ot();t=t===void 0?null:t;var i=o.memoizedState;return i!==null&&t!==null&&As(t,i[1])?i[0]:(e=e(),o.memoizedState=[e,t],e)}function vc(e,t,o){return(bi&21)===0?(e.baseState&&(e.baseState=!1,Rt=!0),e.memoizedState=o):(Yt(o,t)||(o=$l(),Je.lanes|=o,wi|=o,e.baseState=!0),t)}function Vg(e,t){var o=Be;Be=o!==0&&4>o?o:4,e(!0);var i=Ts.transition;Ts.transition={};try{e(!1),t()}finally{Be=o,Ts.transition=i}}function bc(){return Ot().memoizedState}function Yg(e,t,o){var i=Xo(e);if(o={lane:i,action:o,hasEagerState:!1,eagerState:null,next:null},wc(e))kc(t,o);else if(o=Ju(e,t,o,i),o!==null){var n=Pt();Zt(o,e,i,n),Pc(o,t,i)}}function Kg(e,t,o){var i=Xo(e),n={lane:i,action:o,hasEagerState:!1,eagerState:null,next:null};if(wc(e))kc(t,n);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var c=t.lastRenderedState,h=l(c,o);if(n.hasEagerState=!0,n.eagerState=h,Yt(h,c)){var v=t.interleaved;v===null?(n.next=n,ws(t)):(n.next=v.next,v.next=n),t.interleaved=n;return}}catch{}finally{}o=Ju(e,t,n,i),o!==null&&(n=Pt(),Zt(o,e,i,n),Pc(o,t,i))}}function wc(e){var t=e.alternate;return e===Je||t!==null&&t===Je}function kc(e,t){Oa=Kn=!0;var o=e.pending;o===null?t.next=t:(t.next=o.next,o.next=t),e.pending=t}function Pc(e,t,o){if((o&4194240)!==0){var i=t.lanes;i&=e.pendingLanes,o|=i,t.lanes=o,Lr(e,o)}}var Qn={readContext:Bt,useCallback:St,useContext:St,useEffect:St,useImperativeHandle:St,useInsertionEffect:St,useLayoutEffect:St,useMemo:St,useReducer:St,useRef:St,useState:St,useDebugValue:St,useDeferredValue:St,useTransition:St,useMutableSource:St,useSyncExternalStore:St,useId:St,unstable_isNewReconciler:!1},Gg={readContext:Bt,useCallback:function(e,t){return uo().memoizedState=[e,t===void 0?null:t],e},useContext:Bt,useEffect:pc,useImperativeHandle:function(e,t,o){return o=o!=null?o.concat([e]):null,Gn(4194308,4,mc.bind(null,t,e),o)},useLayoutEffect:function(e,t){return Gn(4194308,4,e,t)},useInsertionEffect:function(e,t){return Gn(4,2,e,t)},useMemo:function(e,t){var o=uo();return t=t===void 0?null:t,e=e(),o.memoizedState=[e,t],e},useReducer:function(e,t,o){var i=uo();return t=o!==void 0?o(t):t,i.memoizedState=i.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},i.queue=e,e=e.dispatch=Yg.bind(null,Je,e),[i.memoizedState,e]},useRef:function(e){var t=uo();return e={current:e},t.memoizedState=e},useState:cc,useDebugValue:Ms,useDeferredValue:function(e){return uo().memoizedState=e},useTransition:function(){var e=cc(!1),t=e[0];return e=Vg.bind(null,e[1]),uo().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,o){var i=Je,n=uo();if(Ge){if(o===void 0)throw Error(s(407));o=o()}else{if(o=t(),dt===null)throw Error(s(349));(bi&30)!==0||nc(i,t,o)}n.memoizedState=o;var l={value:o,getSnapshot:t};return n.queue=l,pc(sc.bind(null,i,l,e),[e]),i.flags|=2048,Wa(9,rc.bind(null,i,l,o,t),void 0,null),o},useId:function(){var e=uo(),t=dt.identifierPrefix;if(Ge){var o=bo,i=vo;o=(i&~(1<<32-De(i)-1)).toString(32)+o,t=":"+t+"R"+o,o=Fa++,0<o&&(t+="H"+o.toString(32)),t+=":"}else o=Wg++,t=":"+t+"r"+o.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},$g={readContext:Bt,useCallback:yc,useContext:Bt,useEffect:Ds,useImperativeHandle:fc,useInsertionEffect:gc,useLayoutEffect:hc,useMemo:Sc,useReducer:js,useRef:dc,useState:function(){return js(qa)},useDebugValue:Ms,useDeferredValue:function(e){var t=Ot();return vc(t,lt.memoizedState,e)},useTransition:function(){var e=js(qa)[0],t=Ot().memoizedState;return[e,t]},useMutableSource:ic,useSyncExternalStore:ac,useId:bc,unstable_isNewReconciler:!1},Qg={readContext:Bt,useCallback:yc,useContext:Bt,useEffect:Ds,useImperativeHandle:fc,useInsertionEffect:gc,useLayoutEffect:hc,useMemo:Sc,useReducer:zs,useRef:dc,useState:function(){return zs(qa)},useDebugValue:Ms,useDeferredValue:function(e){var t=Ot();return lt===null?t.memoizedState=e:vc(t,lt.memoizedState,e)},useTransition:function(){var e=zs(qa)[0],t=Ot().memoizedState;return[e,t]},useMutableSource:ic,useSyncExternalStore:ac,useId:bc,unstable_isNewReconciler:!1};function Gt(e,t){if(e&&e.defaultProps){t=Y({},t),e=e.defaultProps;for(var o in e)t[o]===void 0&&(t[o]=e[o]);return t}return t}function _s(e,t,o,i){t=e.memoizedState,o=o(i,t),o=o==null?t:Y({},t,o),e.memoizedState=o,e.lanes===0&&(e.updateQueue.baseState=o)}var Zn={isMounted:function(e){return(e=e._reactInternals)?Z(e)===e:!1},enqueueSetState:function(e,t,o){e=e._reactInternals;var i=Pt(),n=Xo(e),l=ko(i,n);l.payload=t,o!=null&&(l.callback=o),t=$o(e,l,n),t!==null&&(Zt(t,e,n,i),qn(t,e,n))},enqueueReplaceState:function(e,t,o){e=e._reactInternals;var i=Pt(),n=Xo(e),l=ko(i,n);l.tag=1,l.payload=t,o!=null&&(l.callback=o),t=$o(e,l,n),t!==null&&(Zt(t,e,n,i),qn(t,e,n))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var o=Pt(),i=Xo(e),n=ko(o,i);n.tag=2,t!=null&&(n.callback=t),t=$o(e,n,i),t!==null&&(Zt(t,e,i,o),qn(t,e,i))}};function Cc(e,t,o,i,n,l,c){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(i,l,c):t.prototype&&t.prototype.isPureReactComponent?!Ea(o,i)||!Ea(n,l):!0}function xc(e,t,o){var i=!1,n=Yo,l=t.contextType;return typeof l=="object"&&l!==null?l=Bt(l):(n=xt(t)?mi:yt.current,i=t.contextTypes,l=(i=i!=null)?Yi(e,n):Yo),t=new t(o,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=Zn,e.stateNode=t,t._reactInternals=e,i&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=l),t}function Rc(e,t,o,i){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(o,i),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(o,i),t.state!==e&&Zn.enqueueReplaceState(t,t.state,null)}function Ls(e,t,o,i){var n=e.stateNode;n.props=o,n.state=e.memoizedState,n.refs={},ks(e);var l=t.contextType;typeof l=="object"&&l!==null?n.context=Bt(l):(l=xt(t)?mi:yt.current,n.context=Yi(e,l)),n.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(_s(e,t,l,o),n.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof n.getSnapshotBeforeUpdate=="function"||typeof n.UNSAFE_componentWillMount!="function"&&typeof n.componentWillMount!="function"||(t=n.state,typeof n.componentWillMount=="function"&&n.componentWillMount(),typeof n.UNSAFE_componentWillMount=="function"&&n.UNSAFE_componentWillMount(),t!==n.state&&Zn.enqueueReplaceState(n,n.state,null),Wn(e,o,n,i),n.state=e.memoizedState),typeof n.componentDidMount=="function"&&(e.flags|=4194308)}function ea(e,t){try{var o="",i=t;do o+=me(i),i=i.return;while(i);var n=o}catch(l){n=`
37
+ `),d=n.length-1,h=l.length-1;1<=d&&0<=h&&n[d]!==l[h];)h--;for(;1<=d&&0<=h;d--,h--)if(n[d]!==l[h]){if(d!==1||h!==1)do if(d--,h--,0>h||n[d]!==l[h]){var S=`
38
+ `+n[d].replace(" at new "," at ");return e.displayName&&S.includes("<anonymous>")&&(S=S.replace("<anonymous>",e.displayName)),S}while(1<=d&&0<=h);break}}}finally{pe=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?D(e):""}function he(e){switch(e.tag){case 5:return D(e.type);case 16:return D("Lazy");case 13:return D("Suspense");case 19:return D("SuspenseList");case 0:case 2:case 15:return e=fe(e.type,!1),e;case 11:return e=fe(e.type.render,!1),e;case 1:return e=fe(e.type,!0),e;default:return""}}function be(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case I:return"Fragment";case je:return"Portal";case ve:return"Profiler";case K:return"StrictMode";case Ue:return"Suspense";case ke:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case _e:return(e.displayName||"Context")+".Consumer";case se:return(e._context.displayName||"Context")+".Provider";case we:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case $e:return t=e.displayName||null,t!==null?t:be(e.type)||"Memo";case Xe:t=e._payload,e=e._init;try{return be(e(t))}catch{}}return null}function Re(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return be(t);case 8:return t===K?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Te(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Ne(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ct(e){var t=Ne(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),i=""+e[t];if(!e.hasOwnProperty(t)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var n=o.get,l=o.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return n.call(this)},set:function(d){i=""+d,l.call(this,d)}}),Object.defineProperty(e,t,{enumerable:o.enumerable}),{getValue:function(){return i},setValue:function(d){i=""+d},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function mo(e){e._valueTracker||(e._valueTracker=ct(e))}function ot(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var o=t.getValue(),i="";return e&&(i=Ne(e)?e.checked?"true":"false":e.value),e=i,e!==o?(t.setValue(e),!0):!1}function ge(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function et(e,t){var o=t.checked;return Y({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function ht(e,t){var o=t.defaultValue==null?"":t.defaultValue,i=t.checked!=null?t.checked:t.defaultChecked;o=Te(t.value!=null?t.value:o),e._wrapperState={initialChecked:i,initialValue:o,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Rt(e,t){t=t.checked,t!=null&&Z(e,"checked",t,!1)}function ui(e,t){Rt(e,t);var o=Te(t.value),i=t.type;if(o!=null)i==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(i==="submit"||i==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Mi(e,t.type,o):t.hasOwnProperty("defaultValue")&&Mi(e,t.type,Te(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function cn(e,t,o){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var i=t.type;if(!(i!=="submit"&&i!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,o||t===e.value||(e.value=t),e.defaultValue=t}o=e.name,o!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,o!==""&&(e.name=o)}function Mi(e,t,o){(t!=="number"||ge(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var ci=Array.isArray;function Do(e,t,o,i){if(e=e.options,t){t={};for(var n=0;n<o.length;n++)t["$"+o[n]]=!0;for(o=0;o<e.length;o++)n=t.hasOwnProperty("$"+e[o].value),e[o].selected!==n&&(e[o].selected=n),n&&i&&(e[o].defaultSelected=!0)}else{for(o=""+Te(o),t=null,n=0;n<e.length;n++){if(e[n].value===o){e[n].selected=!0,i&&(e[n].defaultSelected=!0);return}t!==null||e[n].disabled||(t=e[n])}t!==null&&(t.selected=!0)}}function pa(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(s(91));return Y({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function dn(e,t){var o=t.value;if(o==null){if(o=t.children,t=t.defaultValue,o!=null){if(t!=null)throw Error(s(92));if(ci(o)){if(1<o.length)throw Error(s(93));o=o[0]}t=o}t==null&&(t=""),o=t}e._wrapperState={initialValue:Te(o)}}function ao(e,t){var o=Te(t.value),i=Te(t.defaultValue);o!=null&&(o=""+o,o!==e.value&&(e.value=o),t.defaultValue==null&&e.defaultValue!==o&&(e.defaultValue=o)),i!=null&&(e.defaultValue=""+i)}function Mo(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function ga(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function di(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?ga(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Mt,Bt=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,o,i,n){MSApp.execUnsafeLocalFunction(function(){return e(t,o,i,n)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Mt=Mt||document.createElement("div"),Mt.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Mt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function _o(e,t){if(t){var o=e.firstChild;if(o&&o===e.lastChild&&o.nodeType===3){o.nodeValue=t;return}}e.textContent=t}var no={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Dr=["Webkit","ms","Moz","O"];Object.keys(no).forEach(function(e){Dr.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),no[t]=no[e]})});function Kt(e,t,o){return t==null||typeof t=="boolean"||t===""?"":o||typeof t!="number"||t===0||no.hasOwnProperty(e)&&no[e]?(""+t).trim():t+"px"}function ha(e,t){e=e.style;for(var o in t)if(t.hasOwnProperty(o)){var i=o.indexOf("--")===0,n=Kt(o,t[o],i);o==="float"&&(o="cssFloat"),i?e.setProperty(o,n):e[o]=n}}var pn=Y({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function _i(e,t){if(t){if(pn[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(s(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(s(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(s(61))}if(t.style!=null&&typeof t.style!="object")throw Error(s(62))}}function ma(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ui=null;function Uo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Li=null,ro=null,so=null;function gn(e){if(e=La(e)){if(typeof Li!="function")throw Error(s(280));var t=e.stateNode;t&&(t=_n(t),Li(e.stateNode,e.type,t))}}function fa(e){ro?so?so.push(e):so=[e]:ro=e}function hn(){if(ro){var e=ro,t=so;if(so=ro=null,gn(e),t)for(e=0;e<t.length;e++)gn(t[e])}}function ya(e,t){return e(t)}function pi(){}var Lo=!1;function mn(e,t,o){if(Lo)return e(t,o);Lo=!0;try{return ya(e,t,o)}finally{Lo=!1,(ro!==null||so!==null)&&(pi(),hn())}}function gi(e,t){var o=e.stateNode;if(o===null)return null;var i=_n(o);if(i===null)return null;o=i[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(i=!i.disabled)||(e=e.type,i=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!i;break e;default:e=!1}if(e)return null;if(o&&typeof o!="function")throw Error(s(231,t,typeof o));return o}var y=!1;if(f)try{var C={};Object.defineProperty(C,"passive",{get:function(){y=!0}}),window.addEventListener("test",C,C),window.removeEventListener("test",C,C)}catch{y=!1}function E(e,t,o,i,n,l,d,h,S){var A=Array.prototype.slice.call(arguments,3);try{t.apply(o,A)}catch(N){this.onError(N)}}var M=!1,V=null,ne=!1,de=null,X={onError:function(e){M=!0,V=e}};function oe(e,t,o,i,n,l,d,h,S){M=!1,V=null,E.apply(X,arguments)}function $(e,t,o,i,n,l,d,h,S){if(oe.apply(this,arguments),M){if(M){var A=V;M=!1,V=null}else throw Error(s(198));ne||(ne=!0,de=A)}}function J(e){var t=e,o=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(o=t.return),e=t.return;while(e)}return t.tag===3?o:null}function Se(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function xe(e){if(J(e)!==e)throw Error(s(188))}function st(e){var t=e.alternate;if(!t){if(t=J(e),t===null)throw Error(s(188));return t!==e?null:e}for(var o=e,i=t;;){var n=o.return;if(n===null)break;var l=n.alternate;if(l===null){if(i=n.return,i!==null){o=i;continue}break}if(n.child===l.child){for(l=n.child;l;){if(l===o)return xe(n),e;if(l===i)return xe(n),t;l=l.sibling}throw Error(s(188))}if(o.return!==i.return)o=n,i=l;else{for(var d=!1,h=n.child;h;){if(h===o){d=!0,o=n,i=l;break}if(h===i){d=!0,i=n,o=l;break}h=h.sibling}if(!d){for(h=l.child;h;){if(h===o){d=!0,o=l,i=n;break}if(h===i){d=!0,i=l,o=n;break}h=h.sibling}if(!d)throw Error(s(189))}}if(o.alternate!==i)throw Error(s(190))}if(o.tag!==3)throw Error(s(188));return o.stateNode.current===o?e:t}function He(e){return e=st(e),e!==null?Ie(e):null}function Ie(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=Ie(e);if(t!==null)return t;e=e.sibling}return null}var We=r.unstable_scheduleCallback,fo=r.unstable_cancelCallback,hi=r.unstable_shouldYield,Gt=r.unstable_requestPaint,ze=r.unstable_now,Sa=r.unstable_getCurrentPriorityLevel,yo=r.unstable_ImmediatePriority,lo=r.unstable_UserBlockingPriority,So=r.unstable_NormalPriority,Ni=r.unstable_LowPriority,Ae=r.unstable_IdlePriority,Fe=null,mt=null;function mi(e){if(mt&&typeof mt.onCommitFiberRoot=="function")try{mt.onCommitFiberRoot(Fe,e,void 0,(e.current.flags&128)===128)}catch{}}var De=Math.clz32?Math.clz32:Mr,No=Math.log,fn=Math.LN2;function Mr(e){return e>>>=0,e===0?32:31-(No(e)/fn|0)|0}var yn=64,Sn=4194304;function va(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function vn(e,t){var o=e.pendingLanes;if(o===0)return 0;var i=0,n=e.suspendedLanes,l=e.pingedLanes,d=o&268435455;if(d!==0){var h=d&~n;h!==0?i=va(h):(l&=d,l!==0&&(i=va(l)))}else d=o&~n,d!==0?i=va(d):l!==0&&(i=va(l));if(i===0)return 0;if(t!==0&&t!==i&&(t&n)===0&&(n=i&-i,l=t&-t,n>=l||n===16&&(l&4194240)!==0))return t;if((i&4)!==0&&(i|=o&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=i;0<t;)o=31-De(t),n=1<<o,i|=e[o],t&=~n;return i}function Fp(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function qp(e,t){for(var o=e.suspendedLanes,i=e.pingedLanes,n=e.expirationTimes,l=e.pendingLanes;0<l;){var d=31-De(l),h=1<<d,S=n[d];S===-1?((h&o)===0||(h&i)!==0)&&(n[d]=Fp(h,t)):S<=t&&(e.expiredLanes|=h),l&=~h}}function _r(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function $l(){var e=yn;return yn<<=1,(yn&4194240)===0&&(yn=64),e}function Ur(e){for(var t=[],o=0;31>o;o++)t.push(e);return t}function ba(e,t,o){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-De(t),e[t]=o}function Wp(e,t){var o=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var i=e.eventTimes;for(e=e.expirationTimes;0<o;){var n=31-De(o),l=1<<n;t[n]=0,i[n]=-1,e[n]=-1,o&=~l}}function Lr(e,t){var o=e.entangledLanes|=t;for(e=e.entanglements;o;){var i=31-De(o),n=1<<i;n&t|e[i]&t&&(e[i]|=t),o&=~n}}var Be=0;function Ql(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var Jl,Nr,Zl,Xl,eu,Hr=!1,bn=[],Ho=null,Bo=null,Oo=null,wa=new Map,ka=new Map,Fo=[],Vp="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" ");function tu(e,t){switch(e){case"focusin":case"focusout":Ho=null;break;case"dragenter":case"dragleave":Bo=null;break;case"mouseover":case"mouseout":Oo=null;break;case"pointerover":case"pointerout":wa.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ka.delete(t.pointerId)}}function Pa(e,t,o,i,n,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:o,eventSystemFlags:i,nativeEvent:l,targetContainers:[n]},t!==null&&(t=La(t),t!==null&&Nr(t)),e):(e.eventSystemFlags|=i,t=e.targetContainers,n!==null&&t.indexOf(n)===-1&&t.push(n),e)}function Yp(e,t,o,i,n){switch(t){case"focusin":return Ho=Pa(Ho,e,t,o,i,n),!0;case"dragenter":return Bo=Pa(Bo,e,t,o,i,n),!0;case"mouseover":return Oo=Pa(Oo,e,t,o,i,n),!0;case"pointerover":var l=n.pointerId;return wa.set(l,Pa(wa.get(l)||null,e,t,o,i,n)),!0;case"gotpointercapture":return l=n.pointerId,ka.set(l,Pa(ka.get(l)||null,e,t,o,i,n)),!0}return!1}function ou(e){var t=fi(e.target);if(t!==null){var o=J(t);if(o!==null){if(t=o.tag,t===13){if(t=Se(o),t!==null){e.blockedOn=t,eu(e.priority,function(){Zl(o)});return}}else if(t===3&&o.stateNode.current.memoizedState.isDehydrated){e.blockedOn=o.tag===3?o.stateNode.containerInfo:null;return}}}e.blockedOn=null}function wn(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var o=Or(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(o===null){o=e.nativeEvent;var i=new o.constructor(o.type,o);Ui=i,o.target.dispatchEvent(i),Ui=null}else return t=La(o),t!==null&&Nr(t),e.blockedOn=o,!1;t.shift()}return!0}function iu(e,t,o){wn(e)&&o.delete(t)}function Kp(){Hr=!1,Ho!==null&&wn(Ho)&&(Ho=null),Bo!==null&&wn(Bo)&&(Bo=null),Oo!==null&&wn(Oo)&&(Oo=null),wa.forEach(iu),ka.forEach(iu)}function Ca(e,t){e.blockedOn===t&&(e.blockedOn=null,Hr||(Hr=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Kp)))}function xa(e){function t(n){return Ca(n,e)}if(0<bn.length){Ca(bn[0],e);for(var o=1;o<bn.length;o++){var i=bn[o];i.blockedOn===e&&(i.blockedOn=null)}}for(Ho!==null&&Ca(Ho,e),Bo!==null&&Ca(Bo,e),Oo!==null&&Ca(Oo,e),wa.forEach(t),ka.forEach(t),o=0;o<Fo.length;o++)i=Fo[o],i.blockedOn===e&&(i.blockedOn=null);for(;0<Fo.length&&(o=Fo[0],o.blockedOn===null);)ou(o),o.blockedOn===null&&Fo.shift()}var Hi=te.ReactCurrentBatchConfig,kn=!0;function Gp(e,t,o,i){var n=Be,l=Hi.transition;Hi.transition=null;try{Be=1,Br(e,t,o,i)}finally{Be=n,Hi.transition=l}}function $p(e,t,o,i){var n=Be,l=Hi.transition;Hi.transition=null;try{Be=4,Br(e,t,o,i)}finally{Be=n,Hi.transition=l}}function Br(e,t,o,i){if(kn){var n=Or(e,t,o,i);if(n===null)as(e,t,i,Pn,o),tu(e,i);else if(Yp(n,e,t,o,i))i.stopPropagation();else if(tu(e,i),t&4&&-1<Vp.indexOf(e)){for(;n!==null;){var l=La(n);if(l!==null&&Jl(l),l=Or(e,t,o,i),l===null&&as(e,t,i,Pn,o),l===n)break;n=l}n!==null&&i.stopPropagation()}else as(e,t,i,null,o)}}var Pn=null;function Or(e,t,o,i){if(Pn=null,e=Uo(i),e=fi(e),e!==null)if(t=J(e),t===null)e=null;else if(o=t.tag,o===13){if(e=Se(t),e!==null)return e;e=null}else if(o===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Pn=e,null}function au(e){switch(e){case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 1;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"toggle":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 4;case"message":switch(Sa()){case yo:return 1;case lo:return 4;case So:case Ni:return 16;case Ae:return 536870912;default:return 16}default:return 16}}var qo=null,Fr=null,Cn=null;function nu(){if(Cn)return Cn;var e,t=Fr,o=t.length,i,n="value"in qo?qo.value:qo.textContent,l=n.length;for(e=0;e<o&&t[e]===n[e];e++);var d=o-e;for(i=1;i<=d&&t[o-i]===n[l-i];i++);return Cn=n.slice(e,1<i?1-i:void 0)}function xn(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Rn(){return!0}function ru(){return!1}function _t(e){function t(o,i,n,l,d){this._reactName=o,this._targetInst=n,this.type=i,this.nativeEvent=l,this.target=d,this.currentTarget=null;for(var h in e)e.hasOwnProperty(h)&&(o=e[h],this[h]=o?o(l):l[h]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Rn:ru,this.isPropagationStopped=ru,this}return Y(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var o=this.nativeEvent;o&&(o.preventDefault?o.preventDefault():typeof o.returnValue!="unknown"&&(o.returnValue=!1),this.isDefaultPrevented=Rn)},stopPropagation:function(){var o=this.nativeEvent;o&&(o.stopPropagation?o.stopPropagation():typeof o.cancelBubble!="unknown"&&(o.cancelBubble=!0),this.isPropagationStopped=Rn)},persist:function(){},isPersistent:Rn}),t}var Bi={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},qr=_t(Bi),Ra=Y({},Bi,{view:0,detail:0}),Qp=_t(Ra),Wr,Vr,Ta,Tn=Y({},Ra,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Kr,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Ta&&(Ta&&e.type==="mousemove"?(Wr=e.screenX-Ta.screenX,Vr=e.screenY-Ta.screenY):Vr=Wr=0,Ta=e),Wr)},movementY:function(e){return"movementY"in e?e.movementY:Vr}}),su=_t(Tn),Jp=Y({},Tn,{dataTransfer:0}),Zp=_t(Jp),Xp=Y({},Ra,{relatedTarget:0}),Yr=_t(Xp),eg=Y({},Bi,{animationName:0,elapsedTime:0,pseudoElement:0}),tg=_t(eg),og=Y({},Bi,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),ig=_t(og),ag=Y({},Bi,{data:0}),lu=_t(ag),ng={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},rg={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},sg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function lg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=sg[e])?!!t[e]:!1}function Kr(){return lg}var ug=Y({},Ra,{key:function(e){if(e.key){var t=ng[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=xn(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?rg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Kr,charCode:function(e){return e.type==="keypress"?xn(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?xn(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),cg=_t(ug),dg=Y({},Tn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),uu=_t(dg),pg=Y({},Ra,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Kr}),gg=_t(pg),hg=Y({},Bi,{propertyName:0,elapsedTime:0,pseudoElement:0}),mg=_t(hg),fg=Y({},Tn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),yg=_t(fg),Sg=[9,13,27,32],Gr=f&&"CompositionEvent"in window,Aa=null;f&&"documentMode"in document&&(Aa=document.documentMode);var vg=f&&"TextEvent"in window&&!Aa,cu=f&&(!Gr||Aa&&8<Aa&&11>=Aa),du=" ",pu=!1;function gu(e,t){switch(e){case"keyup":return Sg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function hu(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Oi=!1;function bg(e,t){switch(e){case"compositionend":return hu(t);case"keypress":return t.which!==32?null:(pu=!0,du);case"textInput":return e=t.data,e===du&&pu?null:e;default:return null}}function wg(e,t){if(Oi)return e==="compositionend"||!Gr&&gu(e,t)?(e=nu(),Cn=Fr=qo=null,Oi=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return cu&&t.locale!=="ko"?null:t.data;default:return null}}var kg={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function mu(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!kg[e.type]:t==="textarea"}function fu(e,t,o,i){fa(i),t=zn(t,"onChange"),0<t.length&&(o=new qr("onChange","change",null,o,i),e.push({event:o,listeners:t}))}var Ia=null,Ea=null;function Pg(e){Mu(e,0)}function An(e){var t=Yi(e);if(ot(t))return e}function Cg(e,t){if(e==="change")return t}var yu=!1;if(f){var $r;if(f){var Qr="oninput"in document;if(!Qr){var Su=document.createElement("div");Su.setAttribute("oninput","return;"),Qr=typeof Su.oninput=="function"}$r=Qr}else $r=!1;yu=$r&&(!document.documentMode||9<document.documentMode)}function vu(){Ia&&(Ia.detachEvent("onpropertychange",bu),Ea=Ia=null)}function bu(e){if(e.propertyName==="value"&&An(Ea)){var t=[];fu(t,Ea,e,Uo(e)),mn(Pg,t)}}function xg(e,t,o){e==="focusin"?(vu(),Ia=t,Ea=o,Ia.attachEvent("onpropertychange",bu)):e==="focusout"&&vu()}function Rg(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return An(Ea)}function Tg(e,t){if(e==="click")return An(t)}function Ag(e,t){if(e==="input"||e==="change")return An(t)}function Ig(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var $t=typeof Object.is=="function"?Object.is:Ig;function ja(e,t){if($t(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var o=Object.keys(e),i=Object.keys(t);if(o.length!==i.length)return!1;for(i=0;i<o.length;i++){var n=o[i];if(!m.call(t,n)||!$t(e[n],t[n]))return!1}return!0}function wu(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function ku(e,t){var o=wu(e);e=0;for(var i;o;){if(o.nodeType===3){if(i=e+o.textContent.length,e<=t&&i>=t)return{node:o,offset:t-e};e=i}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=wu(o)}}function Pu(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Pu(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Cu(){for(var e=window,t=ge();t instanceof e.HTMLIFrameElement;){try{var o=typeof t.contentWindow.location.href=="string"}catch{o=!1}if(o)e=t.contentWindow;else break;t=ge(e.document)}return t}function Jr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Eg(e){var t=Cu(),o=e.focusedElem,i=e.selectionRange;if(t!==o&&o&&o.ownerDocument&&Pu(o.ownerDocument.documentElement,o)){if(i!==null&&Jr(o)){if(t=i.start,e=i.end,e===void 0&&(e=t),"selectionStart"in o)o.selectionStart=t,o.selectionEnd=Math.min(e,o.value.length);else if(e=(t=o.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var n=o.textContent.length,l=Math.min(i.start,n);i=i.end===void 0?l:Math.min(i.end,n),!e.extend&&l>i&&(n=i,i=l,l=n),n=ku(o,l);var d=ku(o,i);n&&d&&(e.rangeCount!==1||e.anchorNode!==n.node||e.anchorOffset!==n.offset||e.focusNode!==d.node||e.focusOffset!==d.offset)&&(t=t.createRange(),t.setStart(n.node,n.offset),e.removeAllRanges(),l>i?(e.addRange(t),e.extend(d.node,d.offset)):(t.setEnd(d.node,d.offset),e.addRange(t)))}}for(t=[],e=o;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof o.focus=="function"&&o.focus(),o=0;o<t.length;o++)e=t[o],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var jg=f&&"documentMode"in document&&11>=document.documentMode,Fi=null,Zr=null,za=null,Xr=!1;function xu(e,t,o){var i=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;Xr||Fi==null||Fi!==ge(i)||(i=Fi,"selectionStart"in i&&Jr(i)?i={start:i.selectionStart,end:i.selectionEnd}:(i=(i.ownerDocument&&i.ownerDocument.defaultView||window).getSelection(),i={anchorNode:i.anchorNode,anchorOffset:i.anchorOffset,focusNode:i.focusNode,focusOffset:i.focusOffset}),za&&ja(za,i)||(za=i,i=zn(Zr,"onSelect"),0<i.length&&(t=new qr("onSelect","select",null,t,o),e.push({event:t,listeners:i}),t.target=Fi)))}function In(e,t){var o={};return o[e.toLowerCase()]=t.toLowerCase(),o["Webkit"+e]="webkit"+t,o["Moz"+e]="moz"+t,o}var qi={animationend:In("Animation","AnimationEnd"),animationiteration:In("Animation","AnimationIteration"),animationstart:In("Animation","AnimationStart"),transitionend:In("Transition","TransitionEnd")},es={},Ru={};f&&(Ru=document.createElement("div").style,"AnimationEvent"in window||(delete qi.animationend.animation,delete qi.animationiteration.animation,delete qi.animationstart.animation),"TransitionEvent"in window||delete qi.transitionend.transition);function En(e){if(es[e])return es[e];if(!qi[e])return e;var t=qi[e],o;for(o in t)if(t.hasOwnProperty(o)&&o in Ru)return es[e]=t[o];return e}var Tu=En("animationend"),Au=En("animationiteration"),Iu=En("animationstart"),Eu=En("transitionend"),ju=new Map,zu="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function Wo(e,t){ju.set(e,t),p(t,[e])}for(var ts=0;ts<zu.length;ts++){var os=zu[ts],zg=os.toLowerCase(),Dg=os[0].toUpperCase()+os.slice(1);Wo(zg,"on"+Dg)}Wo(Tu,"onAnimationEnd"),Wo(Au,"onAnimationIteration"),Wo(Iu,"onAnimationStart"),Wo("dblclick","onDoubleClick"),Wo("focusin","onFocus"),Wo("focusout","onBlur"),Wo(Eu,"onTransitionEnd"),g("onMouseEnter",["mouseout","mouseover"]),g("onMouseLeave",["mouseout","mouseover"]),g("onPointerEnter",["pointerout","pointerover"]),g("onPointerLeave",["pointerout","pointerover"]),p("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),p("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),p("onBeforeInput",["compositionend","keypress","textInput","paste"]),p("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),p("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Da="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Mg=new Set("cancel close invalid load scroll toggle".split(" ").concat(Da));function Du(e,t,o){var i=e.type||"unknown-event";e.currentTarget=o,$(i,t,void 0,e),e.currentTarget=null}function Mu(e,t){t=(t&4)!==0;for(var o=0;o<e.length;o++){var i=e[o],n=i.event;i=i.listeners;e:{var l=void 0;if(t)for(var d=i.length-1;0<=d;d--){var h=i[d],S=h.instance,A=h.currentTarget;if(h=h.listener,S!==l&&n.isPropagationStopped())break e;Du(n,h,A),l=S}else for(d=0;d<i.length;d++){if(h=i[d],S=h.instance,A=h.currentTarget,h=h.listener,S!==l&&n.isPropagationStopped())break e;Du(n,h,A),l=S}}}if(ne)throw e=de,ne=!1,de=null,e}function Ve(e,t){var o=t[cs];o===void 0&&(o=t[cs]=new Set);var i=e+"__bubble";o.has(i)||(_u(t,e,2,!1),o.add(i))}function is(e,t,o){var i=0;t&&(i|=4),_u(o,e,i,t)}var jn="_reactListening"+Math.random().toString(36).slice(2);function Ma(e){if(!e[jn]){e[jn]=!0,u.forEach(function(o){o!=="selectionchange"&&(Mg.has(o)||is(o,!1,e),is(o,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[jn]||(t[jn]=!0,is("selectionchange",!1,t))}}function _u(e,t,o,i){switch(au(t)){case 1:var n=Gp;break;case 4:n=$p;break;default:n=Br}o=n.bind(null,t,o,e),n=void 0,!y||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(n=!0),i?n!==void 0?e.addEventListener(t,o,{capture:!0,passive:n}):e.addEventListener(t,o,!0):n!==void 0?e.addEventListener(t,o,{passive:n}):e.addEventListener(t,o,!1)}function as(e,t,o,i,n){var l=i;if((t&1)===0&&(t&2)===0&&i!==null)e:for(;;){if(i===null)return;var d=i.tag;if(d===3||d===4){var h=i.stateNode.containerInfo;if(h===n||h.nodeType===8&&h.parentNode===n)break;if(d===4)for(d=i.return;d!==null;){var S=d.tag;if((S===3||S===4)&&(S=d.stateNode.containerInfo,S===n||S.nodeType===8&&S.parentNode===n))return;d=d.return}for(;h!==null;){if(d=fi(h),d===null)return;if(S=d.tag,S===5||S===6){i=l=d;continue e}h=h.parentNode}}i=i.return}mn(function(){var A=l,N=Uo(o),B=[];e:{var U=ju.get(e);if(U!==void 0){var G=qr,ee=e;switch(e){case"keypress":if(xn(o)===0)break e;case"keydown":case"keyup":G=cg;break;case"focusin":ee="focus",G=Yr;break;case"focusout":ee="blur",G=Yr;break;case"beforeblur":case"afterblur":G=Yr;break;case"click":if(o.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":G=su;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":G=Zp;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":G=gg;break;case Tu:case Au:case Iu:G=tg;break;case Eu:G=mg;break;case"scroll":G=Qp;break;case"wheel":G=yg;break;case"copy":case"cut":case"paste":G=ig;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":G=uu}var ie=(t&4)!==0,it=!ie&&e==="scroll",x=ie?U!==null?U+"Capture":null:U;ie=[];for(var b=A,T;b!==null;){T=b;var q=T.stateNode;if(T.tag===5&&q!==null&&(T=q,x!==null&&(q=gi(b,x),q!=null&&ie.push(_a(b,q,T)))),it)break;b=b.return}0<ie.length&&(U=new G(U,ee,null,o,N),B.push({event:U,listeners:ie}))}}if((t&7)===0){e:{if(U=e==="mouseover"||e==="pointerover",G=e==="mouseout"||e==="pointerout",U&&o!==Ui&&(ee=o.relatedTarget||o.fromElement)&&(fi(ee)||ee[vo]))break e;if((G||U)&&(U=N.window===N?N:(U=N.ownerDocument)?U.defaultView||U.parentWindow:window,G?(ee=o.relatedTarget||o.toElement,G=A,ee=ee?fi(ee):null,ee!==null&&(it=J(ee),ee!==it||ee.tag!==5&&ee.tag!==6)&&(ee=null)):(G=null,ee=A),G!==ee)){if(ie=su,q="onMouseLeave",x="onMouseEnter",b="mouse",(e==="pointerout"||e==="pointerover")&&(ie=uu,q="onPointerLeave",x="onPointerEnter",b="pointer"),it=G==null?U:Yi(G),T=ee==null?U:Yi(ee),U=new ie(q,b+"leave",G,o,N),U.target=it,U.relatedTarget=T,q=null,fi(N)===A&&(ie=new ie(x,b+"enter",ee,o,N),ie.target=T,ie.relatedTarget=it,q=ie),it=q,G&&ee)t:{for(ie=G,x=ee,b=0,T=ie;T;T=Wi(T))b++;for(T=0,q=x;q;q=Wi(q))T++;for(;0<b-T;)ie=Wi(ie),b--;for(;0<T-b;)x=Wi(x),T--;for(;b--;){if(ie===x||x!==null&&ie===x.alternate)break t;ie=Wi(ie),x=Wi(x)}ie=null}else ie=null;G!==null&&Uu(B,U,G,ie,!1),ee!==null&&it!==null&&Uu(B,it,ee,ie,!0)}}e:{if(U=A?Yi(A):window,G=U.nodeName&&U.nodeName.toLowerCase(),G==="select"||G==="input"&&U.type==="file")var ae=Cg;else if(mu(U))if(yu)ae=Ag;else{ae=Rg;var ue=xg}else(G=U.nodeName)&&G.toLowerCase()==="input"&&(U.type==="checkbox"||U.type==="radio")&&(ae=Tg);if(ae&&(ae=ae(e,A))){fu(B,ae,o,N);break e}ue&&ue(e,U,A),e==="focusout"&&(ue=U._wrapperState)&&ue.controlled&&U.type==="number"&&Mi(U,"number",U.value)}switch(ue=A?Yi(A):window,e){case"focusin":(mu(ue)||ue.contentEditable==="true")&&(Fi=ue,Zr=A,za=null);break;case"focusout":za=Zr=Fi=null;break;case"mousedown":Xr=!0;break;case"contextmenu":case"mouseup":case"dragend":Xr=!1,xu(B,o,N);break;case"selectionchange":if(jg)break;case"keydown":case"keyup":xu(B,o,N)}var ce;if(Gr)e:{switch(e){case"compositionstart":var me="onCompositionStart";break e;case"compositionend":me="onCompositionEnd";break e;case"compositionupdate":me="onCompositionUpdate";break e}me=void 0}else Oi?gu(e,o)&&(me="onCompositionEnd"):e==="keydown"&&o.keyCode===229&&(me="onCompositionStart");me&&(cu&&o.locale!=="ko"&&(Oi||me!=="onCompositionStart"?me==="onCompositionEnd"&&Oi&&(ce=nu()):(qo=N,Fr="value"in qo?qo.value:qo.textContent,Oi=!0)),ue=zn(A,me),0<ue.length&&(me=new lu(me,e,null,o,N),B.push({event:me,listeners:ue}),ce?me.data=ce:(ce=hu(o),ce!==null&&(me.data=ce)))),(ce=vg?bg(e,o):wg(e,o))&&(A=zn(A,"onBeforeInput"),0<A.length&&(N=new lu("onBeforeInput","beforeinput",null,o,N),B.push({event:N,listeners:A}),N.data=ce))}Mu(B,t)})}function _a(e,t,o){return{instance:e,listener:t,currentTarget:o}}function zn(e,t){for(var o=t+"Capture",i=[];e!==null;){var n=e,l=n.stateNode;n.tag===5&&l!==null&&(n=l,l=gi(e,o),l!=null&&i.unshift(_a(e,l,n)),l=gi(e,t),l!=null&&i.push(_a(e,l,n))),e=e.return}return i}function Wi(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Uu(e,t,o,i,n){for(var l=t._reactName,d=[];o!==null&&o!==i;){var h=o,S=h.alternate,A=h.stateNode;if(S!==null&&S===i)break;h.tag===5&&A!==null&&(h=A,n?(S=gi(o,l),S!=null&&d.unshift(_a(o,S,h))):n||(S=gi(o,l),S!=null&&d.push(_a(o,S,h)))),o=o.return}d.length!==0&&e.push({event:t,listeners:d})}var _g=/\r\n?/g,Ug=/\u0000|\uFFFD/g;function Lu(e){return(typeof e=="string"?e:""+e).replace(_g,`
39
+ `).replace(Ug,"")}function Dn(e,t,o){if(t=Lu(t),Lu(e)!==t&&o)throw Error(s(425))}function Mn(){}var ns=null,rs=null;function ss(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var ls=typeof setTimeout=="function"?setTimeout:void 0,Lg=typeof clearTimeout=="function"?clearTimeout:void 0,Nu=typeof Promise=="function"?Promise:void 0,Ng=typeof queueMicrotask=="function"?queueMicrotask:typeof Nu<"u"?function(e){return Nu.resolve(null).then(e).catch(Hg)}:ls;function Hg(e){setTimeout(function(){throw e})}function us(e,t){var o=t,i=0;do{var n=o.nextSibling;if(e.removeChild(o),n&&n.nodeType===8)if(o=n.data,o==="/$"){if(i===0){e.removeChild(n),xa(t);return}i--}else o!=="$"&&o!=="$?"&&o!=="$!"||i++;o=n}while(o);xa(t)}function Vo(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?")break;if(t==="/$")return null}}return e}function Hu(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="$"||o==="$!"||o==="$?"){if(t===0)return e;t--}else o==="/$"&&t++}e=e.previousSibling}return null}var Vi=Math.random().toString(36).slice(2),uo="__reactFiber$"+Vi,Ua="__reactProps$"+Vi,vo="__reactContainer$"+Vi,cs="__reactEvents$"+Vi,Bg="__reactListeners$"+Vi,Og="__reactHandles$"+Vi;function fi(e){var t=e[uo];if(t)return t;for(var o=e.parentNode;o;){if(t=o[vo]||o[uo]){if(o=t.alternate,t.child!==null||o!==null&&o.child!==null)for(e=Hu(e);e!==null;){if(o=e[uo])return o;e=Hu(e)}return t}e=o,o=e.parentNode}return null}function La(e){return e=e[uo]||e[vo],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Yi(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(s(33))}function _n(e){return e[Ua]||null}var ds=[],Ki=-1;function Yo(e){return{current:e}}function Ye(e){0>Ki||(e.current=ds[Ki],ds[Ki]=null,Ki--)}function qe(e,t){Ki++,ds[Ki]=e.current,e.current=t}var Ko={},vt=Yo(Ko),Tt=Yo(!1),yi=Ko;function Gi(e,t){var o=e.type.contextTypes;if(!o)return Ko;var i=e.stateNode;if(i&&i.__reactInternalMemoizedUnmaskedChildContext===t)return i.__reactInternalMemoizedMaskedChildContext;var n={},l;for(l in o)n[l]=t[l];return i&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=n),n}function At(e){return e=e.childContextTypes,e!=null}function Un(){Ye(Tt),Ye(vt)}function Bu(e,t,o){if(vt.current!==Ko)throw Error(s(168));qe(vt,t),qe(Tt,o)}function Ou(e,t,o){var i=e.stateNode;if(t=t.childContextTypes,typeof i.getChildContext!="function")return o;i=i.getChildContext();for(var n in i)if(!(n in t))throw Error(s(108,Re(e)||"Unknown",n));return Y({},o,i)}function Ln(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ko,yi=vt.current,qe(vt,e),qe(Tt,Tt.current),!0}function Fu(e,t,o){var i=e.stateNode;if(!i)throw Error(s(169));o?(e=Ou(e,t,yi),i.__reactInternalMemoizedMergedChildContext=e,Ye(Tt),Ye(vt),qe(vt,e)):Ye(Tt),qe(Tt,o)}var bo=null,Nn=!1,ps=!1;function qu(e){bo===null?bo=[e]:bo.push(e)}function Fg(e){Nn=!0,qu(e)}function Go(){if(!ps&&bo!==null){ps=!0;var e=0,t=Be;try{var o=bo;for(Be=1;e<o.length;e++){var i=o[e];do i=i(!0);while(i!==null)}bo=null,Nn=!1}catch(n){throw bo!==null&&(bo=bo.slice(e+1)),We(yo,Go),n}finally{Be=t,ps=!1}}return null}var $i=[],Qi=0,Hn=null,Bn=0,Ot=[],Ft=0,Si=null,wo=1,ko="";function vi(e,t){$i[Qi++]=Bn,$i[Qi++]=Hn,Hn=e,Bn=t}function Wu(e,t,o){Ot[Ft++]=wo,Ot[Ft++]=ko,Ot[Ft++]=Si,Si=e;var i=wo;e=ko;var n=32-De(i)-1;i&=~(1<<n),o+=1;var l=32-De(t)+n;if(30<l){var d=n-n%5;l=(i&(1<<d)-1).toString(32),i>>=d,n-=d,wo=1<<32-De(t)+n|o<<n|i,ko=l+e}else wo=1<<l|o<<n|i,ko=e}function gs(e){e.return!==null&&(vi(e,1),Wu(e,1,0))}function hs(e){for(;e===Hn;)Hn=$i[--Qi],$i[Qi]=null,Bn=$i[--Qi],$i[Qi]=null;for(;e===Si;)Si=Ot[--Ft],Ot[Ft]=null,ko=Ot[--Ft],Ot[Ft]=null,wo=Ot[--Ft],Ot[Ft]=null}var Ut=null,Lt=null,Ke=!1,Qt=null;function Vu(e,t){var o=Yt(5,null,null,0);o.elementType="DELETED",o.stateNode=t,o.return=e,t=e.deletions,t===null?(e.deletions=[o],e.flags|=16):t.push(o)}function Yu(e,t){switch(e.tag){case 5:var o=e.type;return t=t.nodeType!==1||o.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,Ut=e,Lt=Vo(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Ut=e,Lt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(o=Si!==null?{id:wo,overflow:ko}:null,e.memoizedState={dehydrated:t,treeContext:o,retryLane:1073741824},o=Yt(18,null,null,0),o.stateNode=t,o.return=e,e.child=o,Ut=e,Lt=null,!0):!1;default:return!1}}function ms(e){return(e.mode&1)!==0&&(e.flags&128)===0}function fs(e){if(Ke){var t=Lt;if(t){var o=t;if(!Yu(e,t)){if(ms(e))throw Error(s(418));t=Vo(o.nextSibling);var i=Ut;t&&Yu(e,t)?Vu(i,o):(e.flags=e.flags&-4097|2,Ke=!1,Ut=e)}}else{if(ms(e))throw Error(s(418));e.flags=e.flags&-4097|2,Ke=!1,Ut=e}}}function Ku(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Ut=e}function On(e){if(e!==Ut)return!1;if(!Ke)return Ku(e),Ke=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!ss(e.type,e.memoizedProps)),t&&(t=Lt)){if(ms(e))throw Gu(),Error(s(418));for(;t;)Vu(e,t),t=Vo(t.nextSibling)}if(Ku(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(s(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="/$"){if(t===0){Lt=Vo(e.nextSibling);break e}t--}else o!=="$"&&o!=="$!"&&o!=="$?"||t++}e=e.nextSibling}Lt=null}}else Lt=Ut?Vo(e.stateNode.nextSibling):null;return!0}function Gu(){for(var e=Lt;e;)e=Vo(e.nextSibling)}function Ji(){Lt=Ut=null,Ke=!1}function ys(e){Qt===null?Qt=[e]:Qt.push(e)}var qg=te.ReactCurrentBatchConfig;function Na(e,t,o){if(e=o.ref,e!==null&&typeof e!="function"&&typeof e!="object"){if(o._owner){if(o=o._owner,o){if(o.tag!==1)throw Error(s(309));var i=o.stateNode}if(!i)throw Error(s(147,e));var n=i,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(d){var h=n.refs;d===null?delete h[l]:h[l]=d},t._stringRef=l,t)}if(typeof e!="string")throw Error(s(284));if(!o._owner)throw Error(s(290,e))}return e}function Fn(e,t){throw e=Object.prototype.toString.call(t),Error(s(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function $u(e){var t=e._init;return t(e._payload)}function Qu(e){function t(x,b){if(e){var T=x.deletions;T===null?(x.deletions=[b],x.flags|=16):T.push(b)}}function o(x,b){if(!e)return null;for(;b!==null;)t(x,b),b=b.sibling;return null}function i(x,b){for(x=new Map;b!==null;)b.key!==null?x.set(b.key,b):x.set(b.index,b),b=b.sibling;return x}function n(x,b){return x=oi(x,b),x.index=0,x.sibling=null,x}function l(x,b,T){return x.index=T,e?(T=x.alternate,T!==null?(T=T.index,T<b?(x.flags|=2,b):T):(x.flags|=2,b)):(x.flags|=1048576,b)}function d(x){return e&&x.alternate===null&&(x.flags|=2),x}function h(x,b,T,q){return b===null||b.tag!==6?(b=ll(T,x.mode,q),b.return=x,b):(b=n(b,T),b.return=x,b)}function S(x,b,T,q){var ae=T.type;return ae===I?N(x,b,T.props.children,q,T.key):b!==null&&(b.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===Xe&&$u(ae)===b.type)?(q=n(b,T.props),q.ref=Na(x,b,T),q.return=x,q):(q=pr(T.type,T.key,T.props,null,x.mode,q),q.ref=Na(x,b,T),q.return=x,q)}function A(x,b,T,q){return b===null||b.tag!==4||b.stateNode.containerInfo!==T.containerInfo||b.stateNode.implementation!==T.implementation?(b=ul(T,x.mode,q),b.return=x,b):(b=n(b,T.children||[]),b.return=x,b)}function N(x,b,T,q,ae){return b===null||b.tag!==7?(b=Ti(T,x.mode,q,ae),b.return=x,b):(b=n(b,T),b.return=x,b)}function B(x,b,T){if(typeof b=="string"&&b!==""||typeof b=="number")return b=ll(""+b,x.mode,T),b.return=x,b;if(typeof b=="object"&&b!==null){switch(b.$$typeof){case ye:return T=pr(b.type,b.key,b.props,null,x.mode,T),T.ref=Na(x,null,b),T.return=x,T;case je:return b=ul(b,x.mode,T),b.return=x,b;case Xe:var q=b._init;return B(x,q(b._payload),T)}if(ci(b)||le(b))return b=Ti(b,x.mode,T,null),b.return=x,b;Fn(x,b)}return null}function U(x,b,T,q){var ae=b!==null?b.key:null;if(typeof T=="string"&&T!==""||typeof T=="number")return ae!==null?null:h(x,b,""+T,q);if(typeof T=="object"&&T!==null){switch(T.$$typeof){case ye:return T.key===ae?S(x,b,T,q):null;case je:return T.key===ae?A(x,b,T,q):null;case Xe:return ae=T._init,U(x,b,ae(T._payload),q)}if(ci(T)||le(T))return ae!==null?null:N(x,b,T,q,null);Fn(x,T)}return null}function G(x,b,T,q,ae){if(typeof q=="string"&&q!==""||typeof q=="number")return x=x.get(T)||null,h(b,x,""+q,ae);if(typeof q=="object"&&q!==null){switch(q.$$typeof){case ye:return x=x.get(q.key===null?T:q.key)||null,S(b,x,q,ae);case je:return x=x.get(q.key===null?T:q.key)||null,A(b,x,q,ae);case Xe:var ue=q._init;return G(x,b,T,ue(q._payload),ae)}if(ci(q)||le(q))return x=x.get(T)||null,N(b,x,q,ae,null);Fn(b,q)}return null}function ee(x,b,T,q){for(var ae=null,ue=null,ce=b,me=b=0,gt=null;ce!==null&&me<T.length;me++){ce.index>me?(gt=ce,ce=null):gt=ce.sibling;var Me=U(x,ce,T[me],q);if(Me===null){ce===null&&(ce=gt);break}e&&ce&&Me.alternate===null&&t(x,ce),b=l(Me,b,me),ue===null?ae=Me:ue.sibling=Me,ue=Me,ce=gt}if(me===T.length)return o(x,ce),Ke&&vi(x,me),ae;if(ce===null){for(;me<T.length;me++)ce=B(x,T[me],q),ce!==null&&(b=l(ce,b,me),ue===null?ae=ce:ue.sibling=ce,ue=ce);return Ke&&vi(x,me),ae}for(ce=i(x,ce);me<T.length;me++)gt=G(ce,x,me,T[me],q),gt!==null&&(e&&gt.alternate!==null&&ce.delete(gt.key===null?me:gt.key),b=l(gt,b,me),ue===null?ae=gt:ue.sibling=gt,ue=gt);return e&&ce.forEach(function(ii){return t(x,ii)}),Ke&&vi(x,me),ae}function ie(x,b,T,q){var ae=le(T);if(typeof ae!="function")throw Error(s(150));if(T=ae.call(T),T==null)throw Error(s(151));for(var ue=ae=null,ce=b,me=b=0,gt=null,Me=T.next();ce!==null&&!Me.done;me++,Me=T.next()){ce.index>me?(gt=ce,ce=null):gt=ce.sibling;var ii=U(x,ce,Me.value,q);if(ii===null){ce===null&&(ce=gt);break}e&&ce&&ii.alternate===null&&t(x,ce),b=l(ii,b,me),ue===null?ae=ii:ue.sibling=ii,ue=ii,ce=gt}if(Me.done)return o(x,ce),Ke&&vi(x,me),ae;if(ce===null){for(;!Me.done;me++,Me=T.next())Me=B(x,Me.value,q),Me!==null&&(b=l(Me,b,me),ue===null?ae=Me:ue.sibling=Me,ue=Me);return Ke&&vi(x,me),ae}for(ce=i(x,ce);!Me.done;me++,Me=T.next())Me=G(ce,x,me,Me.value,q),Me!==null&&(e&&Me.alternate!==null&&ce.delete(Me.key===null?me:Me.key),b=l(Me,b,me),ue===null?ae=Me:ue.sibling=Me,ue=Me);return e&&ce.forEach(function(kh){return t(x,kh)}),Ke&&vi(x,me),ae}function it(x,b,T,q){if(typeof T=="object"&&T!==null&&T.type===I&&T.key===null&&(T=T.props.children),typeof T=="object"&&T!==null){switch(T.$$typeof){case ye:e:{for(var ae=T.key,ue=b;ue!==null;){if(ue.key===ae){if(ae=T.type,ae===I){if(ue.tag===7){o(x,ue.sibling),b=n(ue,T.props.children),b.return=x,x=b;break e}}else if(ue.elementType===ae||typeof ae=="object"&&ae!==null&&ae.$$typeof===Xe&&$u(ae)===ue.type){o(x,ue.sibling),b=n(ue,T.props),b.ref=Na(x,ue,T),b.return=x,x=b;break e}o(x,ue);break}else t(x,ue);ue=ue.sibling}T.type===I?(b=Ti(T.props.children,x.mode,q,T.key),b.return=x,x=b):(q=pr(T.type,T.key,T.props,null,x.mode,q),q.ref=Na(x,b,T),q.return=x,x=q)}return d(x);case je:e:{for(ue=T.key;b!==null;){if(b.key===ue)if(b.tag===4&&b.stateNode.containerInfo===T.containerInfo&&b.stateNode.implementation===T.implementation){o(x,b.sibling),b=n(b,T.children||[]),b.return=x,x=b;break e}else{o(x,b);break}else t(x,b);b=b.sibling}b=ul(T,x.mode,q),b.return=x,x=b}return d(x);case Xe:return ue=T._init,it(x,b,ue(T._payload),q)}if(ci(T))return ee(x,b,T,q);if(le(T))return ie(x,b,T,q);Fn(x,T)}return typeof T=="string"&&T!==""||typeof T=="number"?(T=""+T,b!==null&&b.tag===6?(o(x,b.sibling),b=n(b,T),b.return=x,x=b):(o(x,b),b=ll(T,x.mode,q),b.return=x,x=b),d(x)):o(x,b)}return it}var Zi=Qu(!0),Ju=Qu(!1),qn=Yo(null),Wn=null,Xi=null,Ss=null;function vs(){Ss=Xi=Wn=null}function bs(e){var t=qn.current;Ye(qn),e._currentValue=t}function ws(e,t,o){for(;e!==null;){var i=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,i!==null&&(i.childLanes|=t)):i!==null&&(i.childLanes&t)!==t&&(i.childLanes|=t),e===o)break;e=e.return}}function ea(e,t){Wn=e,Ss=Xi=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(It=!0),e.firstContext=null)}function qt(e){var t=e._currentValue;if(Ss!==e)if(e={context:e,memoizedValue:t,next:null},Xi===null){if(Wn===null)throw Error(s(308));Xi=e,Wn.dependencies={lanes:0,firstContext:e}}else Xi=Xi.next=e;return t}var bi=null;function ks(e){bi===null?bi=[e]:bi.push(e)}function Zu(e,t,o,i){var n=t.interleaved;return n===null?(o.next=o,ks(t)):(o.next=n.next,n.next=o),t.interleaved=o,Po(e,i)}function Po(e,t){e.lanes|=t;var o=e.alternate;for(o!==null&&(o.lanes|=t),o=e,e=e.return;e!==null;)e.childLanes|=t,o=e.alternate,o!==null&&(o.childLanes|=t),o=e,e=e.return;return o.tag===3?o.stateNode:null}var $o=!1;function Ps(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Xu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Co(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Qo(e,t,o){var i=e.updateQueue;if(i===null)return null;if(i=i.shared,(Ee&2)!==0){var n=i.pending;return n===null?t.next=t:(t.next=n.next,n.next=t),i.pending=t,Po(e,o)}return n=i.interleaved,n===null?(t.next=t,ks(i)):(t.next=n.next,n.next=t),i.interleaved=t,Po(e,o)}function Vn(e,t,o){if(t=t.updateQueue,t!==null&&(t=t.shared,(o&4194240)!==0)){var i=t.lanes;i&=e.pendingLanes,o|=i,t.lanes=o,Lr(e,o)}}function ec(e,t){var o=e.updateQueue,i=e.alternate;if(i!==null&&(i=i.updateQueue,o===i)){var n=null,l=null;if(o=o.firstBaseUpdate,o!==null){do{var d={eventTime:o.eventTime,lane:o.lane,tag:o.tag,payload:o.payload,callback:o.callback,next:null};l===null?n=l=d:l=l.next=d,o=o.next}while(o!==null);l===null?n=l=t:l=l.next=t}else n=l=t;o={baseState:i.baseState,firstBaseUpdate:n,lastBaseUpdate:l,shared:i.shared,effects:i.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=t:e.next=t,o.lastBaseUpdate=t}function Yn(e,t,o,i){var n=e.updateQueue;$o=!1;var l=n.firstBaseUpdate,d=n.lastBaseUpdate,h=n.shared.pending;if(h!==null){n.shared.pending=null;var S=h,A=S.next;S.next=null,d===null?l=A:d.next=A,d=S;var N=e.alternate;N!==null&&(N=N.updateQueue,h=N.lastBaseUpdate,h!==d&&(h===null?N.firstBaseUpdate=A:h.next=A,N.lastBaseUpdate=S))}if(l!==null){var B=n.baseState;d=0,N=A=S=null,h=l;do{var U=h.lane,G=h.eventTime;if((i&U)===U){N!==null&&(N=N.next={eventTime:G,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,next:null});e:{var ee=e,ie=h;switch(U=t,G=o,ie.tag){case 1:if(ee=ie.payload,typeof ee=="function"){B=ee.call(G,B,U);break e}B=ee;break e;case 3:ee.flags=ee.flags&-65537|128;case 0:if(ee=ie.payload,U=typeof ee=="function"?ee.call(G,B,U):ee,U==null)break e;B=Y({},B,U);break e;case 2:$o=!0}}h.callback!==null&&h.lane!==0&&(e.flags|=64,U=n.effects,U===null?n.effects=[h]:U.push(h))}else G={eventTime:G,lane:U,tag:h.tag,payload:h.payload,callback:h.callback,next:null},N===null?(A=N=G,S=B):N=N.next=G,d|=U;if(h=h.next,h===null){if(h=n.shared.pending,h===null)break;U=h,h=U.next,U.next=null,n.lastBaseUpdate=U,n.shared.pending=null}}while(!0);if(N===null&&(S=B),n.baseState=S,n.firstBaseUpdate=A,n.lastBaseUpdate=N,t=n.shared.interleaved,t!==null){n=t;do d|=n.lane,n=n.next;while(n!==t)}else l===null&&(n.shared.lanes=0);Pi|=d,e.lanes=d,e.memoizedState=B}}function tc(e,t,o){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var i=e[t],n=i.callback;if(n!==null){if(i.callback=null,i=o,typeof n!="function")throw Error(s(191,n));n.call(i)}}}var Ha={},co=Yo(Ha),Ba=Yo(Ha),Oa=Yo(Ha);function wi(e){if(e===Ha)throw Error(s(174));return e}function Cs(e,t){switch(qe(Oa,t),qe(Ba,e),qe(co,Ha),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:di(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=di(t,e)}Ye(co),qe(co,t)}function ta(){Ye(co),Ye(Ba),Ye(Oa)}function oc(e){wi(Oa.current);var t=wi(co.current),o=di(t,e.type);t!==o&&(qe(Ba,e),qe(co,o))}function xs(e){Ba.current===e&&(Ye(co),Ye(Ba))}var Qe=Yo(0);function Kn(e){for(var t=e;t!==null;){if(t.tag===13){var o=t.memoizedState;if(o!==null&&(o=o.dehydrated,o===null||o.data==="$?"||o.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var Rs=[];function Ts(){for(var e=0;e<Rs.length;e++)Rs[e]._workInProgressVersionPrimary=null;Rs.length=0}var Gn=te.ReactCurrentDispatcher,As=te.ReactCurrentBatchConfig,ki=0,Je=null,lt=null,dt=null,$n=!1,Fa=!1,qa=0,Wg=0;function bt(){throw Error(s(321))}function Is(e,t){if(t===null)return!1;for(var o=0;o<t.length&&o<e.length;o++)if(!$t(e[o],t[o]))return!1;return!0}function Es(e,t,o,i,n,l){if(ki=l,Je=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,Gn.current=e===null||e.memoizedState===null?Gg:$g,e=o(i,n),Fa){l=0;do{if(Fa=!1,qa=0,25<=l)throw Error(s(301));l+=1,dt=lt=null,t.updateQueue=null,Gn.current=Qg,e=o(i,n)}while(Fa)}if(Gn.current=Zn,t=lt!==null&&lt.next!==null,ki=0,dt=lt=Je=null,$n=!1,t)throw Error(s(300));return e}function js(){var e=qa!==0;return qa=0,e}function po(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return dt===null?Je.memoizedState=dt=e:dt=dt.next=e,dt}function Wt(){if(lt===null){var e=Je.alternate;e=e!==null?e.memoizedState:null}else e=lt.next;var t=dt===null?Je.memoizedState:dt.next;if(t!==null)dt=t,lt=e;else{if(e===null)throw Error(s(310));lt=e,e={memoizedState:lt.memoizedState,baseState:lt.baseState,baseQueue:lt.baseQueue,queue:lt.queue,next:null},dt===null?Je.memoizedState=dt=e:dt=dt.next=e}return dt}function Wa(e,t){return typeof t=="function"?t(e):t}function zs(e){var t=Wt(),o=t.queue;if(o===null)throw Error(s(311));o.lastRenderedReducer=e;var i=lt,n=i.baseQueue,l=o.pending;if(l!==null){if(n!==null){var d=n.next;n.next=l.next,l.next=d}i.baseQueue=n=l,o.pending=null}if(n!==null){l=n.next,i=i.baseState;var h=d=null,S=null,A=l;do{var N=A.lane;if((ki&N)===N)S!==null&&(S=S.next={lane:0,action:A.action,hasEagerState:A.hasEagerState,eagerState:A.eagerState,next:null}),i=A.hasEagerState?A.eagerState:e(i,A.action);else{var B={lane:N,action:A.action,hasEagerState:A.hasEagerState,eagerState:A.eagerState,next:null};S===null?(h=S=B,d=i):S=S.next=B,Je.lanes|=N,Pi|=N}A=A.next}while(A!==null&&A!==l);S===null?d=i:S.next=h,$t(i,t.memoizedState)||(It=!0),t.memoizedState=i,t.baseState=d,t.baseQueue=S,o.lastRenderedState=i}if(e=o.interleaved,e!==null){n=e;do l=n.lane,Je.lanes|=l,Pi|=l,n=n.next;while(n!==e)}else n===null&&(o.lanes=0);return[t.memoizedState,o.dispatch]}function Ds(e){var t=Wt(),o=t.queue;if(o===null)throw Error(s(311));o.lastRenderedReducer=e;var i=o.dispatch,n=o.pending,l=t.memoizedState;if(n!==null){o.pending=null;var d=n=n.next;do l=e(l,d.action),d=d.next;while(d!==n);$t(l,t.memoizedState)||(It=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),o.lastRenderedState=l}return[l,i]}function ic(){}function ac(e,t){var o=Je,i=Wt(),n=t(),l=!$t(i.memoizedState,n);if(l&&(i.memoizedState=n,It=!0),i=i.queue,Ms(sc.bind(null,o,i,e),[e]),i.getSnapshot!==t||l||dt!==null&&dt.memoizedState.tag&1){if(o.flags|=2048,Va(9,rc.bind(null,o,i,n,t),void 0,null),pt===null)throw Error(s(349));(ki&30)!==0||nc(o,t,n)}return n}function nc(e,t,o){e.flags|=16384,e={getSnapshot:t,value:o},t=Je.updateQueue,t===null?(t={lastEffect:null,stores:null},Je.updateQueue=t,t.stores=[e]):(o=t.stores,o===null?t.stores=[e]:o.push(e))}function rc(e,t,o,i){t.value=o,t.getSnapshot=i,lc(t)&&uc(e)}function sc(e,t,o){return o(function(){lc(t)&&uc(e)})}function lc(e){var t=e.getSnapshot;e=e.value;try{var o=t();return!$t(e,o)}catch{return!0}}function uc(e){var t=Po(e,1);t!==null&&eo(t,e,1,-1)}function cc(e){var t=po();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Wa,lastRenderedState:e},t.queue=e,e=e.dispatch=Kg.bind(null,Je,e),[t.memoizedState,e]}function Va(e,t,o,i){return e={tag:e,create:t,destroy:o,deps:i,next:null},t=Je.updateQueue,t===null?(t={lastEffect:null,stores:null},Je.updateQueue=t,t.lastEffect=e.next=e):(o=t.lastEffect,o===null?t.lastEffect=e.next=e:(i=o.next,o.next=e,e.next=i,t.lastEffect=e)),e}function dc(){return Wt().memoizedState}function Qn(e,t,o,i){var n=po();Je.flags|=e,n.memoizedState=Va(1|t,o,void 0,i===void 0?null:i)}function Jn(e,t,o,i){var n=Wt();i=i===void 0?null:i;var l=void 0;if(lt!==null){var d=lt.memoizedState;if(l=d.destroy,i!==null&&Is(i,d.deps)){n.memoizedState=Va(t,o,l,i);return}}Je.flags|=e,n.memoizedState=Va(1|t,o,l,i)}function pc(e,t){return Qn(8390656,8,e,t)}function Ms(e,t){return Jn(2048,8,e,t)}function gc(e,t){return Jn(4,2,e,t)}function hc(e,t){return Jn(4,4,e,t)}function mc(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function fc(e,t,o){return o=o!=null?o.concat([e]):null,Jn(4,4,mc.bind(null,t,e),o)}function _s(){}function yc(e,t){var o=Wt();t=t===void 0?null:t;var i=o.memoizedState;return i!==null&&t!==null&&Is(t,i[1])?i[0]:(o.memoizedState=[e,t],e)}function Sc(e,t){var o=Wt();t=t===void 0?null:t;var i=o.memoizedState;return i!==null&&t!==null&&Is(t,i[1])?i[0]:(e=e(),o.memoizedState=[e,t],e)}function vc(e,t,o){return(ki&21)===0?(e.baseState&&(e.baseState=!1,It=!0),e.memoizedState=o):($t(o,t)||(o=$l(),Je.lanes|=o,Pi|=o,e.baseState=!0),t)}function Vg(e,t){var o=Be;Be=o!==0&&4>o?o:4,e(!0);var i=As.transition;As.transition={};try{e(!1),t()}finally{Be=o,As.transition=i}}function bc(){return Wt().memoizedState}function Yg(e,t,o){var i=ei(e);if(o={lane:i,action:o,hasEagerState:!1,eagerState:null,next:null},wc(e))kc(t,o);else if(o=Zu(e,t,o,i),o!==null){var n=xt();eo(o,e,i,n),Pc(o,t,i)}}function Kg(e,t,o){var i=ei(e),n={lane:i,action:o,hasEagerState:!1,eagerState:null,next:null};if(wc(e))kc(t,n);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var d=t.lastRenderedState,h=l(d,o);if(n.hasEagerState=!0,n.eagerState=h,$t(h,d)){var S=t.interleaved;S===null?(n.next=n,ks(t)):(n.next=S.next,S.next=n),t.interleaved=n;return}}catch{}finally{}o=Zu(e,t,n,i),o!==null&&(n=xt(),eo(o,e,i,n),Pc(o,t,i))}}function wc(e){var t=e.alternate;return e===Je||t!==null&&t===Je}function kc(e,t){Fa=$n=!0;var o=e.pending;o===null?t.next=t:(t.next=o.next,o.next=t),e.pending=t}function Pc(e,t,o){if((o&4194240)!==0){var i=t.lanes;i&=e.pendingLanes,o|=i,t.lanes=o,Lr(e,o)}}var Zn={readContext:qt,useCallback:bt,useContext:bt,useEffect:bt,useImperativeHandle:bt,useInsertionEffect:bt,useLayoutEffect:bt,useMemo:bt,useReducer:bt,useRef:bt,useState:bt,useDebugValue:bt,useDeferredValue:bt,useTransition:bt,useMutableSource:bt,useSyncExternalStore:bt,useId:bt,unstable_isNewReconciler:!1},Gg={readContext:qt,useCallback:function(e,t){return po().memoizedState=[e,t===void 0?null:t],e},useContext:qt,useEffect:pc,useImperativeHandle:function(e,t,o){return o=o!=null?o.concat([e]):null,Qn(4194308,4,mc.bind(null,t,e),o)},useLayoutEffect:function(e,t){return Qn(4194308,4,e,t)},useInsertionEffect:function(e,t){return Qn(4,2,e,t)},useMemo:function(e,t){var o=po();return t=t===void 0?null:t,e=e(),o.memoizedState=[e,t],e},useReducer:function(e,t,o){var i=po();return t=o!==void 0?o(t):t,i.memoizedState=i.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},i.queue=e,e=e.dispatch=Yg.bind(null,Je,e),[i.memoizedState,e]},useRef:function(e){var t=po();return e={current:e},t.memoizedState=e},useState:cc,useDebugValue:_s,useDeferredValue:function(e){return po().memoizedState=e},useTransition:function(){var e=cc(!1),t=e[0];return e=Vg.bind(null,e[1]),po().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,o){var i=Je,n=po();if(Ke){if(o===void 0)throw Error(s(407));o=o()}else{if(o=t(),pt===null)throw Error(s(349));(ki&30)!==0||nc(i,t,o)}n.memoizedState=o;var l={value:o,getSnapshot:t};return n.queue=l,pc(sc.bind(null,i,l,e),[e]),i.flags|=2048,Va(9,rc.bind(null,i,l,o,t),void 0,null),o},useId:function(){var e=po(),t=pt.identifierPrefix;if(Ke){var o=ko,i=wo;o=(i&~(1<<32-De(i)-1)).toString(32)+o,t=":"+t+"R"+o,o=qa++,0<o&&(t+="H"+o.toString(32)),t+=":"}else o=Wg++,t=":"+t+"r"+o.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},$g={readContext:qt,useCallback:yc,useContext:qt,useEffect:Ms,useImperativeHandle:fc,useInsertionEffect:gc,useLayoutEffect:hc,useMemo:Sc,useReducer:zs,useRef:dc,useState:function(){return zs(Wa)},useDebugValue:_s,useDeferredValue:function(e){var t=Wt();return vc(t,lt.memoizedState,e)},useTransition:function(){var e=zs(Wa)[0],t=Wt().memoizedState;return[e,t]},useMutableSource:ic,useSyncExternalStore:ac,useId:bc,unstable_isNewReconciler:!1},Qg={readContext:qt,useCallback:yc,useContext:qt,useEffect:Ms,useImperativeHandle:fc,useInsertionEffect:gc,useLayoutEffect:hc,useMemo:Sc,useReducer:Ds,useRef:dc,useState:function(){return Ds(Wa)},useDebugValue:_s,useDeferredValue:function(e){var t=Wt();return lt===null?t.memoizedState=e:vc(t,lt.memoizedState,e)},useTransition:function(){var e=Ds(Wa)[0],t=Wt().memoizedState;return[e,t]},useMutableSource:ic,useSyncExternalStore:ac,useId:bc,unstable_isNewReconciler:!1};function Jt(e,t){if(e&&e.defaultProps){t=Y({},t),e=e.defaultProps;for(var o in e)t[o]===void 0&&(t[o]=e[o]);return t}return t}function Us(e,t,o,i){t=e.memoizedState,o=o(i,t),o=o==null?t:Y({},t,o),e.memoizedState=o,e.lanes===0&&(e.updateQueue.baseState=o)}var Xn={isMounted:function(e){return(e=e._reactInternals)?J(e)===e:!1},enqueueSetState:function(e,t,o){e=e._reactInternals;var i=xt(),n=ei(e),l=Co(i,n);l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,n),t!==null&&(eo(t,e,n,i),Vn(t,e,n))},enqueueReplaceState:function(e,t,o){e=e._reactInternals;var i=xt(),n=ei(e),l=Co(i,n);l.tag=1,l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,n),t!==null&&(eo(t,e,n,i),Vn(t,e,n))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var o=xt(),i=ei(e),n=Co(o,i);n.tag=2,t!=null&&(n.callback=t),t=Qo(e,n,i),t!==null&&(eo(t,e,i,o),Vn(t,e,i))}};function Cc(e,t,o,i,n,l,d){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(i,l,d):t.prototype&&t.prototype.isPureReactComponent?!ja(o,i)||!ja(n,l):!0}function xc(e,t,o){var i=!1,n=Ko,l=t.contextType;return typeof l=="object"&&l!==null?l=qt(l):(n=At(t)?yi:vt.current,i=t.contextTypes,l=(i=i!=null)?Gi(e,n):Ko),t=new t(o,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=Xn,e.stateNode=t,t._reactInternals=e,i&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=n,e.__reactInternalMemoizedMaskedChildContext=l),t}function Rc(e,t,o,i){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(o,i),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(o,i),t.state!==e&&Xn.enqueueReplaceState(t,t.state,null)}function Ls(e,t,o,i){var n=e.stateNode;n.props=o,n.state=e.memoizedState,n.refs={},Ps(e);var l=t.contextType;typeof l=="object"&&l!==null?n.context=qt(l):(l=At(t)?yi:vt.current,n.context=Gi(e,l)),n.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(Us(e,t,l,o),n.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof n.getSnapshotBeforeUpdate=="function"||typeof n.UNSAFE_componentWillMount!="function"&&typeof n.componentWillMount!="function"||(t=n.state,typeof n.componentWillMount=="function"&&n.componentWillMount(),typeof n.UNSAFE_componentWillMount=="function"&&n.UNSAFE_componentWillMount(),t!==n.state&&Xn.enqueueReplaceState(n,n.state,null),Yn(e,o,n,i),n.state=e.memoizedState),typeof n.componentDidMount=="function"&&(e.flags|=4194308)}function oa(e,t){try{var o="",i=t;do o+=he(i),i=i.return;while(i);var n=o}catch(l){n=`
40
40
  Error generating stack: `+l.message+`
41
- `+l.stack}return{value:e,source:t,stack:n,digest:null}}function Ns(e,t,o){return{value:e,source:null,stack:o??null,digest:t??null}}function Us(e,t){try{console.error(t.value)}catch(o){setTimeout(function(){throw o})}}var Zg=typeof WeakMap=="function"?WeakMap:Map;function Tc(e,t,o){o=ko(-1,o),o.tag=3,o.payload={element:null};var i=t.value;return o.callback=function(){ar||(ar=!0,Xs=i),Us(e,t)},o}function Ac(e,t,o){o=ko(-1,o),o.tag=3;var i=e.type.getDerivedStateFromError;if(typeof i=="function"){var n=t.value;o.payload=function(){return i(n)},o.callback=function(){Us(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(o.callback=function(){Us(e,t),typeof i!="function"&&(Zo===null?Zo=new Set([this]):Zo.add(this));var c=t.stack;this.componentDidCatch(t.value,{componentStack:c!==null?c:""})}),o}function Ic(e,t,o){var i=e.pingCache;if(i===null){i=e.pingCache=new Zg;var n=new Set;i.set(t,n)}else n=i.get(t),n===void 0&&(n=new Set,i.set(t,n));n.has(o)||(n.add(o),e=dh.bind(null,e,t,o),t.then(e,e))}function Ec(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function jc(e,t,o,i,n){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,o.flags|=131072,o.flags&=-52805,o.tag===1&&(o.alternate===null?o.tag=17:(t=ko(-1,1),t.tag=2,$o(o,t,1))),o.lanes|=1),e):(e.flags|=65536,e.lanes=n,e)}var Jg=te.ReactCurrentOwner,Rt=!1;function kt(e,t,o,i){t.child=e===null?Zu(t,null,o,i):Qi(t,e.child,o,i)}function zc(e,t,o,i,n){o=o.render;var l=t.ref;return Ji(t,n),i=Is(e,t,o,i,l,n),o=Es(),e!==null&&!Rt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n,Po(e,t,n)):(Ge&&o&&ps(t),t.flags|=1,kt(e,t,i,n),t.child)}function Dc(e,t,o,i,n){if(e===null){var l=o.type;return typeof l=="function"&&!rl(l)&&l.defaultProps===void 0&&o.compare===null&&o.defaultProps===void 0?(t.tag=15,t.type=l,Mc(e,t,l,i,n)):(e=cr(o.type,null,i,t,t.mode,n),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&n)===0){var c=l.memoizedProps;if(o=o.compare,o=o!==null?o:Ea,o(c,i)&&e.ref===t.ref)return Po(e,t,n)}return t.flags|=1,e=ti(l,i),e.ref=t.ref,e.return=t,t.child=e}function Mc(e,t,o,i,n){if(e!==null){var l=e.memoizedProps;if(Ea(l,i)&&e.ref===t.ref)if(Rt=!1,t.pendingProps=i=l,(e.lanes&n)!==0)(e.flags&131072)!==0&&(Rt=!0);else return t.lanes=e.lanes,Po(e,t,n)}return Hs(e,t,o,i,n)}function _c(e,t,o){var i=t.pendingProps,n=i.children,l=e!==null?e.memoizedState:null;if(i.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},We(oa,_t),_t|=o;else{if((o&1073741824)===0)return e=l!==null?l.baseLanes|o:o,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,We(oa,_t),_t|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},i=l!==null?l.baseLanes:o,We(oa,_t),_t|=i}else l!==null?(i=l.baseLanes|o,t.memoizedState=null):i=o,We(oa,_t),_t|=i;return kt(e,t,n,o),t.child}function Lc(e,t){var o=t.ref;(e===null&&o!==null||e!==null&&e.ref!==o)&&(t.flags|=512,t.flags|=2097152)}function Hs(e,t,o,i,n){var l=xt(o)?mi:yt.current;return l=Yi(t,l),Ji(t,n),o=Is(e,t,o,i,l,n),i=Es(),e!==null&&!Rt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n,Po(e,t,n)):(Ge&&i&&ps(t),t.flags|=1,kt(e,t,o,n),t.child)}function Nc(e,t,o,i,n){if(xt(o)){var l=!0;_n(t)}else l=!1;if(Ji(t,n),t.stateNode===null)Xn(e,t),xc(t,o,i),Ls(t,o,i,n),i=!0;else if(e===null){var c=t.stateNode,h=t.memoizedProps;c.props=h;var v=c.context,I=o.contextType;typeof I=="object"&&I!==null?I=Bt(I):(I=xt(o)?mi:yt.current,I=Yi(t,I));var U=o.getDerivedStateFromProps,B=typeof U=="function"||typeof c.getSnapshotBeforeUpdate=="function";B||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(h!==i||v!==I)&&Rc(t,c,i,I),Go=!1;var L=t.memoizedState;c.state=L,Wn(t,i,c,n),v=t.memoizedState,h!==i||L!==v||Ct.current||Go?(typeof U=="function"&&(_s(t,o,U,i),v=t.memoizedState),(h=Go||Cc(t,o,h,i,L,v,I))?(B||typeof c.UNSAFE_componentWillMount!="function"&&typeof c.componentWillMount!="function"||(typeof c.componentWillMount=="function"&&c.componentWillMount(),typeof c.UNSAFE_componentWillMount=="function"&&c.UNSAFE_componentWillMount()),typeof c.componentDidMount=="function"&&(t.flags|=4194308)):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=i,t.memoizedState=v),c.props=i,c.state=v,c.context=I,i=h):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),i=!1)}else{c=t.stateNode,Xu(e,t),h=t.memoizedProps,I=t.type===t.elementType?h:Gt(t.type,h),c.props=I,B=t.pendingProps,L=c.context,v=o.contextType,typeof v=="object"&&v!==null?v=Bt(v):(v=xt(o)?mi:yt.current,v=Yi(t,v));var G=o.getDerivedStateFromProps;(U=typeof G=="function"||typeof c.getSnapshotBeforeUpdate=="function")||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(h!==B||L!==v)&&Rc(t,c,i,v),Go=!1,L=t.memoizedState,c.state=L,Wn(t,i,c,n);var ee=t.memoizedState;h!==B||L!==ee||Ct.current||Go?(typeof G=="function"&&(_s(t,o,G,i),ee=t.memoizedState),(I=Go||Cc(t,o,I,i,L,ee,v)||!1)?(U||typeof c.UNSAFE_componentWillUpdate!="function"&&typeof c.componentWillUpdate!="function"||(typeof c.componentWillUpdate=="function"&&c.componentWillUpdate(i,ee,v),typeof c.UNSAFE_componentWillUpdate=="function"&&c.UNSAFE_componentWillUpdate(i,ee,v)),typeof c.componentDidUpdate=="function"&&(t.flags|=4),typeof c.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof c.componentDidUpdate!="function"||h===e.memoizedProps&&L===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&L===e.memoizedState||(t.flags|=1024),t.memoizedProps=i,t.memoizedState=ee),c.props=i,c.state=ee,c.context=v,i=I):(typeof c.componentDidUpdate!="function"||h===e.memoizedProps&&L===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&L===e.memoizedState||(t.flags|=1024),i=!1)}return Bs(e,t,o,i,l,n)}function Bs(e,t,o,i,n,l){Lc(e,t);var c=(t.flags&128)!==0;if(!i&&!c)return n&&Fu(t,o,!1),Po(e,t,l);i=t.stateNode,Jg.current=t;var h=c&&typeof o.getDerivedStateFromError!="function"?null:i.render();return t.flags|=1,e!==null&&c?(t.child=Qi(t,e.child,null,l),t.child=Qi(t,null,h,l)):kt(e,t,h,l),t.memoizedState=i.state,n&&Fu(t,o,!0),t.child}function Uc(e){var t=e.stateNode;t.pendingContext?Bu(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Bu(e,t.context,!1),Ps(e,t.containerInfo)}function Hc(e,t,o,i,n){return $i(),fs(n),t.flags|=256,kt(e,t,o,i),t.child}var Os={dehydrated:null,treeContext:null,retryLane:0};function Fs(e){return{baseLanes:e,cachePool:null,transitions:null}}function Bc(e,t,o){var i=t.pendingProps,n=Ze.current,l=!1,c=(t.flags&128)!==0,h;if((h=c)||(h=e!==null&&e.memoizedState===null?!1:(n&2)!==0),h?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(n|=1),We(Ze,n&1),e===null)return ms(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(c=i.children,e=i.fallback,l?(i=t.mode,l=t.child,c={mode:"hidden",children:c},(i&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=c):l=dr(c,i,0,null),e=xi(e,i,o,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Fs(o),t.memoizedState=Os,e):qs(t,c));if(n=e.memoizedState,n!==null&&(h=n.dehydrated,h!==null))return Xg(e,t,c,i,h,n,o);if(l){l=i.fallback,c=t.mode,n=e.child,h=n.sibling;var v={mode:"hidden",children:i.children};return(c&1)===0&&t.child!==n?(i=t.child,i.childLanes=0,i.pendingProps=v,t.deletions=null):(i=ti(n,v),i.subtreeFlags=n.subtreeFlags&14680064),h!==null?l=ti(h,l):(l=xi(l,c,o,null),l.flags|=2),l.return=t,i.return=t,i.sibling=l,t.child=i,i=l,l=t.child,c=e.child.memoizedState,c=c===null?Fs(o):{baseLanes:c.baseLanes|o,cachePool:null,transitions:c.transitions},l.memoizedState=c,l.childLanes=e.childLanes&~o,t.memoizedState=Os,i}return l=e.child,e=l.sibling,i=ti(l,{mode:"visible",children:i.children}),(t.mode&1)===0&&(i.lanes=o),i.return=t,i.sibling=null,e!==null&&(o=t.deletions,o===null?(t.deletions=[e],t.flags|=16):o.push(e)),t.child=i,t.memoizedState=null,i}function qs(e,t){return t=dr({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function Jn(e,t,o,i){return i!==null&&fs(i),Qi(t,e.child,null,o),e=qs(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Xg(e,t,o,i,n,l,c){if(o)return t.flags&256?(t.flags&=-257,i=Ns(Error(s(422))),Jn(e,t,c,i)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=i.fallback,n=t.mode,i=dr({mode:"visible",children:i.children},n,0,null),l=xi(l,n,c,null),l.flags|=2,i.return=t,l.return=t,i.sibling=l,t.child=i,(t.mode&1)!==0&&Qi(t,e.child,null,c),t.child.memoizedState=Fs(c),t.memoizedState=Os,l);if((t.mode&1)===0)return Jn(e,t,c,null);if(n.data==="$!"){if(i=n.nextSibling&&n.nextSibling.dataset,i)var h=i.dgst;return i=h,l=Error(s(419)),i=Ns(l,i,void 0),Jn(e,t,c,i)}if(h=(c&e.childLanes)!==0,Rt||h){if(i=dt,i!==null){switch(c&-c){case 4:n=2;break;case 16:n=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:n=32;break;case 536870912:n=268435456;break;default:n=0}n=(n&(i.suspendedLanes|c))!==0?0:n,n!==0&&n!==l.retryLane&&(l.retryLane=n,wo(e,n),Zt(i,e,n,-1))}return nl(),i=Ns(Error(s(421))),Jn(e,t,c,i)}return n.data==="$?"?(t.flags|=128,t.child=e.child,t=ph.bind(null,e),n._reactRetry=t,null):(e=l.treeContext,Mt=Wo(n.nextSibling),Dt=t,Ge=!0,Kt=null,e!==null&&(Ut[Ht++]=vo,Ut[Ht++]=bo,Ut[Ht++]=fi,vo=e.id,bo=e.overflow,fi=t),t=qs(t,i.children),t.flags|=4096,t)}function Oc(e,t,o){e.lanes|=t;var i=e.alternate;i!==null&&(i.lanes|=t),bs(e.return,t,o)}function Ws(e,t,o,i,n){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:i,tail:o,tailMode:n}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=i,l.tail=o,l.tailMode=n)}function Fc(e,t,o){var i=t.pendingProps,n=i.revealOrder,l=i.tail;if(kt(e,t,i.children,o),i=Ze.current,(i&2)!==0)i=i&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Oc(e,o,t);else if(e.tag===19)Oc(e,o,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}i&=1}if(We(Ze,i),(t.mode&1)===0)t.memoizedState=null;else switch(n){case"forwards":for(o=t.child,n=null;o!==null;)e=o.alternate,e!==null&&Vn(e)===null&&(n=o),o=o.sibling;o=n,o===null?(n=t.child,t.child=null):(n=o.sibling,o.sibling=null),Ws(t,!1,n,o,l);break;case"backwards":for(o=null,n=t.child,t.child=null;n!==null;){if(e=n.alternate,e!==null&&Vn(e)===null){t.child=n;break}e=n.sibling,n.sibling=o,o=n,n=e}Ws(t,!0,o,null,l);break;case"together":Ws(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Xn(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Po(e,t,o){if(e!==null&&(t.dependencies=e.dependencies),wi|=t.lanes,(o&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(s(153));if(t.child!==null){for(e=t.child,o=ti(e,e.pendingProps),t.child=o,o.return=t;e.sibling!==null;)e=e.sibling,o=o.sibling=ti(e,e.pendingProps),o.return=t;o.sibling=null}return t.child}function eh(e,t,o){switch(t.tag){case 3:Uc(t),$i();break;case 5:oc(t);break;case 1:xt(t.type)&&_n(t);break;case 4:Ps(t,t.stateNode.containerInfo);break;case 10:var i=t.type._context,n=t.memoizedProps.value;We(On,i._currentValue),i._currentValue=n;break;case 13:if(i=t.memoizedState,i!==null)return i.dehydrated!==null?(We(Ze,Ze.current&1),t.flags|=128,null):(o&t.child.childLanes)!==0?Bc(e,t,o):(We(Ze,Ze.current&1),e=Po(e,t,o),e!==null?e.sibling:null);We(Ze,Ze.current&1);break;case 19:if(i=(o&t.childLanes)!==0,(e.flags&128)!==0){if(i)return Fc(e,t,o);t.flags|=128}if(n=t.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),We(Ze,Ze.current),i)break;return null;case 22:case 23:return t.lanes=0,_c(e,t,o)}return Po(e,t,o)}var qc,Vs,Wc,Vc;qc=function(e,t){for(var o=t.child;o!==null;){if(o.tag===5||o.tag===6)e.appendChild(o.stateNode);else if(o.tag!==4&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break;for(;o.sibling===null;){if(o.return===null||o.return===t)return;o=o.return}o.sibling.return=o.return,o=o.sibling}},Vs=function(){},Wc=function(e,t,o,i){var n=e.memoizedProps;if(n!==i){e=t.stateNode,vi(lo.current);var l=null;switch(o){case"input":n=jo(e,n),i=jo(e,i),l=[];break;case"select":n=Y({},n,{value:void 0}),i=Y({},i,{value:void 0}),l=[];break;case"textarea":n=da(e,n),i=da(e,i),l=[];break;default:typeof n.onClick!="function"&&typeof i.onClick=="function"&&(e.onclick=zn)}Di(o,i);var c;o=null;for(I in n)if(!i.hasOwnProperty(I)&&n.hasOwnProperty(I)&&n[I]!=null)if(I==="style"){var h=n[I];for(c in h)h.hasOwnProperty(c)&&(o||(o={}),o[c]="")}else I!=="dangerouslySetInnerHTML"&&I!=="children"&&I!=="suppressContentEditableWarning"&&I!=="suppressHydrationWarning"&&I!=="autoFocus"&&(d.hasOwnProperty(I)?l||(l=[]):(l=l||[]).push(I,null));for(I in i){var v=i[I];if(h=n!=null?n[I]:void 0,i.hasOwnProperty(I)&&v!==h&&(v!=null||h!=null))if(I==="style")if(h){for(c in h)!h.hasOwnProperty(c)||v&&v.hasOwnProperty(c)||(o||(o={}),o[c]="");for(c in v)v.hasOwnProperty(c)&&h[c]!==v[c]&&(o||(o={}),o[c]=v[c])}else o||(l||(l=[]),l.push(I,o)),o=v;else I==="dangerouslySetInnerHTML"?(v=v?v.__html:void 0,h=h?h.__html:void 0,v!=null&&h!==v&&(l=l||[]).push(I,v)):I==="children"?typeof v!="string"&&typeof v!="number"||(l=l||[]).push(I,""+v):I!=="suppressContentEditableWarning"&&I!=="suppressHydrationWarning"&&(d.hasOwnProperty(I)?(v!=null&&I==="onScroll"&&Ye("scroll",e),l||h===v||(l=[])):(l=l||[]).push(I,v))}o&&(l=l||[]).push("style",o);var I=l;(t.updateQueue=I)&&(t.flags|=4)}},Vc=function(e,t,o,i){o!==i&&(t.flags|=4)};function Va(e,t){if(!Ge)switch(e.tailMode){case"hidden":t=e.tail;for(var o=null;t!==null;)t.alternate!==null&&(o=t),t=t.sibling;o===null?e.tail=null:o.sibling=null;break;case"collapsed":o=e.tail;for(var i=null;o!==null;)o.alternate!==null&&(i=o),o=o.sibling;i===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:i.sibling=null}}function vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,o=0,i=0;if(t)for(var n=e.child;n!==null;)o|=n.lanes|n.childLanes,i|=n.subtreeFlags&14680064,i|=n.flags&14680064,n.return=e,n=n.sibling;else for(n=e.child;n!==null;)o|=n.lanes|n.childLanes,i|=n.subtreeFlags,i|=n.flags,n.return=e,n=n.sibling;return e.subtreeFlags|=i,e.childLanes=o,t}function th(e,t,o){var i=t.pendingProps;switch(gs(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return vt(t),null;case 1:return xt(t.type)&&Mn(),vt(t),null;case 3:return i=t.stateNode,Xi(),Ke(Ct),Ke(yt),Rs(),i.pendingContext&&(i.context=i.pendingContext,i.pendingContext=null),(e===null||e.child===null)&&(Hn(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Kt!==null&&(ol(Kt),Kt=null))),Vs(e,t),vt(t),null;case 5:Cs(t);var n=vi(Ba.current);if(o=t.type,e!==null&&t.stateNode!=null)Wc(e,t,o,i,n),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!i){if(t.stateNode===null)throw Error(s(166));return vt(t),null}if(e=vi(lo.current),Hn(t)){i=t.stateNode,o=t.type;var l=t.memoizedProps;switch(i[so]=t,i[_a]=l,e=(t.mode&1)!==0,o){case"dialog":Ye("cancel",i),Ye("close",i);break;case"iframe":case"object":case"embed":Ye("load",i);break;case"video":case"audio":for(n=0;n<za.length;n++)Ye(za[n],i);break;case"source":Ye("error",i);break;case"img":case"image":case"link":Ye("error",i),Ye("load",i);break;case"details":Ye("toggle",i);break;case"input":sn(i,l),Ye("invalid",i);break;case"select":i._wrapperState={wasMultiple:!!l.multiple},Ye("invalid",i);break;case"textarea":un(i,l),Ye("invalid",i)}Di(o,l),n=null;for(var c in l)if(l.hasOwnProperty(c)){var h=l[c];c==="children"?typeof h=="string"?i.textContent!==h&&(l.suppressHydrationWarning!==!0&&jn(i.textContent,h,e),n=["children",h]):typeof h=="number"&&i.textContent!==""+h&&(l.suppressHydrationWarning!==!0&&jn(i.textContent,h,e),n=["children",""+h]):d.hasOwnProperty(c)&&h!=null&&c==="onScroll"&&Ye("scroll",i)}switch(o){case"input":et(i),ln(i,l,!0);break;case"textarea":et(i),Do(i);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(i.onclick=zn)}i=n,t.updateQueue=i,i!==null&&(t.flags|=4)}else{c=n.nodeType===9?n:n.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=pa(o)),e==="http://www.w3.org/1999/xhtml"?o==="script"?(e=c.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof i.is=="string"?e=c.createElement(o,{is:i.is}):(e=c.createElement(o),o==="select"&&(c=e,i.multiple?c.multiple=!0:i.size&&(c.size=i.size))):e=c.createElementNS(e,o),e[so]=t,e[_a]=i,qc(e,t,!1,!1),t.stateNode=e;e:{switch(c=ha(o,i),o){case"dialog":Ye("cancel",e),Ye("close",e),n=i;break;case"iframe":case"object":case"embed":Ye("load",e),n=i;break;case"video":case"audio":for(n=0;n<za.length;n++)Ye(za[n],e);n=i;break;case"source":Ye("error",e),n=i;break;case"img":case"image":case"link":Ye("error",e),Ye("load",e),n=i;break;case"details":Ye("toggle",e),n=i;break;case"input":sn(e,i),n=jo(e,i),Ye("invalid",e);break;case"option":n=i;break;case"select":e._wrapperState={wasMultiple:!!i.multiple},n=Y({},i,{value:void 0}),Ye("invalid",e);break;case"textarea":un(e,i),n=da(e,i),Ye("invalid",e);break;default:n=i}Di(o,n),h=n;for(l in h)if(h.hasOwnProperty(l)){var v=h[l];l==="style"?ga(e,v):l==="dangerouslySetInnerHTML"?(v=v?v.__html:void 0,v!=null&&Nt(e,v)):l==="children"?typeof v=="string"?(o!=="textarea"||v!=="")&&Mo(e,v):typeof v=="number"&&Mo(e,""+v):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(d.hasOwnProperty(l)?v!=null&&l==="onScroll"&&Ye("scroll",e):v!=null&&J(e,l,v,c))}switch(o){case"input":et(e),ln(e,i,!1);break;case"textarea":et(e),Do(e);break;case"option":i.value!=null&&e.setAttribute("value",""+Re(i.value));break;case"select":e.multiple=!!i.multiple,l=i.value,l!=null?zo(e,!!i.multiple,l,!1):i.defaultValue!=null&&zo(e,!!i.multiple,i.defaultValue,!0);break;default:typeof n.onClick=="function"&&(e.onclick=zn)}switch(o){case"button":case"input":case"select":case"textarea":i=!!i.autoFocus;break e;case"img":i=!0;break e;default:i=!1}}i&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return vt(t),null;case 6:if(e&&t.stateNode!=null)Vc(e,t,e.memoizedProps,i);else{if(typeof i!="string"&&t.stateNode===null)throw Error(s(166));if(o=vi(Ba.current),vi(lo.current),Hn(t)){if(i=t.stateNode,o=t.memoizedProps,i[so]=t,(l=i.nodeValue!==o)&&(e=Dt,e!==null))switch(e.tag){case 3:jn(i.nodeValue,o,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&jn(i.nodeValue,o,(e.mode&1)!==0)}l&&(t.flags|=4)}else i=(o.nodeType===9?o:o.ownerDocument).createTextNode(i),i[so]=t,t.stateNode=i}return vt(t),null;case 13:if(Ke(Ze),i=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Ge&&Mt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Gu(),$i(),t.flags|=98560,l=!1;else if(l=Hn(t),i!==null&&i.dehydrated!==null){if(e===null){if(!l)throw Error(s(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(s(317));l[so]=t}else $i(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;vt(t),l=!1}else Kt!==null&&(ol(Kt),Kt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=o,t):(i=i!==null,i!==(e!==null&&e.memoizedState!==null)&&i&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Ze.current&1)!==0?ut===0&&(ut=3):nl())),t.updateQueue!==null&&(t.flags|=4),vt(t),null);case 4:return Xi(),Vs(e,t),e===null&&Da(t.stateNode.containerInfo),vt(t),null;case 10:return vs(t.type._context),vt(t),null;case 17:return xt(t.type)&&Mn(),vt(t),null;case 19:if(Ke(Ze),l=t.memoizedState,l===null)return vt(t),null;if(i=(t.flags&128)!==0,c=l.rendering,c===null)if(i)Va(l,!1);else{if(ut!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(c=Vn(e),c!==null){for(t.flags|=128,Va(l,!1),i=c.updateQueue,i!==null&&(t.updateQueue=i,t.flags|=4),t.subtreeFlags=0,i=o,o=t.child;o!==null;)l=o,e=i,l.flags&=14680066,c=l.alternate,c===null?(l.childLanes=0,l.lanes=e,l.child=null,l.subtreeFlags=0,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=c.childLanes,l.lanes=c.lanes,l.child=c.child,l.subtreeFlags=0,l.deletions=null,l.memoizedProps=c.memoizedProps,l.memoizedState=c.memoizedState,l.updateQueue=c.updateQueue,l.type=c.type,e=c.dependencies,l.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),o=o.sibling;return We(Ze,Ze.current&1|2),t.child}e=e.sibling}l.tail!==null&&ze()>ia&&(t.flags|=128,i=!0,Va(l,!1),t.lanes=4194304)}else{if(!i)if(e=Vn(c),e!==null){if(t.flags|=128,i=!0,o=e.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),Va(l,!0),l.tail===null&&l.tailMode==="hidden"&&!c.alternate&&!Ge)return vt(t),null}else 2*ze()-l.renderingStartTime>ia&&o!==1073741824&&(t.flags|=128,i=!0,Va(l,!1),t.lanes=4194304);l.isBackwards?(c.sibling=t.child,t.child=c):(o=l.last,o!==null?o.sibling=c:t.child=c,l.last=c)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=ze(),t.sibling=null,o=Ze.current,We(Ze,i?o&1|2:o&1),t):(vt(t),null);case 22:case 23:return al(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&(t.mode&1)!==0?(_t&1073741824)!==0&&(vt(t),t.subtreeFlags&6&&(t.flags|=8192)):vt(t),null;case 24:return null;case 25:return null}throw Error(s(156,t.tag))}function oh(e,t){switch(gs(t),t.tag){case 1:return xt(t.type)&&Mn(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Xi(),Ke(Ct),Ke(yt),Rs(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Cs(t),null;case 13:if(Ke(Ze),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));$i()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ke(Ze),null;case 4:return Xi(),null;case 10:return vs(t.type._context),null;case 22:case 23:return al(),null;case 24:return null;default:return null}}var er=!1,bt=!1,ih=typeof WeakSet=="function"?WeakSet:Set,Q=null;function ta(e,t){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(i){tt(e,t,i)}else o.current=null}function Ys(e,t,o){try{o()}catch(i){tt(e,t,i)}}var Yc=!1;function ah(e,t){if(as=bn,e=Cu(),Qr(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var i=o.getSelection&&o.getSelection();if(i&&i.rangeCount!==0){o=i.anchorNode;var n=i.anchorOffset,l=i.focusNode;i=i.focusOffset;try{o.nodeType,l.nodeType}catch{o=null;break e}var c=0,h=-1,v=-1,I=0,U=0,B=e,L=null;t:for(;;){for(var G;B!==o||n!==0&&B.nodeType!==3||(h=c+n),B!==l||i!==0&&B.nodeType!==3||(v=c+i),B.nodeType===3&&(c+=B.nodeValue.length),(G=B.firstChild)!==null;)L=B,B=G;for(;;){if(B===e)break t;if(L===o&&++I===n&&(h=c),L===l&&++U===i&&(v=c),(G=B.nextSibling)!==null)break;B=L,L=B.parentNode}B=G}o=h===-1||v===-1?null:{start:h,end:v}}else o=null}o=o||{start:0,end:0}}else o=null;for(ns={focusedElem:e,selectionRange:o},bn=!1,Q=t;Q!==null;)if(t=Q,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Q=e;else for(;Q!==null;){t=Q;try{var ee=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(ee!==null){var ie=ee.memoizedProps,it=ee.memoizedState,x=t.stateNode,b=x.getSnapshotBeforeUpdate(t.elementType===t.type?ie:Gt(t.type,ie),it);x.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var T=t.stateNode.containerInfo;T.nodeType===1?T.textContent="":T.nodeType===9&&T.documentElement&&T.removeChild(T.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(s(163))}}catch(q){tt(t,t.return,q)}if(e=t.sibling,e!==null){e.return=t.return,Q=e;break}Q=t.return}return ee=Yc,Yc=!1,ee}function Ya(e,t,o){var i=t.updateQueue;if(i=i!==null?i.lastEffect:null,i!==null){var n=i=i.next;do{if((n.tag&e)===e){var l=n.destroy;n.destroy=void 0,l!==void 0&&Ys(t,o,l)}n=n.next}while(n!==i)}}function tr(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var o=t=t.next;do{if((o.tag&e)===e){var i=o.create;o.destroy=i()}o=o.next}while(o!==t)}}function Ks(e){var t=e.ref;if(t!==null){var o=e.stateNode;switch(e.tag){case 5:e=o;break;default:e=o}typeof t=="function"?t(e):t.current=e}}function Kc(e){var t=e.alternate;t!==null&&(e.alternate=null,Kc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[so],delete t[_a],delete t[us],delete t[Bg],delete t[Og])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Gc(e){return e.tag===5||e.tag===3||e.tag===4}function $c(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Gc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Gs(e,t,o){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?o.nodeType===8?o.parentNode.insertBefore(e,t):o.insertBefore(e,t):(o.nodeType===8?(t=o.parentNode,t.insertBefore(e,o)):(t=o,t.appendChild(e)),o=o._reactRootContainer,o!=null||t.onclick!==null||(t.onclick=zn));else if(i!==4&&(e=e.child,e!==null))for(Gs(e,t,o),e=e.sibling;e!==null;)Gs(e,t,o),e=e.sibling}function $s(e,t,o){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?o.insertBefore(e,t):o.appendChild(e);else if(i!==4&&(e=e.child,e!==null))for($s(e,t,o),e=e.sibling;e!==null;)$s(e,t,o),e=e.sibling}var ht=null,$t=!1;function Qo(e,t,o){for(o=o.child;o!==null;)Qc(e,t,o),o=o.sibling}function Qc(e,t,o){if(gt&&typeof gt.onCommitFiberUnmount=="function")try{gt.onCommitFiberUnmount(qe,o)}catch{}switch(o.tag){case 5:bt||ta(o,t);case 6:var i=ht,n=$t;ht=null,Qo(e,t,o),ht=i,$t=n,ht!==null&&($t?(e=ht,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):ht.removeChild(o.stateNode));break;case 18:ht!==null&&($t?(e=ht,o=o.stateNode,e.nodeType===8?ls(e.parentNode,o):e.nodeType===1&&ls(e,o),Ca(e)):ls(ht,o.stateNode));break;case 4:i=ht,n=$t,ht=o.stateNode.containerInfo,$t=!0,Qo(e,t,o),ht=i,$t=n;break;case 0:case 11:case 14:case 15:if(!bt&&(i=o.updateQueue,i!==null&&(i=i.lastEffect,i!==null))){n=i=i.next;do{var l=n,c=l.destroy;l=l.tag,c!==void 0&&((l&2)!==0||(l&4)!==0)&&Ys(o,t,c),n=n.next}while(n!==i)}Qo(e,t,o);break;case 1:if(!bt&&(ta(o,t),i=o.stateNode,typeof i.componentWillUnmount=="function"))try{i.props=o.memoizedProps,i.state=o.memoizedState,i.componentWillUnmount()}catch(h){tt(o,t,h)}Qo(e,t,o);break;case 21:Qo(e,t,o);break;case 22:o.mode&1?(bt=(i=bt)||o.memoizedState!==null,Qo(e,t,o),bt=i):Qo(e,t,o);break;default:Qo(e,t,o)}}function Zc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new ih),t.forEach(function(i){var n=gh.bind(null,e,i);o.has(i)||(o.add(i),i.then(n,n))})}}function Qt(e,t){var o=t.deletions;if(o!==null)for(var i=0;i<o.length;i++){var n=o[i];try{var l=e,c=t,h=c;e:for(;h!==null;){switch(h.tag){case 5:ht=h.stateNode,$t=!1;break e;case 3:ht=h.stateNode.containerInfo,$t=!0;break e;case 4:ht=h.stateNode.containerInfo,$t=!0;break e}h=h.return}if(ht===null)throw Error(s(160));Qc(l,c,n),ht=null,$t=!1;var v=n.alternate;v!==null&&(v.return=null),n.return=null}catch(I){tt(n,t,I)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Jc(t,e),t=t.sibling}function Jc(e,t){var o=e.alternate,i=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(Qt(t,e),co(e),i&4){try{Ya(3,e,e.return),tr(3,e)}catch(ie){tt(e,e.return,ie)}try{Ya(5,e,e.return)}catch(ie){tt(e,e.return,ie)}}break;case 1:Qt(t,e),co(e),i&512&&o!==null&&ta(o,o.return);break;case 5:if(Qt(t,e),co(e),i&512&&o!==null&&ta(o,o.return),e.flags&32){var n=e.stateNode;try{Mo(n,"")}catch(ie){tt(e,e.return,ie)}}if(i&4&&(n=e.stateNode,n!=null)){var l=e.memoizedProps,c=o!==null?o.memoizedProps:l,h=e.type,v=e.updateQueue;if(e.updateQueue=null,v!==null)try{h==="input"&&l.type==="radio"&&l.name!=null&&to(n,l),ha(h,c);var I=ha(h,l);for(c=0;c<v.length;c+=2){var U=v[c],B=v[c+1];U==="style"?ga(n,B):U==="dangerouslySetInnerHTML"?Nt(n,B):U==="children"?Mo(n,B):J(n,U,B,I)}switch(h){case"input":ca(n,l);break;case"textarea":oo(n,l);break;case"select":var L=n._wrapperState.wasMultiple;n._wrapperState.wasMultiple=!!l.multiple;var G=l.value;G!=null?zo(n,!!l.multiple,G,!1):L!==!!l.multiple&&(l.defaultValue!=null?zo(n,!!l.multiple,l.defaultValue,!0):zo(n,!!l.multiple,l.multiple?[]:"",!1))}n[_a]=l}catch(ie){tt(e,e.return,ie)}}break;case 6:if(Qt(t,e),co(e),i&4){if(e.stateNode===null)throw Error(s(162));n=e.stateNode,l=e.memoizedProps;try{n.nodeValue=l}catch(ie){tt(e,e.return,ie)}}break;case 3:if(Qt(t,e),co(e),i&4&&o!==null&&o.memoizedState.isDehydrated)try{Ca(t.containerInfo)}catch(ie){tt(e,e.return,ie)}break;case 4:Qt(t,e),co(e);break;case 13:Qt(t,e),co(e),n=e.child,n.flags&8192&&(l=n.memoizedState!==null,n.stateNode.isHidden=l,!l||n.alternate!==null&&n.alternate.memoizedState!==null||(Js=ze())),i&4&&Zc(e);break;case 22:if(U=o!==null&&o.memoizedState!==null,e.mode&1?(bt=(I=bt)||U,Qt(t,e),bt=I):Qt(t,e),co(e),i&8192){if(I=e.memoizedState!==null,(e.stateNode.isHidden=I)&&!U&&(e.mode&1)!==0)for(Q=e,U=e.child;U!==null;){for(B=Q=U;Q!==null;){switch(L=Q,G=L.child,L.tag){case 0:case 11:case 14:case 15:Ya(4,L,L.return);break;case 1:ta(L,L.return);var ee=L.stateNode;if(typeof ee.componentWillUnmount=="function"){i=L,o=L.return;try{t=i,ee.props=t.memoizedProps,ee.state=t.memoizedState,ee.componentWillUnmount()}catch(ie){tt(i,o,ie)}}break;case 5:ta(L,L.return);break;case 22:if(L.memoizedState!==null){td(B);continue}}G!==null?(G.return=L,Q=G):td(B)}U=U.sibling}e:for(U=null,B=e;;){if(B.tag===5){if(U===null){U=B;try{n=B.stateNode,I?(l=n.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(h=B.stateNode,v=B.memoizedProps.style,c=v!=null&&v.hasOwnProperty("display")?v.display:null,h.style.display=Wt("display",c))}catch(ie){tt(e,e.return,ie)}}}else if(B.tag===6){if(U===null)try{B.stateNode.nodeValue=I?"":B.memoizedProps}catch(ie){tt(e,e.return,ie)}}else if((B.tag!==22&&B.tag!==23||B.memoizedState===null||B===e)&&B.child!==null){B.child.return=B,B=B.child;continue}if(B===e)break e;for(;B.sibling===null;){if(B.return===null||B.return===e)break e;U===B&&(U=null),B=B.return}U===B&&(U=null),B.sibling.return=B.return,B=B.sibling}}break;case 19:Qt(t,e),co(e),i&4&&Zc(e);break;case 21:break;default:Qt(t,e),co(e)}}function co(e){var t=e.flags;if(t&2){try{e:{for(var o=e.return;o!==null;){if(Gc(o)){var i=o;break e}o=o.return}throw Error(s(160))}switch(i.tag){case 5:var n=i.stateNode;i.flags&32&&(Mo(n,""),i.flags&=-33);var l=$c(e);$s(e,l,n);break;case 3:case 4:var c=i.stateNode.containerInfo,h=$c(e);Gs(e,h,c);break;default:throw Error(s(161))}}catch(v){tt(e,e.return,v)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function nh(e,t,o){Q=e,Xc(e)}function Xc(e,t,o){for(var i=(e.mode&1)!==0;Q!==null;){var n=Q,l=n.child;if(n.tag===22&&i){var c=n.memoizedState!==null||er;if(!c){var h=n.alternate,v=h!==null&&h.memoizedState!==null||bt;h=er;var I=bt;if(er=c,(bt=v)&&!I)for(Q=n;Q!==null;)c=Q,v=c.child,c.tag===22&&c.memoizedState!==null?od(n):v!==null?(v.return=c,Q=v):od(n);for(;l!==null;)Q=l,Xc(l),l=l.sibling;Q=n,er=h,bt=I}ed(e)}else(n.subtreeFlags&8772)!==0&&l!==null?(l.return=n,Q=l):ed(e)}}function ed(e){for(;Q!==null;){var t=Q;if((t.flags&8772)!==0){var o=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:bt||tr(5,t);break;case 1:var i=t.stateNode;if(t.flags&4&&!bt)if(o===null)i.componentDidMount();else{var n=t.elementType===t.type?o.memoizedProps:Gt(t.type,o.memoizedProps);i.componentDidUpdate(n,o.memoizedState,i.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&tc(t,l,i);break;case 3:var c=t.updateQueue;if(c!==null){if(o=null,t.child!==null)switch(t.child.tag){case 5:o=t.child.stateNode;break;case 1:o=t.child.stateNode}tc(t,c,o)}break;case 5:var h=t.stateNode;if(o===null&&t.flags&4){o=h;var v=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":v.autoFocus&&o.focus();break;case"img":v.src&&(o.src=v.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var I=t.alternate;if(I!==null){var U=I.memoizedState;if(U!==null){var B=U.dehydrated;B!==null&&Ca(B)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(s(163))}bt||t.flags&512&&Ks(t)}catch(L){tt(t,t.return,L)}}if(t===e){Q=null;break}if(o=t.sibling,o!==null){o.return=t.return,Q=o;break}Q=t.return}}function td(e){for(;Q!==null;){var t=Q;if(t===e){Q=null;break}var o=t.sibling;if(o!==null){o.return=t.return,Q=o;break}Q=t.return}}function od(e){for(;Q!==null;){var t=Q;try{switch(t.tag){case 0:case 11:case 15:var o=t.return;try{tr(4,t)}catch(v){tt(t,o,v)}break;case 1:var i=t.stateNode;if(typeof i.componentDidMount=="function"){var n=t.return;try{i.componentDidMount()}catch(v){tt(t,n,v)}}var l=t.return;try{Ks(t)}catch(v){tt(t,l,v)}break;case 5:var c=t.return;try{Ks(t)}catch(v){tt(t,c,v)}}}catch(v){tt(t,t.return,v)}if(t===e){Q=null;break}var h=t.sibling;if(h!==null){h.return=t.return,Q=h;break}Q=t.return}}var rh=Math.ceil,or=te.ReactCurrentDispatcher,Qs=te.ReactCurrentOwner,Ft=te.ReactCurrentBatchConfig,je=0,dt=null,nt=null,mt=0,_t=0,oa=Vo(0),ut=0,Ka=null,wi=0,ir=0,Zs=0,Ga=null,Tt=null,Js=0,ia=1/0,Co=null,ar=!1,Xs=null,Zo=null,nr=!1,Jo=null,rr=0,$a=0,el=null,sr=-1,lr=0;function Pt(){return(je&6)!==0?ze():sr!==-1?sr:sr=ze()}function Xo(e){return(e.mode&1)===0?1:(je&2)!==0&&mt!==0?mt&-mt:qg.transition!==null?(lr===0&&(lr=$l()),lr):(e=Be,e!==0||(e=window.event,e=e===void 0?16:au(e.type)),e)}function Zt(e,t,o,i){if(50<$a)throw $a=0,el=null,Error(s(185));va(e,o,i),((je&2)===0||e!==dt)&&(e===dt&&((je&2)===0&&(ir|=o),ut===4&&ei(e,mt)),At(e,i),o===1&&je===0&&(t.mode&1)===0&&(ia=ze()+500,Ln&&Ko()))}function At(e,t){var o=e.callbackNode;qp(e,t);var i=yn(e,e===dt?mt:0);if(i===0)o!==null&&ho(o),e.callbackNode=null,e.callbackPriority=0;else if(t=i&-i,e.callbackPriority!==t){if(o!=null&&ho(o),t===1)e.tag===0?Fg(ad.bind(null,e)):qu(ad.bind(null,e)),Ug(function(){(je&6)===0&&Ko()}),o=null;else{switch(Ql(i)){case 1:o=mo;break;case 4:o=ro;break;case 16:o=fo;break;case 536870912:o=Ie;break;default:o=fo}o=pd(o,id.bind(null,e))}e.callbackPriority=t,e.callbackNode=o}}function id(e,t){if(sr=-1,lr=0,(je&6)!==0)throw Error(s(327));var o=e.callbackNode;if(aa()&&e.callbackNode!==o)return null;var i=yn(e,e===dt?mt:0);if(i===0)return null;if((i&30)!==0||(i&e.expiredLanes)!==0||t)t=ur(e,i);else{t=i;var n=je;je|=2;var l=rd();(dt!==e||mt!==t)&&(Co=null,ia=ze()+500,Pi(e,t));do try{uh();break}catch(h){nd(e,h)}while(!0);Ss(),or.current=l,je=n,nt!==null?t=0:(dt=null,mt=0,t=ut)}if(t!==0){if(t===2&&(n=Mr(e),n!==0&&(i=n,t=tl(e,n))),t===1)throw o=Ka,Pi(e,0),ei(e,i),At(e,ze()),o;if(t===6)ei(e,i);else{if(n=e.current.alternate,(i&30)===0&&!sh(n)&&(t=ur(e,i),t===2&&(l=Mr(e),l!==0&&(i=l,t=tl(e,l))),t===1))throw o=Ka,Pi(e,0),ei(e,i),At(e,ze()),o;switch(e.finishedWork=n,e.finishedLanes=i,t){case 0:case 1:throw Error(s(345));case 2:Ci(e,Tt,Co);break;case 3:if(ei(e,i),(i&130023424)===i&&(t=Js+500-ze(),10<t)){if(yn(e,0)!==0)break;if(n=e.suspendedLanes,(n&i)!==i){Pt(),e.pingedLanes|=e.suspendedLanes&n;break}e.timeoutHandle=ss(Ci.bind(null,e,Tt,Co),t);break}Ci(e,Tt,Co);break;case 4:if(ei(e,i),(i&4194240)===i)break;for(t=e.eventTimes,n=-1;0<i;){var c=31-De(i);l=1<<c,c=t[c],c>n&&(n=c),i&=~l}if(i=n,i=ze()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*rh(i/1960))-i,10<i){e.timeoutHandle=ss(Ci.bind(null,e,Tt,Co),i);break}Ci(e,Tt,Co);break;case 5:Ci(e,Tt,Co);break;default:throw Error(s(329))}}}return At(e,ze()),e.callbackNode===o?id.bind(null,e):null}function tl(e,t){var o=Ga;return e.current.memoizedState.isDehydrated&&(Pi(e,t).flags|=256),e=ur(e,t),e!==2&&(t=Tt,Tt=o,t!==null&&ol(t)),e}function ol(e){Tt===null?Tt=e:Tt.push.apply(Tt,e)}function sh(e){for(var t=e;;){if(t.flags&16384){var o=t.updateQueue;if(o!==null&&(o=o.stores,o!==null))for(var i=0;i<o.length;i++){var n=o[i],l=n.getSnapshot;n=n.value;try{if(!Yt(l(),n))return!1}catch{return!1}}}if(o=t.child,t.subtreeFlags&16384&&o!==null)o.return=t,t=o;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function ei(e,t){for(t&=~Zs,t&=~ir,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var o=31-De(t),i=1<<o;e[o]=-1,t&=~i}}function ad(e){if((je&6)!==0)throw Error(s(327));aa();var t=yn(e,0);if((t&1)===0)return At(e,ze()),null;var o=ur(e,t);if(e.tag!==0&&o===2){var i=Mr(e);i!==0&&(t=i,o=tl(e,i))}if(o===1)throw o=Ka,Pi(e,0),ei(e,t),At(e,ze()),o;if(o===6)throw Error(s(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ci(e,Tt,Co),At(e,ze()),null}function il(e,t){var o=je;je|=1;try{return e(t)}finally{je=o,je===0&&(ia=ze()+500,Ln&&Ko())}}function ki(e){Jo!==null&&Jo.tag===0&&(je&6)===0&&aa();var t=je;je|=1;var o=Ft.transition,i=Be;try{if(Ft.transition=null,Be=1,e)return e()}finally{Be=i,Ft.transition=o,je=t,(je&6)===0&&Ko()}}function al(){_t=oa.current,Ke(oa)}function Pi(e,t){e.finishedWork=null,e.finishedLanes=0;var o=e.timeoutHandle;if(o!==-1&&(e.timeoutHandle=-1,Ng(o)),nt!==null)for(o=nt.return;o!==null;){var i=o;switch(gs(i),i.tag){case 1:i=i.type.childContextTypes,i!=null&&Mn();break;case 3:Xi(),Ke(Ct),Ke(yt),Rs();break;case 5:Cs(i);break;case 4:Xi();break;case 13:Ke(Ze);break;case 19:Ke(Ze);break;case 10:vs(i.type._context);break;case 22:case 23:al()}o=o.return}if(dt=e,nt=e=ti(e.current,null),mt=_t=t,ut=0,Ka=null,Zs=ir=wi=0,Tt=Ga=null,Si!==null){for(t=0;t<Si.length;t++)if(o=Si[t],i=o.interleaved,i!==null){o.interleaved=null;var n=i.next,l=o.pending;if(l!==null){var c=l.next;l.next=n,i.next=c}o.pending=i}Si=null}return e}function nd(e,t){do{var o=nt;try{if(Ss(),Yn.current=Qn,Kn){for(var i=Je.memoizedState;i!==null;){var n=i.queue;n!==null&&(n.pending=null),i=i.next}Kn=!1}if(bi=0,ct=lt=Je=null,Oa=!1,Fa=0,Qs.current=null,o===null||o.return===null){ut=1,Ka=t,nt=null;break}e:{var l=e,c=o.return,h=o,v=t;if(t=mt,h.flags|=32768,v!==null&&typeof v=="object"&&typeof v.then=="function"){var I=v,U=h,B=U.tag;if((U.mode&1)===0&&(B===0||B===11||B===15)){var L=U.alternate;L?(U.updateQueue=L.updateQueue,U.memoizedState=L.memoizedState,U.lanes=L.lanes):(U.updateQueue=null,U.memoizedState=null)}var G=Ec(c);if(G!==null){G.flags&=-257,jc(G,c,h,l,t),G.mode&1&&Ic(l,I,t),t=G,v=I;var ee=t.updateQueue;if(ee===null){var ie=new Set;ie.add(v),t.updateQueue=ie}else ee.add(v);break e}else{if((t&1)===0){Ic(l,I,t),nl();break e}v=Error(s(426))}}else if(Ge&&h.mode&1){var it=Ec(c);if(it!==null){(it.flags&65536)===0&&(it.flags|=256),jc(it,c,h,l,t),fs(ea(v,h));break e}}l=v=ea(v,h),ut!==4&&(ut=2),Ga===null?Ga=[l]:Ga.push(l),l=c;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var x=Tc(l,v,t);ec(l,x);break e;case 1:h=v;var b=l.type,T=l.stateNode;if((l.flags&128)===0&&(typeof b.getDerivedStateFromError=="function"||T!==null&&typeof T.componentDidCatch=="function"&&(Zo===null||!Zo.has(T)))){l.flags|=65536,t&=-t,l.lanes|=t;var q=Ac(l,h,t);ec(l,q);break e}}l=l.return}while(l!==null)}ld(o)}catch(ae){t=ae,nt===o&&o!==null&&(nt=o=o.return);continue}break}while(!0)}function rd(){var e=or.current;return or.current=Qn,e===null?Qn:e}function nl(){(ut===0||ut===3||ut===2)&&(ut=4),dt===null||(wi&268435455)===0&&(ir&268435455)===0||ei(dt,mt)}function ur(e,t){var o=je;je|=2;var i=rd();(dt!==e||mt!==t)&&(Co=null,Pi(e,t));do try{lh();break}catch(n){nd(e,n)}while(!0);if(Ss(),je=o,or.current=i,nt!==null)throw Error(s(261));return dt=null,mt=0,ut}function lh(){for(;nt!==null;)sd(nt)}function uh(){for(;nt!==null&&!pi();)sd(nt)}function sd(e){var t=dd(e.alternate,e,_t);e.memoizedProps=e.pendingProps,t===null?ld(e):nt=t,Qs.current=null}function ld(e){var t=e;do{var o=t.alternate;if(e=t.return,(t.flags&32768)===0){if(o=th(o,t,_t),o!==null){nt=o;return}}else{if(o=oh(o,t),o!==null){o.flags&=32767,nt=o;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{ut=6,nt=null;return}}if(t=t.sibling,t!==null){nt=t;return}nt=t=e}while(t!==null);ut===0&&(ut=5)}function Ci(e,t,o){var i=Be,n=Ft.transition;try{Ft.transition=null,Be=1,ch(e,t,o,i)}finally{Ft.transition=n,Be=i}return null}function ch(e,t,o,i){do aa();while(Jo!==null);if((je&6)!==0)throw Error(s(327));o=e.finishedWork;var n=e.finishedLanes;if(o===null)return null;if(e.finishedWork=null,e.finishedLanes=0,o===e.current)throw Error(s(177));e.callbackNode=null,e.callbackPriority=0;var l=o.lanes|o.childLanes;if(Wp(e,l),e===dt&&(nt=dt=null,mt=0),(o.subtreeFlags&2064)===0&&(o.flags&2064)===0||nr||(nr=!0,pd(fo,function(){return aa(),null})),l=(o.flags&15990)!==0,(o.subtreeFlags&15990)!==0||l){l=Ft.transition,Ft.transition=null;var c=Be;Be=1;var h=je;je|=4,Qs.current=null,ah(e,o),Jc(o,e),Eg(ns),bn=!!as,ns=as=null,e.current=o,nh(o),Vt(),je=h,Be=c,Ft.transition=l}else e.current=o;if(nr&&(nr=!1,Jo=e,rr=n),l=e.pendingLanes,l===0&&(Zo=null),gi(o.stateNode),At(e,ze()),t!==null)for(i=e.onRecoverableError,o=0;o<t.length;o++)n=t[o],i(n.value,{componentStack:n.stack,digest:n.digest});if(ar)throw ar=!1,e=Xs,Xs=null,e;return(rr&1)!==0&&e.tag!==0&&aa(),l=e.pendingLanes,(l&1)!==0?e===el?$a++:($a=0,el=e):$a=0,Ko(),null}function aa(){if(Jo!==null){var e=Ql(rr),t=Ft.transition,o=Be;try{if(Ft.transition=null,Be=16>e?16:e,Jo===null)var i=!1;else{if(e=Jo,Jo=null,rr=0,(je&6)!==0)throw Error(s(331));var n=je;for(je|=4,Q=e.current;Q!==null;){var l=Q,c=l.child;if((Q.flags&16)!==0){var h=l.deletions;if(h!==null){for(var v=0;v<h.length;v++){var I=h[v];for(Q=I;Q!==null;){var U=Q;switch(U.tag){case 0:case 11:case 15:Ya(8,U,l)}var B=U.child;if(B!==null)B.return=U,Q=B;else for(;Q!==null;){U=Q;var L=U.sibling,G=U.return;if(Kc(U),U===I){Q=null;break}if(L!==null){L.return=G,Q=L;break}Q=G}}}var ee=l.alternate;if(ee!==null){var ie=ee.child;if(ie!==null){ee.child=null;do{var it=ie.sibling;ie.sibling=null,ie=it}while(ie!==null)}}Q=l}}if((l.subtreeFlags&2064)!==0&&c!==null)c.return=l,Q=c;else e:for(;Q!==null;){if(l=Q,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:Ya(9,l,l.return)}var x=l.sibling;if(x!==null){x.return=l.return,Q=x;break e}Q=l.return}}var b=e.current;for(Q=b;Q!==null;){c=Q;var T=c.child;if((c.subtreeFlags&2064)!==0&&T!==null)T.return=c,Q=T;else e:for(c=b;Q!==null;){if(h=Q,(h.flags&2048)!==0)try{switch(h.tag){case 0:case 11:case 15:tr(9,h)}}catch(ae){tt(h,h.return,ae)}if(h===c){Q=null;break e}var q=h.sibling;if(q!==null){q.return=h.return,Q=q;break e}Q=h.return}}if(je=n,Ko(),gt&&typeof gt.onPostCommitFiberRoot=="function")try{gt.onPostCommitFiberRoot(qe,e)}catch{}i=!0}return i}finally{Be=o,Ft.transition=t}}return!1}function ud(e,t,o){t=ea(o,t),t=Tc(e,t,1),e=$o(e,t,1),t=Pt(),e!==null&&(va(e,1,t),At(e,t))}function tt(e,t,o){if(e.tag===3)ud(e,e,o);else for(;t!==null;){if(t.tag===3){ud(t,e,o);break}else if(t.tag===1){var i=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(Zo===null||!Zo.has(i))){e=ea(o,e),e=Ac(t,e,1),t=$o(t,e,1),e=Pt(),t!==null&&(va(t,1,e),At(t,e));break}}t=t.return}}function dh(e,t,o){var i=e.pingCache;i!==null&&i.delete(t),t=Pt(),e.pingedLanes|=e.suspendedLanes&o,dt===e&&(mt&o)===o&&(ut===4||ut===3&&(mt&130023424)===mt&&500>ze()-Js?Pi(e,0):Zs|=o),At(e,t)}function cd(e,t){t===0&&((e.mode&1)===0?t=1:(t=fn,fn<<=1,(fn&130023424)===0&&(fn=4194304)));var o=Pt();e=wo(e,t),e!==null&&(va(e,t,o),At(e,o))}function ph(e){var t=e.memoizedState,o=0;t!==null&&(o=t.retryLane),cd(e,o)}function gh(e,t){var o=0;switch(e.tag){case 13:var i=e.stateNode,n=e.memoizedState;n!==null&&(o=n.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(s(314))}i!==null&&i.delete(t),cd(e,o)}var dd;dd=function(e,t,o){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ct.current)Rt=!0;else{if((e.lanes&o)===0&&(t.flags&128)===0)return Rt=!1,eh(e,t,o);Rt=(e.flags&131072)!==0}else Rt=!1,Ge&&(t.flags&1048576)!==0&&Wu(t,Un,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;Xn(e,t),e=t.pendingProps;var n=Yi(t,yt.current);Ji(t,o),n=Is(null,t,i,e,n,o);var l=Es();return t.flags|=1,typeof n=="object"&&n!==null&&typeof n.render=="function"&&n.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,xt(i)?(l=!0,_n(t)):l=!1,t.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,ks(t),n.updater=Zn,t.stateNode=n,n._reactInternals=t,Ls(t,i,e,o),t=Bs(null,t,i,!0,l,o)):(t.tag=0,Ge&&l&&ps(t),kt(null,t,n,o),t=t.child),t;case 16:i=t.elementType;e:{switch(Xn(e,t),e=t.pendingProps,n=i._init,i=n(i._payload),t.type=i,n=t.tag=mh(i),e=Gt(i,e),n){case 0:t=Hs(null,t,i,e,o);break e;case 1:t=Nc(null,t,i,e,o);break e;case 11:t=zc(null,t,i,e,o);break e;case 14:t=Dc(null,t,i,Gt(i.type,e),o);break e}throw Error(s(306,i,""))}return t;case 0:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Gt(i,n),Hs(e,t,i,n,o);case 1:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Gt(i,n),Nc(e,t,i,n,o);case 3:e:{if(Uc(t),e===null)throw Error(s(387));i=t.pendingProps,l=t.memoizedState,n=l.element,Xu(e,t),Wn(t,i,null,o);var c=t.memoizedState;if(i=c.element,l.isDehydrated)if(l={element:i,isDehydrated:!1,cache:c.cache,pendingSuspenseBoundaries:c.pendingSuspenseBoundaries,transitions:c.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){n=ea(Error(s(423)),t),t=Hc(e,t,i,o,n);break e}else if(i!==n){n=ea(Error(s(424)),t),t=Hc(e,t,i,o,n);break e}else for(Mt=Wo(t.stateNode.containerInfo.firstChild),Dt=t,Ge=!0,Kt=null,o=Zu(t,null,i,o),t.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if($i(),i===n){t=Po(e,t,o);break e}kt(e,t,i,o)}t=t.child}return t;case 5:return oc(t),e===null&&ms(t),i=t.type,n=t.pendingProps,l=e!==null?e.memoizedProps:null,c=n.children,rs(i,n)?c=null:l!==null&&rs(i,l)&&(t.flags|=32),Lc(e,t),kt(e,t,c,o),t.child;case 6:return e===null&&ms(t),null;case 13:return Bc(e,t,o);case 4:return Ps(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Qi(t,null,i,o):kt(e,t,i,o),t.child;case 11:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Gt(i,n),zc(e,t,i,n,o);case 7:return kt(e,t,t.pendingProps,o),t.child;case 8:return kt(e,t,t.pendingProps.children,o),t.child;case 12:return kt(e,t,t.pendingProps.children,o),t.child;case 10:e:{if(i=t.type._context,n=t.pendingProps,l=t.memoizedProps,c=n.value,We(On,i._currentValue),i._currentValue=c,l!==null)if(Yt(l.value,c)){if(l.children===n.children&&!Ct.current){t=Po(e,t,o);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var h=l.dependencies;if(h!==null){c=l.child;for(var v=h.firstContext;v!==null;){if(v.context===i){if(l.tag===1){v=ko(-1,o&-o),v.tag=2;var I=l.updateQueue;if(I!==null){I=I.shared;var U=I.pending;U===null?v.next=v:(v.next=U.next,U.next=v),I.pending=v}}l.lanes|=o,v=l.alternate,v!==null&&(v.lanes|=o),bs(l.return,o,t),h.lanes|=o;break}v=v.next}}else if(l.tag===10)c=l.type===t.type?null:l.child;else if(l.tag===18){if(c=l.return,c===null)throw Error(s(341));c.lanes|=o,h=c.alternate,h!==null&&(h.lanes|=o),bs(c,o,t),c=l.sibling}else c=l.child;if(c!==null)c.return=l;else for(c=l;c!==null;){if(c===t){c=null;break}if(l=c.sibling,l!==null){l.return=c.return,c=l;break}c=c.return}l=c}kt(e,t,n.children,o),t=t.child}return t;case 9:return n=t.type,i=t.pendingProps.children,Ji(t,o),n=Bt(n),i=i(n),t.flags|=1,kt(e,t,i,o),t.child;case 14:return i=t.type,n=Gt(i,t.pendingProps),n=Gt(i.type,n),Dc(e,t,i,n,o);case 15:return Mc(e,t,t.type,t.pendingProps,o);case 17:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Gt(i,n),Xn(e,t),t.tag=1,xt(i)?(e=!0,_n(t)):e=!1,Ji(t,o),xc(t,i,n),Ls(t,i,n,o),Bs(null,t,i,!0,e,o);case 19:return Fc(e,t,o);case 22:return _c(e,t,o)}throw Error(s(156,t.tag))};function pd(e,t){return Ve(e,t)}function hh(e,t,o,i){this.tag=e,this.key=o,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=i,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function qt(e,t,o,i){return new hh(e,t,o,i)}function rl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function mh(e){if(typeof e=="function")return rl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===we)return 11;if(e===Qe)return 14}return 2}function ti(e,t){var o=e.alternate;return o===null?(o=qt(e.tag,t,e.key,e.mode),o.elementType=e.elementType,o.type=e.type,o.stateNode=e.stateNode,o.alternate=e,e.alternate=o):(o.pendingProps=t,o.type=e.type,o.flags=0,o.subtreeFlags=0,o.deletions=null),o.flags=e.flags&14680064,o.childLanes=e.childLanes,o.lanes=e.lanes,o.child=e.child,o.memoizedProps=e.memoizedProps,o.memoizedState=e.memoizedState,o.updateQueue=e.updateQueue,t=e.dependencies,o.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},o.sibling=e.sibling,o.index=e.index,o.ref=e.ref,o}function cr(e,t,o,i,n,l){var c=2;if(i=e,typeof e=="function")rl(e)&&(c=1);else if(typeof e=="string")c=5;else e:switch(e){case A:return xi(o.children,n,l,t);case K:c=8,n|=8;break;case be:return e=qt(12,o,t,n|2),e.elementType=be,e.lanes=l,e;case _e:return e=qt(13,o,t,n),e.elementType=_e,e.lanes=l,e;case Fe:return e=qt(19,o,t,n),e.elementType=Fe,e.lanes=l,e;case Le:return dr(o,n,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case le:c=10;break e;case ke:c=9;break e;case we:c=11;break e;case Qe:c=14;break e;case ot:c=16,i=null;break e}throw Error(s(130,e==null?e:typeof e,""))}return t=qt(c,o,t,n),t.elementType=e,t.type=i,t.lanes=l,t}function xi(e,t,o,i){return e=qt(7,e,i,t),e.lanes=o,e}function dr(e,t,o,i){return e=qt(22,e,i,t),e.elementType=Le,e.lanes=o,e.stateNode={isHidden:!1},e}function sl(e,t,o){return e=qt(6,e,null,t),e.lanes=o,e}function ll(e,t,o){return t=qt(4,e.children!==null?e.children:[],e.key,t),t.lanes=o,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function fh(e,t,o,i,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=_r(0),this.expirationTimes=_r(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=_r(0),this.identifierPrefix=i,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function ul(e,t,o,i,n,l,c,h,v){return e=new fh(e,t,o,h,v),t===1?(t=1,l===!0&&(t|=8)):t=0,l=qt(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:i,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},ks(l),e}function yh(e,t,o){var i=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:Ae,key:i==null?null:""+i,children:e,containerInfo:t,implementation:o}}function gd(e){if(!e)return Yo;e=e._reactInternals;e:{if(Z(e)!==e||e.tag!==1)throw Error(s(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(xt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(s(171))}if(e.tag===1){var o=e.type;if(xt(o))return Ou(e,o,t)}return t}function hd(e,t,o,i,n,l,c,h,v){return e=ul(o,i,!0,e,n,l,c,h,v),e.context=gd(null),o=e.current,i=Pt(),n=Xo(o),l=ko(i,n),l.callback=t??null,$o(o,l,n),e.current.lanes=n,va(e,n,i),At(e,i),e}function pr(e,t,o,i){var n=t.current,l=Pt(),c=Xo(n);return o=gd(o),t.context===null?t.context=o:t.pendingContext=o,t=ko(l,c),t.payload={element:e},i=i===void 0?null:i,i!==null&&(t.callback=i),e=$o(n,t,c),e!==null&&(Zt(e,n,c,l),qn(e,n,c)),c}function gr(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function md(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var o=e.retryLane;e.retryLane=o!==0&&o<t?o:t}}function cl(e,t){md(e,t),(e=e.alternate)&&md(e,t)}function Sh(){return null}var fd=typeof reportError=="function"?reportError:function(e){console.error(e)};function dl(e){this._internalRoot=e}hr.prototype.render=dl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(s(409));pr(e,t,null,null)},hr.prototype.unmount=dl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;ki(function(){pr(null,e,null,null)}),t[yo]=null}};function hr(e){this._internalRoot=e}hr.prototype.unstable_scheduleHydration=function(e){if(e){var t=Xl();e={blockedOn:null,target:e,priority:t};for(var o=0;o<Oo.length&&t!==0&&t<Oo[o].priority;o++);Oo.splice(o,0,e),o===0&&ou(e)}};function pl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function mr(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function yd(){}function vh(e,t,o,i,n){if(n){if(typeof i=="function"){var l=i;i=function(){var I=gr(c);l.call(I)}}var c=hd(t,i,e,0,null,!1,!1,"",yd);return e._reactRootContainer=c,e[yo]=c.current,Da(e.nodeType===8?e.parentNode:e),ki(),c}for(;n=e.lastChild;)e.removeChild(n);if(typeof i=="function"){var h=i;i=function(){var I=gr(v);h.call(I)}}var v=ul(e,0,!1,null,null,!1,!1,"",yd);return e._reactRootContainer=v,e[yo]=v.current,Da(e.nodeType===8?e.parentNode:e),ki(function(){pr(t,v,o,i)}),v}function fr(e,t,o,i,n){var l=o._reactRootContainer;if(l){var c=l;if(typeof n=="function"){var h=n;n=function(){var v=gr(c);h.call(v)}}pr(t,c,e,n)}else c=vh(o,t,e,n,i);return gr(c)}Zl=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var o=Sa(t.pendingLanes);o!==0&&(Lr(t,o|1),At(t,ze()),(je&6)===0&&(ia=ze()+500,Ko()))}break;case 13:ki(function(){var i=wo(e,1);if(i!==null){var n=Pt();Zt(i,e,1,n)}}),cl(e,1)}},Nr=function(e){if(e.tag===13){var t=wo(e,134217728);if(t!==null){var o=Pt();Zt(t,e,134217728,o)}cl(e,134217728)}},Jl=function(e){if(e.tag===13){var t=Xo(e),o=wo(e,t);if(o!==null){var i=Pt();Zt(o,e,t,i)}cl(e,t)}},Xl=function(){return Be},eu=function(e,t){var o=Be;try{return Be=e,t()}finally{Be=o}},_i=function(e,t,o){switch(t){case"input":if(ca(e,o),t=o.name,o.type==="radio"&&t!=null){for(o=e;o.parentNode;)o=o.parentNode;for(o=o.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<o.length;t++){var i=o[t];if(i!==e&&i.form===e.form){var n=Dn(i);if(!n)throw Error(s(90));Ne(i),ca(i,n)}}}break;case"textarea":oo(e,o);break;case"select":t=o.value,t!=null&&zo(e,!!o.multiple,t,!1)}},fa=il,ci=ki;var bh={usingClientEntryPoint:!1,Events:[La,Wi,Dn,ma,pn,il]},Qa={findFiberByHostInstance:hi,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},wh={bundleType:Qa.bundleType,version:Qa.version,rendererPackageName:Qa.rendererPackageName,rendererConfig:Qa.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:te.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=He(e),e===null?null:e.stateNode},findFiberByHostInstance:Qa.findFiberByHostInstance||Sh,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var yr=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!yr.isDisabled&&yr.supportsFiber)try{qe=yr.inject(wh),gt=yr}catch{}}return It.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=bh,It.createPortal=function(e,t){var o=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!pl(t))throw Error(s(200));return yh(e,t,null,o)},It.createRoot=function(e,t){if(!pl(e))throw Error(s(299));var o=!1,i="",n=fd;return t!=null&&(t.unstable_strictMode===!0&&(o=!0),t.identifierPrefix!==void 0&&(i=t.identifierPrefix),t.onRecoverableError!==void 0&&(n=t.onRecoverableError)),t=ul(e,1,!1,null,null,o,!1,i,n),e[yo]=t.current,Da(e.nodeType===8?e.parentNode:e),new dl(t)},It.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(s(188)):(e=Object.keys(e).join(","),Error(s(268,e)));return e=He(t),e=e===null?null:e.stateNode,e},It.flushSync=function(e){return ki(e)},It.hydrate=function(e,t,o){if(!mr(t))throw Error(s(200));return fr(null,e,t,!0,o)},It.hydrateRoot=function(e,t,o){if(!pl(e))throw Error(s(405));var i=o!=null&&o.hydratedSources||null,n=!1,l="",c=fd;if(o!=null&&(o.unstable_strictMode===!0&&(n=!0),o.identifierPrefix!==void 0&&(l=o.identifierPrefix),o.onRecoverableError!==void 0&&(c=o.onRecoverableError)),t=hd(t,null,e,1,o??null,n,!1,l,c),e[yo]=t.current,Da(e),i)for(e=0;e<i.length;e++)o=i[e],n=o._getVersion,n=n(o._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[o,n]:t.mutableSourceEagerHydrationData.push(o,n);return new hr(t)},It.render=function(e,t,o){if(!mr(t))throw Error(s(200));return fr(null,e,t,!1,o)},It.unmountComponentAtNode=function(e){if(!mr(e))throw Error(s(40));return e._reactRootContainer?(ki(function(){fr(null,null,e,!1,function(){e._reactRootContainer=null,e[yo]=null})}),!0):!1},It.unstable_batchedUpdates=il,It.unstable_renderSubtreeIntoContainer=function(e,t,o,i){if(!mr(o))throw Error(s(200));if(e==null||e._reactInternals===void 0)throw Error(s(38));return fr(e,t,o,!1,i)},It.version="18.3.1-next-f1338f8080-20240426",It}var xd;function up(){if(xd)return ml.exports;xd=1;function a(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),ml.exports=Eh(),ml.exports}var Rd;function jh(){if(Rd)return Sr;Rd=1;var a=up();return Sr.createRoot=a.createRoot,Sr.hydrateRoot=a.hydrateRoot,Sr}var zh=jh(),R=Ll();const Dh=lp(R),Mh=sp({__proto__:null,default:Dh},[R]);var Nl=up();const _h=lp(Nl),Lh=sp({__proto__:null,default:_h},[Nl]);/**
41
+ `+l.stack}return{value:e,source:t,stack:n,digest:null}}function Ns(e,t,o){return{value:e,source:null,stack:o??null,digest:t??null}}function Hs(e,t){try{console.error(t.value)}catch(o){setTimeout(function(){throw o})}}var Jg=typeof WeakMap=="function"?WeakMap:Map;function Tc(e,t,o){o=Co(-1,o),o.tag=3,o.payload={element:null};var i=t.value;return o.callback=function(){rr||(rr=!0,el=i),Hs(e,t)},o}function Ac(e,t,o){o=Co(-1,o),o.tag=3;var i=e.type.getDerivedStateFromError;if(typeof i=="function"){var n=t.value;o.payload=function(){return i(n)},o.callback=function(){Hs(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(o.callback=function(){Hs(e,t),typeof i!="function"&&(Zo===null?Zo=new Set([this]):Zo.add(this));var d=t.stack;this.componentDidCatch(t.value,{componentStack:d!==null?d:""})}),o}function Ic(e,t,o){var i=e.pingCache;if(i===null){i=e.pingCache=new Jg;var n=new Set;i.set(t,n)}else n=i.get(t),n===void 0&&(n=new Set,i.set(t,n));n.has(o)||(n.add(o),e=dh.bind(null,e,t,o),t.then(e,e))}function Ec(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function jc(e,t,o,i,n){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,o.flags|=131072,o.flags&=-52805,o.tag===1&&(o.alternate===null?o.tag=17:(t=Co(-1,1),t.tag=2,Qo(o,t,1))),o.lanes|=1),e):(e.flags|=65536,e.lanes=n,e)}var Zg=te.ReactCurrentOwner,It=!1;function Ct(e,t,o,i){t.child=e===null?Ju(t,null,o,i):Zi(t,e.child,o,i)}function zc(e,t,o,i,n){o=o.render;var l=t.ref;return ea(t,n),i=Es(e,t,o,i,l,n),o=js(),e!==null&&!It?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n,xo(e,t,n)):(Ke&&o&&gs(t),t.flags|=1,Ct(e,t,i,n),t.child)}function Dc(e,t,o,i,n){if(e===null){var l=o.type;return typeof l=="function"&&!sl(l)&&l.defaultProps===void 0&&o.compare===null&&o.defaultProps===void 0?(t.tag=15,t.type=l,Mc(e,t,l,i,n)):(e=pr(o.type,null,i,t,t.mode,n),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&n)===0){var d=l.memoizedProps;if(o=o.compare,o=o!==null?o:ja,o(d,i)&&e.ref===t.ref)return xo(e,t,n)}return t.flags|=1,e=oi(l,i),e.ref=t.ref,e.return=t,t.child=e}function Mc(e,t,o,i,n){if(e!==null){var l=e.memoizedProps;if(ja(l,i)&&e.ref===t.ref)if(It=!1,t.pendingProps=i=l,(e.lanes&n)!==0)(e.flags&131072)!==0&&(It=!0);else return t.lanes=e.lanes,xo(e,t,n)}return Bs(e,t,o,i,n)}function _c(e,t,o){var i=t.pendingProps,n=i.children,l=e!==null?e.memoizedState:null;if(i.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},qe(aa,Nt),Nt|=o;else{if((o&1073741824)===0)return e=l!==null?l.baseLanes|o:o,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,qe(aa,Nt),Nt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},i=l!==null?l.baseLanes:o,qe(aa,Nt),Nt|=i}else l!==null?(i=l.baseLanes|o,t.memoizedState=null):i=o,qe(aa,Nt),Nt|=i;return Ct(e,t,n,o),t.child}function Uc(e,t){var o=t.ref;(e===null&&o!==null||e!==null&&e.ref!==o)&&(t.flags|=512,t.flags|=2097152)}function Bs(e,t,o,i,n){var l=At(o)?yi:vt.current;return l=Gi(t,l),ea(t,n),o=Es(e,t,o,i,l,n),i=js(),e!==null&&!It?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n,xo(e,t,n)):(Ke&&i&&gs(t),t.flags|=1,Ct(e,t,o,n),t.child)}function Lc(e,t,o,i,n){if(At(o)){var l=!0;Ln(t)}else l=!1;if(ea(t,n),t.stateNode===null)tr(e,t),xc(t,o,i),Ls(t,o,i,n),i=!0;else if(e===null){var d=t.stateNode,h=t.memoizedProps;d.props=h;var S=d.context,A=o.contextType;typeof A=="object"&&A!==null?A=qt(A):(A=At(o)?yi:vt.current,A=Gi(t,A));var N=o.getDerivedStateFromProps,B=typeof N=="function"||typeof d.getSnapshotBeforeUpdate=="function";B||typeof d.UNSAFE_componentWillReceiveProps!="function"&&typeof d.componentWillReceiveProps!="function"||(h!==i||S!==A)&&Rc(t,d,i,A),$o=!1;var U=t.memoizedState;d.state=U,Yn(t,i,d,n),S=t.memoizedState,h!==i||U!==S||Tt.current||$o?(typeof N=="function"&&(Us(t,o,N,i),S=t.memoizedState),(h=$o||Cc(t,o,h,i,U,S,A))?(B||typeof d.UNSAFE_componentWillMount!="function"&&typeof d.componentWillMount!="function"||(typeof d.componentWillMount=="function"&&d.componentWillMount(),typeof d.UNSAFE_componentWillMount=="function"&&d.UNSAFE_componentWillMount()),typeof d.componentDidMount=="function"&&(t.flags|=4194308)):(typeof d.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=i,t.memoizedState=S),d.props=i,d.state=S,d.context=A,i=h):(typeof d.componentDidMount=="function"&&(t.flags|=4194308),i=!1)}else{d=t.stateNode,Xu(e,t),h=t.memoizedProps,A=t.type===t.elementType?h:Jt(t.type,h),d.props=A,B=t.pendingProps,U=d.context,S=o.contextType,typeof S=="object"&&S!==null?S=qt(S):(S=At(o)?yi:vt.current,S=Gi(t,S));var G=o.getDerivedStateFromProps;(N=typeof G=="function"||typeof d.getSnapshotBeforeUpdate=="function")||typeof d.UNSAFE_componentWillReceiveProps!="function"&&typeof d.componentWillReceiveProps!="function"||(h!==B||U!==S)&&Rc(t,d,i,S),$o=!1,U=t.memoizedState,d.state=U,Yn(t,i,d,n);var ee=t.memoizedState;h!==B||U!==ee||Tt.current||$o?(typeof G=="function"&&(Us(t,o,G,i),ee=t.memoizedState),(A=$o||Cc(t,o,A,i,U,ee,S)||!1)?(N||typeof d.UNSAFE_componentWillUpdate!="function"&&typeof d.componentWillUpdate!="function"||(typeof d.componentWillUpdate=="function"&&d.componentWillUpdate(i,ee,S),typeof d.UNSAFE_componentWillUpdate=="function"&&d.UNSAFE_componentWillUpdate(i,ee,S)),typeof d.componentDidUpdate=="function"&&(t.flags|=4),typeof d.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof d.componentDidUpdate!="function"||h===e.memoizedProps&&U===e.memoizedState||(t.flags|=4),typeof d.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&U===e.memoizedState||(t.flags|=1024),t.memoizedProps=i,t.memoizedState=ee),d.props=i,d.state=ee,d.context=S,i=A):(typeof d.componentDidUpdate!="function"||h===e.memoizedProps&&U===e.memoizedState||(t.flags|=4),typeof d.getSnapshotBeforeUpdate!="function"||h===e.memoizedProps&&U===e.memoizedState||(t.flags|=1024),i=!1)}return Os(e,t,o,i,l,n)}function Os(e,t,o,i,n,l){Uc(e,t);var d=(t.flags&128)!==0;if(!i&&!d)return n&&Fu(t,o,!1),xo(e,t,l);i=t.stateNode,Zg.current=t;var h=d&&typeof o.getDerivedStateFromError!="function"?null:i.render();return t.flags|=1,e!==null&&d?(t.child=Zi(t,e.child,null,l),t.child=Zi(t,null,h,l)):Ct(e,t,h,l),t.memoizedState=i.state,n&&Fu(t,o,!0),t.child}function Nc(e){var t=e.stateNode;t.pendingContext?Bu(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Bu(e,t.context,!1),Cs(e,t.containerInfo)}function Hc(e,t,o,i,n){return Ji(),ys(n),t.flags|=256,Ct(e,t,o,i),t.child}var Fs={dehydrated:null,treeContext:null,retryLane:0};function qs(e){return{baseLanes:e,cachePool:null,transitions:null}}function Bc(e,t,o){var i=t.pendingProps,n=Qe.current,l=!1,d=(t.flags&128)!==0,h;if((h=d)||(h=e!==null&&e.memoizedState===null?!1:(n&2)!==0),h?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(n|=1),qe(Qe,n&1),e===null)return fs(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data==="$!"?t.lanes=8:t.lanes=1073741824,null):(d=i.children,e=i.fallback,l?(i=t.mode,l=t.child,d={mode:"hidden",children:d},(i&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=d):l=gr(d,i,0,null),e=Ti(e,i,o,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=qs(o),t.memoizedState=Fs,e):Ws(t,d));if(n=e.memoizedState,n!==null&&(h=n.dehydrated,h!==null))return Xg(e,t,d,i,h,n,o);if(l){l=i.fallback,d=t.mode,n=e.child,h=n.sibling;var S={mode:"hidden",children:i.children};return(d&1)===0&&t.child!==n?(i=t.child,i.childLanes=0,i.pendingProps=S,t.deletions=null):(i=oi(n,S),i.subtreeFlags=n.subtreeFlags&14680064),h!==null?l=oi(h,l):(l=Ti(l,d,o,null),l.flags|=2),l.return=t,i.return=t,i.sibling=l,t.child=i,i=l,l=t.child,d=e.child.memoizedState,d=d===null?qs(o):{baseLanes:d.baseLanes|o,cachePool:null,transitions:d.transitions},l.memoizedState=d,l.childLanes=e.childLanes&~o,t.memoizedState=Fs,i}return l=e.child,e=l.sibling,i=oi(l,{mode:"visible",children:i.children}),(t.mode&1)===0&&(i.lanes=o),i.return=t,i.sibling=null,e!==null&&(o=t.deletions,o===null?(t.deletions=[e],t.flags|=16):o.push(e)),t.child=i,t.memoizedState=null,i}function Ws(e,t){return t=gr({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function er(e,t,o,i){return i!==null&&ys(i),Zi(t,e.child,null,o),e=Ws(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Xg(e,t,o,i,n,l,d){if(o)return t.flags&256?(t.flags&=-257,i=Ns(Error(s(422))),er(e,t,d,i)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=i.fallback,n=t.mode,i=gr({mode:"visible",children:i.children},n,0,null),l=Ti(l,n,d,null),l.flags|=2,i.return=t,l.return=t,i.sibling=l,t.child=i,(t.mode&1)!==0&&Zi(t,e.child,null,d),t.child.memoizedState=qs(d),t.memoizedState=Fs,l);if((t.mode&1)===0)return er(e,t,d,null);if(n.data==="$!"){if(i=n.nextSibling&&n.nextSibling.dataset,i)var h=i.dgst;return i=h,l=Error(s(419)),i=Ns(l,i,void 0),er(e,t,d,i)}if(h=(d&e.childLanes)!==0,It||h){if(i=pt,i!==null){switch(d&-d){case 4:n=2;break;case 16:n=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:n=32;break;case 536870912:n=268435456;break;default:n=0}n=(n&(i.suspendedLanes|d))!==0?0:n,n!==0&&n!==l.retryLane&&(l.retryLane=n,Po(e,n),eo(i,e,n,-1))}return rl(),i=Ns(Error(s(421))),er(e,t,d,i)}return n.data==="$?"?(t.flags|=128,t.child=e.child,t=ph.bind(null,e),n._reactRetry=t,null):(e=l.treeContext,Lt=Vo(n.nextSibling),Ut=t,Ke=!0,Qt=null,e!==null&&(Ot[Ft++]=wo,Ot[Ft++]=ko,Ot[Ft++]=Si,wo=e.id,ko=e.overflow,Si=t),t=Ws(t,i.children),t.flags|=4096,t)}function Oc(e,t,o){e.lanes|=t;var i=e.alternate;i!==null&&(i.lanes|=t),ws(e.return,t,o)}function Vs(e,t,o,i,n){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:i,tail:o,tailMode:n}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=i,l.tail=o,l.tailMode=n)}function Fc(e,t,o){var i=t.pendingProps,n=i.revealOrder,l=i.tail;if(Ct(e,t,i.children,o),i=Qe.current,(i&2)!==0)i=i&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Oc(e,o,t);else if(e.tag===19)Oc(e,o,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}i&=1}if(qe(Qe,i),(t.mode&1)===0)t.memoizedState=null;else switch(n){case"forwards":for(o=t.child,n=null;o!==null;)e=o.alternate,e!==null&&Kn(e)===null&&(n=o),o=o.sibling;o=n,o===null?(n=t.child,t.child=null):(n=o.sibling,o.sibling=null),Vs(t,!1,n,o,l);break;case"backwards":for(o=null,n=t.child,t.child=null;n!==null;){if(e=n.alternate,e!==null&&Kn(e)===null){t.child=n;break}e=n.sibling,n.sibling=o,o=n,n=e}Vs(t,!0,o,null,l);break;case"together":Vs(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function tr(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function xo(e,t,o){if(e!==null&&(t.dependencies=e.dependencies),Pi|=t.lanes,(o&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(s(153));if(t.child!==null){for(e=t.child,o=oi(e,e.pendingProps),t.child=o,o.return=t;e.sibling!==null;)e=e.sibling,o=o.sibling=oi(e,e.pendingProps),o.return=t;o.sibling=null}return t.child}function eh(e,t,o){switch(t.tag){case 3:Nc(t),Ji();break;case 5:oc(t);break;case 1:At(t.type)&&Ln(t);break;case 4:Cs(t,t.stateNode.containerInfo);break;case 10:var i=t.type._context,n=t.memoizedProps.value;qe(qn,i._currentValue),i._currentValue=n;break;case 13:if(i=t.memoizedState,i!==null)return i.dehydrated!==null?(qe(Qe,Qe.current&1),t.flags|=128,null):(o&t.child.childLanes)!==0?Bc(e,t,o):(qe(Qe,Qe.current&1),e=xo(e,t,o),e!==null?e.sibling:null);qe(Qe,Qe.current&1);break;case 19:if(i=(o&t.childLanes)!==0,(e.flags&128)!==0){if(i)return Fc(e,t,o);t.flags|=128}if(n=t.memoizedState,n!==null&&(n.rendering=null,n.tail=null,n.lastEffect=null),qe(Qe,Qe.current),i)break;return null;case 22:case 23:return t.lanes=0,_c(e,t,o)}return xo(e,t,o)}var qc,Ys,Wc,Vc;qc=function(e,t){for(var o=t.child;o!==null;){if(o.tag===5||o.tag===6)e.appendChild(o.stateNode);else if(o.tag!==4&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break;for(;o.sibling===null;){if(o.return===null||o.return===t)return;o=o.return}o.sibling.return=o.return,o=o.sibling}},Ys=function(){},Wc=function(e,t,o,i){var n=e.memoizedProps;if(n!==i){e=t.stateNode,wi(co.current);var l=null;switch(o){case"input":n=et(e,n),i=et(e,i),l=[];break;case"select":n=Y({},n,{value:void 0}),i=Y({},i,{value:void 0}),l=[];break;case"textarea":n=pa(e,n),i=pa(e,i),l=[];break;default:typeof n.onClick!="function"&&typeof i.onClick=="function"&&(e.onclick=Mn)}_i(o,i);var d;o=null;for(A in n)if(!i.hasOwnProperty(A)&&n.hasOwnProperty(A)&&n[A]!=null)if(A==="style"){var h=n[A];for(d in h)h.hasOwnProperty(d)&&(o||(o={}),o[d]="")}else A!=="dangerouslySetInnerHTML"&&A!=="children"&&A!=="suppressContentEditableWarning"&&A!=="suppressHydrationWarning"&&A!=="autoFocus"&&(c.hasOwnProperty(A)?l||(l=[]):(l=l||[]).push(A,null));for(A in i){var S=i[A];if(h=n!=null?n[A]:void 0,i.hasOwnProperty(A)&&S!==h&&(S!=null||h!=null))if(A==="style")if(h){for(d in h)!h.hasOwnProperty(d)||S&&S.hasOwnProperty(d)||(o||(o={}),o[d]="");for(d in S)S.hasOwnProperty(d)&&h[d]!==S[d]&&(o||(o={}),o[d]=S[d])}else o||(l||(l=[]),l.push(A,o)),o=S;else A==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,h=h?h.__html:void 0,S!=null&&h!==S&&(l=l||[]).push(A,S)):A==="children"?typeof S!="string"&&typeof S!="number"||(l=l||[]).push(A,""+S):A!=="suppressContentEditableWarning"&&A!=="suppressHydrationWarning"&&(c.hasOwnProperty(A)?(S!=null&&A==="onScroll"&&Ve("scroll",e),l||h===S||(l=[])):(l=l||[]).push(A,S))}o&&(l=l||[]).push("style",o);var A=l;(t.updateQueue=A)&&(t.flags|=4)}},Vc=function(e,t,o,i){o!==i&&(t.flags|=4)};function Ya(e,t){if(!Ke)switch(e.tailMode){case"hidden":t=e.tail;for(var o=null;t!==null;)t.alternate!==null&&(o=t),t=t.sibling;o===null?e.tail=null:o.sibling=null;break;case"collapsed":o=e.tail;for(var i=null;o!==null;)o.alternate!==null&&(i=o),o=o.sibling;i===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:i.sibling=null}}function wt(e){var t=e.alternate!==null&&e.alternate.child===e.child,o=0,i=0;if(t)for(var n=e.child;n!==null;)o|=n.lanes|n.childLanes,i|=n.subtreeFlags&14680064,i|=n.flags&14680064,n.return=e,n=n.sibling;else for(n=e.child;n!==null;)o|=n.lanes|n.childLanes,i|=n.subtreeFlags,i|=n.flags,n.return=e,n=n.sibling;return e.subtreeFlags|=i,e.childLanes=o,t}function th(e,t,o){var i=t.pendingProps;switch(hs(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return wt(t),null;case 1:return At(t.type)&&Un(),wt(t),null;case 3:return i=t.stateNode,ta(),Ye(Tt),Ye(vt),Ts(),i.pendingContext&&(i.context=i.pendingContext,i.pendingContext=null),(e===null||e.child===null)&&(On(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Qt!==null&&(il(Qt),Qt=null))),Ys(e,t),wt(t),null;case 5:xs(t);var n=wi(Oa.current);if(o=t.type,e!==null&&t.stateNode!=null)Wc(e,t,o,i,n),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!i){if(t.stateNode===null)throw Error(s(166));return wt(t),null}if(e=wi(co.current),On(t)){i=t.stateNode,o=t.type;var l=t.memoizedProps;switch(i[uo]=t,i[Ua]=l,e=(t.mode&1)!==0,o){case"dialog":Ve("cancel",i),Ve("close",i);break;case"iframe":case"object":case"embed":Ve("load",i);break;case"video":case"audio":for(n=0;n<Da.length;n++)Ve(Da[n],i);break;case"source":Ve("error",i);break;case"img":case"image":case"link":Ve("error",i),Ve("load",i);break;case"details":Ve("toggle",i);break;case"input":ht(i,l),Ve("invalid",i);break;case"select":i._wrapperState={wasMultiple:!!l.multiple},Ve("invalid",i);break;case"textarea":dn(i,l),Ve("invalid",i)}_i(o,l),n=null;for(var d in l)if(l.hasOwnProperty(d)){var h=l[d];d==="children"?typeof h=="string"?i.textContent!==h&&(l.suppressHydrationWarning!==!0&&Dn(i.textContent,h,e),n=["children",h]):typeof h=="number"&&i.textContent!==""+h&&(l.suppressHydrationWarning!==!0&&Dn(i.textContent,h,e),n=["children",""+h]):c.hasOwnProperty(d)&&h!=null&&d==="onScroll"&&Ve("scroll",i)}switch(o){case"input":mo(i),cn(i,l,!0);break;case"textarea":mo(i),Mo(i);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(i.onclick=Mn)}i=n,t.updateQueue=i,i!==null&&(t.flags|=4)}else{d=n.nodeType===9?n:n.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=ga(o)),e==="http://www.w3.org/1999/xhtml"?o==="script"?(e=d.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof i.is=="string"?e=d.createElement(o,{is:i.is}):(e=d.createElement(o),o==="select"&&(d=e,i.multiple?d.multiple=!0:i.size&&(d.size=i.size))):e=d.createElementNS(e,o),e[uo]=t,e[Ua]=i,qc(e,t,!1,!1),t.stateNode=e;e:{switch(d=ma(o,i),o){case"dialog":Ve("cancel",e),Ve("close",e),n=i;break;case"iframe":case"object":case"embed":Ve("load",e),n=i;break;case"video":case"audio":for(n=0;n<Da.length;n++)Ve(Da[n],e);n=i;break;case"source":Ve("error",e),n=i;break;case"img":case"image":case"link":Ve("error",e),Ve("load",e),n=i;break;case"details":Ve("toggle",e),n=i;break;case"input":ht(e,i),n=et(e,i),Ve("invalid",e);break;case"option":n=i;break;case"select":e._wrapperState={wasMultiple:!!i.multiple},n=Y({},i,{value:void 0}),Ve("invalid",e);break;case"textarea":dn(e,i),n=pa(e,i),Ve("invalid",e);break;default:n=i}_i(o,n),h=n;for(l in h)if(h.hasOwnProperty(l)){var S=h[l];l==="style"?ha(e,S):l==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,S!=null&&Bt(e,S)):l==="children"?typeof S=="string"?(o!=="textarea"||S!=="")&&_o(e,S):typeof S=="number"&&_o(e,""+S):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(c.hasOwnProperty(l)?S!=null&&l==="onScroll"&&Ve("scroll",e):S!=null&&Z(e,l,S,d))}switch(o){case"input":mo(e),cn(e,i,!1);break;case"textarea":mo(e),Mo(e);break;case"option":i.value!=null&&e.setAttribute("value",""+Te(i.value));break;case"select":e.multiple=!!i.multiple,l=i.value,l!=null?Do(e,!!i.multiple,l,!1):i.defaultValue!=null&&Do(e,!!i.multiple,i.defaultValue,!0);break;default:typeof n.onClick=="function"&&(e.onclick=Mn)}switch(o){case"button":case"input":case"select":case"textarea":i=!!i.autoFocus;break e;case"img":i=!0;break e;default:i=!1}}i&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return wt(t),null;case 6:if(e&&t.stateNode!=null)Vc(e,t,e.memoizedProps,i);else{if(typeof i!="string"&&t.stateNode===null)throw Error(s(166));if(o=wi(Oa.current),wi(co.current),On(t)){if(i=t.stateNode,o=t.memoizedProps,i[uo]=t,(l=i.nodeValue!==o)&&(e=Ut,e!==null))switch(e.tag){case 3:Dn(i.nodeValue,o,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Dn(i.nodeValue,o,(e.mode&1)!==0)}l&&(t.flags|=4)}else i=(o.nodeType===9?o:o.ownerDocument).createTextNode(i),i[uo]=t,t.stateNode=i}return wt(t),null;case 13:if(Ye(Qe),i=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Ke&&Lt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Gu(),Ji(),t.flags|=98560,l=!1;else if(l=On(t),i!==null&&i.dehydrated!==null){if(e===null){if(!l)throw Error(s(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(s(317));l[uo]=t}else Ji(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;wt(t),l=!1}else Qt!==null&&(il(Qt),Qt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=o,t):(i=i!==null,i!==(e!==null&&e.memoizedState!==null)&&i&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Qe.current&1)!==0?ut===0&&(ut=3):rl())),t.updateQueue!==null&&(t.flags|=4),wt(t),null);case 4:return ta(),Ys(e,t),e===null&&Ma(t.stateNode.containerInfo),wt(t),null;case 10:return bs(t.type._context),wt(t),null;case 17:return At(t.type)&&Un(),wt(t),null;case 19:if(Ye(Qe),l=t.memoizedState,l===null)return wt(t),null;if(i=(t.flags&128)!==0,d=l.rendering,d===null)if(i)Ya(l,!1);else{if(ut!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(d=Kn(e),d!==null){for(t.flags|=128,Ya(l,!1),i=d.updateQueue,i!==null&&(t.updateQueue=i,t.flags|=4),t.subtreeFlags=0,i=o,o=t.child;o!==null;)l=o,e=i,l.flags&=14680066,d=l.alternate,d===null?(l.childLanes=0,l.lanes=e,l.child=null,l.subtreeFlags=0,l.memoizedProps=null,l.memoizedState=null,l.updateQueue=null,l.dependencies=null,l.stateNode=null):(l.childLanes=d.childLanes,l.lanes=d.lanes,l.child=d.child,l.subtreeFlags=0,l.deletions=null,l.memoizedProps=d.memoizedProps,l.memoizedState=d.memoizedState,l.updateQueue=d.updateQueue,l.type=d.type,e=d.dependencies,l.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),o=o.sibling;return qe(Qe,Qe.current&1|2),t.child}e=e.sibling}l.tail!==null&&ze()>na&&(t.flags|=128,i=!0,Ya(l,!1),t.lanes=4194304)}else{if(!i)if(e=Kn(d),e!==null){if(t.flags|=128,i=!0,o=e.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),Ya(l,!0),l.tail===null&&l.tailMode==="hidden"&&!d.alternate&&!Ke)return wt(t),null}else 2*ze()-l.renderingStartTime>na&&o!==1073741824&&(t.flags|=128,i=!0,Ya(l,!1),t.lanes=4194304);l.isBackwards?(d.sibling=t.child,t.child=d):(o=l.last,o!==null?o.sibling=d:t.child=d,l.last=d)}return l.tail!==null?(t=l.tail,l.rendering=t,l.tail=t.sibling,l.renderingStartTime=ze(),t.sibling=null,o=Qe.current,qe(Qe,i?o&1|2:o&1),t):(wt(t),null);case 22:case 23:return nl(),i=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==i&&(t.flags|=8192),i&&(t.mode&1)!==0?(Nt&1073741824)!==0&&(wt(t),t.subtreeFlags&6&&(t.flags|=8192)):wt(t),null;case 24:return null;case 25:return null}throw Error(s(156,t.tag))}function oh(e,t){switch(hs(t),t.tag){case 1:return At(t.type)&&Un(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(),Ye(Tt),Ye(vt),Ts(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return xs(t),null;case 13:if(Ye(Qe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ye(Qe),null;case 4:return ta(),null;case 10:return bs(t.type._context),null;case 22:case 23:return nl(),null;case 24:return null;default:return null}}var or=!1,kt=!1,ih=typeof WeakSet=="function"?WeakSet:Set,Q=null;function ia(e,t){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(i){tt(e,t,i)}else o.current=null}function Ks(e,t,o){try{o()}catch(i){tt(e,t,i)}}var Yc=!1;function ah(e,t){if(ns=kn,e=Cu(),Jr(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var i=o.getSelection&&o.getSelection();if(i&&i.rangeCount!==0){o=i.anchorNode;var n=i.anchorOffset,l=i.focusNode;i=i.focusOffset;try{o.nodeType,l.nodeType}catch{o=null;break e}var d=0,h=-1,S=-1,A=0,N=0,B=e,U=null;t:for(;;){for(var G;B!==o||n!==0&&B.nodeType!==3||(h=d+n),B!==l||i!==0&&B.nodeType!==3||(S=d+i),B.nodeType===3&&(d+=B.nodeValue.length),(G=B.firstChild)!==null;)U=B,B=G;for(;;){if(B===e)break t;if(U===o&&++A===n&&(h=d),U===l&&++N===i&&(S=d),(G=B.nextSibling)!==null)break;B=U,U=B.parentNode}B=G}o=h===-1||S===-1?null:{start:h,end:S}}else o=null}o=o||{start:0,end:0}}else o=null;for(rs={focusedElem:e,selectionRange:o},kn=!1,Q=t;Q!==null;)if(t=Q,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Q=e;else for(;Q!==null;){t=Q;try{var ee=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(ee!==null){var ie=ee.memoizedProps,it=ee.memoizedState,x=t.stateNode,b=x.getSnapshotBeforeUpdate(t.elementType===t.type?ie:Jt(t.type,ie),it);x.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var T=t.stateNode.containerInfo;T.nodeType===1?T.textContent="":T.nodeType===9&&T.documentElement&&T.removeChild(T.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(s(163))}}catch(q){tt(t,t.return,q)}if(e=t.sibling,e!==null){e.return=t.return,Q=e;break}Q=t.return}return ee=Yc,Yc=!1,ee}function Ka(e,t,o){var i=t.updateQueue;if(i=i!==null?i.lastEffect:null,i!==null){var n=i=i.next;do{if((n.tag&e)===e){var l=n.destroy;n.destroy=void 0,l!==void 0&&Ks(t,o,l)}n=n.next}while(n!==i)}}function ir(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var o=t=t.next;do{if((o.tag&e)===e){var i=o.create;o.destroy=i()}o=o.next}while(o!==t)}}function Gs(e){var t=e.ref;if(t!==null){var o=e.stateNode;switch(e.tag){case 5:e=o;break;default:e=o}typeof t=="function"?t(e):t.current=e}}function Kc(e){var t=e.alternate;t!==null&&(e.alternate=null,Kc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[uo],delete t[Ua],delete t[cs],delete t[Bg],delete t[Og])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Gc(e){return e.tag===5||e.tag===3||e.tag===4}function $c(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Gc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $s(e,t,o){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?o.nodeType===8?o.parentNode.insertBefore(e,t):o.insertBefore(e,t):(o.nodeType===8?(t=o.parentNode,t.insertBefore(e,o)):(t=o,t.appendChild(e)),o=o._reactRootContainer,o!=null||t.onclick!==null||(t.onclick=Mn));else if(i!==4&&(e=e.child,e!==null))for($s(e,t,o),e=e.sibling;e!==null;)$s(e,t,o),e=e.sibling}function Qs(e,t,o){var i=e.tag;if(i===5||i===6)e=e.stateNode,t?o.insertBefore(e,t):o.appendChild(e);else if(i!==4&&(e=e.child,e!==null))for(Qs(e,t,o),e=e.sibling;e!==null;)Qs(e,t,o),e=e.sibling}var ft=null,Zt=!1;function Jo(e,t,o){for(o=o.child;o!==null;)Qc(e,t,o),o=o.sibling}function Qc(e,t,o){if(mt&&typeof mt.onCommitFiberUnmount=="function")try{mt.onCommitFiberUnmount(Fe,o)}catch{}switch(o.tag){case 5:kt||ia(o,t);case 6:var i=ft,n=Zt;ft=null,Jo(e,t,o),ft=i,Zt=n,ft!==null&&(Zt?(e=ft,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):ft.removeChild(o.stateNode));break;case 18:ft!==null&&(Zt?(e=ft,o=o.stateNode,e.nodeType===8?us(e.parentNode,o):e.nodeType===1&&us(e,o),xa(e)):us(ft,o.stateNode));break;case 4:i=ft,n=Zt,ft=o.stateNode.containerInfo,Zt=!0,Jo(e,t,o),ft=i,Zt=n;break;case 0:case 11:case 14:case 15:if(!kt&&(i=o.updateQueue,i!==null&&(i=i.lastEffect,i!==null))){n=i=i.next;do{var l=n,d=l.destroy;l=l.tag,d!==void 0&&((l&2)!==0||(l&4)!==0)&&Ks(o,t,d),n=n.next}while(n!==i)}Jo(e,t,o);break;case 1:if(!kt&&(ia(o,t),i=o.stateNode,typeof i.componentWillUnmount=="function"))try{i.props=o.memoizedProps,i.state=o.memoizedState,i.componentWillUnmount()}catch(h){tt(o,t,h)}Jo(e,t,o);break;case 21:Jo(e,t,o);break;case 22:o.mode&1?(kt=(i=kt)||o.memoizedState!==null,Jo(e,t,o),kt=i):Jo(e,t,o);break;default:Jo(e,t,o)}}function Jc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new ih),t.forEach(function(i){var n=gh.bind(null,e,i);o.has(i)||(o.add(i),i.then(n,n))})}}function Xt(e,t){var o=t.deletions;if(o!==null)for(var i=0;i<o.length;i++){var n=o[i];try{var l=e,d=t,h=d;e:for(;h!==null;){switch(h.tag){case 5:ft=h.stateNode,Zt=!1;break e;case 3:ft=h.stateNode.containerInfo,Zt=!0;break e;case 4:ft=h.stateNode.containerInfo,Zt=!0;break e}h=h.return}if(ft===null)throw Error(s(160));Qc(l,d,n),ft=null,Zt=!1;var S=n.alternate;S!==null&&(S.return=null),n.return=null}catch(A){tt(n,t,A)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)Zc(t,e),t=t.sibling}function Zc(e,t){var o=e.alternate,i=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(Xt(t,e),go(e),i&4){try{Ka(3,e,e.return),ir(3,e)}catch(ie){tt(e,e.return,ie)}try{Ka(5,e,e.return)}catch(ie){tt(e,e.return,ie)}}break;case 1:Xt(t,e),go(e),i&512&&o!==null&&ia(o,o.return);break;case 5:if(Xt(t,e),go(e),i&512&&o!==null&&ia(o,o.return),e.flags&32){var n=e.stateNode;try{_o(n,"")}catch(ie){tt(e,e.return,ie)}}if(i&4&&(n=e.stateNode,n!=null)){var l=e.memoizedProps,d=o!==null?o.memoizedProps:l,h=e.type,S=e.updateQueue;if(e.updateQueue=null,S!==null)try{h==="input"&&l.type==="radio"&&l.name!=null&&Rt(n,l),ma(h,d);var A=ma(h,l);for(d=0;d<S.length;d+=2){var N=S[d],B=S[d+1];N==="style"?ha(n,B):N==="dangerouslySetInnerHTML"?Bt(n,B):N==="children"?_o(n,B):Z(n,N,B,A)}switch(h){case"input":ui(n,l);break;case"textarea":ao(n,l);break;case"select":var U=n._wrapperState.wasMultiple;n._wrapperState.wasMultiple=!!l.multiple;var G=l.value;G!=null?Do(n,!!l.multiple,G,!1):U!==!!l.multiple&&(l.defaultValue!=null?Do(n,!!l.multiple,l.defaultValue,!0):Do(n,!!l.multiple,l.multiple?[]:"",!1))}n[Ua]=l}catch(ie){tt(e,e.return,ie)}}break;case 6:if(Xt(t,e),go(e),i&4){if(e.stateNode===null)throw Error(s(162));n=e.stateNode,l=e.memoizedProps;try{n.nodeValue=l}catch(ie){tt(e,e.return,ie)}}break;case 3:if(Xt(t,e),go(e),i&4&&o!==null&&o.memoizedState.isDehydrated)try{xa(t.containerInfo)}catch(ie){tt(e,e.return,ie)}break;case 4:Xt(t,e),go(e);break;case 13:Xt(t,e),go(e),n=e.child,n.flags&8192&&(l=n.memoizedState!==null,n.stateNode.isHidden=l,!l||n.alternate!==null&&n.alternate.memoizedState!==null||(Xs=ze())),i&4&&Jc(e);break;case 22:if(N=o!==null&&o.memoizedState!==null,e.mode&1?(kt=(A=kt)||N,Xt(t,e),kt=A):Xt(t,e),go(e),i&8192){if(A=e.memoizedState!==null,(e.stateNode.isHidden=A)&&!N&&(e.mode&1)!==0)for(Q=e,N=e.child;N!==null;){for(B=Q=N;Q!==null;){switch(U=Q,G=U.child,U.tag){case 0:case 11:case 14:case 15:Ka(4,U,U.return);break;case 1:ia(U,U.return);var ee=U.stateNode;if(typeof ee.componentWillUnmount=="function"){i=U,o=U.return;try{t=i,ee.props=t.memoizedProps,ee.state=t.memoizedState,ee.componentWillUnmount()}catch(ie){tt(i,o,ie)}}break;case 5:ia(U,U.return);break;case 22:if(U.memoizedState!==null){td(B);continue}}G!==null?(G.return=U,Q=G):td(B)}N=N.sibling}e:for(N=null,B=e;;){if(B.tag===5){if(N===null){N=B;try{n=B.stateNode,A?(l=n.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(h=B.stateNode,S=B.memoizedProps.style,d=S!=null&&S.hasOwnProperty("display")?S.display:null,h.style.display=Kt("display",d))}catch(ie){tt(e,e.return,ie)}}}else if(B.tag===6){if(N===null)try{B.stateNode.nodeValue=A?"":B.memoizedProps}catch(ie){tt(e,e.return,ie)}}else if((B.tag!==22&&B.tag!==23||B.memoizedState===null||B===e)&&B.child!==null){B.child.return=B,B=B.child;continue}if(B===e)break e;for(;B.sibling===null;){if(B.return===null||B.return===e)break e;N===B&&(N=null),B=B.return}N===B&&(N=null),B.sibling.return=B.return,B=B.sibling}}break;case 19:Xt(t,e),go(e),i&4&&Jc(e);break;case 21:break;default:Xt(t,e),go(e)}}function go(e){var t=e.flags;if(t&2){try{e:{for(var o=e.return;o!==null;){if(Gc(o)){var i=o;break e}o=o.return}throw Error(s(160))}switch(i.tag){case 5:var n=i.stateNode;i.flags&32&&(_o(n,""),i.flags&=-33);var l=$c(e);Qs(e,l,n);break;case 3:case 4:var d=i.stateNode.containerInfo,h=$c(e);$s(e,h,d);break;default:throw Error(s(161))}}catch(S){tt(e,e.return,S)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function nh(e,t,o){Q=e,Xc(e)}function Xc(e,t,o){for(var i=(e.mode&1)!==0;Q!==null;){var n=Q,l=n.child;if(n.tag===22&&i){var d=n.memoizedState!==null||or;if(!d){var h=n.alternate,S=h!==null&&h.memoizedState!==null||kt;h=or;var A=kt;if(or=d,(kt=S)&&!A)for(Q=n;Q!==null;)d=Q,S=d.child,d.tag===22&&d.memoizedState!==null?od(n):S!==null?(S.return=d,Q=S):od(n);for(;l!==null;)Q=l,Xc(l),l=l.sibling;Q=n,or=h,kt=A}ed(e)}else(n.subtreeFlags&8772)!==0&&l!==null?(l.return=n,Q=l):ed(e)}}function ed(e){for(;Q!==null;){var t=Q;if((t.flags&8772)!==0){var o=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:kt||ir(5,t);break;case 1:var i=t.stateNode;if(t.flags&4&&!kt)if(o===null)i.componentDidMount();else{var n=t.elementType===t.type?o.memoizedProps:Jt(t.type,o.memoizedProps);i.componentDidUpdate(n,o.memoizedState,i.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&tc(t,l,i);break;case 3:var d=t.updateQueue;if(d!==null){if(o=null,t.child!==null)switch(t.child.tag){case 5:o=t.child.stateNode;break;case 1:o=t.child.stateNode}tc(t,d,o)}break;case 5:var h=t.stateNode;if(o===null&&t.flags&4){o=h;var S=t.memoizedProps;switch(t.type){case"button":case"input":case"select":case"textarea":S.autoFocus&&o.focus();break;case"img":S.src&&(o.src=S.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var A=t.alternate;if(A!==null){var N=A.memoizedState;if(N!==null){var B=N.dehydrated;B!==null&&xa(B)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(s(163))}kt||t.flags&512&&Gs(t)}catch(U){tt(t,t.return,U)}}if(t===e){Q=null;break}if(o=t.sibling,o!==null){o.return=t.return,Q=o;break}Q=t.return}}function td(e){for(;Q!==null;){var t=Q;if(t===e){Q=null;break}var o=t.sibling;if(o!==null){o.return=t.return,Q=o;break}Q=t.return}}function od(e){for(;Q!==null;){var t=Q;try{switch(t.tag){case 0:case 11:case 15:var o=t.return;try{ir(4,t)}catch(S){tt(t,o,S)}break;case 1:var i=t.stateNode;if(typeof i.componentDidMount=="function"){var n=t.return;try{i.componentDidMount()}catch(S){tt(t,n,S)}}var l=t.return;try{Gs(t)}catch(S){tt(t,l,S)}break;case 5:var d=t.return;try{Gs(t)}catch(S){tt(t,d,S)}}}catch(S){tt(t,t.return,S)}if(t===e){Q=null;break}var h=t.sibling;if(h!==null){h.return=t.return,Q=h;break}Q=t.return}}var rh=Math.ceil,ar=te.ReactCurrentDispatcher,Js=te.ReactCurrentOwner,Vt=te.ReactCurrentBatchConfig,Ee=0,pt=null,nt=null,yt=0,Nt=0,aa=Yo(0),ut=0,Ga=null,Pi=0,nr=0,Zs=0,$a=null,Et=null,Xs=0,na=1/0,Ro=null,rr=!1,el=null,Zo=null,sr=!1,Xo=null,lr=0,Qa=0,tl=null,ur=-1,cr=0;function xt(){return(Ee&6)!==0?ze():ur!==-1?ur:ur=ze()}function ei(e){return(e.mode&1)===0?1:(Ee&2)!==0&&yt!==0?yt&-yt:qg.transition!==null?(cr===0&&(cr=$l()),cr):(e=Be,e!==0||(e=window.event,e=e===void 0?16:au(e.type)),e)}function eo(e,t,o,i){if(50<Qa)throw Qa=0,tl=null,Error(s(185));ba(e,o,i),((Ee&2)===0||e!==pt)&&(e===pt&&((Ee&2)===0&&(nr|=o),ut===4&&ti(e,yt)),jt(e,i),o===1&&Ee===0&&(t.mode&1)===0&&(na=ze()+500,Nn&&Go()))}function jt(e,t){var o=e.callbackNode;qp(e,t);var i=vn(e,e===pt?yt:0);if(i===0)o!==null&&fo(o),e.callbackNode=null,e.callbackPriority=0;else if(t=i&-i,e.callbackPriority!==t){if(o!=null&&fo(o),t===1)e.tag===0?Fg(ad.bind(null,e)):qu(ad.bind(null,e)),Ng(function(){(Ee&6)===0&&Go()}),o=null;else{switch(Ql(i)){case 1:o=yo;break;case 4:o=lo;break;case 16:o=So;break;case 536870912:o=Ae;break;default:o=So}o=pd(o,id.bind(null,e))}e.callbackPriority=t,e.callbackNode=o}}function id(e,t){if(ur=-1,cr=0,(Ee&6)!==0)throw Error(s(327));var o=e.callbackNode;if(ra()&&e.callbackNode!==o)return null;var i=vn(e,e===pt?yt:0);if(i===0)return null;if((i&30)!==0||(i&e.expiredLanes)!==0||t)t=dr(e,i);else{t=i;var n=Ee;Ee|=2;var l=rd();(pt!==e||yt!==t)&&(Ro=null,na=ze()+500,xi(e,t));do try{uh();break}catch(h){nd(e,h)}while(!0);vs(),ar.current=l,Ee=n,nt!==null?t=0:(pt=null,yt=0,t=ut)}if(t!==0){if(t===2&&(n=_r(e),n!==0&&(i=n,t=ol(e,n))),t===1)throw o=Ga,xi(e,0),ti(e,i),jt(e,ze()),o;if(t===6)ti(e,i);else{if(n=e.current.alternate,(i&30)===0&&!sh(n)&&(t=dr(e,i),t===2&&(l=_r(e),l!==0&&(i=l,t=ol(e,l))),t===1))throw o=Ga,xi(e,0),ti(e,i),jt(e,ze()),o;switch(e.finishedWork=n,e.finishedLanes=i,t){case 0:case 1:throw Error(s(345));case 2:Ri(e,Et,Ro);break;case 3:if(ti(e,i),(i&130023424)===i&&(t=Xs+500-ze(),10<t)){if(vn(e,0)!==0)break;if(n=e.suspendedLanes,(n&i)!==i){xt(),e.pingedLanes|=e.suspendedLanes&n;break}e.timeoutHandle=ls(Ri.bind(null,e,Et,Ro),t);break}Ri(e,Et,Ro);break;case 4:if(ti(e,i),(i&4194240)===i)break;for(t=e.eventTimes,n=-1;0<i;){var d=31-De(i);l=1<<d,d=t[d],d>n&&(n=d),i&=~l}if(i=n,i=ze()-i,i=(120>i?120:480>i?480:1080>i?1080:1920>i?1920:3e3>i?3e3:4320>i?4320:1960*rh(i/1960))-i,10<i){e.timeoutHandle=ls(Ri.bind(null,e,Et,Ro),i);break}Ri(e,Et,Ro);break;case 5:Ri(e,Et,Ro);break;default:throw Error(s(329))}}}return jt(e,ze()),e.callbackNode===o?id.bind(null,e):null}function ol(e,t){var o=$a;return e.current.memoizedState.isDehydrated&&(xi(e,t).flags|=256),e=dr(e,t),e!==2&&(t=Et,Et=o,t!==null&&il(t)),e}function il(e){Et===null?Et=e:Et.push.apply(Et,e)}function sh(e){for(var t=e;;){if(t.flags&16384){var o=t.updateQueue;if(o!==null&&(o=o.stores,o!==null))for(var i=0;i<o.length;i++){var n=o[i],l=n.getSnapshot;n=n.value;try{if(!$t(l(),n))return!1}catch{return!1}}}if(o=t.child,t.subtreeFlags&16384&&o!==null)o.return=t,t=o;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function ti(e,t){for(t&=~Zs,t&=~nr,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var o=31-De(t),i=1<<o;e[o]=-1,t&=~i}}function ad(e){if((Ee&6)!==0)throw Error(s(327));ra();var t=vn(e,0);if((t&1)===0)return jt(e,ze()),null;var o=dr(e,t);if(e.tag!==0&&o===2){var i=_r(e);i!==0&&(t=i,o=ol(e,i))}if(o===1)throw o=Ga,xi(e,0),ti(e,t),jt(e,ze()),o;if(o===6)throw Error(s(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,Ri(e,Et,Ro),jt(e,ze()),null}function al(e,t){var o=Ee;Ee|=1;try{return e(t)}finally{Ee=o,Ee===0&&(na=ze()+500,Nn&&Go())}}function Ci(e){Xo!==null&&Xo.tag===0&&(Ee&6)===0&&ra();var t=Ee;Ee|=1;var o=Vt.transition,i=Be;try{if(Vt.transition=null,Be=1,e)return e()}finally{Be=i,Vt.transition=o,Ee=t,(Ee&6)===0&&Go()}}function nl(){Nt=aa.current,Ye(aa)}function xi(e,t){e.finishedWork=null,e.finishedLanes=0;var o=e.timeoutHandle;if(o!==-1&&(e.timeoutHandle=-1,Lg(o)),nt!==null)for(o=nt.return;o!==null;){var i=o;switch(hs(i),i.tag){case 1:i=i.type.childContextTypes,i!=null&&Un();break;case 3:ta(),Ye(Tt),Ye(vt),Ts();break;case 5:xs(i);break;case 4:ta();break;case 13:Ye(Qe);break;case 19:Ye(Qe);break;case 10:bs(i.type._context);break;case 22:case 23:nl()}o=o.return}if(pt=e,nt=e=oi(e.current,null),yt=Nt=t,ut=0,Ga=null,Zs=nr=Pi=0,Et=$a=null,bi!==null){for(t=0;t<bi.length;t++)if(o=bi[t],i=o.interleaved,i!==null){o.interleaved=null;var n=i.next,l=o.pending;if(l!==null){var d=l.next;l.next=n,i.next=d}o.pending=i}bi=null}return e}function nd(e,t){do{var o=nt;try{if(vs(),Gn.current=Zn,$n){for(var i=Je.memoizedState;i!==null;){var n=i.queue;n!==null&&(n.pending=null),i=i.next}$n=!1}if(ki=0,dt=lt=Je=null,Fa=!1,qa=0,Js.current=null,o===null||o.return===null){ut=1,Ga=t,nt=null;break}e:{var l=e,d=o.return,h=o,S=t;if(t=yt,h.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){var A=S,N=h,B=N.tag;if((N.mode&1)===0&&(B===0||B===11||B===15)){var U=N.alternate;U?(N.updateQueue=U.updateQueue,N.memoizedState=U.memoizedState,N.lanes=U.lanes):(N.updateQueue=null,N.memoizedState=null)}var G=Ec(d);if(G!==null){G.flags&=-257,jc(G,d,h,l,t),G.mode&1&&Ic(l,A,t),t=G,S=A;var ee=t.updateQueue;if(ee===null){var ie=new Set;ie.add(S),t.updateQueue=ie}else ee.add(S);break e}else{if((t&1)===0){Ic(l,A,t),rl();break e}S=Error(s(426))}}else if(Ke&&h.mode&1){var it=Ec(d);if(it!==null){(it.flags&65536)===0&&(it.flags|=256),jc(it,d,h,l,t),ys(oa(S,h));break e}}l=S=oa(S,h),ut!==4&&(ut=2),$a===null?$a=[l]:$a.push(l),l=d;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var x=Tc(l,S,t);ec(l,x);break e;case 1:h=S;var b=l.type,T=l.stateNode;if((l.flags&128)===0&&(typeof b.getDerivedStateFromError=="function"||T!==null&&typeof T.componentDidCatch=="function"&&(Zo===null||!Zo.has(T)))){l.flags|=65536,t&=-t,l.lanes|=t;var q=Ac(l,h,t);ec(l,q);break e}}l=l.return}while(l!==null)}ld(o)}catch(ae){t=ae,nt===o&&o!==null&&(nt=o=o.return);continue}break}while(!0)}function rd(){var e=ar.current;return ar.current=Zn,e===null?Zn:e}function rl(){(ut===0||ut===3||ut===2)&&(ut=4),pt===null||(Pi&268435455)===0&&(nr&268435455)===0||ti(pt,yt)}function dr(e,t){var o=Ee;Ee|=2;var i=rd();(pt!==e||yt!==t)&&(Ro=null,xi(e,t));do try{lh();break}catch(n){nd(e,n)}while(!0);if(vs(),Ee=o,ar.current=i,nt!==null)throw Error(s(261));return pt=null,yt=0,ut}function lh(){for(;nt!==null;)sd(nt)}function uh(){for(;nt!==null&&!hi();)sd(nt)}function sd(e){var t=dd(e.alternate,e,Nt);e.memoizedProps=e.pendingProps,t===null?ld(e):nt=t,Js.current=null}function ld(e){var t=e;do{var o=t.alternate;if(e=t.return,(t.flags&32768)===0){if(o=th(o,t,Nt),o!==null){nt=o;return}}else{if(o=oh(o,t),o!==null){o.flags&=32767,nt=o;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{ut=6,nt=null;return}}if(t=t.sibling,t!==null){nt=t;return}nt=t=e}while(t!==null);ut===0&&(ut=5)}function Ri(e,t,o){var i=Be,n=Vt.transition;try{Vt.transition=null,Be=1,ch(e,t,o,i)}finally{Vt.transition=n,Be=i}return null}function ch(e,t,o,i){do ra();while(Xo!==null);if((Ee&6)!==0)throw Error(s(327));o=e.finishedWork;var n=e.finishedLanes;if(o===null)return null;if(e.finishedWork=null,e.finishedLanes=0,o===e.current)throw Error(s(177));e.callbackNode=null,e.callbackPriority=0;var l=o.lanes|o.childLanes;if(Wp(e,l),e===pt&&(nt=pt=null,yt=0),(o.subtreeFlags&2064)===0&&(o.flags&2064)===0||sr||(sr=!0,pd(So,function(){return ra(),null})),l=(o.flags&15990)!==0,(o.subtreeFlags&15990)!==0||l){l=Vt.transition,Vt.transition=null;var d=Be;Be=1;var h=Ee;Ee|=4,Js.current=null,ah(e,o),Zc(o,e),Eg(rs),kn=!!ns,rs=ns=null,e.current=o,nh(o),Gt(),Ee=h,Be=d,Vt.transition=l}else e.current=o;if(sr&&(sr=!1,Xo=e,lr=n),l=e.pendingLanes,l===0&&(Zo=null),mi(o.stateNode),jt(e,ze()),t!==null)for(i=e.onRecoverableError,o=0;o<t.length;o++)n=t[o],i(n.value,{componentStack:n.stack,digest:n.digest});if(rr)throw rr=!1,e=el,el=null,e;return(lr&1)!==0&&e.tag!==0&&ra(),l=e.pendingLanes,(l&1)!==0?e===tl?Qa++:(Qa=0,tl=e):Qa=0,Go(),null}function ra(){if(Xo!==null){var e=Ql(lr),t=Vt.transition,o=Be;try{if(Vt.transition=null,Be=16>e?16:e,Xo===null)var i=!1;else{if(e=Xo,Xo=null,lr=0,(Ee&6)!==0)throw Error(s(331));var n=Ee;for(Ee|=4,Q=e.current;Q!==null;){var l=Q,d=l.child;if((Q.flags&16)!==0){var h=l.deletions;if(h!==null){for(var S=0;S<h.length;S++){var A=h[S];for(Q=A;Q!==null;){var N=Q;switch(N.tag){case 0:case 11:case 15:Ka(8,N,l)}var B=N.child;if(B!==null)B.return=N,Q=B;else for(;Q!==null;){N=Q;var U=N.sibling,G=N.return;if(Kc(N),N===A){Q=null;break}if(U!==null){U.return=G,Q=U;break}Q=G}}}var ee=l.alternate;if(ee!==null){var ie=ee.child;if(ie!==null){ee.child=null;do{var it=ie.sibling;ie.sibling=null,ie=it}while(ie!==null)}}Q=l}}if((l.subtreeFlags&2064)!==0&&d!==null)d.return=l,Q=d;else e:for(;Q!==null;){if(l=Q,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:Ka(9,l,l.return)}var x=l.sibling;if(x!==null){x.return=l.return,Q=x;break e}Q=l.return}}var b=e.current;for(Q=b;Q!==null;){d=Q;var T=d.child;if((d.subtreeFlags&2064)!==0&&T!==null)T.return=d,Q=T;else e:for(d=b;Q!==null;){if(h=Q,(h.flags&2048)!==0)try{switch(h.tag){case 0:case 11:case 15:ir(9,h)}}catch(ae){tt(h,h.return,ae)}if(h===d){Q=null;break e}var q=h.sibling;if(q!==null){q.return=h.return,Q=q;break e}Q=h.return}}if(Ee=n,Go(),mt&&typeof mt.onPostCommitFiberRoot=="function")try{mt.onPostCommitFiberRoot(Fe,e)}catch{}i=!0}return i}finally{Be=o,Vt.transition=t}}return!1}function ud(e,t,o){t=oa(o,t),t=Tc(e,t,1),e=Qo(e,t,1),t=xt(),e!==null&&(ba(e,1,t),jt(e,t))}function tt(e,t,o){if(e.tag===3)ud(e,e,o);else for(;t!==null;){if(t.tag===3){ud(t,e,o);break}else if(t.tag===1){var i=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof i.componentDidCatch=="function"&&(Zo===null||!Zo.has(i))){e=oa(o,e),e=Ac(t,e,1),t=Qo(t,e,1),e=xt(),t!==null&&(ba(t,1,e),jt(t,e));break}}t=t.return}}function dh(e,t,o){var i=e.pingCache;i!==null&&i.delete(t),t=xt(),e.pingedLanes|=e.suspendedLanes&o,pt===e&&(yt&o)===o&&(ut===4||ut===3&&(yt&130023424)===yt&&500>ze()-Xs?xi(e,0):Zs|=o),jt(e,t)}function cd(e,t){t===0&&((e.mode&1)===0?t=1:(t=Sn,Sn<<=1,(Sn&130023424)===0&&(Sn=4194304)));var o=xt();e=Po(e,t),e!==null&&(ba(e,t,o),jt(e,o))}function ph(e){var t=e.memoizedState,o=0;t!==null&&(o=t.retryLane),cd(e,o)}function gh(e,t){var o=0;switch(e.tag){case 13:var i=e.stateNode,n=e.memoizedState;n!==null&&(o=n.retryLane);break;case 19:i=e.stateNode;break;default:throw Error(s(314))}i!==null&&i.delete(t),cd(e,o)}var dd;dd=function(e,t,o){if(e!==null)if(e.memoizedProps!==t.pendingProps||Tt.current)It=!0;else{if((e.lanes&o)===0&&(t.flags&128)===0)return It=!1,eh(e,t,o);It=(e.flags&131072)!==0}else It=!1,Ke&&(t.flags&1048576)!==0&&Wu(t,Bn,t.index);switch(t.lanes=0,t.tag){case 2:var i=t.type;tr(e,t),e=t.pendingProps;var n=Gi(t,vt.current);ea(t,o),n=Es(null,t,i,e,n,o);var l=js();return t.flags|=1,typeof n=="object"&&n!==null&&typeof n.render=="function"&&n.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,At(i)?(l=!0,Ln(t)):l=!1,t.memoizedState=n.state!==null&&n.state!==void 0?n.state:null,Ps(t),n.updater=Xn,t.stateNode=n,n._reactInternals=t,Ls(t,i,e,o),t=Os(null,t,i,!0,l,o)):(t.tag=0,Ke&&l&&gs(t),Ct(null,t,n,o),t=t.child),t;case 16:i=t.elementType;e:{switch(tr(e,t),e=t.pendingProps,n=i._init,i=n(i._payload),t.type=i,n=t.tag=mh(i),e=Jt(i,e),n){case 0:t=Bs(null,t,i,e,o);break e;case 1:t=Lc(null,t,i,e,o);break e;case 11:t=zc(null,t,i,e,o);break e;case 14:t=Dc(null,t,i,Jt(i.type,e),o);break e}throw Error(s(306,i,""))}return t;case 0:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Jt(i,n),Bs(e,t,i,n,o);case 1:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Jt(i,n),Lc(e,t,i,n,o);case 3:e:{if(Nc(t),e===null)throw Error(s(387));i=t.pendingProps,l=t.memoizedState,n=l.element,Xu(e,t),Yn(t,i,null,o);var d=t.memoizedState;if(i=d.element,l.isDehydrated)if(l={element:i,isDehydrated:!1,cache:d.cache,pendingSuspenseBoundaries:d.pendingSuspenseBoundaries,transitions:d.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){n=oa(Error(s(423)),t),t=Hc(e,t,i,o,n);break e}else if(i!==n){n=oa(Error(s(424)),t),t=Hc(e,t,i,o,n);break e}else for(Lt=Vo(t.stateNode.containerInfo.firstChild),Ut=t,Ke=!0,Qt=null,o=Ju(t,null,i,o),t.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(Ji(),i===n){t=xo(e,t,o);break e}Ct(e,t,i,o)}t=t.child}return t;case 5:return oc(t),e===null&&fs(t),i=t.type,n=t.pendingProps,l=e!==null?e.memoizedProps:null,d=n.children,ss(i,n)?d=null:l!==null&&ss(i,l)&&(t.flags|=32),Uc(e,t),Ct(e,t,d,o),t.child;case 6:return e===null&&fs(t),null;case 13:return Bc(e,t,o);case 4:return Cs(t,t.stateNode.containerInfo),i=t.pendingProps,e===null?t.child=Zi(t,null,i,o):Ct(e,t,i,o),t.child;case 11:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Jt(i,n),zc(e,t,i,n,o);case 7:return Ct(e,t,t.pendingProps,o),t.child;case 8:return Ct(e,t,t.pendingProps.children,o),t.child;case 12:return Ct(e,t,t.pendingProps.children,o),t.child;case 10:e:{if(i=t.type._context,n=t.pendingProps,l=t.memoizedProps,d=n.value,qe(qn,i._currentValue),i._currentValue=d,l!==null)if($t(l.value,d)){if(l.children===n.children&&!Tt.current){t=xo(e,t,o);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var h=l.dependencies;if(h!==null){d=l.child;for(var S=h.firstContext;S!==null;){if(S.context===i){if(l.tag===1){S=Co(-1,o&-o),S.tag=2;var A=l.updateQueue;if(A!==null){A=A.shared;var N=A.pending;N===null?S.next=S:(S.next=N.next,N.next=S),A.pending=S}}l.lanes|=o,S=l.alternate,S!==null&&(S.lanes|=o),ws(l.return,o,t),h.lanes|=o;break}S=S.next}}else if(l.tag===10)d=l.type===t.type?null:l.child;else if(l.tag===18){if(d=l.return,d===null)throw Error(s(341));d.lanes|=o,h=d.alternate,h!==null&&(h.lanes|=o),ws(d,o,t),d=l.sibling}else d=l.child;if(d!==null)d.return=l;else for(d=l;d!==null;){if(d===t){d=null;break}if(l=d.sibling,l!==null){l.return=d.return,d=l;break}d=d.return}l=d}Ct(e,t,n.children,o),t=t.child}return t;case 9:return n=t.type,i=t.pendingProps.children,ea(t,o),n=qt(n),i=i(n),t.flags|=1,Ct(e,t,i,o),t.child;case 14:return i=t.type,n=Jt(i,t.pendingProps),n=Jt(i.type,n),Dc(e,t,i,n,o);case 15:return Mc(e,t,t.type,t.pendingProps,o);case 17:return i=t.type,n=t.pendingProps,n=t.elementType===i?n:Jt(i,n),tr(e,t),t.tag=1,At(i)?(e=!0,Ln(t)):e=!1,ea(t,o),xc(t,i,n),Ls(t,i,n,o),Os(null,t,i,!0,e,o);case 19:return Fc(e,t,o);case 22:return _c(e,t,o)}throw Error(s(156,t.tag))};function pd(e,t){return We(e,t)}function hh(e,t,o,i){this.tag=e,this.key=o,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=i,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Yt(e,t,o,i){return new hh(e,t,o,i)}function sl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function mh(e){if(typeof e=="function")return sl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===we)return 11;if(e===$e)return 14}return 2}function oi(e,t){var o=e.alternate;return o===null?(o=Yt(e.tag,t,e.key,e.mode),o.elementType=e.elementType,o.type=e.type,o.stateNode=e.stateNode,o.alternate=e,e.alternate=o):(o.pendingProps=t,o.type=e.type,o.flags=0,o.subtreeFlags=0,o.deletions=null),o.flags=e.flags&14680064,o.childLanes=e.childLanes,o.lanes=e.lanes,o.child=e.child,o.memoizedProps=e.memoizedProps,o.memoizedState=e.memoizedState,o.updateQueue=e.updateQueue,t=e.dependencies,o.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},o.sibling=e.sibling,o.index=e.index,o.ref=e.ref,o}function pr(e,t,o,i,n,l){var d=2;if(i=e,typeof e=="function")sl(e)&&(d=1);else if(typeof e=="string")d=5;else e:switch(e){case I:return Ti(o.children,n,l,t);case K:d=8,n|=8;break;case ve:return e=Yt(12,o,t,n|2),e.elementType=ve,e.lanes=l,e;case Ue:return e=Yt(13,o,t,n),e.elementType=Ue,e.lanes=l,e;case ke:return e=Yt(19,o,t,n),e.elementType=ke,e.lanes=l,e;case Le:return gr(o,n,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case se:d=10;break e;case _e:d=9;break e;case we:d=11;break e;case $e:d=14;break e;case Xe:d=16,i=null;break e}throw Error(s(130,e==null?e:typeof e,""))}return t=Yt(d,o,t,n),t.elementType=e,t.type=i,t.lanes=l,t}function Ti(e,t,o,i){return e=Yt(7,e,i,t),e.lanes=o,e}function gr(e,t,o,i){return e=Yt(22,e,i,t),e.elementType=Le,e.lanes=o,e.stateNode={isHidden:!1},e}function ll(e,t,o){return e=Yt(6,e,null,t),e.lanes=o,e}function ul(e,t,o){return t=Yt(4,e.children!==null?e.children:[],e.key,t),t.lanes=o,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function fh(e,t,o,i,n){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ur(0),this.expirationTimes=Ur(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ur(0),this.identifierPrefix=i,this.onRecoverableError=n,this.mutableSourceEagerHydrationData=null}function cl(e,t,o,i,n,l,d,h,S){return e=new fh(e,t,o,h,S),t===1?(t=1,l===!0&&(t|=8)):t=0,l=Yt(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:i,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ps(l),e}function yh(e,t,o){var i=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:je,key:i==null?null:""+i,children:e,containerInfo:t,implementation:o}}function gd(e){if(!e)return Ko;e=e._reactInternals;e:{if(J(e)!==e||e.tag!==1)throw Error(s(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(At(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(s(171))}if(e.tag===1){var o=e.type;if(At(o))return Ou(e,o,t)}return t}function hd(e,t,o,i,n,l,d,h,S){return e=cl(o,i,!0,e,n,l,d,h,S),e.context=gd(null),o=e.current,i=xt(),n=ei(o),l=Co(i,n),l.callback=t??null,Qo(o,l,n),e.current.lanes=n,ba(e,n,i),jt(e,i),e}function hr(e,t,o,i){var n=t.current,l=xt(),d=ei(n);return o=gd(o),t.context===null?t.context=o:t.pendingContext=o,t=Co(l,d),t.payload={element:e},i=i===void 0?null:i,i!==null&&(t.callback=i),e=Qo(n,t,d),e!==null&&(eo(e,n,d,l),Vn(e,n,d)),d}function mr(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function md(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var o=e.retryLane;e.retryLane=o!==0&&o<t?o:t}}function dl(e,t){md(e,t),(e=e.alternate)&&md(e,t)}function Sh(){return null}var fd=typeof reportError=="function"?reportError:function(e){console.error(e)};function pl(e){this._internalRoot=e}fr.prototype.render=pl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(s(409));hr(e,t,null,null)},fr.prototype.unmount=pl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;Ci(function(){hr(null,e,null,null)}),t[vo]=null}};function fr(e){this._internalRoot=e}fr.prototype.unstable_scheduleHydration=function(e){if(e){var t=Xl();e={blockedOn:null,target:e,priority:t};for(var o=0;o<Fo.length&&t!==0&&t<Fo[o].priority;o++);Fo.splice(o,0,e),o===0&&ou(e)}};function gl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function yr(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function yd(){}function vh(e,t,o,i,n){if(n){if(typeof i=="function"){var l=i;i=function(){var A=mr(d);l.call(A)}}var d=hd(t,i,e,0,null,!1,!1,"",yd);return e._reactRootContainer=d,e[vo]=d.current,Ma(e.nodeType===8?e.parentNode:e),Ci(),d}for(;n=e.lastChild;)e.removeChild(n);if(typeof i=="function"){var h=i;i=function(){var A=mr(S);h.call(A)}}var S=cl(e,0,!1,null,null,!1,!1,"",yd);return e._reactRootContainer=S,e[vo]=S.current,Ma(e.nodeType===8?e.parentNode:e),Ci(function(){hr(t,S,o,i)}),S}function Sr(e,t,o,i,n){var l=o._reactRootContainer;if(l){var d=l;if(typeof n=="function"){var h=n;n=function(){var S=mr(d);h.call(S)}}hr(t,d,e,n)}else d=vh(o,t,e,n,i);return mr(d)}Jl=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var o=va(t.pendingLanes);o!==0&&(Lr(t,o|1),jt(t,ze()),(Ee&6)===0&&(na=ze()+500,Go()))}break;case 13:Ci(function(){var i=Po(e,1);if(i!==null){var n=xt();eo(i,e,1,n)}}),dl(e,1)}},Nr=function(e){if(e.tag===13){var t=Po(e,134217728);if(t!==null){var o=xt();eo(t,e,134217728,o)}dl(e,134217728)}},Zl=function(e){if(e.tag===13){var t=ei(e),o=Po(e,t);if(o!==null){var i=xt();eo(o,e,t,i)}dl(e,t)}},Xl=function(){return Be},eu=function(e,t){var o=Be;try{return Be=e,t()}finally{Be=o}},Li=function(e,t,o){switch(t){case"input":if(ui(e,o),t=o.name,o.type==="radio"&&t!=null){for(o=e;o.parentNode;)o=o.parentNode;for(o=o.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<o.length;t++){var i=o[t];if(i!==e&&i.form===e.form){var n=_n(i);if(!n)throw Error(s(90));ot(i),ui(i,n)}}}break;case"textarea":ao(e,o);break;case"select":t=o.value,t!=null&&Do(e,!!o.multiple,t,!1)}},ya=al,pi=Ci;var bh={usingClientEntryPoint:!1,Events:[La,Yi,_n,fa,hn,al]},Ja={findFiberByHostInstance:fi,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},wh={bundleType:Ja.bundleType,version:Ja.version,rendererPackageName:Ja.rendererPackageName,rendererConfig:Ja.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:te.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=He(e),e===null?null:e.stateNode},findFiberByHostInstance:Ja.findFiberByHostInstance||Sh,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1-next-f1338f8080-20240426"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var vr=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!vr.isDisabled&&vr.supportsFiber)try{Fe=vr.inject(wh),mt=vr}catch{}}return zt.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=bh,zt.createPortal=function(e,t){var o=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!gl(t))throw Error(s(200));return yh(e,t,null,o)},zt.createRoot=function(e,t){if(!gl(e))throw Error(s(299));var o=!1,i="",n=fd;return t!=null&&(t.unstable_strictMode===!0&&(o=!0),t.identifierPrefix!==void 0&&(i=t.identifierPrefix),t.onRecoverableError!==void 0&&(n=t.onRecoverableError)),t=cl(e,1,!1,null,null,o,!1,i,n),e[vo]=t.current,Ma(e.nodeType===8?e.parentNode:e),new pl(t)},zt.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(s(188)):(e=Object.keys(e).join(","),Error(s(268,e)));return e=He(t),e=e===null?null:e.stateNode,e},zt.flushSync=function(e){return Ci(e)},zt.hydrate=function(e,t,o){if(!yr(t))throw Error(s(200));return Sr(null,e,t,!0,o)},zt.hydrateRoot=function(e,t,o){if(!gl(e))throw Error(s(405));var i=o!=null&&o.hydratedSources||null,n=!1,l="",d=fd;if(o!=null&&(o.unstable_strictMode===!0&&(n=!0),o.identifierPrefix!==void 0&&(l=o.identifierPrefix),o.onRecoverableError!==void 0&&(d=o.onRecoverableError)),t=hd(t,null,e,1,o??null,n,!1,l,d),e[vo]=t.current,Ma(e),i)for(e=0;e<i.length;e++)o=i[e],n=o._getVersion,n=n(o._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[o,n]:t.mutableSourceEagerHydrationData.push(o,n);return new fr(t)},zt.render=function(e,t,o){if(!yr(t))throw Error(s(200));return Sr(null,e,t,!1,o)},zt.unmountComponentAtNode=function(e){if(!yr(e))throw Error(s(40));return e._reactRootContainer?(Ci(function(){Sr(null,null,e,!1,function(){e._reactRootContainer=null,e[vo]=null})}),!0):!1},zt.unstable_batchedUpdates=al,zt.unstable_renderSubtreeIntoContainer=function(e,t,o,i){if(!yr(o))throw Error(s(200));if(e==null||e._reactInternals===void 0)throw Error(s(38));return Sr(e,t,o,!1,i)},zt.version="18.3.1-next-f1338f8080-20240426",zt}var xd;function up(){if(xd)return fl.exports;xd=1;function a(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(a)}catch(r){console.error(r)}}return a(),fl.exports=Eh(),fl.exports}var Rd;function jh(){if(Rd)return br;Rd=1;var a=up();return br.createRoot=a.createRoot,br.hydrateRoot=a.hydrateRoot,br}var zh=jh(),R=Ll();const Dh=lp(R),Mh=sp({__proto__:null,default:Dh},[R]);var Nl=up();const _h=lp(Nl),Uh=sp({__proto__:null,default:_h},[Nl]);/**
42
42
  * @remix-run/router v1.23.2
43
43
  *
44
44
  * Copyright (c) Remix Software Inc.
@@ -47,8 +47,8 @@ Error generating stack: `+l.message+`
47
47
  * LICENSE.md file in the root directory of this source tree.
48
48
  *
49
49
  * @license MIT
50
- */function $e(){return $e=Object.assign?Object.assign.bind():function(a){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(a[u]=s[u])}return a},$e.apply(this,arguments)}var rt;(function(a){a.Pop="POP",a.Push="PUSH",a.Replace="REPLACE"})(rt||(rt={}));const Td="popstate";function Nh(a){a===void 0&&(a={});function r(d,p){let{pathname:g="/",search:m="",hash:f=""}=Io(d.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),on("",{pathname:g,search:m,hash:f},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function s(d,p){let g=d.document.querySelector("base"),m="";if(g&&g.getAttribute("href")){let f=d.location.href,y=f.indexOf("#");m=y===-1?f:f.slice(0,y)}return m+"#"+(typeof p=="string"?p:ji(p))}function u(d,p){ni(d.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Hh(r,s,u,a)}function Ce(a,r){if(a===!1||a===null||typeof a>"u")throw new Error(r)}function ni(a,r){if(!a){typeof console<"u"&&console.warn(r);try{throw new Error(r)}catch{}}}function Uh(){return Math.random().toString(36).substr(2,8)}function Ad(a,r){return{usr:a.state,key:a.key,idx:r}}function on(a,r,s,u){return s===void 0&&(s=null),$e({pathname:typeof a=="string"?a:a.pathname,search:"",hash:""},typeof r=="string"?Io(r):r,{state:s,key:r&&r.key||u||Uh()})}function ji(a){let{pathname:r="/",search:s="",hash:u=""}=a;return s&&s!=="?"&&(r+=s.charAt(0)==="?"?s:"?"+s),u&&u!=="#"&&(r+=u.charAt(0)==="#"?u:"#"+u),r}function Io(a){let r={};if(a){let s=a.indexOf("#");s>=0&&(r.hash=a.substr(s),a=a.substr(0,s));let u=a.indexOf("?");u>=0&&(r.search=a.substr(u),a=a.substr(0,u)),a&&(r.pathname=a)}return r}function Hh(a,r,s,u){u===void 0&&(u={});let{window:d=document.defaultView,v5Compat:p=!1}=u,g=d.history,m=rt.Pop,f=null,y=P();y==null&&(y=0,g.replaceState($e({},g.state,{idx:y}),""));function P(){return(g.state||{idx:null}).idx}function C(){m=rt.Pop;let H=P(),re=H==null?null:H-y;y=H,f&&f({action:m,location:N.location,delta:re})}function j(H,re){m=rt.Push;let W=on(N.location,H,re);s&&s(W,H),y=P()+1;let J=Ad(W,y),te=N.createHref(W);try{g.pushState(J,"",te)}catch(Se){if(Se instanceof DOMException&&Se.name==="DataCloneError")throw Se;d.location.assign(te)}p&&f&&f({action:m,location:N.location,delta:1})}function _(H,re){m=rt.Replace;let W=on(N.location,H,re);s&&s(W,H),y=P();let J=Ad(W,y),te=N.createHref(W);g.replaceState(J,"",te),p&&f&&f({action:m,location:N.location,delta:0})}function F(H){let re=d.location.origin!=="null"?d.location.origin:d.location.href,W=typeof H=="string"?H:ji(H);return W=W.replace(/ $/,"%20"),Ce(re,"No window.location.(origin|href) available to create URL for href: "+W),new URL(W,re)}let N={get action(){return m},get location(){return a(d,g)},listen(H){if(f)throw new Error("A history only accepts one active listener");return d.addEventListener(Td,C),f=H,()=>{d.removeEventListener(Td,C),f=null}},createHref(H){return r(d,H)},createURL:F,encodeLocation(H){let re=F(H);return{pathname:re.pathname,search:re.search,hash:re.hash}},push:j,replace:_,go(H){return g.go(H)}};return N}var Oe;(function(a){a.data="data",a.deferred="deferred",a.redirect="redirect",a.error="error"})(Oe||(Oe={}));const Bh=new Set(["lazy","caseSensitive","path","id","index","children"]);function Oh(a){return a.index===!0}function Cr(a,r,s,u){return s===void 0&&(s=[]),u===void 0&&(u={}),a.map((d,p)=>{let g=[...s,String(p)],m=typeof d.id=="string"?d.id:g.join("-");if(Ce(d.index!==!0||!d.children,"Cannot specify children on an index route"),Ce(!u[m],'Found a route id collision on id "'+m+`". Route id's must be globally unique within Data Router usages`),Oh(d)){let f=$e({},d,r(d),{id:m});return u[m]=f,f}else{let f=$e({},d,r(d),{id:m,children:void 0});return u[m]=f,d.children&&(f.children=Cr(d.children,r,g,u)),f}})}function Ri(a,r,s){return s===void 0&&(s="/"),kr(a,r,s,!1)}function kr(a,r,s,u){let d=typeof r=="string"?Io(r):r,p=Ao(d.pathname||"/",s);if(p==null)return null;let g=cp(a);qh(g);let m=null;for(let f=0;m==null&&f<g.length;++f){let y=em(p);m=Jh(g[f],y,u)}return m}function Fh(a,r){let{route:s,pathname:u,params:d}=a;return{id:s.id,pathname:u,params:d,data:r[s.id],handle:s.handle}}function cp(a,r,s,u){r===void 0&&(r=[]),s===void 0&&(s=[]),u===void 0&&(u="");let d=(p,g,m)=>{let f={relativePath:m===void 0?p.path||"":m,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};f.relativePath.startsWith("/")&&(Ce(f.relativePath.startsWith(u),'Absolute route path "'+f.relativePath+'" nested under path '+('"'+u+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),f.relativePath=f.relativePath.slice(u.length));let y=To([u,f.relativePath]),P=s.concat(f);p.children&&p.children.length>0&&(Ce(p.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+y+'".')),cp(p.children,r,P,y)),!(p.path==null&&!p.index)&&r.push({path:y,score:Qh(y,p.index),routesMeta:P})};return a.forEach((p,g)=>{var m;if(p.path===""||!((m=p.path)!=null&&m.includes("?")))d(p,g);else for(let f of dp(p.path))d(p,g,f)}),r}function dp(a){let r=a.split("/");if(r.length===0)return[];let[s,...u]=r,d=s.endsWith("?"),p=s.replace(/\?$/,"");if(u.length===0)return d?[p,""]:[p];let g=dp(u.join("/")),m=[];return m.push(...g.map(f=>f===""?p:[p,f].join("/"))),d&&m.push(...g),m.map(f=>a.startsWith("/")&&f===""?"/":f)}function qh(a){a.sort((r,s)=>r.score!==s.score?s.score-r.score:Zh(r.routesMeta.map(u=>u.childrenIndex),s.routesMeta.map(u=>u.childrenIndex)))}const Wh=/^:[\w-]+$/,Vh=3,Yh=2,Kh=1,Gh=10,$h=-2,Id=a=>a==="*";function Qh(a,r){let s=a.split("/"),u=s.length;return s.some(Id)&&(u+=$h),r&&(u+=Yh),s.filter(d=>!Id(d)).reduce((d,p)=>d+(Wh.test(p)?Vh:p===""?Kh:Gh),u)}function Zh(a,r){return a.length===r.length&&a.slice(0,-1).every((u,d)=>u===r[d])?a[a.length-1]-r[r.length-1]:0}function Jh(a,r,s){s===void 0&&(s=!1);let{routesMeta:u}=a,d={},p="/",g=[];for(let m=0;m<u.length;++m){let f=u[m],y=m===u.length-1,P=p==="/"?r:r.slice(p.length)||"/",C=xr({path:f.relativePath,caseSensitive:f.caseSensitive,end:y},P),j=f.route;if(!C&&y&&s&&!u[u.length-1].route.index&&(C=xr({path:f.relativePath,caseSensitive:f.caseSensitive,end:!1},P)),!C)return null;Object.assign(d,C.params),g.push({params:d,pathname:To([p,C.pathname]),pathnameBase:am(To([p,C.pathnameBase])),route:j}),C.pathnameBase!=="/"&&(p=To([p,C.pathnameBase]))}return g}function xr(a,r){typeof a=="string"&&(a={path:a,caseSensitive:!1,end:!0});let[s,u]=Xh(a.path,a.caseSensitive,a.end),d=r.match(s);if(!d)return null;let p=d[0],g=p.replace(/(.)\/+$/,"$1"),m=d.slice(1);return{params:u.reduce((y,P,C)=>{let{paramName:j,isOptional:_}=P;if(j==="*"){let N=m[C]||"";g=p.slice(0,p.length-N.length).replace(/(.)\/+$/,"$1")}const F=m[C];return _&&!F?y[j]=void 0:y[j]=(F||"").replace(/%2F/g,"/"),y},{}),pathname:p,pathnameBase:g,pattern:a}}function Xh(a,r,s){r===void 0&&(r=!1),s===void 0&&(s=!0),ni(a==="*"||!a.endsWith("*")||a.endsWith("/*"),'Route path "'+a+'" will be treated as if it were '+('"'+a.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+a.replace(/\*$/,"/*")+'".'));let u=[],d="^"+a.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,m,f)=>(u.push({paramName:m,isOptional:f!=null}),f?"/?([^\\/]+)?":"/([^\\/]+)"));return a.endsWith("*")?(u.push({paramName:"*"}),d+=a==="*"||a==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):s?d+="\\/*$":a!==""&&a!=="/"&&(d+="(?:(?=\\/|$))"),[new RegExp(d,r?void 0:"i"),u]}function em(a){try{return a.split("/").map(r=>decodeURIComponent(r).replace(/\//g,"%2F")).join("/")}catch(r){return ni(!1,'The URL path "'+a+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+r+").")),a}}function Ao(a,r){if(r==="/")return a;if(!a.toLowerCase().startsWith(r.toLowerCase()))return null;let s=r.endsWith("/")?r.length-1:r.length,u=a.charAt(s);return u&&u!=="/"?null:a.slice(s)||"/"}const tm=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,om=a=>tm.test(a);function im(a,r){r===void 0&&(r="/");let{pathname:s,search:u="",hash:d=""}=typeof a=="string"?Io(a):a,p;if(s)if(om(s))p=s;else{if(s.includes("//")){let g=s;s=s.replace(/\/\/+/g,"/"),ni(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+s))}s.startsWith("/")?p=Ed(s.substring(1),"/"):p=Ed(s,r)}else p=r;return{pathname:p,search:nm(u),hash:rm(d)}}function Ed(a,r){let s=r.replace(/\/+$/,"").split("/");return a.split("/").forEach(d=>{d===".."?s.length>1&&s.pop():d!=="."&&s.push(d)}),s.length>1?s.join("/"):"/"}function Sl(a,r,s,u){return"Cannot include a '"+a+"' character in a manually specified "+("`to."+r+"` field ["+JSON.stringify(u)+"]. Please separate it out to the ")+("`to."+s+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function pp(a){return a.filter((r,s)=>s===0||r.route.path&&r.route.path.length>0)}function Ul(a,r){let s=pp(a);return r?s.map((u,d)=>d===s.length-1?u.pathname:u.pathnameBase):s.map(u=>u.pathnameBase)}function Hl(a,r,s,u){u===void 0&&(u=!1);let d;typeof a=="string"?d=Io(a):(d=$e({},a),Ce(!d.pathname||!d.pathname.includes("?"),Sl("?","pathname","search",d)),Ce(!d.pathname||!d.pathname.includes("#"),Sl("#","pathname","hash",d)),Ce(!d.search||!d.search.includes("#"),Sl("#","search","hash",d)));let p=a===""||d.pathname==="",g=p?"/":d.pathname,m;if(g==null)m=s;else{let C=r.length-1;if(!u&&g.startsWith("..")){let j=g.split("/");for(;j[0]==="..";)j.shift(),C-=1;d.pathname=j.join("/")}m=C>=0?r[C]:"/"}let f=im(d,m),y=g&&g!=="/"&&g.endsWith("/"),P=(p||g===".")&&s.endsWith("/");return!f.pathname.endsWith("/")&&(y||P)&&(f.pathname+="/"),f}const To=a=>a.join("/").replace(/\/\/+/g,"/"),am=a=>a.replace(/\/+$/,"").replace(/^\/*/,"/"),nm=a=>!a||a==="?"?"":a.startsWith("?")?a:"?"+a,rm=a=>!a||a==="#"?"":a.startsWith("#")?a:"#"+a;class Rr{constructor(r,s,u,d){d===void 0&&(d=!1),this.status=r,this.statusText=s||"",this.internal=d,u instanceof Error?(this.data=u.toString(),this.error=u):this.data=u}}function an(a){return a!=null&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.internal=="boolean"&&"data"in a}const gp=["post","put","patch","delete"],sm=new Set(gp),lm=["get",...gp],um=new Set(lm),cm=new Set([301,302,303,307,308]),dm=new Set([307,308]),vl={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},pm={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Ja={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Bl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,gm=a=>({hasErrorBoundary:!!a.hasErrorBoundary}),hp="remix-router-transitions";function hm(a){const r=a.window?a.window:typeof window<"u"?window:void 0,s=typeof r<"u"&&typeof r.document<"u"&&typeof r.document.createElement<"u",u=!s;Ce(a.routes.length>0,"You must provide a non-empty routes array to createRouter");let d;if(a.mapRouteProperties)d=a.mapRouteProperties;else if(a.detectErrorBoundary){let S=a.detectErrorBoundary;d=k=>({hasErrorBoundary:S(k)})}else d=gm;let p={},g=Cr(a.routes,d,void 0,p),m,f=a.basename||"/",y=a.dataStrategy||Sm,P=a.patchRoutesOnNavigation,C=$e({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},a.future),j=null,_=new Set,F=null,N=null,H=null,re=a.hydrationData!=null,W=Ri(g,a.history.location,f),J=!1,te=null;if(W==null&&!P){let S=Et(404,{pathname:a.history.location.pathname}),{matches:k,route:E}=Od(g);W=k,te={[E.id]:S}}W&&!a.hydrationData&&ci(W,g,a.history.location.pathname).active&&(W=null);let Se;if(W)if(W.some(S=>S.route.lazy))Se=!1;else if(!W.some(S=>S.route.loader))Se=!0;else if(C.v7_partialHydration){let S=a.hydrationData?a.hydrationData.loaderData:null,k=a.hydrationData?a.hydrationData.errors:null;if(k){let E=W.findIndex(M=>k[M.route.id]!==void 0);Se=W.slice(0,E+1).every(M=>!El(M.route,S,k))}else Se=W.every(E=>!El(E.route,S,k))}else Se=a.hydrationData!=null;else if(Se=!1,W=[],C.v7_partialHydration){let S=ci(null,g,a.history.location.pathname);S.active&&S.matches&&(J=!0,W=S.matches)}let Ae,A={historyAction:a.history.action,location:a.history.location,matches:W,initialized:Se,navigation:vl,restoreScrollPosition:a.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:a.hydrationData&&a.hydrationData.loaderData||{},actionData:a.hydrationData&&a.hydrationData.actionData||null,errors:a.hydrationData&&a.hydrationData.errors||te,fetchers:new Map,blockers:new Map},K=rt.Pop,be=!1,le,ke=!1,we=new Map,_e=null,Fe=!1,Qe=!1,ot=[],Le=new Set,O=new Map,se=0,Y=-1,w=new Map,D=new Set,ge=new Map,fe=new Map,me=new Set,ve=new Map,xe=new Map,Re;function Ue(){if(j=a.history.listen(S=>{let{action:k,location:E,delta:M}=S;if(Re){Re(),Re=void 0;return}ni(xe.size===0||M!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let V=_i({currentLocation:A.location,nextLocation:E,historyAction:k});if(V&&M!=null){let ne=new Promise(pe=>{Re=pe});a.history.go(M*-1),_o(V,{state:"blocked",location:E,proceed(){_o(V,{state:"proceeding",proceed:void 0,reset:void 0,location:E}),ne.then(()=>a.history.go(M))},reset(){let pe=new Map(A.blockers);pe.set(V,Ja),Ne({blockers:pe})}});return}return to(k,E)}),s){zm(r,we);let S=()=>Dm(r,we);r.addEventListener("pagehide",S),_e=()=>r.removeEventListener("pagehide",S)}return A.initialized||to(rt.Pop,A.location,{initialHydration:!0}),Ae}function ue(){j&&j(),_e&&_e(),_.clear(),le&&le.abort(),A.fetchers.forEach((S,k)=>io(k)),A.blockers.forEach((S,k)=>Mi(k))}function et(S){return _.add(S),()=>_.delete(S)}function Ne(S,k){k===void 0&&(k={}),A=$e({},A,S);let E=[],M=[];C.v7_fetcherPersist&&A.fetchers.forEach((V,ne)=>{V.state==="idle"&&(me.has(ne)?M.push(ne):E.push(ne))}),me.forEach(V=>{!A.fetchers.has(V)&&!O.has(V)&&M.push(V)}),[..._].forEach(V=>V(A,{deletedFetchers:M,viewTransitionOpts:k.viewTransitionOpts,flushSync:k.flushSync===!0})),C.v7_fetcherPersist?(E.forEach(V=>A.fetchers.delete(V)),M.forEach(V=>io(V))):M.forEach(V=>me.delete(V))}function wt(S,k,E){var M,V;let{flushSync:ne}=E===void 0?{}:E,pe=A.actionData!=null&&A.navigation.formMethod!=null&&Jt(A.navigation.formMethod)&&A.navigation.state==="loading"&&((M=S.state)==null?void 0:M._isRedirect)!==!0,X;k.actionData?Object.keys(k.actionData).length>0?X=k.actionData:X=null:pe?X=A.actionData:X=null;let oe=k.loaderData?Hd(A.loaderData,k.loaderData,k.matches||[],k.errors):A.loaderData,$=A.blockers;$.size>0&&($=new Map($),$.forEach((Te,st)=>$.set(st,Ja)));let Z=be===!0||A.navigation.formMethod!=null&&Jt(A.navigation.formMethod)&&((V=S.state)==null?void 0:V._isRedirect)!==!0;m&&(g=m,m=void 0),Fe||K===rt.Pop||(K===rt.Push?a.history.push(S,S.state):K===rt.Replace&&a.history.replace(S,S.state));let ye;if(K===rt.Pop){let Te=we.get(A.location.pathname);Te&&Te.has(S.pathname)?ye={currentLocation:A.location,nextLocation:S}:we.has(S.pathname)&&(ye={currentLocation:S,nextLocation:A.location})}else if(ke){let Te=we.get(A.location.pathname);Te?Te.add(S.pathname):(Te=new Set([S.pathname]),we.set(A.location.pathname,Te)),ye={currentLocation:A.location,nextLocation:S}}Ne($e({},k,{actionData:X,loaderData:oe,historyAction:K,location:S,initialized:!0,navigation:vl,revalidation:"idle",restoreScrollPosition:fa(S,k.matches||A.matches),preventScrollReset:Z,blockers:$}),{viewTransitionOpts:ye,flushSync:ne===!0}),K=rt.Pop,be=!1,ke=!1,Fe=!1,Qe=!1,ot=[]}async function jo(S,k){if(typeof S=="number"){a.history.go(S);return}let E=Il(A.location,A.matches,f,C.v7_prependBasename,S,C.v7_relativeSplatPath,k==null?void 0:k.fromRouteId,k==null?void 0:k.relative),{path:M,submission:V,error:ne}=jd(C.v7_normalizeFormMethod,!1,E,k),pe=A.location,X=on(A.location,M,k&&k.state);X=$e({},X,a.history.encodeLocation(X));let oe=k&&k.replace!=null?k.replace:void 0,$=rt.Push;oe===!0?$=rt.Replace:oe===!1||V!=null&&Jt(V.formMethod)&&V.formAction===A.location.pathname+A.location.search&&($=rt.Replace);let Z=k&&"preventScrollReset"in k?k.preventScrollReset===!0:void 0,ye=(k&&k.flushSync)===!0,Te=_i({currentLocation:pe,nextLocation:X,historyAction:$});if(Te){_o(Te,{state:"blocked",location:X,proceed(){_o(Te,{state:"proceeding",proceed:void 0,reset:void 0,location:X}),jo(S,k)},reset(){let st=new Map(A.blockers);st.set(Te,Ja),Ne({blockers:st})}});return}return await to($,X,{submission:V,pendingError:ne,preventScrollReset:Z,replace:k&&k.replace,enableViewTransition:k&&k.viewTransition,flushSync:ye})}function sn(){if(ui(),Ne({revalidation:"loading"}),A.navigation.state!=="submitting"){if(A.navigation.state==="idle"){to(A.historyAction,A.location,{startUninterruptedRevalidation:!0});return}to(K||A.historyAction,A.navigation.location,{overrideNavigation:A.navigation,enableViewTransition:ke===!0})}}async function to(S,k,E){le&&le.abort(),le=null,K=S,Fe=(E&&E.startUninterruptedRevalidation)===!0,pn(A.location,A.matches),be=(E&&E.preventScrollReset)===!0,ke=(E&&E.enableViewTransition)===!0;let M=m||g,V=E&&E.overrideNavigation,ne=E!=null&&E.initialHydration&&A.matches&&A.matches.length>0&&!J?A.matches:Ri(M,k,f),pe=(E&&E.flushSync)===!0;if(ne&&A.initialized&&!Qe&&Cm(A.location,k)&&!(E&&E.submission&&Jt(E.submission.formMethod))){wt(k,{matches:ne},{flushSync:pe});return}let X=ci(ne,M,k.pathname);if(X.active&&X.matches&&(ne=X.matches),!ne){let{error:He,notFoundMatches:Ee,route:Ve}=ao(k.pathname);wt(k,{matches:Ee,loaderData:{},errors:{[Ve.id]:He}},{flushSync:pe});return}le=new AbortController;let oe=na(a.history,k,le.signal,E&&E.submission),$;if(E&&E.pendingError)$=[Ti(ne).route.id,{type:Oe.error,error:E.pendingError}];else if(E&&E.submission&&Jt(E.submission.formMethod)){let He=await ca(oe,k,E.submission,ne,X.active,{replace:E.replace,flushSync:pe});if(He.shortCircuited)return;if(He.pendingActionResult){let[Ee,Ve]=He.pendingActionResult;if(Lt(Ve)&&an(Ve.error)&&Ve.error.status===404){le=null,wt(k,{matches:He.matches,loaderData:{},errors:{[Ee]:Ve.error}});return}}ne=He.matches||ne,$=He.pendingActionResult,V=bl(k,E.submission),pe=!1,X.active=!1,oe=na(a.history,oe.url,oe.signal)}let{shortCircuited:Z,matches:ye,loaderData:Te,errors:st}=await ln(oe,k,ne,X.active,V,E&&E.submission,E&&E.fetcherSubmission,E&&E.replace,E&&E.initialHydration===!0,pe,$);Z||(le=null,wt(k,$e({matches:ye||ne},Bd($),{loaderData:Te,errors:st})))}async function ca(S,k,E,M,V,ne){ne===void 0&&(ne={}),ui();let pe=Em(k,E);if(Ne({navigation:pe},{flushSync:ne.flushSync===!0}),V){let $=await Lo(M,k.pathname,S.signal);if($.type==="aborted")return{shortCircuited:!0};if($.type==="error"){let Z=Ti($.partialMatches).route.id;return{matches:$.partialMatches,pendingActionResult:[Z,{type:Oe.error,error:$.error}]}}else if($.matches)M=$.matches;else{let{notFoundMatches:Z,error:ye,route:Te}=ao(k.pathname);return{matches:Z,pendingActionResult:[Te.id,{type:Oe.error,error:ye}]}}}let X,oe=tn(M,k);if(!oe.route.action&&!oe.route.lazy)X={type:Oe.error,error:Et(405,{method:S.method,pathname:k.pathname,routeId:oe.route.id})};else if(X=(await Do("action",A,S,[oe],M,null))[oe.route.id],S.signal.aborted)return{shortCircuited:!0};if(Ai(X)){let $;return ne&&ne.replace!=null?$=ne.replace:$=Ld(X.response.headers.get("Location"),new URL(S.url),f,a.history)===A.location.pathname+A.location.search,await oo(S,X,!0,{submission:E,replace:$}),{shortCircuited:!0}}if(ai(X))throw Et(400,{type:"defer-action"});if(Lt(X)){let $=Ti(M,oe.route.id);return(ne&&ne.replace)!==!0&&(K=rt.Push),{matches:M,pendingActionResult:[$.route.id,X]}}return{matches:M,pendingActionResult:[oe.route.id,X]}}async function ln(S,k,E,M,V,ne,pe,X,oe,$,Z){let ye=V||bl(k,ne),Te=ne||pe||qd(ye),st=!Fe&&(!C.v7_partialHydration||!oe);if(M){if(st){let qe=zi(Z);Ne($e({navigation:ye},qe!==void 0?{actionData:qe}:{}),{flushSync:$})}let Ie=await Lo(E,k.pathname,S.signal);if(Ie.type==="aborted")return{shortCircuited:!0};if(Ie.type==="error"){let qe=Ti(Ie.partialMatches).route.id;return{matches:Ie.partialMatches,loaderData:{},errors:{[qe]:Ie.error}}}else if(Ie.matches)E=Ie.matches;else{let{error:qe,notFoundMatches:gt,route:gi}=ao(k.pathname);return{matches:gt,loaderData:{},errors:{[gi.id]:qe}}}}let He=m||g,[Ee,Ve]=Dd(a.history,A,E,Te,k,C.v7_partialHydration&&oe===!0,C.v7_skipActionErrorRevalidation,Qe,ot,Le,me,ge,D,He,f,Z);if(no(Ie=>!(E&&E.some(qe=>qe.route.id===Ie))||Ee&&Ee.some(qe=>qe.route.id===Ie)),Y=++se,Ee.length===0&&Ve.length===0){let Ie=cn();return wt(k,$e({matches:E,loaderData:{},errors:Z&&Lt(Z[1])?{[Z[0]]:Z[1].error}:null},Bd(Z),Ie?{fetchers:new Map(A.fetchers)}:{}),{flushSync:$}),{shortCircuited:!0}}if(st){let Ie={};if(!M){Ie.navigation=ye;let qe=zi(Z);qe!==void 0&&(Ie.actionData=qe)}Ve.length>0&&(Ie.fetchers=li(Ve)),Ne(Ie,{flushSync:$})}Ve.forEach(Ie=>{Wt(Ie.key),Ie.controller&&O.set(Ie.key,Ie.controller)});let ho=()=>Ve.forEach(Ie=>Wt(Ie.key));le&&le.signal.addEventListener("abort",ho);let{loaderResults:pi,fetcherResults:Vt}=await pa(A,E,Ee,Ve,S);if(S.signal.aborted)return{shortCircuited:!0};le&&le.signal.removeEventListener("abort",ho),Ve.forEach(Ie=>O.delete(Ie.key));let ze=vr(pi);if(ze)return await oo(S,ze.result,!0,{replace:X}),{shortCircuited:!0};if(ze=vr(Vt),ze)return D.add(ze.key),await oo(S,ze.result,!0,{replace:X}),{shortCircuited:!0};let{loaderData:ya,errors:mo}=Ud(A,E,pi,Z,Ve,Vt,ve);ve.forEach((Ie,qe)=>{Ie.subscribe(gt=>{(gt||Ie.done)&&ve.delete(qe)})}),C.v7_partialHydration&&oe&&A.errors&&(mo=$e({},A.errors,mo));let ro=cn(),fo=Di(Y),Li=ro||fo||Ve.length>0;return $e({matches:E,loaderData:ya,errors:mo},Li?{fetchers:new Map(A.fetchers)}:{})}function zi(S){if(S&&!Lt(S[1]))return{[S[0]]:S[1].data};if(A.actionData)return Object.keys(A.actionData).length===0?null:A.actionData}function li(S){return S.forEach(k=>{let E=A.fetchers.get(k.key),M=Xa(void 0,E?E.data:void 0);A.fetchers.set(k.key,M)}),new Map(A.fetchers)}function zo(S,k,E,M){if(u)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Wt(S);let V=(M&&M.flushSync)===!0,ne=m||g,pe=Il(A.location,A.matches,f,C.v7_prependBasename,E,C.v7_relativeSplatPath,k,M==null?void 0:M.relative),X=Ri(ne,pe,f),oe=ci(X,ne,pe);if(oe.active&&oe.matches&&(X=oe.matches),!X){Nt(S,k,Et(404,{pathname:pe}),{flushSync:V});return}let{path:$,submission:Z,error:ye}=jd(C.v7_normalizeFormMethod,!0,pe,M);if(ye){Nt(S,k,ye,{flushSync:V});return}let Te=tn(X,$),st=(M&&M.preventScrollReset)===!0;if(Z&&Jt(Z.formMethod)){da(S,k,$,Te,X,oe.active,V,st,Z);return}ge.set(S,{routeId:k,path:$}),un(S,k,$,Te,X,oe.active,V,st,Z)}async function da(S,k,E,M,V,ne,pe,X,oe){ui(),ge.delete(S);function $(De){if(!De.route.action&&!De.route.lazy){let No=Et(405,{method:oe.formMethod,pathname:E,routeId:k});return Nt(S,k,No,{flushSync:pe}),!0}return!1}if(!ne&&$(M))return;let Z=A.fetchers.get(S);jt(S,jm(oe,Z),{flushSync:pe});let ye=new AbortController,Te=na(a.history,E,ye.signal,oe);if(ne){let De=await Lo(V,new URL(Te.url).pathname,Te.signal,S);if(De.type==="aborted")return;if(De.type==="error"){Nt(S,k,De.error,{flushSync:pe});return}else if(De.matches){if(V=De.matches,M=tn(V,E),$(M))return}else{Nt(S,k,Et(404,{pathname:E}),{flushSync:pe});return}}O.set(S,ye);let st=se,Ee=(await Do("action",A,Te,[M],V,S))[M.route.id];if(Te.signal.aborted){O.get(S)===ye&&O.delete(S);return}if(C.v7_fetcherPersist&&me.has(S)){if(Ai(Ee)||Lt(Ee)){jt(S,ii(void 0));return}}else{if(Ai(Ee))if(O.delete(S),Y>st){jt(S,ii(void 0));return}else return D.add(S),jt(S,Xa(oe)),oo(Te,Ee,!1,{fetcherSubmission:oe,preventScrollReset:X});if(Lt(Ee)){Nt(S,k,Ee.error);return}}if(ai(Ee))throw Et(400,{type:"defer-action"});let Ve=A.navigation.location||A.location,ho=na(a.history,Ve,ye.signal),pi=m||g,Vt=A.navigation.state!=="idle"?Ri(pi,A.navigation.location,f):A.matches;Ce(Vt,"Didn't find any matches after fetcher action");let ze=++se;w.set(S,ze);let ya=Xa(oe,Ee.data);A.fetchers.set(S,ya);let[mo,ro]=Dd(a.history,A,Vt,oe,Ve,!1,C.v7_skipActionErrorRevalidation,Qe,ot,Le,me,ge,D,pi,f,[M.route.id,Ee]);ro.filter(De=>De.key!==S).forEach(De=>{let No=De.key,hn=A.fetchers.get(No),Dr=Xa(void 0,hn?hn.data:void 0);A.fetchers.set(No,Dr),Wt(No),De.controller&&O.set(No,De.controller)}),Ne({fetchers:new Map(A.fetchers)});let fo=()=>ro.forEach(De=>Wt(De.key));ye.signal.addEventListener("abort",fo);let{loaderResults:Li,fetcherResults:Ie}=await pa(A,Vt,mo,ro,ho);if(ye.signal.aborted)return;ye.signal.removeEventListener("abort",fo),w.delete(S),O.delete(S),ro.forEach(De=>O.delete(De.key));let qe=vr(Li);if(qe)return oo(ho,qe.result,!1,{preventScrollReset:X});if(qe=vr(Ie),qe)return D.add(qe.key),oo(ho,qe.result,!1,{preventScrollReset:X});let{loaderData:gt,errors:gi}=Ud(A,Vt,Li,void 0,ro,Ie,ve);if(A.fetchers.has(S)){let De=ii(Ee.data);A.fetchers.set(S,De)}Di(ze),A.navigation.state==="loading"&&ze>Y?(Ce(K,"Expected pending action"),le&&le.abort(),wt(A.navigation.location,{matches:Vt,loaderData:gt,errors:gi,fetchers:new Map(A.fetchers)})):(Ne({errors:gi,loaderData:Hd(A.loaderData,gt,Vt,gi),fetchers:new Map(A.fetchers)}),Qe=!1)}async function un(S,k,E,M,V,ne,pe,X,oe){let $=A.fetchers.get(S);jt(S,Xa(oe,$?$.data:void 0),{flushSync:pe});let Z=new AbortController,ye=na(a.history,E,Z.signal);if(ne){let Ee=await Lo(V,new URL(ye.url).pathname,ye.signal,S);if(Ee.type==="aborted")return;if(Ee.type==="error"){Nt(S,k,Ee.error,{flushSync:pe});return}else if(Ee.matches)V=Ee.matches,M=tn(V,E);else{Nt(S,k,Et(404,{pathname:E}),{flushSync:pe});return}}O.set(S,Z);let Te=se,He=(await Do("loader",A,ye,[M],V,S))[M.route.id];if(ai(He)&&(He=await Ol(He,ye.signal,!0)||He),O.get(S)===Z&&O.delete(S),!ye.signal.aborted){if(me.has(S)){jt(S,ii(void 0));return}if(Ai(He))if(Y>Te){jt(S,ii(void 0));return}else{D.add(S),await oo(ye,He,!1,{preventScrollReset:X});return}if(Lt(He)){Nt(S,k,He.error);return}Ce(!ai(He),"Unhandled fetcher deferred data"),jt(S,ii(He.data))}}async function oo(S,k,E,M){let{submission:V,fetcherSubmission:ne,preventScrollReset:pe,replace:X}=M===void 0?{}:M;k.response.headers.has("X-Remix-Revalidate")&&(Qe=!0);let oe=k.response.headers.get("Location");Ce(oe,"Expected a Location header on the redirect Response"),oe=Ld(oe,new URL(S.url),f,a.history);let $=on(A.location,oe,{_isRedirect:!0});if(s){let Ee=!1;if(k.response.headers.has("X-Remix-Reload-Document"))Ee=!0;else if(Bl.test(oe)){const Ve=a.history.createURL(oe);Ee=Ve.origin!==r.location.origin||Ao(Ve.pathname,f)==null}if(Ee){X?r.location.replace(oe):r.location.assign(oe);return}}le=null;let Z=X===!0||k.response.headers.has("X-Remix-Replace")?rt.Replace:rt.Push,{formMethod:ye,formAction:Te,formEncType:st}=A.navigation;!V&&!ne&&ye&&Te&&st&&(V=qd(A.navigation));let He=V||ne;if(dm.has(k.response.status)&&He&&Jt(He.formMethod))await to(Z,$,{submission:$e({},He,{formAction:oe}),preventScrollReset:pe||be,enableViewTransition:E?ke:void 0});else{let Ee=bl($,V);await to(Z,$,{overrideNavigation:Ee,fetcherSubmission:ne,preventScrollReset:pe||be,enableViewTransition:E?ke:void 0})}}async function Do(S,k,E,M,V,ne){let pe,X={};try{pe=await vm(y,S,k,E,M,V,ne,p,d)}catch(oe){return M.forEach($=>{X[$.route.id]={type:Oe.error,error:oe}}),X}for(let[oe,$]of Object.entries(pe))if(xm($)){let Z=$.result;X[oe]={type:Oe.redirect,response:km(Z,E,oe,V,f,C.v7_relativeSplatPath)}}else X[oe]=await wm($);return X}async function pa(S,k,E,M,V){let ne=S.matches,pe=Do("loader",S,V,E,k,null),X=Promise.all(M.map(async Z=>{if(Z.matches&&Z.match&&Z.controller){let Te=(await Do("loader",S,na(a.history,Z.path,Z.controller.signal),[Z.match],Z.matches,Z.key))[Z.match.route.id];return{[Z.key]:Te}}else return Promise.resolve({[Z.key]:{type:Oe.error,error:Et(404,{pathname:Z.path})}})})),oe=await pe,$=(await X).reduce((Z,ye)=>Object.assign(Z,ye),{});return await Promise.all([Am(k,oe,V.signal,ne,S.loaderData),Im(k,$,M)]),{loaderResults:oe,fetcherResults:$}}function ui(){Qe=!0,ot.push(...no()),ge.forEach((S,k)=>{O.has(k)&&Le.add(k),Wt(k)})}function jt(S,k,E){E===void 0&&(E={}),A.fetchers.set(S,k),Ne({fetchers:new Map(A.fetchers)},{flushSync:(E&&E.flushSync)===!0})}function Nt(S,k,E,M){M===void 0&&(M={});let V=Ti(A.matches,k);io(S),Ne({errors:{[V.route.id]:E},fetchers:new Map(A.fetchers)},{flushSync:(M&&M.flushSync)===!0})}function Mo(S){return fe.set(S,(fe.get(S)||0)+1),me.has(S)&&me.delete(S),A.fetchers.get(S)||pm}function io(S){let k=A.fetchers.get(S);O.has(S)&&!(k&&k.state==="loading"&&w.has(S))&&Wt(S),ge.delete(S),w.delete(S),D.delete(S),C.v7_fetcherPersist&&me.delete(S),Le.delete(S),A.fetchers.delete(S)}function zr(S){let k=(fe.get(S)||0)-1;k<=0?(fe.delete(S),me.add(S),C.v7_fetcherPersist||io(S)):fe.set(S,k),Ne({fetchers:new Map(A.fetchers)})}function Wt(S){let k=O.get(S);k&&(k.abort(),O.delete(S))}function ga(S){for(let k of S){let E=Mo(k),M=ii(E.data);A.fetchers.set(k,M)}}function cn(){let S=[],k=!1;for(let E of D){let M=A.fetchers.get(E);Ce(M,"Expected fetcher: "+E),M.state==="loading"&&(D.delete(E),S.push(E),k=!0)}return ga(S),k}function Di(S){let k=[];for(let[E,M]of w)if(M<S){let V=A.fetchers.get(E);Ce(V,"Expected fetcher: "+E),V.state==="loading"&&(Wt(E),w.delete(E),k.push(E))}return ga(k),k.length>0}function ha(S,k){let E=A.blockers.get(S)||Ja;return xe.get(S)!==k&&xe.set(S,k),E}function Mi(S){A.blockers.delete(S),xe.delete(S)}function _o(S,k){let E=A.blockers.get(S)||Ja;Ce(E.state==="unblocked"&&k.state==="blocked"||E.state==="blocked"&&k.state==="blocked"||E.state==="blocked"&&k.state==="proceeding"||E.state==="blocked"&&k.state==="unblocked"||E.state==="proceeding"&&k.state==="unblocked","Invalid blocker state transition: "+E.state+" -> "+k.state);let M=new Map(A.blockers);M.set(S,k),Ne({blockers:M})}function _i(S){let{currentLocation:k,nextLocation:E,historyAction:M}=S;if(xe.size===0)return;xe.size>1&&ni(!1,"A router only supports one blocker at a time");let V=Array.from(xe.entries()),[ne,pe]=V[V.length-1],X=A.blockers.get(ne);if(!(X&&X.state==="proceeding")&&pe({currentLocation:k,nextLocation:E,historyAction:M}))return ne}function ao(S){let k=Et(404,{pathname:S}),E=m||g,{matches:M,route:V}=Od(E);return no(),{notFoundMatches:M,route:V,error:k}}function no(S){let k=[];return ve.forEach((E,M)=>{(!S||S(M))&&(E.cancel(),k.push(M),ve.delete(M))}),k}function dn(S,k,E){if(F=S,H=k,N=E||null,!re&&A.navigation===vl){re=!0;let M=fa(A.location,A.matches);M!=null&&Ne({restoreScrollPosition:M})}return()=>{F=null,H=null,N=null}}function ma(S,k){return N&&N(S,k.map(M=>Fh(M,A.loaderData)))||S.key}function pn(S,k){if(F&&H){let E=ma(S,k);F[E]=H()}}function fa(S,k){if(F){let E=ma(S,k),M=F[E];if(typeof M=="number")return M}return null}function ci(S,k,E){if(P)if(S){if(Object.keys(S[0].params).length>0)return{active:!0,matches:kr(k,E,f,!0)}}else return{active:!0,matches:kr(k,E,f,!0)||[]};return{active:!1,matches:null}}async function Lo(S,k,E,M){if(!P)return{type:"success",matches:S};let V=S;for(;;){let ne=m==null,pe=m||g,X=p;try{await P({signal:E,path:k,matches:V,fetcherKey:M,patch:(Z,ye)=>{E.aborted||_d(Z,ye,pe,X,d)}})}catch(Z){return{type:"error",error:Z,partialMatches:V}}finally{ne&&!E.aborted&&(g=[...g])}if(E.aborted)return{type:"aborted"};let oe=Ri(pe,k,f);if(oe)return{type:"success",matches:oe};let $=kr(pe,k,f,!0);if(!$||V.length===$.length&&V.every((Z,ye)=>Z.route.id===$[ye].route.id))return{type:"success",matches:null};V=$}}function gn(S){p={},m=Cr(S,d,void 0,p)}function di(S,k){let E=m==null;_d(S,k,m||g,p,d),E&&(g=[...g],Ne({}))}return Ae={get basename(){return f},get future(){return C},get state(){return A},get routes(){return g},get window(){return r},initialize:Ue,subscribe:et,enableScrollRestoration:dn,navigate:jo,fetch:zo,revalidate:sn,createHref:S=>a.history.createHref(S),encodeLocation:S=>a.history.encodeLocation(S),getFetcher:Mo,deleteFetcher:zr,dispose:ue,getBlocker:ha,deleteBlocker:Mi,patchRoutes:di,_internalFetchControllers:O,_internalActiveDeferreds:ve,_internalSetRoutes:gn},Ae}function mm(a){return a!=null&&("formData"in a&&a.formData!=null||"body"in a&&a.body!==void 0)}function Il(a,r,s,u,d,p,g,m){let f,y;if(g){f=[];for(let C of r)if(f.push(C),C.route.id===g){y=C;break}}else f=r,y=r[r.length-1];let P=Hl(d||".",Ul(f,p),Ao(a.pathname,s)||a.pathname,m==="path");if(d==null&&(P.search=a.search,P.hash=a.hash),(d==null||d===""||d===".")&&y){let C=Fl(P.search);if(y.route.index&&!C)P.search=P.search?P.search.replace(/^\?/,"?index&"):"?index";else if(!y.route.index&&C){let j=new URLSearchParams(P.search),_=j.getAll("index");j.delete("index"),_.filter(N=>N).forEach(N=>j.append("index",N));let F=j.toString();P.search=F?"?"+F:""}}return u&&s!=="/"&&(P.pathname=P.pathname==="/"?s:To([s,P.pathname])),ji(P)}function jd(a,r,s,u){if(!u||!mm(u))return{path:s};if(u.formMethod&&!Tm(u.formMethod))return{path:s,error:Et(405,{method:u.formMethod})};let d=()=>({path:s,error:Et(400,{type:"invalid-body"})}),p=u.formMethod||"get",g=a?p.toUpperCase():p.toLowerCase(),m=yp(s);if(u.body!==void 0){if(u.formEncType==="text/plain"){if(!Jt(g))return d();let j=typeof u.body=="string"?u.body:u.body instanceof FormData||u.body instanceof URLSearchParams?Array.from(u.body.entries()).reduce((_,F)=>{let[N,H]=F;return""+_+N+"="+H+`
51
- `},""):String(u.body);return{path:s,submission:{formMethod:g,formAction:m,formEncType:u.formEncType,formData:void 0,json:void 0,text:j}}}else if(u.formEncType==="application/json"){if(!Jt(g))return d();try{let j=typeof u.body=="string"?JSON.parse(u.body):u.body;return{path:s,submission:{formMethod:g,formAction:m,formEncType:u.formEncType,formData:void 0,json:j,text:void 0}}}catch{return d()}}}Ce(typeof FormData=="function","FormData is not available in this environment");let f,y;if(u.formData)f=jl(u.formData),y=u.formData;else if(u.body instanceof FormData)f=jl(u.body),y=u.body;else if(u.body instanceof URLSearchParams)f=u.body,y=Nd(f);else if(u.body==null)f=new URLSearchParams,y=new FormData;else try{f=new URLSearchParams(u.body),y=Nd(f)}catch{return d()}let P={formMethod:g,formAction:m,formEncType:u&&u.formEncType||"application/x-www-form-urlencoded",formData:y,json:void 0,text:void 0};if(Jt(P.formMethod))return{path:s,submission:P};let C=Io(s);return r&&C.search&&Fl(C.search)&&f.append("index",""),C.search="?"+f,{path:ji(C),submission:P}}function zd(a,r,s){s===void 0&&(s=!1);let u=a.findIndex(d=>d.route.id===r);return u>=0?a.slice(0,s?u+1:u):a}function Dd(a,r,s,u,d,p,g,m,f,y,P,C,j,_,F,N){let H=N?Lt(N[1])?N[1].error:N[1].data:void 0,re=a.createURL(r.location),W=a.createURL(d),J=s;p&&r.errors?J=zd(s,Object.keys(r.errors)[0],!0):N&&Lt(N[1])&&(J=zd(s,N[0]));let te=N?N[1].statusCode:void 0,Se=g&&te&&te>=400,Ae=J.filter((K,be)=>{let{route:le}=K;if(le.lazy)return!0;if(le.loader==null)return!1;if(p)return El(le,r.loaderData,r.errors);if(fm(r.loaderData,r.matches[be],K)||f.some(_e=>_e===K.route.id))return!0;let ke=r.matches[be],we=K;return Md(K,$e({currentUrl:re,currentParams:ke.params,nextUrl:W,nextParams:we.params},u,{actionResult:H,actionStatus:te,defaultShouldRevalidate:Se?!1:m||re.pathname+re.search===W.pathname+W.search||re.search!==W.search||mp(ke,we)}))}),A=[];return C.forEach((K,be)=>{if(p||!s.some(Fe=>Fe.route.id===K.routeId)||P.has(be))return;let le=Ri(_,K.path,F);if(!le){A.push({key:be,routeId:K.routeId,path:K.path,matches:null,match:null,controller:null});return}let ke=r.fetchers.get(be),we=tn(le,K.path),_e=!1;j.has(be)?_e=!1:y.has(be)?(y.delete(be),_e=!0):ke&&ke.state!=="idle"&&ke.data===void 0?_e=m:_e=Md(we,$e({currentUrl:re,currentParams:r.matches[r.matches.length-1].params,nextUrl:W,nextParams:s[s.length-1].params},u,{actionResult:H,actionStatus:te,defaultShouldRevalidate:Se?!1:m})),_e&&A.push({key:be,routeId:K.routeId,path:K.path,matches:le,match:we,controller:new AbortController})}),[Ae,A]}function El(a,r,s){if(a.lazy)return!0;if(!a.loader)return!1;let u=r!=null&&r[a.id]!==void 0,d=s!=null&&s[a.id]!==void 0;return!u&&d?!1:typeof a.loader=="function"&&a.loader.hydrate===!0?!0:!u&&!d}function fm(a,r,s){let u=!r||s.route.id!==r.route.id,d=a[s.route.id]===void 0;return u||d}function mp(a,r){let s=a.route.path;return a.pathname!==r.pathname||s!=null&&s.endsWith("*")&&a.params["*"]!==r.params["*"]}function Md(a,r){if(a.route.shouldRevalidate){let s=a.route.shouldRevalidate(r);if(typeof s=="boolean")return s}return r.defaultShouldRevalidate}function _d(a,r,s,u,d){var p;let g;if(a){let y=u[a];Ce(y,"No route found to patch children into: routeId = "+a),y.children||(y.children=[]),g=y.children}else g=s;let m=r.filter(y=>!g.some(P=>fp(y,P))),f=Cr(m,d,[a||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],u);g.push(...f)}function fp(a,r){return"id"in a&&"id"in r&&a.id===r.id?!0:a.index===r.index&&a.path===r.path&&a.caseSensitive===r.caseSensitive?(!a.children||a.children.length===0)&&(!r.children||r.children.length===0)?!0:a.children.every((s,u)=>{var d;return(d=r.children)==null?void 0:d.some(p=>fp(s,p))}):!1}async function ym(a,r,s){if(!a.lazy)return;let u=await a.lazy();if(!a.lazy)return;let d=s[a.id];Ce(d,"No route found in manifest");let p={};for(let g in u){let f=d[g]!==void 0&&g!=="hasErrorBoundary";ni(!f,'Route "'+d.id+'" has a static property "'+g+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+g+'" will be ignored.')),!f&&!Bh.has(g)&&(p[g]=u[g])}Object.assign(d,p),Object.assign(d,$e({},r(d),{lazy:void 0}))}async function Sm(a){let{matches:r}=a,s=r.filter(d=>d.shouldLoad);return(await Promise.all(s.map(d=>d.resolve()))).reduce((d,p,g)=>Object.assign(d,{[s[g].route.id]:p}),{})}async function vm(a,r,s,u,d,p,g,m,f,y){let P=p.map(_=>_.route.lazy?ym(_.route,f,m):void 0),C=p.map((_,F)=>{let N=P[F],H=d.some(W=>W.route.id===_.route.id);return $e({},_,{shouldLoad:H,resolve:async W=>(W&&u.method==="GET"&&(_.route.lazy||_.route.loader)&&(H=!0),H?bm(r,u,_,N,W,y):Promise.resolve({type:Oe.data,result:void 0}))})}),j=await a({matches:C,request:u,params:p[0].params,fetcherKey:g,context:y});try{await Promise.all(P)}catch{}return j}async function bm(a,r,s,u,d,p){let g,m,f=y=>{let P,C=new Promise((F,N)=>P=N);m=()=>P(),r.signal.addEventListener("abort",m);let j=F=>typeof y!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+a+'" [routeId: '+s.route.id+"]"))):y({request:r,params:s.params,context:p},...F!==void 0?[F]:[]),_=(async()=>{try{return{type:"data",result:await(d?d(N=>j(N)):j())}}catch(F){return{type:"error",result:F}}})();return Promise.race([_,C])};try{let y=s.route[a];if(u)if(y){let P,[C]=await Promise.all([f(y).catch(j=>{P=j}),u]);if(P!==void 0)throw P;g=C}else if(await u,y=s.route[a],y)g=await f(y);else if(a==="action"){let P=new URL(r.url),C=P.pathname+P.search;throw Et(405,{method:r.method,pathname:C,routeId:s.route.id})}else return{type:Oe.data,result:void 0};else if(y)g=await f(y);else{let P=new URL(r.url),C=P.pathname+P.search;throw Et(404,{pathname:C})}Ce(g.result!==void 0,"You defined "+(a==="action"?"an action":"a loader")+" for route "+('"'+s.route.id+"\" but didn't return anything from your `"+a+"` ")+"function. Please return a value or `null`.")}catch(y){return{type:Oe.error,result:y}}finally{m&&r.signal.removeEventListener("abort",m)}return g}async function wm(a){let{result:r,type:s}=a;if(Sp(r)){let C;try{let j=r.headers.get("Content-Type");j&&/\bapplication\/json\b/.test(j)?r.body==null?C=null:C=await r.json():C=await r.text()}catch(j){return{type:Oe.error,error:j}}return s===Oe.error?{type:Oe.error,error:new Rr(r.status,r.statusText,C),statusCode:r.status,headers:r.headers}:{type:Oe.data,data:C,statusCode:r.status,headers:r.headers}}if(s===Oe.error){if(Fd(r)){var u,d;if(r.data instanceof Error){var p,g;return{type:Oe.error,error:r.data,statusCode:(p=r.init)==null?void 0:p.status,headers:(g=r.init)!=null&&g.headers?new Headers(r.init.headers):void 0}}return{type:Oe.error,error:new Rr(((u=r.init)==null?void 0:u.status)||500,void 0,r.data),statusCode:an(r)?r.status:void 0,headers:(d=r.init)!=null&&d.headers?new Headers(r.init.headers):void 0}}return{type:Oe.error,error:r,statusCode:an(r)?r.status:void 0}}if(Rm(r)){var m,f;return{type:Oe.deferred,deferredData:r,statusCode:(m=r.init)==null?void 0:m.status,headers:((f=r.init)==null?void 0:f.headers)&&new Headers(r.init.headers)}}if(Fd(r)){var y,P;return{type:Oe.data,data:r.data,statusCode:(y=r.init)==null?void 0:y.status,headers:(P=r.init)!=null&&P.headers?new Headers(r.init.headers):void 0}}return{type:Oe.data,data:r}}function km(a,r,s,u,d,p){let g=a.headers.get("Location");if(Ce(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Bl.test(g)){let m=u.slice(0,u.findIndex(f=>f.route.id===s)+1);g=Il(new URL(r.url),m,d,!0,g,p),a.headers.set("Location",g)}return a}function Ld(a,r,s,u){let d=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Bl.test(a)){let p=a,g=p.startsWith("//")?new URL(r.protocol+p):new URL(p);if(d.includes(g.protocol))throw new Error("Invalid redirect location");let m=Ao(g.pathname,s)!=null;if(g.origin===r.origin&&m)return g.pathname+g.search+g.hash}try{let p=u.createURL(a);if(d.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return a}function na(a,r,s,u){let d=a.createURL(yp(r)).toString(),p={signal:s};if(u&&Jt(u.formMethod)){let{formMethod:g,formEncType:m}=u;p.method=g.toUpperCase(),m==="application/json"?(p.headers=new Headers({"Content-Type":m}),p.body=JSON.stringify(u.json)):m==="text/plain"?p.body=u.text:m==="application/x-www-form-urlencoded"&&u.formData?p.body=jl(u.formData):p.body=u.formData}return new Request(d,p)}function jl(a){let r=new URLSearchParams;for(let[s,u]of a.entries())r.append(s,typeof u=="string"?u:u.name);return r}function Nd(a){let r=new FormData;for(let[s,u]of a.entries())r.append(s,u);return r}function Pm(a,r,s,u,d){let p={},g=null,m,f=!1,y={},P=s&&Lt(s[1])?s[1].error:void 0;return a.forEach(C=>{if(!(C.route.id in r))return;let j=C.route.id,_=r[j];if(Ce(!Ai(_),"Cannot handle redirect results in processLoaderData"),Lt(_)){let F=_.error;P!==void 0&&(F=P,P=void 0),g=g||{};{let N=Ti(a,j);g[N.route.id]==null&&(g[N.route.id]=F)}p[j]=void 0,f||(f=!0,m=an(_.error)?_.error.status:500),_.headers&&(y[j]=_.headers)}else ai(_)?(u.set(j,_.deferredData),p[j]=_.deferredData.data,_.statusCode!=null&&_.statusCode!==200&&!f&&(m=_.statusCode),_.headers&&(y[j]=_.headers)):(p[j]=_.data,_.statusCode&&_.statusCode!==200&&!f&&(m=_.statusCode),_.headers&&(y[j]=_.headers))}),P!==void 0&&s&&(g={[s[0]]:P},p[s[0]]=void 0),{loaderData:p,errors:g,statusCode:m||200,loaderHeaders:y}}function Ud(a,r,s,u,d,p,g){let{loaderData:m,errors:f}=Pm(r,s,u,g);return d.forEach(y=>{let{key:P,match:C,controller:j}=y,_=p[P];if(Ce(_,"Did not find corresponding fetcher result"),!(j&&j.signal.aborted))if(Lt(_)){let F=Ti(a.matches,C==null?void 0:C.route.id);f&&f[F.route.id]||(f=$e({},f,{[F.route.id]:_.error})),a.fetchers.delete(P)}else if(Ai(_))Ce(!1,"Unhandled fetcher revalidation redirect");else if(ai(_))Ce(!1,"Unhandled fetcher deferred data");else{let F=ii(_.data);a.fetchers.set(P,F)}}),{loaderData:m,errors:f}}function Hd(a,r,s,u){let d=$e({},r);for(let p of s){let g=p.route.id;if(r.hasOwnProperty(g)?r[g]!==void 0&&(d[g]=r[g]):a[g]!==void 0&&p.route.loader&&(d[g]=a[g]),u&&u.hasOwnProperty(g))break}return d}function Bd(a){return a?Lt(a[1])?{actionData:{}}:{actionData:{[a[0]]:a[1].data}}:{}}function Ti(a,r){return(r?a.slice(0,a.findIndex(u=>u.route.id===r)+1):[...a]).reverse().find(u=>u.route.hasErrorBoundary===!0)||a[0]}function Od(a){let r=a.length===1?a[0]:a.find(s=>s.index||!s.path||s.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:r}],route:r}}function Et(a,r){let{pathname:s,routeId:u,method:d,type:p,message:g}=r===void 0?{}:r,m="Unknown Server Error",f="Unknown @remix-run/router error";return a===400?(m="Bad Request",d&&s&&u?f="You made a "+d+' request to "'+s+'" but '+('did not provide a `loader` for route "'+u+'", ')+"so there is no way to handle the request.":p==="defer-action"?f="defer() is not supported in actions":p==="invalid-body"&&(f="Unable to encode submission body")):a===403?(m="Forbidden",f='Route "'+u+'" does not match URL "'+s+'"'):a===404?(m="Not Found",f='No route matches URL "'+s+'"'):a===405&&(m="Method Not Allowed",d&&s&&u?f="You made a "+d.toUpperCase()+' request to "'+s+'" but '+('did not provide an `action` for route "'+u+'", ')+"so there is no way to handle the request.":d&&(f='Invalid request method "'+d.toUpperCase()+'"')),new Rr(a||500,m,new Error(f),!0)}function vr(a){let r=Object.entries(a);for(let s=r.length-1;s>=0;s--){let[u,d]=r[s];if(Ai(d))return{key:u,result:d}}}function yp(a){let r=typeof a=="string"?Io(a):a;return ji($e({},r,{hash:""}))}function Cm(a,r){return a.pathname!==r.pathname||a.search!==r.search?!1:a.hash===""?r.hash!=="":a.hash===r.hash?!0:r.hash!==""}function xm(a){return Sp(a.result)&&cm.has(a.result.status)}function ai(a){return a.type===Oe.deferred}function Lt(a){return a.type===Oe.error}function Ai(a){return(a&&a.type)===Oe.redirect}function Fd(a){return typeof a=="object"&&a!=null&&"type"in a&&"data"in a&&"init"in a&&a.type==="DataWithResponseInit"}function Rm(a){let r=a;return r&&typeof r=="object"&&typeof r.data=="object"&&typeof r.subscribe=="function"&&typeof r.cancel=="function"&&typeof r.resolveData=="function"}function Sp(a){return a!=null&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.headers=="object"&&typeof a.body<"u"}function Tm(a){return um.has(a.toLowerCase())}function Jt(a){return sm.has(a.toLowerCase())}async function Am(a,r,s,u,d){let p=Object.entries(r);for(let g=0;g<p.length;g++){let[m,f]=p[g],y=a.find(j=>(j==null?void 0:j.route.id)===m);if(!y)continue;let P=u.find(j=>j.route.id===y.route.id),C=P!=null&&!mp(P,y)&&(d&&d[y.route.id])!==void 0;ai(f)&&C&&await Ol(f,s,!1).then(j=>{j&&(r[m]=j)})}}async function Im(a,r,s){for(let u=0;u<s.length;u++){let{key:d,routeId:p,controller:g}=s[u],m=r[d];a.find(y=>(y==null?void 0:y.route.id)===p)&&ai(m)&&(Ce(g,"Expected an AbortController for revalidating fetcher deferred result"),await Ol(m,g.signal,!0).then(y=>{y&&(r[d]=y)}))}}async function Ol(a,r,s){if(s===void 0&&(s=!1),!await a.deferredData.resolveData(r)){if(s)try{return{type:Oe.data,data:a.deferredData.unwrappedData}}catch(d){return{type:Oe.error,error:d}}return{type:Oe.data,data:a.deferredData.data}}}function Fl(a){return new URLSearchParams(a).getAll("index").some(r=>r==="")}function tn(a,r){let s=typeof r=="string"?Io(r).search:r.search;if(a[a.length-1].route.index&&Fl(s||""))return a[a.length-1];let u=pp(a);return u[u.length-1]}function qd(a){let{formMethod:r,formAction:s,formEncType:u,text:d,formData:p,json:g}=a;if(!(!r||!s||!u)){if(d!=null)return{formMethod:r,formAction:s,formEncType:u,formData:void 0,json:void 0,text:d};if(p!=null)return{formMethod:r,formAction:s,formEncType:u,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:r,formAction:s,formEncType:u,formData:void 0,json:g,text:void 0}}}function bl(a,r){return r?{state:"loading",location:a,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}:{state:"loading",location:a,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Em(a,r){return{state:"submitting",location:a,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}}function Xa(a,r){return a?{state:"loading",formMethod:a.formMethod,formAction:a.formAction,formEncType:a.formEncType,formData:a.formData,json:a.json,text:a.text,data:r}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:r}}function jm(a,r){return{state:"submitting",formMethod:a.formMethod,formAction:a.formAction,formEncType:a.formEncType,formData:a.formData,json:a.json,text:a.text,data:r?r.data:void 0}}function ii(a){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:a}}function zm(a,r){try{let s=a.sessionStorage.getItem(hp);if(s){let u=JSON.parse(s);for(let[d,p]of Object.entries(u||{}))p&&Array.isArray(p)&&r.set(d,new Set(p||[]))}}catch{}}function Dm(a,r){if(r.size>0){let s={};for(let[u,d]of r)s[u]=[...d];try{a.sessionStorage.setItem(hp,JSON.stringify(s))}catch(u){ni(!1,"Failed to save applied view transitions in sessionStorage ("+u+").")}}}/**
50
+ */function Ge(){return Ge=Object.assign?Object.assign.bind():function(a){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(a[u]=s[u])}return a},Ge.apply(this,arguments)}var rt;(function(a){a.Pop="POP",a.Push="PUSH",a.Replace="REPLACE"})(rt||(rt={}));const Td="popstate";function Lh(a){a===void 0&&(a={});function r(c,p){let{pathname:g="/",search:f="",hash:m=""}=jo(c.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),an("",{pathname:g,search:f,hash:m},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function s(c,p){let g=c.document.querySelector("base"),f="";if(g&&g.getAttribute("href")){let m=c.location.href,v=m.indexOf("#");f=v===-1?m:m.slice(0,v)}return f+"#"+(typeof p=="string"?p:Di(p))}function u(c,p){ri(c.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Hh(r,s,u,a)}function Ce(a,r){if(a===!1||a===null||typeof a>"u")throw new Error(r)}function ri(a,r){if(!a){typeof console<"u"&&console.warn(r);try{throw new Error(r)}catch{}}}function Nh(){return Math.random().toString(36).substr(2,8)}function Ad(a,r){return{usr:a.state,key:a.key,idx:r}}function an(a,r,s,u){return s===void 0&&(s=null),Ge({pathname:typeof a=="string"?a:a.pathname,search:"",hash:""},typeof r=="string"?jo(r):r,{state:s,key:r&&r.key||u||Nh()})}function Di(a){let{pathname:r="/",search:s="",hash:u=""}=a;return s&&s!=="?"&&(r+=s.charAt(0)==="?"?s:"?"+s),u&&u!=="#"&&(r+=u.charAt(0)==="#"?u:"#"+u),r}function jo(a){let r={};if(a){let s=a.indexOf("#");s>=0&&(r.hash=a.substr(s),a=a.substr(0,s));let u=a.indexOf("?");u>=0&&(r.search=a.substr(u),a=a.substr(0,u)),a&&(r.pathname=a)}return r}function Hh(a,r,s,u){u===void 0&&(u={});let{window:c=document.defaultView,v5Compat:p=!1}=u,g=c.history,f=rt.Pop,m=null,v=k();v==null&&(v=0,g.replaceState(Ge({},g.state,{idx:v}),""));function k(){return(g.state||{idx:null}).idx}function w(){f=rt.Pop;let H=k(),re=H==null?null:H-v;v=H,m&&m({action:f,location:L.location,delta:re})}function j(H,re){f=rt.Push;let W=an(L.location,H,re);s&&s(W,H),v=k()+1;let Z=Ad(W,v),te=L.createHref(W);try{g.pushState(Z,"",te)}catch(ye){if(ye instanceof DOMException&&ye.name==="DataCloneError")throw ye;c.location.assign(te)}p&&m&&m({action:f,location:L.location,delta:1})}function _(H,re){f=rt.Replace;let W=an(L.location,H,re);s&&s(W,H),v=k();let Z=Ad(W,v),te=L.createHref(W);g.replaceState(Z,"",te),p&&m&&m({action:f,location:L.location,delta:0})}function F(H){let re=c.location.origin!=="null"?c.location.origin:c.location.href,W=typeof H=="string"?H:Di(H);return W=W.replace(/ $/,"%20"),Ce(re,"No window.location.(origin|href) available to create URL for href: "+W),new URL(W,re)}let L={get action(){return f},get location(){return a(c,g)},listen(H){if(m)throw new Error("A history only accepts one active listener");return c.addEventListener(Td,w),m=H,()=>{c.removeEventListener(Td,w),m=null}},createHref(H){return r(c,H)},createURL:F,encodeLocation(H){let re=F(H);return{pathname:re.pathname,search:re.search,hash:re.hash}},push:j,replace:_,go(H){return g.go(H)}};return L}var Oe;(function(a){a.data="data",a.deferred="deferred",a.redirect="redirect",a.error="error"})(Oe||(Oe={}));const Bh=new Set(["lazy","caseSensitive","path","id","index","children"]);function Oh(a){return a.index===!0}function Rr(a,r,s,u){return s===void 0&&(s=[]),u===void 0&&(u={}),a.map((c,p)=>{let g=[...s,String(p)],f=typeof c.id=="string"?c.id:g.join("-");if(Ce(c.index!==!0||!c.children,"Cannot specify children on an index route"),Ce(!u[f],'Found a route id collision on id "'+f+`". Route id's must be globally unique within Data Router usages`),Oh(c)){let m=Ge({},c,r(c),{id:f});return u[f]=m,m}else{let m=Ge({},c,r(c),{id:f,children:void 0});return u[f]=m,c.children&&(m.children=Rr(c.children,r,g,u)),m}})}function Ai(a,r,s){return s===void 0&&(s="/"),Cr(a,r,s,!1)}function Cr(a,r,s,u){let c=typeof r=="string"?jo(r):r,p=Eo(c.pathname||"/",s);if(p==null)return null;let g=cp(a);qh(g);let f=null;for(let m=0;f==null&&m<g.length;++m){let v=em(p);f=Zh(g[m],v,u)}return f}function Fh(a,r){let{route:s,pathname:u,params:c}=a;return{id:s.id,pathname:u,params:c,data:r[s.id],handle:s.handle}}function cp(a,r,s,u){r===void 0&&(r=[]),s===void 0&&(s=[]),u===void 0&&(u="");let c=(p,g,f)=>{let m={relativePath:f===void 0?p.path||"":f,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};m.relativePath.startsWith("/")&&(Ce(m.relativePath.startsWith(u),'Absolute route path "'+m.relativePath+'" nested under path '+('"'+u+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),m.relativePath=m.relativePath.slice(u.length));let v=Io([u,m.relativePath]),k=s.concat(m);p.children&&p.children.length>0&&(Ce(p.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+v+'".')),cp(p.children,r,k,v)),!(p.path==null&&!p.index)&&r.push({path:v,score:Qh(v,p.index),routesMeta:k})};return a.forEach((p,g)=>{var f;if(p.path===""||!((f=p.path)!=null&&f.includes("?")))c(p,g);else for(let m of dp(p.path))c(p,g,m)}),r}function dp(a){let r=a.split("/");if(r.length===0)return[];let[s,...u]=r,c=s.endsWith("?"),p=s.replace(/\?$/,"");if(u.length===0)return c?[p,""]:[p];let g=dp(u.join("/")),f=[];return f.push(...g.map(m=>m===""?p:[p,m].join("/"))),c&&f.push(...g),f.map(m=>a.startsWith("/")&&m===""?"/":m)}function qh(a){a.sort((r,s)=>r.score!==s.score?s.score-r.score:Jh(r.routesMeta.map(u=>u.childrenIndex),s.routesMeta.map(u=>u.childrenIndex)))}const Wh=/^:[\w-]+$/,Vh=3,Yh=2,Kh=1,Gh=10,$h=-2,Id=a=>a==="*";function Qh(a,r){let s=a.split("/"),u=s.length;return s.some(Id)&&(u+=$h),r&&(u+=Yh),s.filter(c=>!Id(c)).reduce((c,p)=>c+(Wh.test(p)?Vh:p===""?Kh:Gh),u)}function Jh(a,r){return a.length===r.length&&a.slice(0,-1).every((u,c)=>u===r[c])?a[a.length-1]-r[r.length-1]:0}function Zh(a,r,s){s===void 0&&(s=!1);let{routesMeta:u}=a,c={},p="/",g=[];for(let f=0;f<u.length;++f){let m=u[f],v=f===u.length-1,k=p==="/"?r:r.slice(p.length)||"/",w=Tr({path:m.relativePath,caseSensitive:m.caseSensitive,end:v},k),j=m.route;if(!w&&v&&s&&!u[u.length-1].route.index&&(w=Tr({path:m.relativePath,caseSensitive:m.caseSensitive,end:!1},k)),!w)return null;Object.assign(c,w.params),g.push({params:c,pathname:Io([p,w.pathname]),pathnameBase:am(Io([p,w.pathnameBase])),route:j}),w.pathnameBase!=="/"&&(p=Io([p,w.pathnameBase]))}return g}function Tr(a,r){typeof a=="string"&&(a={path:a,caseSensitive:!1,end:!0});let[s,u]=Xh(a.path,a.caseSensitive,a.end),c=r.match(s);if(!c)return null;let p=c[0],g=p.replace(/(.)\/+$/,"$1"),f=c.slice(1);return{params:u.reduce((v,k,w)=>{let{paramName:j,isOptional:_}=k;if(j==="*"){let L=f[w]||"";g=p.slice(0,p.length-L.length).replace(/(.)\/+$/,"$1")}const F=f[w];return _&&!F?v[j]=void 0:v[j]=(F||"").replace(/%2F/g,"/"),v},{}),pathname:p,pathnameBase:g,pattern:a}}function Xh(a,r,s){r===void 0&&(r=!1),s===void 0&&(s=!0),ri(a==="*"||!a.endsWith("*")||a.endsWith("/*"),'Route path "'+a+'" will be treated as if it were '+('"'+a.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+a.replace(/\*$/,"/*")+'".'));let u=[],c="^"+a.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,f,m)=>(u.push({paramName:f,isOptional:m!=null}),m?"/?([^\\/]+)?":"/([^\\/]+)"));return a.endsWith("*")?(u.push({paramName:"*"}),c+=a==="*"||a==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):s?c+="\\/*$":a!==""&&a!=="/"&&(c+="(?:(?=\\/|$))"),[new RegExp(c,r?void 0:"i"),u]}function em(a){try{return a.split("/").map(r=>decodeURIComponent(r).replace(/\//g,"%2F")).join("/")}catch(r){return ri(!1,'The URL path "'+a+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+r+").")),a}}function Eo(a,r){if(r==="/")return a;if(!a.toLowerCase().startsWith(r.toLowerCase()))return null;let s=r.endsWith("/")?r.length-1:r.length,u=a.charAt(s);return u&&u!=="/"?null:a.slice(s)||"/"}const tm=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,om=a=>tm.test(a);function im(a,r){r===void 0&&(r="/");let{pathname:s,search:u="",hash:c=""}=typeof a=="string"?jo(a):a,p;if(s)if(om(s))p=s;else{if(s.includes("//")){let g=s;s=s.replace(/\/\/+/g,"/"),ri(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+s))}s.startsWith("/")?p=Ed(s.substring(1),"/"):p=Ed(s,r)}else p=r;return{pathname:p,search:nm(u),hash:rm(c)}}function Ed(a,r){let s=r.replace(/\/+$/,"").split("/");return a.split("/").forEach(c=>{c===".."?s.length>1&&s.pop():c!=="."&&s.push(c)}),s.length>1?s.join("/"):"/"}function vl(a,r,s,u){return"Cannot include a '"+a+"' character in a manually specified "+("`to."+r+"` field ["+JSON.stringify(u)+"]. Please separate it out to the ")+("`to."+s+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function pp(a){return a.filter((r,s)=>s===0||r.route.path&&r.route.path.length>0)}function Hl(a,r){let s=pp(a);return r?s.map((u,c)=>c===s.length-1?u.pathname:u.pathnameBase):s.map(u=>u.pathnameBase)}function Bl(a,r,s,u){u===void 0&&(u=!1);let c;typeof a=="string"?c=jo(a):(c=Ge({},a),Ce(!c.pathname||!c.pathname.includes("?"),vl("?","pathname","search",c)),Ce(!c.pathname||!c.pathname.includes("#"),vl("#","pathname","hash",c)),Ce(!c.search||!c.search.includes("#"),vl("#","search","hash",c)));let p=a===""||c.pathname==="",g=p?"/":c.pathname,f;if(g==null)f=s;else{let w=r.length-1;if(!u&&g.startsWith("..")){let j=g.split("/");for(;j[0]==="..";)j.shift(),w-=1;c.pathname=j.join("/")}f=w>=0?r[w]:"/"}let m=im(c,f),v=g&&g!=="/"&&g.endsWith("/"),k=(p||g===".")&&s.endsWith("/");return!m.pathname.endsWith("/")&&(v||k)&&(m.pathname+="/"),m}const Io=a=>a.join("/").replace(/\/\/+/g,"/"),am=a=>a.replace(/\/+$/,"").replace(/^\/*/,"/"),nm=a=>!a||a==="?"?"":a.startsWith("?")?a:"?"+a,rm=a=>!a||a==="#"?"":a.startsWith("#")?a:"#"+a;class Ar{constructor(r,s,u,c){c===void 0&&(c=!1),this.status=r,this.statusText=s||"",this.internal=c,u instanceof Error?(this.data=u.toString(),this.error=u):this.data=u}}function nn(a){return a!=null&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.internal=="boolean"&&"data"in a}const gp=["post","put","patch","delete"],sm=new Set(gp),lm=["get",...gp],um=new Set(lm),cm=new Set([301,302,303,307,308]),dm=new Set([307,308]),bl={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},pm={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0},Xa={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Ol=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,gm=a=>({hasErrorBoundary:!!a.hasErrorBoundary}),hp="remix-router-transitions";function hm(a){const r=a.window?a.window:typeof window<"u"?window:void 0,s=typeof r<"u"&&typeof r.document<"u"&&typeof r.document.createElement<"u",u=!s;Ce(a.routes.length>0,"You must provide a non-empty routes array to createRouter");let c;if(a.mapRouteProperties)c=a.mapRouteProperties;else if(a.detectErrorBoundary){let y=a.detectErrorBoundary;c=C=>({hasErrorBoundary:y(C)})}else c=gm;let p={},g=Rr(a.routes,c,void 0,p),f,m=a.basename||"/",v=a.dataStrategy||Sm,k=a.patchRoutesOnNavigation,w=Ge({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},a.future),j=null,_=new Set,F=null,L=null,H=null,re=a.hydrationData!=null,W=Ai(g,a.history.location,m),Z=!1,te=null;if(W==null&&!k){let y=Dt(404,{pathname:a.history.location.pathname}),{matches:C,route:E}=Od(g);W=C,te={[E.id]:y}}W&&!a.hydrationData&&pi(W,g,a.history.location.pathname).active&&(W=null);let ye;if(W)if(W.some(y=>y.route.lazy))ye=!1;else if(!W.some(y=>y.route.loader))ye=!0;else if(w.v7_partialHydration){let y=a.hydrationData?a.hydrationData.loaderData:null,C=a.hydrationData?a.hydrationData.errors:null;if(C){let E=W.findIndex(M=>C[M.route.id]!==void 0);ye=W.slice(0,E+1).every(M=>!jl(M.route,y,C))}else ye=W.every(E=>!jl(E.route,y,C))}else ye=a.hydrationData!=null;else if(ye=!1,W=[],w.v7_partialHydration){let y=pi(null,g,a.history.location.pathname);y.active&&y.matches&&(Z=!0,W=y.matches)}let je,I={historyAction:a.history.action,location:a.history.location,matches:W,initialized:ye,navigation:bl,restoreScrollPosition:a.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:a.hydrationData&&a.hydrationData.loaderData||{},actionData:a.hydrationData&&a.hydrationData.actionData||null,errors:a.hydrationData&&a.hydrationData.errors||te,fetchers:new Map,blockers:new Map},K=rt.Pop,ve=!1,se,_e=!1,we=new Map,Ue=null,ke=!1,$e=!1,Xe=[],Le=new Set,O=new Map,le=0,Y=-1,P=new Map,D=new Set,pe=new Map,fe=new Map,he=new Set,be=new Map,Re=new Map,Te;function Ne(){if(j=a.history.listen(y=>{let{action:C,location:E,delta:M}=y;if(Te){Te(),Te=void 0;return}ri(Re.size===0||M!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let V=Li({currentLocation:I.location,nextLocation:E,historyAction:C});if(V&&M!=null){let ne=new Promise(de=>{Te=de});a.history.go(M*-1),Uo(V,{state:"blocked",location:E,proceed(){Uo(V,{state:"proceeding",proceed:void 0,reset:void 0,location:E}),ne.then(()=>a.history.go(M))},reset(){let de=new Map(I.blockers);de.set(V,Xa),ot({blockers:de})}});return}return Rt(C,E)}),s){zm(r,we);let y=()=>Dm(r,we);r.addEventListener("pagehide",y),Ue=()=>r.removeEventListener("pagehide",y)}return I.initialized||Rt(rt.Pop,I.location,{initialHydration:!0}),je}function ct(){j&&j(),Ue&&Ue(),_.clear(),se&&se.abort(),I.fetchers.forEach((y,C)=>no(C)),I.blockers.forEach((y,C)=>Ui(C))}function mo(y){return _.add(y),()=>_.delete(y)}function ot(y,C){C===void 0&&(C={}),I=Ge({},I,y);let E=[],M=[];w.v7_fetcherPersist&&I.fetchers.forEach((V,ne)=>{V.state==="idle"&&(he.has(ne)?M.push(ne):E.push(ne))}),he.forEach(V=>{!I.fetchers.has(V)&&!O.has(V)&&M.push(V)}),[..._].forEach(V=>V(I,{deletedFetchers:M,viewTransitionOpts:C.viewTransitionOpts,flushSync:C.flushSync===!0})),w.v7_fetcherPersist?(E.forEach(V=>I.fetchers.delete(V)),M.forEach(V=>no(V))):M.forEach(V=>he.delete(V))}function ge(y,C,E){var M,V;let{flushSync:ne}=E===void 0?{}:E,de=I.actionData!=null&&I.navigation.formMethod!=null&&to(I.navigation.formMethod)&&I.navigation.state==="loading"&&((M=y.state)==null?void 0:M._isRedirect)!==!0,X;C.actionData?Object.keys(C.actionData).length>0?X=C.actionData:X=null:de?X=I.actionData:X=null;let oe=C.loaderData?Hd(I.loaderData,C.loaderData,C.matches||[],C.errors):I.loaderData,$=I.blockers;$.size>0&&($=new Map($),$.forEach((xe,st)=>$.set(st,Xa)));let J=ve===!0||I.navigation.formMethod!=null&&to(I.navigation.formMethod)&&((V=y.state)==null?void 0:V._isRedirect)!==!0;f&&(g=f,f=void 0),ke||K===rt.Pop||(K===rt.Push?a.history.push(y,y.state):K===rt.Replace&&a.history.replace(y,y.state));let Se;if(K===rt.Pop){let xe=we.get(I.location.pathname);xe&&xe.has(y.pathname)?Se={currentLocation:I.location,nextLocation:y}:we.has(y.pathname)&&(Se={currentLocation:y,nextLocation:I.location})}else if(_e){let xe=we.get(I.location.pathname);xe?xe.add(y.pathname):(xe=new Set([y.pathname]),we.set(I.location.pathname,xe)),Se={currentLocation:I.location,nextLocation:y}}ot(Ge({},C,{actionData:X,loaderData:oe,historyAction:K,location:y,initialized:!0,navigation:bl,revalidation:"idle",restoreScrollPosition:ya(y,C.matches||I.matches),preventScrollReset:J,blockers:$}),{viewTransitionOpts:Se,flushSync:ne===!0}),K=rt.Pop,ve=!1,_e=!1,ke=!1,$e=!1,Xe=[]}async function et(y,C){if(typeof y=="number"){a.history.go(y);return}let E=El(I.location,I.matches,m,w.v7_prependBasename,y,w.v7_relativeSplatPath,C==null?void 0:C.fromRouteId,C==null?void 0:C.relative),{path:M,submission:V,error:ne}=jd(w.v7_normalizeFormMethod,!1,E,C),de=I.location,X=an(I.location,M,C&&C.state);X=Ge({},X,a.history.encodeLocation(X));let oe=C&&C.replace!=null?C.replace:void 0,$=rt.Push;oe===!0?$=rt.Replace:oe===!1||V!=null&&to(V.formMethod)&&V.formAction===I.location.pathname+I.location.search&&($=rt.Replace);let J=C&&"preventScrollReset"in C?C.preventScrollReset===!0:void 0,Se=(C&&C.flushSync)===!0,xe=Li({currentLocation:de,nextLocation:X,historyAction:$});if(xe){Uo(xe,{state:"blocked",location:X,proceed(){Uo(xe,{state:"proceeding",proceed:void 0,reset:void 0,location:X}),et(y,C)},reset(){let st=new Map(I.blockers);st.set(xe,Xa),ot({blockers:st})}});return}return await Rt($,X,{submission:V,pendingError:ne,preventScrollReset:J,replace:C&&C.replace,enableViewTransition:C&&C.viewTransition,flushSync:Se})}function ht(){if(di(),ot({revalidation:"loading"}),I.navigation.state!=="submitting"){if(I.navigation.state==="idle"){Rt(I.historyAction,I.location,{startUninterruptedRevalidation:!0});return}Rt(K||I.historyAction,I.navigation.location,{overrideNavigation:I.navigation,enableViewTransition:_e===!0})}}async function Rt(y,C,E){se&&se.abort(),se=null,K=y,ke=(E&&E.startUninterruptedRevalidation)===!0,hn(I.location,I.matches),ve=(E&&E.preventScrollReset)===!0,_e=(E&&E.enableViewTransition)===!0;let M=f||g,V=E&&E.overrideNavigation,ne=E!=null&&E.initialHydration&&I.matches&&I.matches.length>0&&!Z?I.matches:Ai(M,C,m),de=(E&&E.flushSync)===!0;if(ne&&I.initialized&&!$e&&Cm(I.location,C)&&!(E&&E.submission&&to(E.submission.formMethod))){ge(C,{matches:ne},{flushSync:de});return}let X=pi(ne,M,C.pathname);if(X.active&&X.matches&&(ne=X.matches),!ne){let{error:He,notFoundMatches:Ie,route:We}=ro(C.pathname);ge(C,{matches:Ie,loaderData:{},errors:{[We.id]:He}},{flushSync:de});return}se=new AbortController;let oe=sa(a.history,C,se.signal,E&&E.submission),$;if(E&&E.pendingError)$=[Ii(ne).route.id,{type:Oe.error,error:E.pendingError}];else if(E&&E.submission&&to(E.submission.formMethod)){let He=await ui(oe,C,E.submission,ne,X.active,{replace:E.replace,flushSync:de});if(He.shortCircuited)return;if(He.pendingActionResult){let[Ie,We]=He.pendingActionResult;if(Ht(We)&&nn(We.error)&&We.error.status===404){se=null,ge(C,{matches:He.matches,loaderData:{},errors:{[Ie]:We.error}});return}}ne=He.matches||ne,$=He.pendingActionResult,V=wl(C,E.submission),de=!1,X.active=!1,oe=sa(a.history,oe.url,oe.signal)}let{shortCircuited:J,matches:Se,loaderData:xe,errors:st}=await cn(oe,C,ne,X.active,V,E&&E.submission,E&&E.fetcherSubmission,E&&E.replace,E&&E.initialHydration===!0,de,$);J||(se=null,ge(C,Ge({matches:Se||ne},Bd($),{loaderData:xe,errors:st})))}async function ui(y,C,E,M,V,ne){ne===void 0&&(ne={}),di();let de=Em(C,E);if(ot({navigation:de},{flushSync:ne.flushSync===!0}),V){let $=await Lo(M,C.pathname,y.signal);if($.type==="aborted")return{shortCircuited:!0};if($.type==="error"){let J=Ii($.partialMatches).route.id;return{matches:$.partialMatches,pendingActionResult:[J,{type:Oe.error,error:$.error}]}}else if($.matches)M=$.matches;else{let{notFoundMatches:J,error:Se,route:xe}=ro(C.pathname);return{matches:J,pendingActionResult:[xe.id,{type:Oe.error,error:Se}]}}}let X,oe=on(M,C);if(!oe.route.action&&!oe.route.lazy)X={type:Oe.error,error:Dt(405,{method:y.method,pathname:C.pathname,routeId:oe.route.id})};else if(X=(await Mo("action",I,y,[oe],M,null))[oe.route.id],y.signal.aborted)return{shortCircuited:!0};if(Ei(X)){let $;return ne&&ne.replace!=null?$=ne.replace:$=Ud(X.response.headers.get("Location"),new URL(y.url),m,a.history)===I.location.pathname+I.location.search,await ao(y,X,!0,{submission:E,replace:$}),{shortCircuited:!0}}if(ni(X))throw Dt(400,{type:"defer-action"});if(Ht(X)){let $=Ii(M,oe.route.id);return(ne&&ne.replace)!==!0&&(K=rt.Push),{matches:M,pendingActionResult:[$.route.id,X]}}return{matches:M,pendingActionResult:[oe.route.id,X]}}async function cn(y,C,E,M,V,ne,de,X,oe,$,J){let Se=V||wl(C,ne),xe=ne||de||qd(Se),st=!ke&&(!w.v7_partialHydration||!oe);if(M){if(st){let Fe=Mi(J);ot(Ge({navigation:Se},Fe!==void 0?{actionData:Fe}:{}),{flushSync:$})}let Ae=await Lo(E,C.pathname,y.signal);if(Ae.type==="aborted")return{shortCircuited:!0};if(Ae.type==="error"){let Fe=Ii(Ae.partialMatches).route.id;return{matches:Ae.partialMatches,loaderData:{},errors:{[Fe]:Ae.error}}}else if(Ae.matches)E=Ae.matches;else{let{error:Fe,notFoundMatches:mt,route:mi}=ro(C.pathname);return{matches:mt,loaderData:{},errors:{[mi.id]:Fe}}}}let He=f||g,[Ie,We]=Dd(a.history,I,E,xe,C,w.v7_partialHydration&&oe===!0,w.v7_skipActionErrorRevalidation,$e,Xe,Le,he,pe,D,He,m,J);if(so(Ae=>!(E&&E.some(Fe=>Fe.route.id===Ae))||Ie&&Ie.some(Fe=>Fe.route.id===Ae)),Y=++le,Ie.length===0&&We.length===0){let Ae=pn();return ge(C,Ge({matches:E,loaderData:{},errors:J&&Ht(J[1])?{[J[0]]:J[1].error}:null},Bd(J),Ae?{fetchers:new Map(I.fetchers)}:{}),{flushSync:$}),{shortCircuited:!0}}if(st){let Ae={};if(!M){Ae.navigation=Se;let Fe=Mi(J);Fe!==void 0&&(Ae.actionData=Fe)}We.length>0&&(Ae.fetchers=ci(We)),ot(Ae,{flushSync:$})}We.forEach(Ae=>{Kt(Ae.key),Ae.controller&&O.set(Ae.key,Ae.controller)});let fo=()=>We.forEach(Ae=>Kt(Ae.key));se&&se.signal.addEventListener("abort",fo);let{loaderResults:hi,fetcherResults:Gt}=await ga(I,E,Ie,We,y);if(y.signal.aborted)return{shortCircuited:!0};se&&se.signal.removeEventListener("abort",fo),We.forEach(Ae=>O.delete(Ae.key));let ze=wr(hi);if(ze)return await ao(y,ze.result,!0,{replace:X}),{shortCircuited:!0};if(ze=wr(Gt),ze)return D.add(ze.key),await ao(y,ze.result,!0,{replace:X}),{shortCircuited:!0};let{loaderData:Sa,errors:yo}=Nd(I,E,hi,J,We,Gt,be);be.forEach((Ae,Fe)=>{Ae.subscribe(mt=>{(mt||Ae.done)&&be.delete(Fe)})}),w.v7_partialHydration&&oe&&I.errors&&(yo=Ge({},I.errors,yo));let lo=pn(),So=_i(Y),Ni=lo||So||We.length>0;return Ge({matches:E,loaderData:Sa,errors:yo},Ni?{fetchers:new Map(I.fetchers)}:{})}function Mi(y){if(y&&!Ht(y[1]))return{[y[0]]:y[1].data};if(I.actionData)return Object.keys(I.actionData).length===0?null:I.actionData}function ci(y){return y.forEach(C=>{let E=I.fetchers.get(C.key),M=en(void 0,E?E.data:void 0);I.fetchers.set(C.key,M)}),new Map(I.fetchers)}function Do(y,C,E,M){if(u)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");Kt(y);let V=(M&&M.flushSync)===!0,ne=f||g,de=El(I.location,I.matches,m,w.v7_prependBasename,E,w.v7_relativeSplatPath,C,M==null?void 0:M.relative),X=Ai(ne,de,m),oe=pi(X,ne,de);if(oe.active&&oe.matches&&(X=oe.matches),!X){Bt(y,C,Dt(404,{pathname:de}),{flushSync:V});return}let{path:$,submission:J,error:Se}=jd(w.v7_normalizeFormMethod,!0,de,M);if(Se){Bt(y,C,Se,{flushSync:V});return}let xe=on(X,$),st=(M&&M.preventScrollReset)===!0;if(J&&to(J.formMethod)){pa(y,C,$,xe,X,oe.active,V,st,J);return}pe.set(y,{routeId:C,path:$}),dn(y,C,$,xe,X,oe.active,V,st,J)}async function pa(y,C,E,M,V,ne,de,X,oe){di(),pe.delete(y);function $(De){if(!De.route.action&&!De.route.lazy){let No=Dt(405,{method:oe.formMethod,pathname:E,routeId:C});return Bt(y,C,No,{flushSync:de}),!0}return!1}if(!ne&&$(M))return;let J=I.fetchers.get(y);Mt(y,jm(oe,J),{flushSync:de});let Se=new AbortController,xe=sa(a.history,E,Se.signal,oe);if(ne){let De=await Lo(V,new URL(xe.url).pathname,xe.signal,y);if(De.type==="aborted")return;if(De.type==="error"){Bt(y,C,De.error,{flushSync:de});return}else if(De.matches){if(V=De.matches,M=on(V,E),$(M))return}else{Bt(y,C,Dt(404,{pathname:E}),{flushSync:de});return}}O.set(y,Se);let st=le,Ie=(await Mo("action",I,xe,[M],V,y))[M.route.id];if(xe.signal.aborted){O.get(y)===Se&&O.delete(y);return}if(w.v7_fetcherPersist&&he.has(y)){if(Ei(Ie)||Ht(Ie)){Mt(y,ai(void 0));return}}else{if(Ei(Ie))if(O.delete(y),Y>st){Mt(y,ai(void 0));return}else return D.add(y),Mt(y,en(oe)),ao(xe,Ie,!1,{fetcherSubmission:oe,preventScrollReset:X});if(Ht(Ie)){Bt(y,C,Ie.error);return}}if(ni(Ie))throw Dt(400,{type:"defer-action"});let We=I.navigation.location||I.location,fo=sa(a.history,We,Se.signal),hi=f||g,Gt=I.navigation.state!=="idle"?Ai(hi,I.navigation.location,m):I.matches;Ce(Gt,"Didn't find any matches after fetcher action");let ze=++le;P.set(y,ze);let Sa=en(oe,Ie.data);I.fetchers.set(y,Sa);let[yo,lo]=Dd(a.history,I,Gt,oe,We,!1,w.v7_skipActionErrorRevalidation,$e,Xe,Le,he,pe,D,hi,m,[M.route.id,Ie]);lo.filter(De=>De.key!==y).forEach(De=>{let No=De.key,fn=I.fetchers.get(No),Mr=en(void 0,fn?fn.data:void 0);I.fetchers.set(No,Mr),Kt(No),De.controller&&O.set(No,De.controller)}),ot({fetchers:new Map(I.fetchers)});let So=()=>lo.forEach(De=>Kt(De.key));Se.signal.addEventListener("abort",So);let{loaderResults:Ni,fetcherResults:Ae}=await ga(I,Gt,yo,lo,fo);if(Se.signal.aborted)return;Se.signal.removeEventListener("abort",So),P.delete(y),O.delete(y),lo.forEach(De=>O.delete(De.key));let Fe=wr(Ni);if(Fe)return ao(fo,Fe.result,!1,{preventScrollReset:X});if(Fe=wr(Ae),Fe)return D.add(Fe.key),ao(fo,Fe.result,!1,{preventScrollReset:X});let{loaderData:mt,errors:mi}=Nd(I,Gt,Ni,void 0,lo,Ae,be);if(I.fetchers.has(y)){let De=ai(Ie.data);I.fetchers.set(y,De)}_i(ze),I.navigation.state==="loading"&&ze>Y?(Ce(K,"Expected pending action"),se&&se.abort(),ge(I.navigation.location,{matches:Gt,loaderData:mt,errors:mi,fetchers:new Map(I.fetchers)})):(ot({errors:mi,loaderData:Hd(I.loaderData,mt,Gt,mi),fetchers:new Map(I.fetchers)}),$e=!1)}async function dn(y,C,E,M,V,ne,de,X,oe){let $=I.fetchers.get(y);Mt(y,en(oe,$?$.data:void 0),{flushSync:de});let J=new AbortController,Se=sa(a.history,E,J.signal);if(ne){let Ie=await Lo(V,new URL(Se.url).pathname,Se.signal,y);if(Ie.type==="aborted")return;if(Ie.type==="error"){Bt(y,C,Ie.error,{flushSync:de});return}else if(Ie.matches)V=Ie.matches,M=on(V,E);else{Bt(y,C,Dt(404,{pathname:E}),{flushSync:de});return}}O.set(y,J);let xe=le,He=(await Mo("loader",I,Se,[M],V,y))[M.route.id];if(ni(He)&&(He=await Fl(He,Se.signal,!0)||He),O.get(y)===J&&O.delete(y),!Se.signal.aborted){if(he.has(y)){Mt(y,ai(void 0));return}if(Ei(He))if(Y>xe){Mt(y,ai(void 0));return}else{D.add(y),await ao(Se,He,!1,{preventScrollReset:X});return}if(Ht(He)){Bt(y,C,He.error);return}Ce(!ni(He),"Unhandled fetcher deferred data"),Mt(y,ai(He.data))}}async function ao(y,C,E,M){let{submission:V,fetcherSubmission:ne,preventScrollReset:de,replace:X}=M===void 0?{}:M;C.response.headers.has("X-Remix-Revalidate")&&($e=!0);let oe=C.response.headers.get("Location");Ce(oe,"Expected a Location header on the redirect Response"),oe=Ud(oe,new URL(y.url),m,a.history);let $=an(I.location,oe,{_isRedirect:!0});if(s){let Ie=!1;if(C.response.headers.has("X-Remix-Reload-Document"))Ie=!0;else if(Ol.test(oe)){const We=a.history.createURL(oe);Ie=We.origin!==r.location.origin||Eo(We.pathname,m)==null}if(Ie){X?r.location.replace(oe):r.location.assign(oe);return}}se=null;let J=X===!0||C.response.headers.has("X-Remix-Replace")?rt.Replace:rt.Push,{formMethod:Se,formAction:xe,formEncType:st}=I.navigation;!V&&!ne&&Se&&xe&&st&&(V=qd(I.navigation));let He=V||ne;if(dm.has(C.response.status)&&He&&to(He.formMethod))await Rt(J,$,{submission:Ge({},He,{formAction:oe}),preventScrollReset:de||ve,enableViewTransition:E?_e:void 0});else{let Ie=wl($,V);await Rt(J,$,{overrideNavigation:Ie,fetcherSubmission:ne,preventScrollReset:de||ve,enableViewTransition:E?_e:void 0})}}async function Mo(y,C,E,M,V,ne){let de,X={};try{de=await vm(v,y,C,E,M,V,ne,p,c)}catch(oe){return M.forEach($=>{X[$.route.id]={type:Oe.error,error:oe}}),X}for(let[oe,$]of Object.entries(de))if(xm($)){let J=$.result;X[oe]={type:Oe.redirect,response:km(J,E,oe,V,m,w.v7_relativeSplatPath)}}else X[oe]=await wm($);return X}async function ga(y,C,E,M,V){let ne=y.matches,de=Mo("loader",y,V,E,C,null),X=Promise.all(M.map(async J=>{if(J.matches&&J.match&&J.controller){let xe=(await Mo("loader",y,sa(a.history,J.path,J.controller.signal),[J.match],J.matches,J.key))[J.match.route.id];return{[J.key]:xe}}else return Promise.resolve({[J.key]:{type:Oe.error,error:Dt(404,{pathname:J.path})}})})),oe=await de,$=(await X).reduce((J,Se)=>Object.assign(J,Se),{});return await Promise.all([Am(C,oe,V.signal,ne,y.loaderData),Im(C,$,M)]),{loaderResults:oe,fetcherResults:$}}function di(){$e=!0,Xe.push(...so()),pe.forEach((y,C)=>{O.has(C)&&Le.add(C),Kt(C)})}function Mt(y,C,E){E===void 0&&(E={}),I.fetchers.set(y,C),ot({fetchers:new Map(I.fetchers)},{flushSync:(E&&E.flushSync)===!0})}function Bt(y,C,E,M){M===void 0&&(M={});let V=Ii(I.matches,C);no(y),ot({errors:{[V.route.id]:E},fetchers:new Map(I.fetchers)},{flushSync:(M&&M.flushSync)===!0})}function _o(y){return fe.set(y,(fe.get(y)||0)+1),he.has(y)&&he.delete(y),I.fetchers.get(y)||pm}function no(y){let C=I.fetchers.get(y);O.has(y)&&!(C&&C.state==="loading"&&P.has(y))&&Kt(y),pe.delete(y),P.delete(y),D.delete(y),w.v7_fetcherPersist&&he.delete(y),Le.delete(y),I.fetchers.delete(y)}function Dr(y){let C=(fe.get(y)||0)-1;C<=0?(fe.delete(y),he.add(y),w.v7_fetcherPersist||no(y)):fe.set(y,C),ot({fetchers:new Map(I.fetchers)})}function Kt(y){let C=O.get(y);C&&(C.abort(),O.delete(y))}function ha(y){for(let C of y){let E=_o(C),M=ai(E.data);I.fetchers.set(C,M)}}function pn(){let y=[],C=!1;for(let E of D){let M=I.fetchers.get(E);Ce(M,"Expected fetcher: "+E),M.state==="loading"&&(D.delete(E),y.push(E),C=!0)}return ha(y),C}function _i(y){let C=[];for(let[E,M]of P)if(M<y){let V=I.fetchers.get(E);Ce(V,"Expected fetcher: "+E),V.state==="loading"&&(Kt(E),P.delete(E),C.push(E))}return ha(C),C.length>0}function ma(y,C){let E=I.blockers.get(y)||Xa;return Re.get(y)!==C&&Re.set(y,C),E}function Ui(y){I.blockers.delete(y),Re.delete(y)}function Uo(y,C){let E=I.blockers.get(y)||Xa;Ce(E.state==="unblocked"&&C.state==="blocked"||E.state==="blocked"&&C.state==="blocked"||E.state==="blocked"&&C.state==="proceeding"||E.state==="blocked"&&C.state==="unblocked"||E.state==="proceeding"&&C.state==="unblocked","Invalid blocker state transition: "+E.state+" -> "+C.state);let M=new Map(I.blockers);M.set(y,C),ot({blockers:M})}function Li(y){let{currentLocation:C,nextLocation:E,historyAction:M}=y;if(Re.size===0)return;Re.size>1&&ri(!1,"A router only supports one blocker at a time");let V=Array.from(Re.entries()),[ne,de]=V[V.length-1],X=I.blockers.get(ne);if(!(X&&X.state==="proceeding")&&de({currentLocation:C,nextLocation:E,historyAction:M}))return ne}function ro(y){let C=Dt(404,{pathname:y}),E=f||g,{matches:M,route:V}=Od(E);return so(),{notFoundMatches:M,route:V,error:C}}function so(y){let C=[];return be.forEach((E,M)=>{(!y||y(M))&&(E.cancel(),C.push(M),be.delete(M))}),C}function gn(y,C,E){if(F=y,H=C,L=E||null,!re&&I.navigation===bl){re=!0;let M=ya(I.location,I.matches);M!=null&&ot({restoreScrollPosition:M})}return()=>{F=null,H=null,L=null}}function fa(y,C){return L&&L(y,C.map(M=>Fh(M,I.loaderData)))||y.key}function hn(y,C){if(F&&H){let E=fa(y,C);F[E]=H()}}function ya(y,C){if(F){let E=fa(y,C),M=F[E];if(typeof M=="number")return M}return null}function pi(y,C,E){if(k)if(y){if(Object.keys(y[0].params).length>0)return{active:!0,matches:Cr(C,E,m,!0)}}else return{active:!0,matches:Cr(C,E,m,!0)||[]};return{active:!1,matches:null}}async function Lo(y,C,E,M){if(!k)return{type:"success",matches:y};let V=y;for(;;){let ne=f==null,de=f||g,X=p;try{await k({signal:E,path:C,matches:V,fetcherKey:M,patch:(J,Se)=>{E.aborted||_d(J,Se,de,X,c)}})}catch(J){return{type:"error",error:J,partialMatches:V}}finally{ne&&!E.aborted&&(g=[...g])}if(E.aborted)return{type:"aborted"};let oe=Ai(de,C,m);if(oe)return{type:"success",matches:oe};let $=Cr(de,C,m,!0);if(!$||V.length===$.length&&V.every((J,Se)=>J.route.id===$[Se].route.id))return{type:"success",matches:null};V=$}}function mn(y){p={},f=Rr(y,c,void 0,p)}function gi(y,C){let E=f==null;_d(y,C,f||g,p,c),E&&(g=[...g],ot({}))}return je={get basename(){return m},get future(){return w},get state(){return I},get routes(){return g},get window(){return r},initialize:Ne,subscribe:mo,enableScrollRestoration:gn,navigate:et,fetch:Do,revalidate:ht,createHref:y=>a.history.createHref(y),encodeLocation:y=>a.history.encodeLocation(y),getFetcher:_o,deleteFetcher:Dr,dispose:ct,getBlocker:ma,deleteBlocker:Ui,patchRoutes:gi,_internalFetchControllers:O,_internalActiveDeferreds:be,_internalSetRoutes:mn},je}function mm(a){return a!=null&&("formData"in a&&a.formData!=null||"body"in a&&a.body!==void 0)}function El(a,r,s,u,c,p,g,f){let m,v;if(g){m=[];for(let w of r)if(m.push(w),w.route.id===g){v=w;break}}else m=r,v=r[r.length-1];let k=Bl(c||".",Hl(m,p),Eo(a.pathname,s)||a.pathname,f==="path");if(c==null&&(k.search=a.search,k.hash=a.hash),(c==null||c===""||c===".")&&v){let w=ql(k.search);if(v.route.index&&!w)k.search=k.search?k.search.replace(/^\?/,"?index&"):"?index";else if(!v.route.index&&w){let j=new URLSearchParams(k.search),_=j.getAll("index");j.delete("index"),_.filter(L=>L).forEach(L=>j.append("index",L));let F=j.toString();k.search=F?"?"+F:""}}return u&&s!=="/"&&(k.pathname=k.pathname==="/"?s:Io([s,k.pathname])),Di(k)}function jd(a,r,s,u){if(!u||!mm(u))return{path:s};if(u.formMethod&&!Tm(u.formMethod))return{path:s,error:Dt(405,{method:u.formMethod})};let c=()=>({path:s,error:Dt(400,{type:"invalid-body"})}),p=u.formMethod||"get",g=a?p.toUpperCase():p.toLowerCase(),f=yp(s);if(u.body!==void 0){if(u.formEncType==="text/plain"){if(!to(g))return c();let j=typeof u.body=="string"?u.body:u.body instanceof FormData||u.body instanceof URLSearchParams?Array.from(u.body.entries()).reduce((_,F)=>{let[L,H]=F;return""+_+L+"="+H+`
51
+ `},""):String(u.body);return{path:s,submission:{formMethod:g,formAction:f,formEncType:u.formEncType,formData:void 0,json:void 0,text:j}}}else if(u.formEncType==="application/json"){if(!to(g))return c();try{let j=typeof u.body=="string"?JSON.parse(u.body):u.body;return{path:s,submission:{formMethod:g,formAction:f,formEncType:u.formEncType,formData:void 0,json:j,text:void 0}}}catch{return c()}}}Ce(typeof FormData=="function","FormData is not available in this environment");let m,v;if(u.formData)m=zl(u.formData),v=u.formData;else if(u.body instanceof FormData)m=zl(u.body),v=u.body;else if(u.body instanceof URLSearchParams)m=u.body,v=Ld(m);else if(u.body==null)m=new URLSearchParams,v=new FormData;else try{m=new URLSearchParams(u.body),v=Ld(m)}catch{return c()}let k={formMethod:g,formAction:f,formEncType:u&&u.formEncType||"application/x-www-form-urlencoded",formData:v,json:void 0,text:void 0};if(to(k.formMethod))return{path:s,submission:k};let w=jo(s);return r&&w.search&&ql(w.search)&&m.append("index",""),w.search="?"+m,{path:Di(w),submission:k}}function zd(a,r,s){s===void 0&&(s=!1);let u=a.findIndex(c=>c.route.id===r);return u>=0?a.slice(0,s?u+1:u):a}function Dd(a,r,s,u,c,p,g,f,m,v,k,w,j,_,F,L){let H=L?Ht(L[1])?L[1].error:L[1].data:void 0,re=a.createURL(r.location),W=a.createURL(c),Z=s;p&&r.errors?Z=zd(s,Object.keys(r.errors)[0],!0):L&&Ht(L[1])&&(Z=zd(s,L[0]));let te=L?L[1].statusCode:void 0,ye=g&&te&&te>=400,je=Z.filter((K,ve)=>{let{route:se}=K;if(se.lazy)return!0;if(se.loader==null)return!1;if(p)return jl(se,r.loaderData,r.errors);if(fm(r.loaderData,r.matches[ve],K)||m.some(Ue=>Ue===K.route.id))return!0;let _e=r.matches[ve],we=K;return Md(K,Ge({currentUrl:re,currentParams:_e.params,nextUrl:W,nextParams:we.params},u,{actionResult:H,actionStatus:te,defaultShouldRevalidate:ye?!1:f||re.pathname+re.search===W.pathname+W.search||re.search!==W.search||mp(_e,we)}))}),I=[];return w.forEach((K,ve)=>{if(p||!s.some(ke=>ke.route.id===K.routeId)||k.has(ve))return;let se=Ai(_,K.path,F);if(!se){I.push({key:ve,routeId:K.routeId,path:K.path,matches:null,match:null,controller:null});return}let _e=r.fetchers.get(ve),we=on(se,K.path),Ue=!1;j.has(ve)?Ue=!1:v.has(ve)?(v.delete(ve),Ue=!0):_e&&_e.state!=="idle"&&_e.data===void 0?Ue=f:Ue=Md(we,Ge({currentUrl:re,currentParams:r.matches[r.matches.length-1].params,nextUrl:W,nextParams:s[s.length-1].params},u,{actionResult:H,actionStatus:te,defaultShouldRevalidate:ye?!1:f})),Ue&&I.push({key:ve,routeId:K.routeId,path:K.path,matches:se,match:we,controller:new AbortController})}),[je,I]}function jl(a,r,s){if(a.lazy)return!0;if(!a.loader)return!1;let u=r!=null&&r[a.id]!==void 0,c=s!=null&&s[a.id]!==void 0;return!u&&c?!1:typeof a.loader=="function"&&a.loader.hydrate===!0?!0:!u&&!c}function fm(a,r,s){let u=!r||s.route.id!==r.route.id,c=a[s.route.id]===void 0;return u||c}function mp(a,r){let s=a.route.path;return a.pathname!==r.pathname||s!=null&&s.endsWith("*")&&a.params["*"]!==r.params["*"]}function Md(a,r){if(a.route.shouldRevalidate){let s=a.route.shouldRevalidate(r);if(typeof s=="boolean")return s}return r.defaultShouldRevalidate}function _d(a,r,s,u,c){var p;let g;if(a){let v=u[a];Ce(v,"No route found to patch children into: routeId = "+a),v.children||(v.children=[]),g=v.children}else g=s;let f=r.filter(v=>!g.some(k=>fp(v,k))),m=Rr(f,c,[a||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],u);g.push(...m)}function fp(a,r){return"id"in a&&"id"in r&&a.id===r.id?!0:a.index===r.index&&a.path===r.path&&a.caseSensitive===r.caseSensitive?(!a.children||a.children.length===0)&&(!r.children||r.children.length===0)?!0:a.children.every((s,u)=>{var c;return(c=r.children)==null?void 0:c.some(p=>fp(s,p))}):!1}async function ym(a,r,s){if(!a.lazy)return;let u=await a.lazy();if(!a.lazy)return;let c=s[a.id];Ce(c,"No route found in manifest");let p={};for(let g in u){let m=c[g]!==void 0&&g!=="hasErrorBoundary";ri(!m,'Route "'+c.id+'" has a static property "'+g+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+g+'" will be ignored.')),!m&&!Bh.has(g)&&(p[g]=u[g])}Object.assign(c,p),Object.assign(c,Ge({},r(c),{lazy:void 0}))}async function Sm(a){let{matches:r}=a,s=r.filter(c=>c.shouldLoad);return(await Promise.all(s.map(c=>c.resolve()))).reduce((c,p,g)=>Object.assign(c,{[s[g].route.id]:p}),{})}async function vm(a,r,s,u,c,p,g,f,m,v){let k=p.map(_=>_.route.lazy?ym(_.route,m,f):void 0),w=p.map((_,F)=>{let L=k[F],H=c.some(W=>W.route.id===_.route.id);return Ge({},_,{shouldLoad:H,resolve:async W=>(W&&u.method==="GET"&&(_.route.lazy||_.route.loader)&&(H=!0),H?bm(r,u,_,L,W,v):Promise.resolve({type:Oe.data,result:void 0}))})}),j=await a({matches:w,request:u,params:p[0].params,fetcherKey:g,context:v});try{await Promise.all(k)}catch{}return j}async function bm(a,r,s,u,c,p){let g,f,m=v=>{let k,w=new Promise((F,L)=>k=L);f=()=>k(),r.signal.addEventListener("abort",f);let j=F=>typeof v!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+a+'" [routeId: '+s.route.id+"]"))):v({request:r,params:s.params,context:p},...F!==void 0?[F]:[]),_=(async()=>{try{return{type:"data",result:await(c?c(L=>j(L)):j())}}catch(F){return{type:"error",result:F}}})();return Promise.race([_,w])};try{let v=s.route[a];if(u)if(v){let k,[w]=await Promise.all([m(v).catch(j=>{k=j}),u]);if(k!==void 0)throw k;g=w}else if(await u,v=s.route[a],v)g=await m(v);else if(a==="action"){let k=new URL(r.url),w=k.pathname+k.search;throw Dt(405,{method:r.method,pathname:w,routeId:s.route.id})}else return{type:Oe.data,result:void 0};else if(v)g=await m(v);else{let k=new URL(r.url),w=k.pathname+k.search;throw Dt(404,{pathname:w})}Ce(g.result!==void 0,"You defined "+(a==="action"?"an action":"a loader")+" for route "+('"'+s.route.id+"\" but didn't return anything from your `"+a+"` ")+"function. Please return a value or `null`.")}catch(v){return{type:Oe.error,result:v}}finally{f&&r.signal.removeEventListener("abort",f)}return g}async function wm(a){let{result:r,type:s}=a;if(Sp(r)){let w;try{let j=r.headers.get("Content-Type");j&&/\bapplication\/json\b/.test(j)?r.body==null?w=null:w=await r.json():w=await r.text()}catch(j){return{type:Oe.error,error:j}}return s===Oe.error?{type:Oe.error,error:new Ar(r.status,r.statusText,w),statusCode:r.status,headers:r.headers}:{type:Oe.data,data:w,statusCode:r.status,headers:r.headers}}if(s===Oe.error){if(Fd(r)){var u,c;if(r.data instanceof Error){var p,g;return{type:Oe.error,error:r.data,statusCode:(p=r.init)==null?void 0:p.status,headers:(g=r.init)!=null&&g.headers?new Headers(r.init.headers):void 0}}return{type:Oe.error,error:new Ar(((u=r.init)==null?void 0:u.status)||500,void 0,r.data),statusCode:nn(r)?r.status:void 0,headers:(c=r.init)!=null&&c.headers?new Headers(r.init.headers):void 0}}return{type:Oe.error,error:r,statusCode:nn(r)?r.status:void 0}}if(Rm(r)){var f,m;return{type:Oe.deferred,deferredData:r,statusCode:(f=r.init)==null?void 0:f.status,headers:((m=r.init)==null?void 0:m.headers)&&new Headers(r.init.headers)}}if(Fd(r)){var v,k;return{type:Oe.data,data:r.data,statusCode:(v=r.init)==null?void 0:v.status,headers:(k=r.init)!=null&&k.headers?new Headers(r.init.headers):void 0}}return{type:Oe.data,data:r}}function km(a,r,s,u,c,p){let g=a.headers.get("Location");if(Ce(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Ol.test(g)){let f=u.slice(0,u.findIndex(m=>m.route.id===s)+1);g=El(new URL(r.url),f,c,!0,g,p),a.headers.set("Location",g)}return a}function Ud(a,r,s,u){let c=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Ol.test(a)){let p=a,g=p.startsWith("//")?new URL(r.protocol+p):new URL(p);if(c.includes(g.protocol))throw new Error("Invalid redirect location");let f=Eo(g.pathname,s)!=null;if(g.origin===r.origin&&f)return g.pathname+g.search+g.hash}try{let p=u.createURL(a);if(c.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return a}function sa(a,r,s,u){let c=a.createURL(yp(r)).toString(),p={signal:s};if(u&&to(u.formMethod)){let{formMethod:g,formEncType:f}=u;p.method=g.toUpperCase(),f==="application/json"?(p.headers=new Headers({"Content-Type":f}),p.body=JSON.stringify(u.json)):f==="text/plain"?p.body=u.text:f==="application/x-www-form-urlencoded"&&u.formData?p.body=zl(u.formData):p.body=u.formData}return new Request(c,p)}function zl(a){let r=new URLSearchParams;for(let[s,u]of a.entries())r.append(s,typeof u=="string"?u:u.name);return r}function Ld(a){let r=new FormData;for(let[s,u]of a.entries())r.append(s,u);return r}function Pm(a,r,s,u,c){let p={},g=null,f,m=!1,v={},k=s&&Ht(s[1])?s[1].error:void 0;return a.forEach(w=>{if(!(w.route.id in r))return;let j=w.route.id,_=r[j];if(Ce(!Ei(_),"Cannot handle redirect results in processLoaderData"),Ht(_)){let F=_.error;k!==void 0&&(F=k,k=void 0),g=g||{};{let L=Ii(a,j);g[L.route.id]==null&&(g[L.route.id]=F)}p[j]=void 0,m||(m=!0,f=nn(_.error)?_.error.status:500),_.headers&&(v[j]=_.headers)}else ni(_)?(u.set(j,_.deferredData),p[j]=_.deferredData.data,_.statusCode!=null&&_.statusCode!==200&&!m&&(f=_.statusCode),_.headers&&(v[j]=_.headers)):(p[j]=_.data,_.statusCode&&_.statusCode!==200&&!m&&(f=_.statusCode),_.headers&&(v[j]=_.headers))}),k!==void 0&&s&&(g={[s[0]]:k},p[s[0]]=void 0),{loaderData:p,errors:g,statusCode:f||200,loaderHeaders:v}}function Nd(a,r,s,u,c,p,g){let{loaderData:f,errors:m}=Pm(r,s,u,g);return c.forEach(v=>{let{key:k,match:w,controller:j}=v,_=p[k];if(Ce(_,"Did not find corresponding fetcher result"),!(j&&j.signal.aborted))if(Ht(_)){let F=Ii(a.matches,w==null?void 0:w.route.id);m&&m[F.route.id]||(m=Ge({},m,{[F.route.id]:_.error})),a.fetchers.delete(k)}else if(Ei(_))Ce(!1,"Unhandled fetcher revalidation redirect");else if(ni(_))Ce(!1,"Unhandled fetcher deferred data");else{let F=ai(_.data);a.fetchers.set(k,F)}}),{loaderData:f,errors:m}}function Hd(a,r,s,u){let c=Ge({},r);for(let p of s){let g=p.route.id;if(r.hasOwnProperty(g)?r[g]!==void 0&&(c[g]=r[g]):a[g]!==void 0&&p.route.loader&&(c[g]=a[g]),u&&u.hasOwnProperty(g))break}return c}function Bd(a){return a?Ht(a[1])?{actionData:{}}:{actionData:{[a[0]]:a[1].data}}:{}}function Ii(a,r){return(r?a.slice(0,a.findIndex(u=>u.route.id===r)+1):[...a]).reverse().find(u=>u.route.hasErrorBoundary===!0)||a[0]}function Od(a){let r=a.length===1?a[0]:a.find(s=>s.index||!s.path||s.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:r}],route:r}}function Dt(a,r){let{pathname:s,routeId:u,method:c,type:p,message:g}=r===void 0?{}:r,f="Unknown Server Error",m="Unknown @remix-run/router error";return a===400?(f="Bad Request",c&&s&&u?m="You made a "+c+' request to "'+s+'" but '+('did not provide a `loader` for route "'+u+'", ')+"so there is no way to handle the request.":p==="defer-action"?m="defer() is not supported in actions":p==="invalid-body"&&(m="Unable to encode submission body")):a===403?(f="Forbidden",m='Route "'+u+'" does not match URL "'+s+'"'):a===404?(f="Not Found",m='No route matches URL "'+s+'"'):a===405&&(f="Method Not Allowed",c&&s&&u?m="You made a "+c.toUpperCase()+' request to "'+s+'" but '+('did not provide an `action` for route "'+u+'", ')+"so there is no way to handle the request.":c&&(m='Invalid request method "'+c.toUpperCase()+'"')),new Ar(a||500,f,new Error(m),!0)}function wr(a){let r=Object.entries(a);for(let s=r.length-1;s>=0;s--){let[u,c]=r[s];if(Ei(c))return{key:u,result:c}}}function yp(a){let r=typeof a=="string"?jo(a):a;return Di(Ge({},r,{hash:""}))}function Cm(a,r){return a.pathname!==r.pathname||a.search!==r.search?!1:a.hash===""?r.hash!=="":a.hash===r.hash?!0:r.hash!==""}function xm(a){return Sp(a.result)&&cm.has(a.result.status)}function ni(a){return a.type===Oe.deferred}function Ht(a){return a.type===Oe.error}function Ei(a){return(a&&a.type)===Oe.redirect}function Fd(a){return typeof a=="object"&&a!=null&&"type"in a&&"data"in a&&"init"in a&&a.type==="DataWithResponseInit"}function Rm(a){let r=a;return r&&typeof r=="object"&&typeof r.data=="object"&&typeof r.subscribe=="function"&&typeof r.cancel=="function"&&typeof r.resolveData=="function"}function Sp(a){return a!=null&&typeof a.status=="number"&&typeof a.statusText=="string"&&typeof a.headers=="object"&&typeof a.body<"u"}function Tm(a){return um.has(a.toLowerCase())}function to(a){return sm.has(a.toLowerCase())}async function Am(a,r,s,u,c){let p=Object.entries(r);for(let g=0;g<p.length;g++){let[f,m]=p[g],v=a.find(j=>(j==null?void 0:j.route.id)===f);if(!v)continue;let k=u.find(j=>j.route.id===v.route.id),w=k!=null&&!mp(k,v)&&(c&&c[v.route.id])!==void 0;ni(m)&&w&&await Fl(m,s,!1).then(j=>{j&&(r[f]=j)})}}async function Im(a,r,s){for(let u=0;u<s.length;u++){let{key:c,routeId:p,controller:g}=s[u],f=r[c];a.find(v=>(v==null?void 0:v.route.id)===p)&&ni(f)&&(Ce(g,"Expected an AbortController for revalidating fetcher deferred result"),await Fl(f,g.signal,!0).then(v=>{v&&(r[c]=v)}))}}async function Fl(a,r,s){if(s===void 0&&(s=!1),!await a.deferredData.resolveData(r)){if(s)try{return{type:Oe.data,data:a.deferredData.unwrappedData}}catch(c){return{type:Oe.error,error:c}}return{type:Oe.data,data:a.deferredData.data}}}function ql(a){return new URLSearchParams(a).getAll("index").some(r=>r==="")}function on(a,r){let s=typeof r=="string"?jo(r).search:r.search;if(a[a.length-1].route.index&&ql(s||""))return a[a.length-1];let u=pp(a);return u[u.length-1]}function qd(a){let{formMethod:r,formAction:s,formEncType:u,text:c,formData:p,json:g}=a;if(!(!r||!s||!u)){if(c!=null)return{formMethod:r,formAction:s,formEncType:u,formData:void 0,json:void 0,text:c};if(p!=null)return{formMethod:r,formAction:s,formEncType:u,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:r,formAction:s,formEncType:u,formData:void 0,json:g,text:void 0}}}function wl(a,r){return r?{state:"loading",location:a,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}:{state:"loading",location:a,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Em(a,r){return{state:"submitting",location:a,formMethod:r.formMethod,formAction:r.formAction,formEncType:r.formEncType,formData:r.formData,json:r.json,text:r.text}}function en(a,r){return a?{state:"loading",formMethod:a.formMethod,formAction:a.formAction,formEncType:a.formEncType,formData:a.formData,json:a.json,text:a.text,data:r}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:r}}function jm(a,r){return{state:"submitting",formMethod:a.formMethod,formAction:a.formAction,formEncType:a.formEncType,formData:a.formData,json:a.json,text:a.text,data:r?r.data:void 0}}function ai(a){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:a}}function zm(a,r){try{let s=a.sessionStorage.getItem(hp);if(s){let u=JSON.parse(s);for(let[c,p]of Object.entries(u||{}))p&&Array.isArray(p)&&r.set(c,new Set(p||[]))}}catch{}}function Dm(a,r){if(r.size>0){let s={};for(let[u,c]of r)s[u]=[...c];try{a.sessionStorage.setItem(hp,JSON.stringify(s))}catch(u){ri(!1,"Failed to save applied view transitions in sessionStorage ("+u+").")}}}/**
52
52
  * React Router v6.30.3
53
53
  *
54
54
  * Copyright (c) Remix Software Inc.
@@ -57,7 +57,7 @@ Error generating stack: `+l.message+`
57
57
  * LICENSE.md file in the root directory of this source tree.
58
58
  *
59
59
  * @license MIT
60
- */function Tr(){return Tr=Object.assign?Object.assign.bind():function(a){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(a[u]=s[u])}return a},Tr.apply(this,arguments)}const nn=R.createContext(null),ql=R.createContext(null),ri=R.createContext(null),Wl=R.createContext(null),Eo=R.createContext({outlet:null,matches:[],isDataRoute:!1}),vp=R.createContext(null);function Mm(a,r){let{relative:s}=r===void 0?{}:r;rn()||Ce(!1);let{basename:u,navigator:d}=R.useContext(ri),{hash:p,pathname:g,search:m}=Ar(a,{relative:s}),f=g;return u!=="/"&&(f=g==="/"?u:To([u,g])),d.createHref({pathname:f,search:m,hash:p})}function rn(){return R.useContext(Wl)!=null}function Xt(){return rn()||Ce(!1),R.useContext(Wl).location}function bp(a){R.useContext(ri).static||R.useLayoutEffect(a)}function wp(){let{isDataRoute:a}=R.useContext(Eo);return a?Gm():_m()}function _m(){rn()||Ce(!1);let a=R.useContext(nn),{basename:r,future:s,navigator:u}=R.useContext(ri),{matches:d}=R.useContext(Eo),{pathname:p}=Xt(),g=JSON.stringify(Ul(d,s.v7_relativeSplatPath)),m=R.useRef(!1);return bp(()=>{m.current=!0}),R.useCallback(function(y,P){if(P===void 0&&(P={}),!m.current)return;if(typeof y=="number"){u.go(y);return}let C=Hl(y,JSON.parse(g),p,P.relative==="path");a==null&&r!=="/"&&(C.pathname=C.pathname==="/"?r:To([r,C.pathname])),(P.replace?u.replace:u.push)(C,P.state,P)},[r,u,g,p,a])}const Lm=R.createContext(null);function Nm(a){let r=R.useContext(Eo).outlet;return r&&R.createElement(Lm.Provider,{value:a},r)}function _v(){let{matches:a}=R.useContext(Eo),r=a[a.length-1];return r?r.params:{}}function Ar(a,r){let{relative:s}=r===void 0?{}:r,{future:u}=R.useContext(ri),{matches:d}=R.useContext(Eo),{pathname:p}=Xt(),g=JSON.stringify(Ul(d,u.v7_relativeSplatPath));return R.useMemo(()=>Hl(a,JSON.parse(g),p,s==="path"),[a,g,p,s])}function Um(a,r,s,u){rn()||Ce(!1);let{navigator:d}=R.useContext(ri),{matches:p}=R.useContext(Eo),g=p[p.length-1],m=g?g.params:{};g&&g.pathname;let f=g?g.pathnameBase:"/";g&&g.route;let y=Xt(),P;P=y;let C=P.pathname||"/",j=C;if(f!=="/"){let N=f.replace(/^\//,"").split("/");j="/"+C.replace(/^\//,"").split("/").slice(N.length).join("/")}let _=Ri(a,{pathname:j});return qm(_&&_.map(N=>Object.assign({},N,{params:Object.assign({},m,N.params),pathname:To([f,d.encodeLocation?d.encodeLocation(N.pathname).pathname:N.pathname]),pathnameBase:N.pathnameBase==="/"?f:To([f,d.encodeLocation?d.encodeLocation(N.pathnameBase).pathname:N.pathnameBase])})),p,s,u)}function Hm(){let a=Km(),r=an(a)?a.status+" "+a.statusText:a instanceof Error?a.message:JSON.stringify(a),s=a instanceof Error?a.stack:null,d={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return R.createElement(R.Fragment,null,R.createElement("h2",null,"Unexpected Application Error!"),R.createElement("h3",{style:{fontStyle:"italic"}},r),s?R.createElement("pre",{style:d},s):null,null)}const Bm=R.createElement(Hm,null);class Om extends R.Component{constructor(r){super(r),this.state={location:r.location,revalidation:r.revalidation,error:r.error}}static getDerivedStateFromError(r){return{error:r}}static getDerivedStateFromProps(r,s){return s.location!==r.location||s.revalidation!=="idle"&&r.revalidation==="idle"?{error:r.error,location:r.location,revalidation:r.revalidation}:{error:r.error!==void 0?r.error:s.error,location:s.location,revalidation:r.revalidation||s.revalidation}}componentDidCatch(r,s){console.error("React Router caught the following error during render",r,s)}render(){return this.state.error!==void 0?R.createElement(Eo.Provider,{value:this.props.routeContext},R.createElement(vp.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Fm(a){let{routeContext:r,match:s,children:u}=a,d=R.useContext(nn);return d&&d.static&&d.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(d.staticContext._deepestRenderedBoundaryId=s.route.id),R.createElement(Eo.Provider,{value:r},u)}function qm(a,r,s,u){var d;if(r===void 0&&(r=[]),s===void 0&&(s=null),u===void 0&&(u=null),a==null){var p;if(!s)return null;if(s.errors)a=s.matches;else if((p=u)!=null&&p.v7_partialHydration&&r.length===0&&!s.initialized&&s.matches.length>0)a=s.matches;else return null}let g=a,m=(d=s)==null?void 0:d.errors;if(m!=null){let P=g.findIndex(C=>C.route.id&&(m==null?void 0:m[C.route.id])!==void 0);P>=0||Ce(!1),g=g.slice(0,Math.min(g.length,P+1))}let f=!1,y=-1;if(s&&u&&u.v7_partialHydration)for(let P=0;P<g.length;P++){let C=g[P];if((C.route.HydrateFallback||C.route.hydrateFallbackElement)&&(y=P),C.route.id){let{loaderData:j,errors:_}=s,F=C.route.loader&&j[C.route.id]===void 0&&(!_||_[C.route.id]===void 0);if(C.route.lazy||F){f=!0,y>=0?g=g.slice(0,y+1):g=[g[0]];break}}}return g.reduceRight((P,C,j)=>{let _,F=!1,N=null,H=null;s&&(_=m&&C.route.id?m[C.route.id]:void 0,N=C.route.errorElement||Bm,f&&(y<0&&j===0?($m("route-fallback"),F=!0,H=null):y===j&&(F=!0,H=C.route.hydrateFallbackElement||null)));let re=r.concat(g.slice(0,j+1)),W=()=>{let J;return _?J=N:F?J=H:C.route.Component?J=R.createElement(C.route.Component,null):C.route.element?J=C.route.element:J=P,R.createElement(Fm,{match:C,routeContext:{outlet:P,matches:re,isDataRoute:s!=null},children:J})};return s&&(C.route.ErrorBoundary||C.route.errorElement||j===0)?R.createElement(Om,{location:s.location,revalidation:s.revalidation,component:N,error:_,children:W(),routeContext:{outlet:null,matches:re,isDataRoute:!0}}):W()},null)}var kp=(function(a){return a.UseBlocker="useBlocker",a.UseRevalidator="useRevalidator",a.UseNavigateStable="useNavigate",a})(kp||{}),Pp=(function(a){return a.UseBlocker="useBlocker",a.UseLoaderData="useLoaderData",a.UseActionData="useActionData",a.UseRouteError="useRouteError",a.UseNavigation="useNavigation",a.UseRouteLoaderData="useRouteLoaderData",a.UseMatches="useMatches",a.UseRevalidator="useRevalidator",a.UseNavigateStable="useNavigate",a.UseRouteId="useRouteId",a})(Pp||{});function Wm(a){let r=R.useContext(nn);return r||Ce(!1),r}function Vm(a){let r=R.useContext(ql);return r||Ce(!1),r}function Ym(a){let r=R.useContext(Eo);return r||Ce(!1),r}function Cp(a){let r=Ym(),s=r.matches[r.matches.length-1];return s.route.id||Ce(!1),s.route.id}function Km(){var a;let r=R.useContext(vp),s=Vm(),u=Cp();return r!==void 0?r:(a=s.errors)==null?void 0:a[u]}function Gm(){let{router:a}=Wm(kp.UseNavigateStable),r=Cp(Pp.UseNavigateStable),s=R.useRef(!1);return bp(()=>{s.current=!0}),R.useCallback(function(d,p){p===void 0&&(p={}),s.current&&(typeof d=="number"?a.navigate(d):a.navigate(d,Tr({fromRouteId:r},p)))},[a,r])}const Wd={};function $m(a,r,s){Wd[a]||(Wd[a]=!0)}function Qm(a,r){a==null||a.v7_startTransition,(a==null?void 0:a.v7_relativeSplatPath)===void 0&&(!r||r.v7_relativeSplatPath),r&&(r.v7_fetcherPersist,r.v7_normalizeFormMethod,r.v7_partialHydration,r.v7_skipActionErrorRevalidation)}function Zm(a){return Nm(a.context)}function Jm(a){let{basename:r="/",children:s=null,location:u,navigationType:d=rt.Pop,navigator:p,static:g=!1,future:m}=a;rn()&&Ce(!1);let f=r.replace(/^\/*/,"/"),y=R.useMemo(()=>({basename:f,navigator:p,static:g,future:Tr({v7_relativeSplatPath:!1},m)}),[f,m,p,g]);typeof u=="string"&&(u=Io(u));let{pathname:P="/",search:C="",hash:j="",state:_=null,key:F="default"}=u,N=R.useMemo(()=>{let H=Ao(P,f);return H==null?null:{location:{pathname:H,search:C,hash:j,state:_,key:F},navigationType:d}},[f,P,C,j,_,F,d]);return N==null?null:R.createElement(ri.Provider,{value:y},R.createElement(Wl.Provider,{children:s,value:N}))}new Promise(()=>{});function Xm(a){let r={hasErrorBoundary:a.ErrorBoundary!=null||a.errorElement!=null};return a.Component&&Object.assign(r,{element:R.createElement(a.Component),Component:void 0}),a.HydrateFallback&&Object.assign(r,{hydrateFallbackElement:R.createElement(a.HydrateFallback),HydrateFallback:void 0}),a.ErrorBoundary&&Object.assign(r,{errorElement:R.createElement(a.ErrorBoundary),ErrorBoundary:void 0}),r}/**
60
+ */function Ir(){return Ir=Object.assign?Object.assign.bind():function(a){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(a[u]=s[u])}return a},Ir.apply(this,arguments)}const rn=R.createContext(null),Wl=R.createContext(null),si=R.createContext(null),Vl=R.createContext(null),zo=R.createContext({outlet:null,matches:[],isDataRoute:!1}),vp=R.createContext(null);function Mm(a,r){let{relative:s}=r===void 0?{}:r;sn()||Ce(!1);let{basename:u,navigator:c}=R.useContext(si),{hash:p,pathname:g,search:f}=Er(a,{relative:s}),m=g;return u!=="/"&&(m=g==="/"?u:Io([u,g])),c.createHref({pathname:m,search:f,hash:p})}function sn(){return R.useContext(Vl)!=null}function oo(){return sn()||Ce(!1),R.useContext(Vl).location}function bp(a){R.useContext(si).static||R.useLayoutEffect(a)}function wp(){let{isDataRoute:a}=R.useContext(zo);return a?Gm():_m()}function _m(){sn()||Ce(!1);let a=R.useContext(rn),{basename:r,future:s,navigator:u}=R.useContext(si),{matches:c}=R.useContext(zo),{pathname:p}=oo(),g=JSON.stringify(Hl(c,s.v7_relativeSplatPath)),f=R.useRef(!1);return bp(()=>{f.current=!0}),R.useCallback(function(v,k){if(k===void 0&&(k={}),!f.current)return;if(typeof v=="number"){u.go(v);return}let w=Bl(v,JSON.parse(g),p,k.relative==="path");a==null&&r!=="/"&&(w.pathname=w.pathname==="/"?r:Io([r,w.pathname])),(k.replace?u.replace:u.push)(w,k.state,k)},[r,u,g,p,a])}const Um=R.createContext(null);function Lm(a){let r=R.useContext(zo).outlet;return r&&R.createElement(Um.Provider,{value:a},r)}function qv(){let{matches:a}=R.useContext(zo),r=a[a.length-1];return r?r.params:{}}function Er(a,r){let{relative:s}=r===void 0?{}:r,{future:u}=R.useContext(si),{matches:c}=R.useContext(zo),{pathname:p}=oo(),g=JSON.stringify(Hl(c,u.v7_relativeSplatPath));return R.useMemo(()=>Bl(a,JSON.parse(g),p,s==="path"),[a,g,p,s])}function Nm(a,r,s,u){sn()||Ce(!1);let{navigator:c}=R.useContext(si),{matches:p}=R.useContext(zo),g=p[p.length-1],f=g?g.params:{};g&&g.pathname;let m=g?g.pathnameBase:"/";g&&g.route;let v=oo(),k;k=v;let w=k.pathname||"/",j=w;if(m!=="/"){let L=m.replace(/^\//,"").split("/");j="/"+w.replace(/^\//,"").split("/").slice(L.length).join("/")}let _=Ai(a,{pathname:j});return qm(_&&_.map(L=>Object.assign({},L,{params:Object.assign({},f,L.params),pathname:Io([m,c.encodeLocation?c.encodeLocation(L.pathname).pathname:L.pathname]),pathnameBase:L.pathnameBase==="/"?m:Io([m,c.encodeLocation?c.encodeLocation(L.pathnameBase).pathname:L.pathnameBase])})),p,s,u)}function Hm(){let a=Km(),r=nn(a)?a.status+" "+a.statusText:a instanceof Error?a.message:JSON.stringify(a),s=a instanceof Error?a.stack:null,c={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return R.createElement(R.Fragment,null,R.createElement("h2",null,"Unexpected Application Error!"),R.createElement("h3",{style:{fontStyle:"italic"}},r),s?R.createElement("pre",{style:c},s):null,null)}const Bm=R.createElement(Hm,null);class Om extends R.Component{constructor(r){super(r),this.state={location:r.location,revalidation:r.revalidation,error:r.error}}static getDerivedStateFromError(r){return{error:r}}static getDerivedStateFromProps(r,s){return s.location!==r.location||s.revalidation!=="idle"&&r.revalidation==="idle"?{error:r.error,location:r.location,revalidation:r.revalidation}:{error:r.error!==void 0?r.error:s.error,location:s.location,revalidation:r.revalidation||s.revalidation}}componentDidCatch(r,s){console.error("React Router caught the following error during render",r,s)}render(){return this.state.error!==void 0?R.createElement(zo.Provider,{value:this.props.routeContext},R.createElement(vp.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Fm(a){let{routeContext:r,match:s,children:u}=a,c=R.useContext(rn);return c&&c.static&&c.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(c.staticContext._deepestRenderedBoundaryId=s.route.id),R.createElement(zo.Provider,{value:r},u)}function qm(a,r,s,u){var c;if(r===void 0&&(r=[]),s===void 0&&(s=null),u===void 0&&(u=null),a==null){var p;if(!s)return null;if(s.errors)a=s.matches;else if((p=u)!=null&&p.v7_partialHydration&&r.length===0&&!s.initialized&&s.matches.length>0)a=s.matches;else return null}let g=a,f=(c=s)==null?void 0:c.errors;if(f!=null){let k=g.findIndex(w=>w.route.id&&(f==null?void 0:f[w.route.id])!==void 0);k>=0||Ce(!1),g=g.slice(0,Math.min(g.length,k+1))}let m=!1,v=-1;if(s&&u&&u.v7_partialHydration)for(let k=0;k<g.length;k++){let w=g[k];if((w.route.HydrateFallback||w.route.hydrateFallbackElement)&&(v=k),w.route.id){let{loaderData:j,errors:_}=s,F=w.route.loader&&j[w.route.id]===void 0&&(!_||_[w.route.id]===void 0);if(w.route.lazy||F){m=!0,v>=0?g=g.slice(0,v+1):g=[g[0]];break}}}return g.reduceRight((k,w,j)=>{let _,F=!1,L=null,H=null;s&&(_=f&&w.route.id?f[w.route.id]:void 0,L=w.route.errorElement||Bm,m&&(v<0&&j===0?($m("route-fallback"),F=!0,H=null):v===j&&(F=!0,H=w.route.hydrateFallbackElement||null)));let re=r.concat(g.slice(0,j+1)),W=()=>{let Z;return _?Z=L:F?Z=H:w.route.Component?Z=R.createElement(w.route.Component,null):w.route.element?Z=w.route.element:Z=k,R.createElement(Fm,{match:w,routeContext:{outlet:k,matches:re,isDataRoute:s!=null},children:Z})};return s&&(w.route.ErrorBoundary||w.route.errorElement||j===0)?R.createElement(Om,{location:s.location,revalidation:s.revalidation,component:L,error:_,children:W(),routeContext:{outlet:null,matches:re,isDataRoute:!0}}):W()},null)}var kp=(function(a){return a.UseBlocker="useBlocker",a.UseRevalidator="useRevalidator",a.UseNavigateStable="useNavigate",a})(kp||{}),Pp=(function(a){return a.UseBlocker="useBlocker",a.UseLoaderData="useLoaderData",a.UseActionData="useActionData",a.UseRouteError="useRouteError",a.UseNavigation="useNavigation",a.UseRouteLoaderData="useRouteLoaderData",a.UseMatches="useMatches",a.UseRevalidator="useRevalidator",a.UseNavigateStable="useNavigate",a.UseRouteId="useRouteId",a})(Pp||{});function Wm(a){let r=R.useContext(rn);return r||Ce(!1),r}function Vm(a){let r=R.useContext(Wl);return r||Ce(!1),r}function Ym(a){let r=R.useContext(zo);return r||Ce(!1),r}function Cp(a){let r=Ym(),s=r.matches[r.matches.length-1];return s.route.id||Ce(!1),s.route.id}function Km(){var a;let r=R.useContext(vp),s=Vm(),u=Cp();return r!==void 0?r:(a=s.errors)==null?void 0:a[u]}function Gm(){let{router:a}=Wm(kp.UseNavigateStable),r=Cp(Pp.UseNavigateStable),s=R.useRef(!1);return bp(()=>{s.current=!0}),R.useCallback(function(c,p){p===void 0&&(p={}),s.current&&(typeof c=="number"?a.navigate(c):a.navigate(c,Ir({fromRouteId:r},p)))},[a,r])}const Wd={};function $m(a,r,s){Wd[a]||(Wd[a]=!0)}function Qm(a,r){a==null||a.v7_startTransition,(a==null?void 0:a.v7_relativeSplatPath)===void 0&&(!r||r.v7_relativeSplatPath),r&&(r.v7_fetcherPersist,r.v7_normalizeFormMethod,r.v7_partialHydration,r.v7_skipActionErrorRevalidation)}function Jm(a){return Lm(a.context)}function Zm(a){let{basename:r="/",children:s=null,location:u,navigationType:c=rt.Pop,navigator:p,static:g=!1,future:f}=a;sn()&&Ce(!1);let m=r.replace(/^\/*/,"/"),v=R.useMemo(()=>({basename:m,navigator:p,static:g,future:Ir({v7_relativeSplatPath:!1},f)}),[m,f,p,g]);typeof u=="string"&&(u=jo(u));let{pathname:k="/",search:w="",hash:j="",state:_=null,key:F="default"}=u,L=R.useMemo(()=>{let H=Eo(k,m);return H==null?null:{location:{pathname:H,search:w,hash:j,state:_,key:F},navigationType:c}},[m,k,w,j,_,F,c]);return L==null?null:R.createElement(si.Provider,{value:v},R.createElement(Vl.Provider,{children:s,value:L}))}new Promise(()=>{});function Xm(a){let r={hasErrorBoundary:a.ErrorBoundary!=null||a.errorElement!=null};return a.Component&&Object.assign(r,{element:R.createElement(a.Component),Component:void 0}),a.HydrateFallback&&Object.assign(r,{hydrateFallbackElement:R.createElement(a.HydrateFallback),HydrateFallback:void 0}),a.ErrorBoundary&&Object.assign(r,{errorElement:R.createElement(a.ErrorBoundary),ErrorBoundary:void 0}),r}/**
61
61
  * React Router DOM v6.30.3
62
62
  *
63
63
  * Copyright (c) Remix Software Inc.
@@ -66,7 +66,7 @@ Error generating stack: `+l.message+`
66
66
  * LICENSE.md file in the root directory of this source tree.
67
67
  *
68
68
  * @license MIT
69
- */function la(){return la=Object.assign?Object.assign.bind():function(a){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(a[u]=s[u])}return a},la.apply(this,arguments)}function xp(a,r){if(a==null)return{};var s={},u=Object.keys(a),d,p;for(p=0;p<u.length;p++)d=u[p],!(r.indexOf(d)>=0)&&(s[d]=a[d]);return s}function ef(a){return!!(a.metaKey||a.altKey||a.ctrlKey||a.shiftKey)}function tf(a,r){return a.button===0&&(!r||r==="_self")&&!ef(a)}function zl(a){return a===void 0&&(a=""),new URLSearchParams(typeof a=="string"||Array.isArray(a)||a instanceof URLSearchParams?a:Object.keys(a).reduce((r,s)=>{let u=a[s];return r.concat(Array.isArray(u)?u.map(d=>[s,d]):[[s,u]])},[]))}function of(a,r){let s=zl(a);return r&&r.forEach((u,d)=>{s.has(d)||r.getAll(d).forEach(p=>{s.append(d,p)})}),s}const af=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],nf=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],rf="6";try{window.__reactRouterVersion=rf}catch{}function sf(a,r){return hm({basename:void 0,future:la({},void 0,{v7_prependBasename:!0}),history:Nh({window:void 0}),hydrationData:lf(),routes:a,mapRouteProperties:Xm,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function lf(){var a;let r=(a=window)==null?void 0:a.__staticRouterHydrationData;return r&&r.errors&&(r=la({},r,{errors:uf(r.errors)})),r}function uf(a){if(!a)return null;let r=Object.entries(a),s={};for(let[u,d]of r)if(d&&d.__type==="RouteErrorResponse")s[u]=new Rr(d.status,d.statusText,d.data,d.internal===!0);else if(d&&d.__type==="Error"){if(d.__subType){let p=window[d.__subType];if(typeof p=="function")try{let g=new p(d.message);g.stack="",s[u]=g}catch{}}if(s[u]==null){let p=new Error(d.message);p.stack="",s[u]=p}}else s[u]=d;return s}const Rp=R.createContext({isTransitioning:!1}),cf=R.createContext(new Map),df="startTransition",Vd=Mh[df],pf="flushSync",Yd=Lh[pf];function gf(a){Vd?Vd(a):a()}function en(a){Yd?Yd(a):a()}class hf{constructor(){this.status="pending",this.promise=new Promise((r,s)=>{this.resolve=u=>{this.status==="pending"&&(this.status="resolved",r(u))},this.reject=u=>{this.status==="pending"&&(this.status="rejected",s(u))}})}}function mf(a){let{fallbackElement:r,router:s,future:u}=a,[d,p]=R.useState(s.state),[g,m]=R.useState(),[f,y]=R.useState({isTransitioning:!1}),[P,C]=R.useState(),[j,_]=R.useState(),[F,N]=R.useState(),H=R.useRef(new Map),{v7_startTransition:re}=u||{},W=R.useCallback(K=>{re?gf(K):K()},[re]),J=R.useCallback((K,be)=>{let{deletedFetchers:le,flushSync:ke,viewTransitionOpts:we}=be;K.fetchers.forEach((Fe,Qe)=>{Fe.data!==void 0&&H.current.set(Qe,Fe.data)}),le.forEach(Fe=>H.current.delete(Fe));let _e=s.window==null||s.window.document==null||typeof s.window.document.startViewTransition!="function";if(!we||_e){ke?en(()=>p(K)):W(()=>p(K));return}if(ke){en(()=>{j&&(P&&P.resolve(),j.skipTransition()),y({isTransitioning:!0,flushSync:!0,currentLocation:we.currentLocation,nextLocation:we.nextLocation})});let Fe=s.window.document.startViewTransition(()=>{en(()=>p(K))});Fe.finished.finally(()=>{en(()=>{C(void 0),_(void 0),m(void 0),y({isTransitioning:!1})})}),en(()=>_(Fe));return}j?(P&&P.resolve(),j.skipTransition(),N({state:K,currentLocation:we.currentLocation,nextLocation:we.nextLocation})):(m(K),y({isTransitioning:!0,flushSync:!1,currentLocation:we.currentLocation,nextLocation:we.nextLocation}))},[s.window,j,P,H,W]);R.useLayoutEffect(()=>s.subscribe(J),[s,J]),R.useEffect(()=>{f.isTransitioning&&!f.flushSync&&C(new hf)},[f]),R.useEffect(()=>{if(P&&g&&s.window){let K=g,be=P.promise,le=s.window.document.startViewTransition(async()=>{W(()=>p(K)),await be});le.finished.finally(()=>{C(void 0),_(void 0),m(void 0),y({isTransitioning:!1})}),_(le)}},[W,g,P,s.window]),R.useEffect(()=>{P&&g&&d.location.key===g.location.key&&P.resolve()},[P,j,d.location,g]),R.useEffect(()=>{!f.isTransitioning&&F&&(m(F.state),y({isTransitioning:!0,flushSync:!1,currentLocation:F.currentLocation,nextLocation:F.nextLocation}),N(void 0))},[f.isTransitioning,F]),R.useEffect(()=>{},[]);let te=R.useMemo(()=>({createHref:s.createHref,encodeLocation:s.encodeLocation,go:K=>s.navigate(K),push:(K,be,le)=>s.navigate(K,{state:be,preventScrollReset:le==null?void 0:le.preventScrollReset}),replace:(K,be,le)=>s.navigate(K,{replace:!0,state:be,preventScrollReset:le==null?void 0:le.preventScrollReset})}),[s]),Se=s.basename||"/",Ae=R.useMemo(()=>({router:s,navigator:te,static:!1,basename:Se}),[s,te,Se]),A=R.useMemo(()=>({v7_relativeSplatPath:s.future.v7_relativeSplatPath}),[s.future.v7_relativeSplatPath]);return R.useEffect(()=>Qm(u,s.future),[u,s.future]),R.createElement(R.Fragment,null,R.createElement(nn.Provider,{value:Ae},R.createElement(ql.Provider,{value:d},R.createElement(cf.Provider,{value:H.current},R.createElement(Rp.Provider,{value:f},R.createElement(Jm,{basename:Se,location:d.location,navigationType:d.historyAction,navigator:te,future:A},d.initialized||s.future.v7_partialHydration?R.createElement(ff,{routes:s.routes,future:s.future,state:d}):r))))),null)}const ff=R.memo(yf);function yf(a){let{routes:r,future:s,state:u}=a;return Um(r,void 0,u,s)}const Sf=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",vf=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Vl=R.forwardRef(function(r,s){let{onClick:u,relative:d,reloadDocument:p,replace:g,state:m,target:f,to:y,preventScrollReset:P,viewTransition:C}=r,j=xp(r,af),{basename:_}=R.useContext(ri),F,N=!1;if(typeof y=="string"&&vf.test(y)&&(F=y,Sf))try{let J=new URL(window.location.href),te=y.startsWith("//")?new URL(J.protocol+y):new URL(y),Se=Ao(te.pathname,_);te.origin===J.origin&&Se!=null?y=Se+te.search+te.hash:N=!0}catch{}let H=Mm(y,{relative:d}),re=kf(y,{replace:g,state:m,target:f,preventScrollReset:P,relative:d,viewTransition:C});function W(J){u&&u(J),J.defaultPrevented||re(J)}return R.createElement("a",la({},j,{href:F||H,onClick:N||p?u:W,ref:s,target:f}))}),bf=R.forwardRef(function(r,s){let{"aria-current":u="page",caseSensitive:d=!1,className:p="",end:g=!1,style:m,to:f,viewTransition:y,children:P}=r,C=xp(r,nf),j=Ar(f,{relative:C.relative}),_=Xt(),F=R.useContext(ql),{navigator:N,basename:H}=R.useContext(ri),re=F!=null&&Pf(j)&&y===!0,W=N.encodeLocation?N.encodeLocation(j).pathname:j.pathname,J=_.pathname,te=F&&F.navigation&&F.navigation.location?F.navigation.location.pathname:null;d||(J=J.toLowerCase(),te=te?te.toLowerCase():null,W=W.toLowerCase()),te&&H&&(te=Ao(te,H)||te);const Se=W!=="/"&&W.endsWith("/")?W.length-1:W.length;let Ae=J===W||!g&&J.startsWith(W)&&J.charAt(Se)==="/",A=te!=null&&(te===W||!g&&te.startsWith(W)&&te.charAt(W.length)==="/"),K={isActive:Ae,isPending:A,isTransitioning:re},be=Ae?u:void 0,le;typeof p=="function"?le=p(K):le=[p,Ae?"active":null,A?"pending":null,re?"transitioning":null].filter(Boolean).join(" ");let ke=typeof m=="function"?m(K):m;return R.createElement(Vl,la({},C,{"aria-current":be,className:le,ref:s,style:ke,to:f,viewTransition:y}),typeof P=="function"?P(K):P)});var Dl;(function(a){a.UseScrollRestoration="useScrollRestoration",a.UseSubmit="useSubmit",a.UseSubmitFetcher="useSubmitFetcher",a.UseFetcher="useFetcher",a.useViewTransitionState="useViewTransitionState"})(Dl||(Dl={}));var Kd;(function(a){a.UseFetcher="useFetcher",a.UseFetchers="useFetchers",a.UseScrollRestoration="useScrollRestoration"})(Kd||(Kd={}));function wf(a){let r=R.useContext(nn);return r||Ce(!1),r}function kf(a,r){let{target:s,replace:u,state:d,preventScrollReset:p,relative:g,viewTransition:m}=r===void 0?{}:r,f=wp(),y=Xt(),P=Ar(a,{relative:g});return R.useCallback(C=>{if(tf(C,s)){C.preventDefault();let j=u!==void 0?u:ji(y)===ji(P);f(a,{replace:j,state:d,preventScrollReset:p,relative:g,viewTransition:m})}},[y,f,P,u,d,s,a,p,g,m])}function Lv(a){let r=R.useRef(zl(a)),s=R.useRef(!1),u=Xt(),d=R.useMemo(()=>of(u.search,s.current?null:r.current),[u.search]),p=wp(),g=R.useCallback((m,f)=>{const y=zl(typeof m=="function"?m(d):m);s.current=!0,p("?"+y,f)},[p,d]);return[d,g]}function Pf(a,r){r===void 0&&(r={});let s=R.useContext(Rp);s==null&&Ce(!1);let{basename:u}=wf(Dl.useViewTransitionState),d=Ar(a,{relative:r.relative});if(!s.isTransitioning)return!1;let p=Ao(s.currentLocation.pathname,u)||s.currentLocation.pathname,g=Ao(s.nextLocation.pathname,u)||s.nextLocation.pathname;return xr(d.pathname,g)!=null||xr(d.pathname,p)!=null}const Cf="modulepreload",xf=function(a){return"/dashboard/"+a},Gd={},go=function(r,s,u){let d=Promise.resolve();if(s&&s.length>0){let g=function(y){return Promise.all(y.map(P=>Promise.resolve(P).then(C=>({status:"fulfilled",value:C}),C=>({status:"rejected",reason:C}))))};document.getElementsByTagName("link");const m=document.querySelector("meta[property=csp-nonce]"),f=(m==null?void 0:m.nonce)||(m==null?void 0:m.getAttribute("nonce"));d=g(s.map(y=>{if(y=xf(y),y in Gd)return;Gd[y]=!0;const P=y.endsWith(".css"),C=P?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${y}"]${C}`))return;const j=document.createElement("link");if(j.rel=P?"stylesheet":Cf,P||(j.as="script"),j.crossOrigin="",j.href=y,f&&j.setAttribute("nonce",f),document.head.appendChild(j),P)return new Promise((_,F)=>{j.addEventListener("load",_),j.addEventListener("error",()=>F(new Error(`Unable to preload CSS for ${y}`)))})}))}function p(g){const m=new Event("vite:preloadError",{cancelable:!0});if(m.payload=g,window.dispatchEvent(m),!m.defaultPrevented)throw g}return d.then(g=>{for(const m of g||[])m.status==="rejected"&&p(m.reason);return r().catch(p)})},Ir=window.location.origin,Rf=3e3,Tf=5e3;class Af extends Error{constructor(s,u,d=null,p=null){super(u);xo(this,"status");xo(this,"error");xo(this,"payload");this.name="ApiClientError",this.status=s,this.error=d,this.payload=p}}function If(a){var s,u;const r=(u=(s=a.headers)==null?void 0:s.get)==null?void 0:u.call(s,"content-type");return typeof r=="string"&&r.toLowerCase().includes("application/json")}async function Ef(a){if(!If(a))return null;try{const r=await a.json();if(r&&typeof r=="object")return r}catch{return null}return null}async function wl(a){if(a.ok)return;const r=await Ef(a),s=typeof(r==null?void 0:r.message)=="string"&&r.message.trim().length>0?r.message:`API ${a.status}: ${a.statusText}`,u=typeof(r==null?void 0:r.error)=="string"?r.error:null;throw new Af(a.status,s,u,r)}class jf{constructor(r){xo(this,"base");this.base=r}async get(r,s){const u=new URL(r,this.base);s&&Object.entries(s).forEach(([p,g])=>u.searchParams.set(p,g));const d=await fetch(u.toString(),{method:"GET"});return await wl(d),d.json()}async patch(r,s){const u=new URL(r,this.base),d=await fetch(u.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return await wl(d),d.json()}async post(r,s){const u=new URL(r,this.base),d=await fetch(u.toString(),{method:"POST",headers:s?{"Content-Type":"application/json"}:{},body:s?JSON.stringify(s):void 0});return await wl(d),d.json()}}const eo=new jf(Ir);function zf(a){return a.pluginClients&&a.pluginClients.length>0?"studioConnected":(a.connectedClients===0||!a.pluginClients,"serverOnly")}const Tp=R.createContext(null);function Df({children:a}){const[r,s]=R.useState("disconnected"),[u,d]=R.useState(null),[p,g]=R.useState(null),m=R.useRef(null);return R.useEffect(()=>{let f=!1;async function y(){try{const P=await eo.get("/status");if(f)return;d(P),s(zf(P)),g(null)}catch(P){if(f)return;s("disconnected"),g(P instanceof Error?P.message:String(P))}}return y(),m.current=setInterval(y,Tf),()=>{f=!0,m.current&&clearInterval(m.current)}},[]),z.jsx(Tp.Provider,{value:{level:r,status:u,error:p},children:a})}function Er(){const a=R.useContext(Tp);if(!a)throw new Error("useConnection must be used within a ConnectionProvider");return a}const Mf={"sidebar.overview":"Overview","sidebar.changelog":"Changelog","sidebar.connection":"Connection","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Settings","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP server connection required","sidebar.gate.l2":"Roblox Studio plugin connection required","header.currentProject":"Current Project","header.unknownProject":"Unknown project","header.projectRoot.label":"Project Root","header.currentProject.loading":"Loading project root...","header.currentProject.unavailable":"Project root unavailable","header.placeNotConnected":"Place not connected","header.currentProject.tooltip":"Currently selected project folder","header.currentProject.loading.tooltip":"Project root information is still loading","header.currentProject.unavailable.tooltip":"Current project root information is unavailable","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Loading sync root...","header.currentProjectSyncRoot.unavailable":"Sync root unavailable","header.currentProjectSyncRoot.tooltip":"Current sync root folder for the selected project","header.currentProjectSyncRoot.loading.tooltip":"Sync root information is still loading","header.currentProjectSyncRoot.unavailable.tooltip":"Current sync root information is unavailable","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Test files unavailable","header.testFiles.tooltip":"Current playtest files directory for the selected place","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Plugin connection required","header.places.liveRequired":"Plugin connection required for live active place","header.place.tooltip":"Connected Roblox place","header.placeNotConnected.tooltip":"Place not connected","header.changeProjectRoot":"Change Project Root","header.changeProjectRoot.ariaLabel":"Change project root","header.changeProjectRoot.tooltip":"Change the current project root","header.changeProjectRoot.disabledTooltip.l0":"MCP server connection required before project root can be changed","header.changeProjectRoot.disabledTooltip.loading":"Project root information is still loading","header.changeProjectRoot.disabledTooltip.unavailable":"Current project root information is unavailable","header.projectRootModal.initial.title":"Change project root","header.projectRootModal.initial.body.connected":"After you choose a project folder, MCP will switch to the new project root and the current Studio contents will be fully resynced into the new <selected project folder>/weppy-project-sync target.","header.projectRootModal.initial.body.disconnected":"After you choose a project folder, MCP will switch to the new project root and use <selected project folder>/weppy-project-sync as the next sync target.","header.projectRootModal.initial.nextSyncRoot":"New sync target after selection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Current sync stops immediately.","header.projectRootModal.initial.warningFreshSync":"The current Studio contents will be used to build a fresh full sync in the new target.","header.projectRootModal.initial.warningNoMove":"Old sync folders are not moved automatically.","header.projectRootModal.initial.warningDeferredSync":"If Studio is not connected, full resync starts the next time the plugin connects.","header.projectRootModal.confirm.title":"Confirm new project root","header.projectRootModal.confirm.body":"Review the selected project folder before applying.","header.projectRootModal.confirm.projectRoot":"Selected project folder","header.projectRootModal.confirm.syncRoot":"New sync target","header.projectRootModal.confirm.warningNoMove":"Existing sync folders are not moved automatically.","header.projectRootModal.pick":"Choose folder","header.projectRootModal.apply":"Apply change","header.projectRootModal.cancel":"Cancel","header.projectRootModal.error":"Failed to change project root","status.online":"Online","status.offline":"Offline","status.idle":"Idle","status.syncing":"Syncing","status.error":"Error","status.initializing":"Initializing","level.l0.title":"Server disconnected","level.l0.message":"WEPPY Dashboard opened but MCP server has stopped or is not responding.","level.l1.title":"Server connected","level.l1.hint":"Check: Is Roblox Studio running? Is the plugin installed?","level.l2.ok":"Studio connected","tier.basic":"Basic","tier.basic.tooltip":"Basic tier with the standard WEPPY Dashboard feature set.","tier.pro":"Pro","tier.pro.tooltip":"Pro tier with the full WEPPY Dashboard feature set.","tier.mixed":"Mixed","tier.upgrade":"Upgrade to Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Save AI tokens with Pro!","tier.comparison.comingSoon":"Basic vs Pro comparison — coming soon","tier.comparison.close":"Close","tier.comparison.detailTitle":"Detailed Tool Catalog","tier.comparison.description":"Description","tier.comparison.basic.core":"Core MCP workflow","tier.comparison.basic.core.item1":"Script create/edit","tier.comparison.basic.core.item2":"Instance management","tier.comparison.basic.core.item3":"Property control","tier.comparison.basic.core.item4":"Selection and search","tier.comparison.basic.core.item5":"Tag management","tier.comparison.basic.core.item6":"Camera control","tier.comparison.basic.core.item7":"Log monitoring","tier.comparison.basic.sync":"Sync (Basic)","tier.comparison.basic.sync.item1":"Studio to Local one-way sync","tier.comparison.basic.sync.item2":"Manual apply as default","tier.comparison.pro.all":"Everything in Basic, plus","tier.comparison.pro.sync":"Advanced Sync workflow","tier.comparison.pro.sync.item1":"Per-type sync direction","tier.comparison.pro.sync.item2":"Per-type apply mode","tier.comparison.pro.sync.item3":"Bidirectional and reverse sync","tier.comparison.pro.sync.item4":"Full sync, resync, and push to Studio","tier.comparison.pro.sync.item5":"Multi-place sync","tier.comparison.pro.playtest":"Playtest control","tier.comparison.pro.playtest.item1":"Play, stop, pause, and resume","tier.comparison.pro.playtest.item2":"Playtest state inspection","tier.comparison.pro.playtest.item3":"Automated test execution","tier.comparison.pro.creation":"Advanced creation workflow","tier.comparison.pro.creation.item1":"Bulk operations","tier.comparison.pro.creation.item2":"Terrain generation","tier.comparison.pro.creation.item3":"Asset search and insert","tier.comparison.pro.creation.item4":"Raycast and spatial analysis","tier.comparison.pro.creation.item5":"Environment control","tier.comparison.pro.ui":"AI UI design (UI Studio)","tier.comparison.pro.ui.item1":"design_brief — guided UI requirements intake","tier.comparison.pro.ui.item2":"create_tree / update / delete — build and edit UI hierarchy","tier.comparison.pro.ui.item3":"preview — capture screenshots of current UI","tier.comparison.pro.ui.item4":"Design Check — validate touch targets, contrast, and safe zones","tier.comparison.discount.label":"🎁 Enter this code at Gumroad checkout for a discount:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Valid until April 30","tier.promo.discount.hint":"🎁 Use code WEPPY-MCP at Gumroad · Valid until April 30","tier.promo.discount.context":"🎁 Enter at Gumroad checkout:","tier.tool.query_instances.desc":"Inspect instances, search children and descendants, and inspect class data. Pro adds file tree, project structure, and property or tag search.","tier.tool.mutate_instances.desc":"Create, delete, clone, and move instances. Pro adds tree creation and bulk create, delete, or clone operations.","tier.tool.manage_properties.desc":"Read and set properties, attributes, and tags. Pro adds calculated updates, relative changes, and bulk property operations.","tier.tool.manage_scripts.desc":"Read, write, create, delete, edit, and search script source. Pro adds bulk replacement across scripts.","tier.tool.manage_lighting.desc":"Pro only. Configure lighting, atmosphere, sky, terrain properties, and time-of-day settings.","tier.tool.manage_selection.desc":"Read, set, and clear the current Studio selection. Pro adds context, details, add or remove, and selection watch support.","tier.tool.manage_camera.desc":"Inspect camera state, focus by path or position, and request suggested views.","tier.tool.manage_tween.desc":"Pro only. Create, play, pause, and cancel tweens for smooth animation.","tier.tool.manage_audio.desc":"Pro only. Play, stop, pause, and resume sounds, and configure the audio listener.","tier.tool.manage_animation.desc":"Pro only. Load, play, and stop animations, and inspect active animation tracks.","tier.tool.manage_physics.desc":"Pro only. Register collision groups, configure group collisions, and inspect available groups.","tier.tool.manage_effects.desc":"Pro only. Emit particles, clear effects, and toggle effect state.","tier.tool.manage_terrain.desc":"Pro only. Fill terrain shapes, clear regions, replace materials, manage terrain colors, read or write voxels, generate terrain, and smooth terrain.","tier.tool.spatial_query.desc":"Pro only. Run raycasts, find ground, validate placement, scan areas, search for flat or spawn positions, analyze walkability, map space, and inspect collisions.","tier.tool.manage_assets.desc":"Pro only. Insert models, inspect asset info, search the creator store, insert free assets or packages, and export assets.","tier.tool.manage_sync.desc":"Pro only. Inspect sync status, configuration, history, directions, and read or write synced files.","tier.tool.workspace_state.desc":"Pro only. Run full sync, capture snapshots, inspect recent changes and viewport state, and manage related metadata.","tier.tool.manage_logs.desc":"Inspect output logs with filtering, incremental polling, buffer clearing, and recent error lookup.","tier.tool.system_info.desc":"Inspect connection status and current tier. Pro adds place info, services, Studio settings, playtest control, and automated tests.","tier.tool.batch_execute.desc":"Pro only. Run multiple commands in a batch, with sequential execution and optional continue-on-error behavior.","tier.tool.execute_luau.desc":"Pro only. Execute arbitrary Luau code inside the Roblox Studio sandbox.","connection.server.title":"Server Status","connection.server.version":"Version","connection.server.version.tooltip":"Installed MCP server version","connection.server.pid":"PID","connection.server.pid.tooltip":"Operating system process identifier","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Time elapsed since the MCP server started","connection.server.session":"Session","connection.server.session.tooltip":"Current MCP session identifier","connection.server.exec":"Exec","connection.server.exec.tooltip":"Executable path used to launch the MCP server","connection.reconnect":"Reconnect","connection.checkSettings":"Check Settings","connection.agents.title":"AI Agents","connection.agents.name":"Agent","connection.agents.cwd":"Working Dir","connection.agents.cwd.tooltip":"Current working directory for the connected AI agent","connection.agents.projectRoot":"Project Root","connection.agents.projectRoot.tooltip":"Authoritative project root for sync ownership","connection.agents.projectRoot.unresolved":"Unresolved","connection.agents.connected":"Connected","connection.agents.unknown":"Unknown","connection.agents.none":"No agents connected","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Client ID","connection.plugins.clientId.tooltip":"Unique plugin client identifier for this Studio connection","connection.plugins.lastSeen":"Last Seen","connection.plugins.lastSeen.tooltip":"Most recent heartbeat received from the plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Installed plugin version reported by Studio","connection.plugins.none":"No plugins connected","connection.log.title":"Connection Log","connection.log.empty":"No events yet","connection.time.secondsAgo":"s ago","connection.time.minutesAgo":"m ago","connection.time.hoursAgo":"h ago","common.loading":"Loading...","common.retry":"Retry","common.reconnecting":"Reconnecting...","common.expand":"Expand","common.collapse":"Collapse","tools.tab.history":"History","tools.tab.statistics":"Statistics","tools.tab.failures":"Failures","tools.col.time":"Time","tools.col.time.tooltip":"When the tool run was recorded.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Tool name and action that were executed.","tools.col.duration":"Duration","tools.col.duration.tooltip":"How long the tool took to finish.","tools.col.status":"Status","tools.col.status.tooltip":"Outcome of the recorded tool run.","tools.col.tier":"Tier","tools.col.tier.tooltip":"License tier required for the tool or action.","tools.col.tierStats.tooltip":"Basic, Pro, or Mixed summary for the tool statistics row.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Consolidated tool name in the statistics table.","tools.col.calls":"Calls","tools.col.calls.tooltip":"Total number of recorded calls for this tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Number of direct successful runs.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Number of runs that succeeded through fallback execution.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Number of blocked runs without fallback execution.","tools.col.err":"FAILED","tools.col.err.tooltip":"Number of runs that failed.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Percentage of calls that finished successfully.","tools.col.avgTime":"Avg Time","tools.col.avgTime.tooltip":"Average execution time across recorded calls.","tools.col.error":"Error","tools.filter.tool":"Tool","tools.filter.all":"All","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"This entry used a Pro-only tool or action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"The requested Pro action succeeded via a Basic fallback.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"The requested Pro action was blocked and no fallback ran.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"The tool run failed.","tools.status.ok":"OK","tools.status.ok.tooltip":"The tool run completed successfully.","tools.tier.mixed.tooltip":"This tool includes both Basic and Pro actions.","tools.detail.params":"Parameters","tools.detail.params.tooltip":"Input parameters passed to this tool run.","tools.detail.result":"Result","tools.detail.result.tooltip":"Returned result payload for this tool run.","tools.detail.requestedCommand":"Command Sent","tools.detail.executedCommand":"Executed Command","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Blocked Reason","tools.detail.noFallback":"No Fallback","tools.detail.noFallback.value":"No fallback ran.","tools.detail.errorMessage":"Error Message","tools.clear.history.title":"Clear history?","tools.clear.history.message":"This permanently removes the current place tools history.","tools.clear.statistics.title":"Clear statistics?","tools.clear.statistics.message":"This permanently resets the current place tool statistics.","tools.detail.error":"Error","tools.page.prev":"Prev","tools.page.prev.tooltip":"Go to the previous page of tool history results.","tools.page.next":"Next","tools.page.next.tooltip":"Go to the next page of tool history results.","tools.empty.history":"No history entries","tools.empty.stats":"No tool statistics","tools.empty.failures":"No failures","tools.summary.total":"Total","tools.summary.calls":"calls","tools.summary.sessions":"Sessions","settings.license.title":"License","settings.license.title.tooltip":"Current license status and subscription tier.","settings.license.status":"Status","settings.license.status.tooltip":"Current license activation state.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Current subscription tier for available WEPPY Dashboard features.","settings.license.key":"Key","settings.license.key.tooltip":"Masked license key currently loaded by the server.","settings.license.keyValue.tooltip":"Masked license key currently loaded by the server.","settings.license.provider":"Provider","settings.license.provider.tooltip":"License provider used to validate this key.","settings.license.providerValue.tooltip":"License provider used to validate this key.","settings.license.active":"Active","settings.license.active.tooltip":"Current license activation state.","settings.license.status.activeCancelPending.tooltip":"Cancellation is pending, but Pro access remains active until the current billing period ends.","settings.license.inactive":"Inactive","settings.license.inactive.tooltip":"Current license activation state.","settings.license.expired":"Expired","settings.license.expired.tooltip":"Current license activation state.","settings.license.unavailable":"License info unavailable","settings.license.detail.cancelPending":"Cancellation is scheduled. Pro access remains active until the current billing period ends.","settings.license.reset":"Reset License","settings.readOnly":"Read-only","settings.readOnly.tooltip":"This section shows values that cannot be edited from the WEPPY Dashboard.","settings.unavailable":"Settings unavailable","settings.general.title":"General Settings","settings.general.title.tooltip":"Hot settings that apply immediately when changed.","settings.general.liveApply":"Live Apply","settings.general.liveApply.tooltip":"Changes in this section are applied immediately without a separate save button.","settings.general.applied":"Applied","settings.general.logLevel":"Log Level","settings.general.logLevel.tooltip":"Choose how much detail the MCP server writes to logs. Lower to ‘debug’ when tracking down a problem.","settings.general.localHistory":"Tool History Recording","settings.general.localHistory.tooltip":"Save AI tool runs to disk. Required for the Tools and History pages.","settings.general.localStatistics":"Tool Statistics Collection","settings.general.localStatistics.tooltip":"Aggregate tool usage counts. Used by the Overview statistics.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"Save structured execution context so the Changelog and Playtest views can render it.","settings.general.requestTimeout":"Action Timeout","settings.general.requestTimeout.tooltip":"Maximum time (in ms) to wait for a single tool action before failing.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Action timeout is measured in milliseconds.","settings.cold.title":"Server Environment","settings.cold.title.tooltip":"Read-only server environment values loaded at startup.","settings.cold.httpPort.tooltip":"Port number used by the MCP WEPPY Dashboard HTTP server.","settings.cold.httpHost.tooltip":"Host interface that the MCP WEPPY Dashboard HTTP server binds to.","settings.cold.dashboardAutoOpen.tooltip":"Controls whether the WEPPY Dashboard opens automatically in the browser when the server starts.","settings.cold.dashboardAutoOpen.value.tooltip":"Current startup behavior for opening the WEPPY Dashboard in a browser.","settings.cold.hint":"Set via environment variables to change these values.","settings.language.title":"Language","settings.language.title.tooltip":"Choose how the WEPPY Dashboard interface text is localized.","settings.language.dashboard":"WEPPY Dashboard Language","settings.language.dashboard.tooltip":"Overrides the WEPPY Dashboard language or follows the system language when set to Auto.","settings.language.auto":"Auto","overview.l0.title":"MCP Server Disconnected","overview.l0.message":"The MCP server is not responding. The WEPPY Dashboard will automatically attempt to reconnect.","overview.l0.step1":"Check that the MCP server process is running","overview.l0.step2":"Restart the MCP server command if needed","overview.l0.reconnecting":"Auto-reconnecting every 3s...","overview.l0.reconnectBtn":"Reconnect","overview.l0.settingsBtn":"Check Settings","overview.l1.pluginGuide":"Roblox Studio plugin is not connected","overview.l1.check1":"Is Roblox Studio running?","overview.l1.check2":"Is the WEPPY Plugin installed?","overview.l1.feedHint":"Changes will appear here once the plugin connects","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP server runtime and process status","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio plugin connection and version status","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Connected AI coding agents and their runtime state","overview.metric.agent.instancesUnit":"instances","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Current Studio to local sync activity","overview.metric.noAgent":"No Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installed MCP server version","overview.meta.session":"Session","overview.meta.session.tooltip":"Current MCP session identifier","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Operating system process identifier","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Time elapsed since the MCP server started","overview.feed.title":"Recent Game Changes","overview.feed.empty":"No recent changes","overview.changelog.title":"Session Change Summary","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instances","overview.changelog.properties":"properties","overview.changelog.assets":"assets","overview.tier.title":"Tier Usage","changelog.subtitle":"Game Change History","changelog.filter.all":"All","changelog.filter.active":"Active","changelog.filter.completed":"Completed","changelog.empty":"No changelog entries yet","changelog.basic.limit.title":"Basic preview shows the latest 3 sessions","changelog.basic.limit.body":"Upgrade to Pro to browse the full changelog timeline for this place.","changelog.basic.metricLabel":"Visible Changelog / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Active","changelog.card.active.tooltip":"This session is still receiving new game changes.","changelog.card.completed":"Completed","changelog.card.completed.tooltip":"This session has ended and no more changes are expected.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"This session only contains the initial sync bootstrap snapshot.","changelog.card.inProgress":"in progress","changelog.card.noChanges":"No changes yet","changelog.card.noChanges.tooltip":"No game changes have been extracted for this session yet.","changelog.card.bootstrapSummary":"Initial sync snapshot","changelog.card.bootstrapSummary.tooltip":"Initial file sync writes are collapsed into a single bootstrap snapshot row.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Script changes made in this session.","changelog.card.instances":"instances","changelog.card.instances.tooltip":"Instance create, delete, move, or clone changes in this session.","changelog.card.modified":"modified","changelog.card.created":"created","changelog.card.deleted":"deleted","changelog.card.moved":"moved","changelog.card.propertiesChanged":"properties changed","changelog.card.propertiesChanged.tooltip":"Property value changes recorded for this session.","changelog.card.lightingConfigured":"Lighting configured","changelog.card.lightingConfigured.tooltip":"Lighting or atmosphere settings changed in this session.","changelog.card.terrainConfigured":"Terrain configured","changelog.card.terrainConfigured.tooltip":"Terrain data or terrain settings changed in this session.","changelog.card.assetsInserted":"assets inserted","changelog.card.assetsInserted.tooltip":"Assets inserted into the place during this session.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Lighting","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Change Summary","changelog.detail.changeSummary.tooltip":"Counts of extracted game changes grouped by category for this session.","changelog.detail.changeTimeline":"Change Timeline","changelog.detail.changeTimeline.tooltip":"Chronological list of extracted game changes for this session.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Before & After","changelog.detail.filterCategory":"Category","changelog.detail.filterCategory.tooltip":"Filter the timeline to a single change category.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Both the before and after state were confirmed for this change.","changelog.detail.confidence.partial":"Partial","changelog.detail.confidence.partial.tooltip":"Only part of the before and after state could be confirmed for this change.","changelog.detail.confidence.afterOnly":"After only","changelog.detail.confidence.afterOnly.tooltip":"Only the resulting state after the change could be confirmed.","changelog.detail.confidence.intentOnly":"Intent only","changelog.detail.confidence.intentOnly.tooltip":"Only the requested action was recorded, not the resulting state.","changelog.detail.confidence.unknown":"Unknown","changelog.detail.confidence.unknown.tooltip":"This change could not be confidently classified from the available data.","changelog.detail.noChanges":"No changes in this category","changelog.detail.backToList":"Back to list","changelog.diff.empty":"No diff available","changelog.diff.unified":"Unified","changelog.diff.sideBySide":"Side by Side","changelog.diff.before":"Before","changelog.diff.after":"After","sync.overlay.title":"Roblox Studio plugin required","sync.overlay.message":"Sync status will be available once the Roblox Studio plugin connects.","sync.overlay.check1":"Is Roblox Studio running?","sync.overlay.check2":"Is the WEPPY Plugin installed?","sync.status.title":"Sync Status","sync.status.title.tooltip":"Current Studio and local file sync status for this place.","sync.status.forwardOnly":"Forward Only","sync.status.forwardOnly.tooltip":"Basic tier allows Studio to local forward sync only.","sync.status.place":"Place","sync.status.place.tooltip":"Connected Roblox place name and place ID.","sync.status.path":"Path","sync.status.path.tooltip":"Local filesystem root currently used for sync output.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Total synced Roblox instances tracked in the local mirror.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total synced script files currently indexed for this place.","sync.status.state":"State","sync.status.state.tooltip":"Current runtime sync state reported by the server.","sync.directions.title":"Sync Directions","sync.directions.title.tooltip":"Per-category sync direction and apply behavior between Local and Studio.","sync.directions.type":"Type","sync.directions.type.tooltip":"Sync category affected by this rule.","sync.directions.direction":"Direction","sync.directions.direction.tooltip":"Whether each category syncs from Studio, to Studio, or both ways.","sync.directions.applyMode":"Apply Mode","sync.directions.applyMode.tooltip":"How incoming sync changes are applied for this category.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Values","sync.directions.cat.containers":"Containers","sync.directions.cat.data":"Data","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Local files on disk are always shown on the left side of the direction rail.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio is always shown on the right side of the direction rail.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Applies sync changes only when you trigger them manually.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Applies sync changes automatically when updates arrive.","sync.directions.tooltip.forward.body":"Studio changes sync to local files only","sync.directions.tooltip.bidirectional.body":"Two-way sync between Local and Studio","sync.directions.tooltip.reverse.body":"Push local file changes to Studio","sync.directions.tooltip.proRequired":"Pro required in Basic tier","sync.directions.dir.forward":"forward","sync.directions.dir.bidirectional":"bidirectional","sync.directions.dir.reverse":"reverse","sync.log.title":"Sync Log","sync.log.empty":"No sync events yet","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"A new sync output was written to disk.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"An existing synced file or instance was updated.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"A synced file or instance was removed.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"A sync event was recorded without a file mutation.","sync.upgrade.title":"Unlock Full Sync with Pro","sync.upgrade.benefit1":"Bidirectional sync — edit files, auto-apply to Studio","sync.upgrade.benefit2":"Reverse sync — push file changes back to Studio","sync.upgrade.benefit3":"Full sync history and detailed change log","sync.upgrade.buy":"Upgrade to Pro","playtest.status.title":"Playtest Status","playtest.status.title.tooltip":"Current Roblox playtest session state reported by Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Studio playtest launch mode for the current session.","playtest.status.mode.value.tooltip":"Specific Roblox Studio playtest mode currently in use.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox place currently associated with this playtest session.","playtest.status.state.running":"Running","playtest.status.state.running.tooltip":"A Roblox playtest session is currently running.","playtest.status.state.paused":"Paused","playtest.status.state.paused.tooltip":"The current Roblox playtest session is paused.","playtest.status.state.notRunning":"Not Running","playtest.status.state.notRunning.tooltip":"No Roblox playtest session is currently running.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Test History","playtest.history.title.tooltip":"Recorded automated playtest runs for this project.","playtest.history.empty":"No test results yet","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Playtest mode used for this recorded test run.","playtest.history.status.passed":"Passed","playtest.history.status.failed":"Failed","playtest.history.status.running":"Running","playtest.history.status.unknown":"Unknown","playtest.history.status.tooltip":"Recorded result state for this automated playtest run.","playtest.empty.title":"No playtest results yet","playtest.empty.message":"Test results will appear here when the AI agent runs automated tests via system_info.run_test.","playtest.empty.message.before":"Test results will appear here when the AI agent runs automated tests via","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"WEPPY Dashboard automation entry point that runs Roblox playtest checks through the system_info tool.","playtest.report.title":"Selected Report","playtest.report.title.tooltip":"Detailed output for the currently selected automated playtest run.","playtest.report.content":"Report","playtest.report.content.tooltip":"Markdown summary for the selected automated playtest run.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Execution logs captured for the selected automated playtest run.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"No report content available","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest is a Pro-only feature","playtest.basic.desc":"Control playtesting from the WEPPY Dashboard, run automated tests, and view detailed test reports.","playtest.basic.benefit1":"One-click play/pause/stop controls","playtest.basic.benefit2":"Automated test execution via AI agent","playtest.basic.benefit3":"Test history with pass/fail tracking","playtest.basic.benefit4":"Detailed markdown test reports","playtest.sample.badge":"Preview of the Pro playtest view","playtest.sample.title":"You are previewing the playtest screen that becomes available after upgrading to Pro.","playtest.sample.message":"This preview uses sample data. Live playtest control, history management, and real reports unlock with Pro.","playtest.sample.clearDisabled":"Upgrade to Pro to clear live playtest history.","playtest.sample.place":"Arena Preview","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Spawn into the arena, survive the opener, and verify the HUD responds immediately.","playtest.sample.context.expected":"The player spawns safely, the countdown UI appears within one second, and the first wave starts without errors.","playtest.sample.context.observed":"Spawn protection held, the HUD updated on time, and wave one completed with no gameplay regressions.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
69
+ */function ca(){return ca=Object.assign?Object.assign.bind():function(a){for(var r=1;r<arguments.length;r++){var s=arguments[r];for(var u in s)Object.prototype.hasOwnProperty.call(s,u)&&(a[u]=s[u])}return a},ca.apply(this,arguments)}function xp(a,r){if(a==null)return{};var s={},u=Object.keys(a),c,p;for(p=0;p<u.length;p++)c=u[p],!(r.indexOf(c)>=0)&&(s[c]=a[c]);return s}function ef(a){return!!(a.metaKey||a.altKey||a.ctrlKey||a.shiftKey)}function tf(a,r){return a.button===0&&(!r||r==="_self")&&!ef(a)}function Dl(a){return a===void 0&&(a=""),new URLSearchParams(typeof a=="string"||Array.isArray(a)||a instanceof URLSearchParams?a:Object.keys(a).reduce((r,s)=>{let u=a[s];return r.concat(Array.isArray(u)?u.map(c=>[s,c]):[[s,u]])},[]))}function of(a,r){let s=Dl(a);return r&&r.forEach((u,c)=>{s.has(c)||r.getAll(c).forEach(p=>{s.append(c,p)})}),s}const af=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],nf=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],rf="6";try{window.__reactRouterVersion=rf}catch{}function sf(a,r){return hm({basename:void 0,future:ca({},void 0,{v7_prependBasename:!0}),history:Lh({window:void 0}),hydrationData:lf(),routes:a,mapRouteProperties:Xm,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function lf(){var a;let r=(a=window)==null?void 0:a.__staticRouterHydrationData;return r&&r.errors&&(r=ca({},r,{errors:uf(r.errors)})),r}function uf(a){if(!a)return null;let r=Object.entries(a),s={};for(let[u,c]of r)if(c&&c.__type==="RouteErrorResponse")s[u]=new Ar(c.status,c.statusText,c.data,c.internal===!0);else if(c&&c.__type==="Error"){if(c.__subType){let p=window[c.__subType];if(typeof p=="function")try{let g=new p(c.message);g.stack="",s[u]=g}catch{}}if(s[u]==null){let p=new Error(c.message);p.stack="",s[u]=p}}else s[u]=c;return s}const Rp=R.createContext({isTransitioning:!1}),cf=R.createContext(new Map),df="startTransition",Vd=Mh[df],pf="flushSync",Yd=Uh[pf];function gf(a){Vd?Vd(a):a()}function tn(a){Yd?Yd(a):a()}class hf{constructor(){this.status="pending",this.promise=new Promise((r,s)=>{this.resolve=u=>{this.status==="pending"&&(this.status="resolved",r(u))},this.reject=u=>{this.status==="pending"&&(this.status="rejected",s(u))}})}}function mf(a){let{fallbackElement:r,router:s,future:u}=a,[c,p]=R.useState(s.state),[g,f]=R.useState(),[m,v]=R.useState({isTransitioning:!1}),[k,w]=R.useState(),[j,_]=R.useState(),[F,L]=R.useState(),H=R.useRef(new Map),{v7_startTransition:re}=u||{},W=R.useCallback(K=>{re?gf(K):K()},[re]),Z=R.useCallback((K,ve)=>{let{deletedFetchers:se,flushSync:_e,viewTransitionOpts:we}=ve;K.fetchers.forEach((ke,$e)=>{ke.data!==void 0&&H.current.set($e,ke.data)}),se.forEach(ke=>H.current.delete(ke));let Ue=s.window==null||s.window.document==null||typeof s.window.document.startViewTransition!="function";if(!we||Ue){_e?tn(()=>p(K)):W(()=>p(K));return}if(_e){tn(()=>{j&&(k&&k.resolve(),j.skipTransition()),v({isTransitioning:!0,flushSync:!0,currentLocation:we.currentLocation,nextLocation:we.nextLocation})});let ke=s.window.document.startViewTransition(()=>{tn(()=>p(K))});ke.finished.finally(()=>{tn(()=>{w(void 0),_(void 0),f(void 0),v({isTransitioning:!1})})}),tn(()=>_(ke));return}j?(k&&k.resolve(),j.skipTransition(),L({state:K,currentLocation:we.currentLocation,nextLocation:we.nextLocation})):(f(K),v({isTransitioning:!0,flushSync:!1,currentLocation:we.currentLocation,nextLocation:we.nextLocation}))},[s.window,j,k,H,W]);R.useLayoutEffect(()=>s.subscribe(Z),[s,Z]),R.useEffect(()=>{m.isTransitioning&&!m.flushSync&&w(new hf)},[m]),R.useEffect(()=>{if(k&&g&&s.window){let K=g,ve=k.promise,se=s.window.document.startViewTransition(async()=>{W(()=>p(K)),await ve});se.finished.finally(()=>{w(void 0),_(void 0),f(void 0),v({isTransitioning:!1})}),_(se)}},[W,g,k,s.window]),R.useEffect(()=>{k&&g&&c.location.key===g.location.key&&k.resolve()},[k,j,c.location,g]),R.useEffect(()=>{!m.isTransitioning&&F&&(f(F.state),v({isTransitioning:!0,flushSync:!1,currentLocation:F.currentLocation,nextLocation:F.nextLocation}),L(void 0))},[m.isTransitioning,F]),R.useEffect(()=>{},[]);let te=R.useMemo(()=>({createHref:s.createHref,encodeLocation:s.encodeLocation,go:K=>s.navigate(K),push:(K,ve,se)=>s.navigate(K,{state:ve,preventScrollReset:se==null?void 0:se.preventScrollReset}),replace:(K,ve,se)=>s.navigate(K,{replace:!0,state:ve,preventScrollReset:se==null?void 0:se.preventScrollReset})}),[s]),ye=s.basename||"/",je=R.useMemo(()=>({router:s,navigator:te,static:!1,basename:ye}),[s,te,ye]),I=R.useMemo(()=>({v7_relativeSplatPath:s.future.v7_relativeSplatPath}),[s.future.v7_relativeSplatPath]);return R.useEffect(()=>Qm(u,s.future),[u,s.future]),R.createElement(R.Fragment,null,R.createElement(rn.Provider,{value:je},R.createElement(Wl.Provider,{value:c},R.createElement(cf.Provider,{value:H.current},R.createElement(Rp.Provider,{value:m},R.createElement(Zm,{basename:ye,location:c.location,navigationType:c.historyAction,navigator:te,future:I},c.initialized||s.future.v7_partialHydration?R.createElement(ff,{routes:s.routes,future:s.future,state:c}):r))))),null)}const ff=R.memo(yf);function yf(a){let{routes:r,future:s,state:u}=a;return Nm(r,void 0,u,s)}const Sf=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",vf=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Yl=R.forwardRef(function(r,s){let{onClick:u,relative:c,reloadDocument:p,replace:g,state:f,target:m,to:v,preventScrollReset:k,viewTransition:w}=r,j=xp(r,af),{basename:_}=R.useContext(si),F,L=!1;if(typeof v=="string"&&vf.test(v)&&(F=v,Sf))try{let Z=new URL(window.location.href),te=v.startsWith("//")?new URL(Z.protocol+v):new URL(v),ye=Eo(te.pathname,_);te.origin===Z.origin&&ye!=null?v=ye+te.search+te.hash:L=!0}catch{}let H=Mm(v,{relative:c}),re=kf(v,{replace:g,state:f,target:m,preventScrollReset:k,relative:c,viewTransition:w});function W(Z){u&&u(Z),Z.defaultPrevented||re(Z)}return R.createElement("a",ca({},j,{href:F||H,onClick:L||p?u:W,ref:s,target:m}))}),bf=R.forwardRef(function(r,s){let{"aria-current":u="page",caseSensitive:c=!1,className:p="",end:g=!1,style:f,to:m,viewTransition:v,children:k}=r,w=xp(r,nf),j=Er(m,{relative:w.relative}),_=oo(),F=R.useContext(Wl),{navigator:L,basename:H}=R.useContext(si),re=F!=null&&Pf(j)&&v===!0,W=L.encodeLocation?L.encodeLocation(j).pathname:j.pathname,Z=_.pathname,te=F&&F.navigation&&F.navigation.location?F.navigation.location.pathname:null;c||(Z=Z.toLowerCase(),te=te?te.toLowerCase():null,W=W.toLowerCase()),te&&H&&(te=Eo(te,H)||te);const ye=W!=="/"&&W.endsWith("/")?W.length-1:W.length;let je=Z===W||!g&&Z.startsWith(W)&&Z.charAt(ye)==="/",I=te!=null&&(te===W||!g&&te.startsWith(W)&&te.charAt(W.length)==="/"),K={isActive:je,isPending:I,isTransitioning:re},ve=je?u:void 0,se;typeof p=="function"?se=p(K):se=[p,je?"active":null,I?"pending":null,re?"transitioning":null].filter(Boolean).join(" ");let _e=typeof f=="function"?f(K):f;return R.createElement(Yl,ca({},w,{"aria-current":ve,className:se,ref:s,style:_e,to:m,viewTransition:v}),typeof k=="function"?k(K):k)});var Ml;(function(a){a.UseScrollRestoration="useScrollRestoration",a.UseSubmit="useSubmit",a.UseSubmitFetcher="useSubmitFetcher",a.UseFetcher="useFetcher",a.useViewTransitionState="useViewTransitionState"})(Ml||(Ml={}));var Kd;(function(a){a.UseFetcher="useFetcher",a.UseFetchers="useFetchers",a.UseScrollRestoration="useScrollRestoration"})(Kd||(Kd={}));function wf(a){let r=R.useContext(rn);return r||Ce(!1),r}function kf(a,r){let{target:s,replace:u,state:c,preventScrollReset:p,relative:g,viewTransition:f}=r===void 0?{}:r,m=wp(),v=oo(),k=Er(a,{relative:g});return R.useCallback(w=>{if(tf(w,s)){w.preventDefault();let j=u!==void 0?u:Di(v)===Di(k);m(a,{replace:j,state:c,preventScrollReset:p,relative:g,viewTransition:f})}},[v,m,k,u,c,s,a,p,g,f])}function Wv(a){let r=R.useRef(Dl(a)),s=R.useRef(!1),u=oo(),c=R.useMemo(()=>of(u.search,s.current?null:r.current),[u.search]),p=wp(),g=R.useCallback((f,m)=>{const v=Dl(typeof f=="function"?f(c):f);s.current=!0,p("?"+v,m)},[p,c]);return[c,g]}function Pf(a,r){r===void 0&&(r={});let s=R.useContext(Rp);s==null&&Ce(!1);let{basename:u}=wf(Ml.useViewTransitionState),c=Er(a,{relative:r.relative});if(!s.isTransitioning)return!1;let p=Eo(s.currentLocation.pathname,u)||s.currentLocation.pathname,g=Eo(s.nextLocation.pathname,u)||s.nextLocation.pathname;return Tr(c.pathname,g)!=null||Tr(c.pathname,p)!=null}const Cf="modulepreload",xf=function(a){return"/dashboard/"+a},Gd={},ho=function(r,s,u){let c=Promise.resolve();if(s&&s.length>0){let g=function(v){return Promise.all(v.map(k=>Promise.resolve(k).then(w=>({status:"fulfilled",value:w}),w=>({status:"rejected",reason:w}))))};document.getElementsByTagName("link");const f=document.querySelector("meta[property=csp-nonce]"),m=(f==null?void 0:f.nonce)||(f==null?void 0:f.getAttribute("nonce"));c=g(s.map(v=>{if(v=xf(v),v in Gd)return;Gd[v]=!0;const k=v.endsWith(".css"),w=k?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${w}`))return;const j=document.createElement("link");if(j.rel=k?"stylesheet":Cf,k||(j.as="script"),j.crossOrigin="",j.href=v,m&&j.setAttribute("nonce",m),document.head.appendChild(j),k)return new Promise((_,F)=>{j.addEventListener("load",_),j.addEventListener("error",()=>F(new Error(`Unable to preload CSS for ${v}`)))})}))}function p(g){const f=new Event("vite:preloadError",{cancelable:!0});if(f.payload=g,window.dispatchEvent(f),!f.defaultPrevented)throw g}return c.then(g=>{for(const f of g||[])f.status==="rejected"&&p(f.reason);return r().catch(p)})},jr=window.location.origin,Rf=3e3,Tf=5e3;class Af extends Error{constructor(s,u,c=null,p=null){super(u);To(this,"status");To(this,"error");To(this,"payload");this.name="ApiClientError",this.status=s,this.error=c,this.payload=p}}function If(a){var s,u;const r=(u=(s=a.headers)==null?void 0:s.get)==null?void 0:u.call(s,"content-type");return typeof r=="string"&&r.toLowerCase().includes("application/json")}async function Ef(a){if(!If(a))return null;try{const r=await a.json();if(r&&typeof r=="object")return r}catch{return null}return null}async function kl(a){if(a.ok)return;const r=await Ef(a),s=typeof(r==null?void 0:r.message)=="string"&&r.message.trim().length>0?r.message:`API ${a.status}: ${a.statusText}`,u=typeof(r==null?void 0:r.error)=="string"?r.error:null;throw new Af(a.status,s,u,r)}class jf{constructor(r){To(this,"base");this.base=r}async get(r,s){const u=new URL(r,this.base);s&&Object.entries(s).forEach(([p,g])=>u.searchParams.set(p,g));const c=await fetch(u.toString(),{method:"GET"});return await kl(c),c.json()}async patch(r,s){const u=new URL(r,this.base),c=await fetch(u.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)});return await kl(c),c.json()}async post(r,s){const u=new URL(r,this.base),c=await fetch(u.toString(),{method:"POST",headers:s?{"Content-Type":"application/json"}:{},body:s?JSON.stringify(s):void 0});return await kl(c),c.json()}}const io=new jf(jr);function zf(a){return a.pluginClients&&a.pluginClients.length>0?"studioConnected":(a.connectedClients===0||!a.pluginClients,"serverOnly")}const Tp=R.createContext(null);function Df({children:a}){const[r,s]=R.useState("disconnected"),[u,c]=R.useState(null),[p,g]=R.useState(null),f=R.useRef(null);return R.useEffect(()=>{let m=!1;async function v(){try{const k=await io.get("/status");if(m)return;c(k),s(zf(k)),g(null)}catch(k){if(m)return;s("disconnected"),g(k instanceof Error?k.message:String(k))}}return v(),f.current=setInterval(v,Tf),()=>{m=!0,f.current&&clearInterval(f.current)}},[]),z.jsx(Tp.Provider,{value:{level:r,status:u,error:p},children:a})}function zr(){const a=R.useContext(Tp);if(!a)throw new Error("useConnection must be used within a ConnectionProvider");return a}const Mf={"sidebar.overview":"Overview","sidebar.changelog":"Changelog","sidebar.connection":"Connection","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Settings","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP server connection required","sidebar.gate.l2":"Roblox Studio plugin connection required","header.currentProject":"Current Project","header.unknownProject":"Unknown project","header.projectRoot.label":"Project Root","header.currentProject.loading":"Loading project root...","header.currentProject.unavailable":"Project root unavailable","header.placeNotConnected":"Place not connected","header.currentProject.tooltip":"Currently selected project folder","header.currentProject.loading.tooltip":"Project root information is still loading","header.currentProject.unavailable.tooltip":"Current project root information is unavailable","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Loading sync root...","header.currentProjectSyncRoot.unavailable":"Sync root unavailable","header.currentProjectSyncRoot.tooltip":"Current sync root folder for the selected project","header.currentProjectSyncRoot.loading.tooltip":"Sync root information is still loading","header.currentProjectSyncRoot.unavailable.tooltip":"Current sync root information is unavailable","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Test files unavailable","header.testFiles.tooltip":"Current playtest files directory for the selected place","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Plugin connection required","header.places.liveRequired":"Plugin connection required for live active place","header.place.tooltip":"Connected Roblox place","header.placeNotConnected.tooltip":"Place not connected","header.changeProjectRoot":"Change Project Root","header.changeProjectRoot.ariaLabel":"Change project root","header.changeProjectRoot.tooltip":"Change the current project root","header.changeProjectRoot.disabledTooltip.l0":"MCP server connection required before project root can be changed","header.changeProjectRoot.disabledTooltip.loading":"Project root information is still loading","header.changeProjectRoot.disabledTooltip.unavailable":"Current project root information is unavailable","header.projectRootModal.initial.title":"Change project root","header.projectRootModal.initial.body.connected":"After you choose a project folder, MCP will switch to the new project root and the current Studio contents will be fully resynced into the new <selected project folder>/weppy-project-sync target.","header.projectRootModal.initial.body.disconnected":"After you choose a project folder, MCP will switch to the new project root and use <selected project folder>/weppy-project-sync as the next sync target.","header.projectRootModal.initial.nextSyncRoot":"New sync target after selection","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Current sync stops immediately.","header.projectRootModal.initial.warningFreshSync":"The current Studio contents will be used to build a fresh full sync in the new target.","header.projectRootModal.initial.warningNoMove":"Old sync folders are not moved automatically.","header.projectRootModal.initial.warningDeferredSync":"If Studio is not connected, full resync starts the next time the plugin connects.","header.projectRootModal.confirm.title":"Confirm new project root","header.projectRootModal.confirm.body":"Review the selected project folder before applying.","header.projectRootModal.confirm.projectRoot":"Selected project folder","header.projectRootModal.confirm.syncRoot":"New sync target","header.projectRootModal.confirm.warningNoMove":"Existing sync folders are not moved automatically.","header.projectRootModal.pick":"Choose folder","header.projectRootModal.apply":"Apply change","header.projectRootModal.cancel":"Cancel","header.projectRootModal.error":"Failed to change project root","status.online":"Online","status.offline":"Offline","status.idle":"Idle","status.syncing":"Syncing","status.error":"Error","status.initializing":"Initializing","level.l0.title":"Server disconnected","level.l0.message":"WEPPY Dashboard opened but MCP server has stopped or is not responding.","level.l1.title":"Server connected","level.l1.hint":"Check: Is Roblox Studio running? Is the plugin installed?","level.l2.ok":"Studio connected","tier.basic":"Basic","tier.basic.tooltip":"Basic tier with the standard WEPPY Dashboard feature set.","tier.pro":"Pro","tier.pro.tooltip":"Pro tier with the full WEPPY Dashboard feature set.","tier.mixed":"Mixed","tier.upgrade":"Upgrade to Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Save AI tokens with Pro!","tier.comparison.comingSoon":"Basic vs Pro comparison — coming soon","tier.comparison.close":"Close","tier.comparison.detailTitle":"Detailed Tool Catalog","tier.comparison.description":"Description","tier.comparison.basic.core":"Core MCP workflow","tier.comparison.basic.core.item1":"Script create/edit","tier.comparison.basic.core.item2":"Instance management","tier.comparison.basic.core.item3":"Property control","tier.comparison.basic.core.item4":"Selection and search","tier.comparison.basic.core.item5":"Tag management","tier.comparison.basic.core.item6":"Camera control","tier.comparison.basic.core.item7":"Log monitoring","tier.comparison.basic.sync":"Sync (Basic)","tier.comparison.basic.sync.item1":"Studio to Local one-way sync","tier.comparison.basic.sync.item2":"Manual apply as default","tier.comparison.pro.all":"Everything in Basic, plus","tier.comparison.pro.sync":"Advanced Sync workflow","tier.comparison.pro.sync.item1":"Per-type sync direction","tier.comparison.pro.sync.item2":"Per-type apply mode","tier.comparison.pro.sync.item3":"Bidirectional and reverse sync","tier.comparison.pro.sync.item4":"Full sync, resync, and push to Studio","tier.comparison.pro.sync.item5":"Multi-place sync","tier.comparison.pro.playtest":"Playtest control","tier.comparison.pro.playtest.item1":"Play, stop, pause, and resume","tier.comparison.pro.playtest.item2":"Playtest state inspection","tier.comparison.pro.playtest.item3":"Automated test execution","tier.comparison.pro.creation":"Advanced creation workflow","tier.comparison.pro.creation.item1":"Bulk operations","tier.comparison.pro.creation.item2":"Terrain generation","tier.comparison.pro.creation.item3":"Asset search and insert","tier.comparison.pro.creation.item4":"Raycast and spatial analysis","tier.comparison.pro.creation.item5":"Environment control","tier.comparison.pro.ui":"AI UI design (UI Studio)","tier.comparison.pro.ui.item1":"Plan game UI from your request and current Studio context","tier.comparison.pro.ui.item2":"Create, update, or remove menus, HUDs, buttons, and panels","tier.comparison.pro.ui.item3":"Capture the current UI for review","tier.comparison.pro.ui.item4":"Review touch, contrast, and safe-area suggestions","tier.comparison.discount.label":"🎁 Enter this code at Gumroad checkout for a discount:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Valid until April 30","tier.promo.discount.hint":"🎁 Use code WEPPY-MCP at Gumroad · Valid until April 30","tier.promo.discount.context":"🎁 Enter at Gumroad checkout:","tier.tool.query_instances.desc":"Inspect instances, search children and descendants, and inspect class data. Pro adds file tree, project structure, and property or tag search.","tier.tool.mutate_instances.desc":"Create, delete, clone, and move instances. Pro adds tree creation and bulk create, delete, or clone operations.","tier.tool.manage_properties.desc":"Read and set properties, attributes, and tags. Pro adds calculated updates, relative changes, and bulk property operations.","tier.tool.manage_scripts.desc":"Read, write, create, delete, edit, and search script source. Pro adds bulk replacement across scripts.","tier.tool.manage_ui.desc":"Pro only. Create or refine game-style menus, HUDs, buttons, labels, and image panels, then capture screens and review improvement suggestions.","tier.tool.manage_ui.action.design_brief":"Plan UI direction","tier.tool.manage_ui.action.create_tree":"Create new UI","tier.tool.manage_ui.action.update":"Update existing UI","tier.tool.manage_ui.action.delete":"Remove UI","tier.tool.manage_ui.action.preview":"Capture UI screen","tier.tool.manage_ui.action.check":"Review improvement suggestions","tier.tool.manage_lighting.desc":"Pro only. Configure lighting, atmosphere, sky, terrain properties, and time-of-day settings.","tier.tool.manage_selection.desc":"Read, set, and clear the current Studio selection. Pro adds context, details, add or remove, and selection watch support.","tier.tool.manage_camera.desc":"Inspect camera state, focus by path or position, and request suggested views.","tier.tool.manage_tween.desc":"Pro only. Create, play, pause, and cancel tweens for smooth animation.","tier.tool.manage_audio.desc":"Pro only. Play, stop, pause, and resume sounds, and configure the audio listener.","tier.tool.manage_animation.desc":"Pro only. Load, play, and stop animations, and inspect active animation tracks.","tier.tool.manage_physics.desc":"Pro only. Register collision groups, configure group collisions, and inspect available groups.","tier.tool.manage_effects.desc":"Pro only. Emit particles, clear effects, and toggle effect state.","tier.tool.manage_terrain.desc":"Pro only. Fill terrain shapes, clear regions, replace materials, manage terrain colors, read or write voxels, generate terrain, and smooth terrain.","tier.tool.spatial_query.desc":"Pro only. Run raycasts, find ground, validate placement, scan areas, search for flat or spawn positions, analyze walkability, map space, and inspect collisions.","tier.tool.manage_assets.desc":"Pro only. Insert models, inspect asset info, search the creator store, insert free assets or packages, and export assets.","tier.tool.manage_sync.desc":"Pro only. Inspect sync status, configuration, history, directions, and read or write synced files.","tier.tool.workspace_state.desc":"Pro only. Run full sync, capture snapshots, inspect recent changes and viewport state, and manage related metadata.","tier.tool.manage_logs.desc":"Inspect output logs with filtering, incremental polling, buffer clearing, and recent error lookup.","tier.tool.system_info.desc":"Inspect connection status and current tier. Pro adds place info, services, Studio settings, playtest control, and automated tests.","tier.tool.manage_studio.desc":"Pro only. Toggle Studio editor view settings such as UI preview for screenshot and QA workflows; it changes Studio session settings, not game UI objects.","tier.tool.batch_execute.desc":"Pro only. Run multiple commands in a batch, with sequential execution and optional continue-on-error behavior.","tier.tool.execute_luau.desc":"Pro only. Execute arbitrary Luau code inside the Roblox Studio sandbox.","connection.server.title":"Server Status","connection.server.version":"Version","connection.server.version.tooltip":"Installed MCP server version","connection.server.pid":"PID","connection.server.pid.tooltip":"Operating system process identifier","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Time elapsed since the MCP server started","connection.server.session":"Session","connection.server.session.tooltip":"Current MCP session identifier","connection.server.exec":"Exec","connection.server.exec.tooltip":"Executable path used to launch the MCP server","connection.reconnect":"Reconnect","connection.checkSettings":"Check Settings","connection.agents.title":"AI Agents","connection.agents.name":"Agent","connection.agents.cwd":"Working Dir","connection.agents.cwd.tooltip":"Current working directory for the connected AI agent","connection.agents.projectRoot":"Project Root","connection.agents.projectRoot.tooltip":"Authoritative project root for sync ownership","connection.agents.projectRoot.unresolved":"Unresolved","connection.agents.connected":"Connected","connection.agents.unknown":"Unknown","connection.agents.none":"No agents connected","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Client ID","connection.plugins.clientId.tooltip":"Unique plugin client identifier for this Studio connection","connection.plugins.lastSeen":"Last Seen","connection.plugins.lastSeen.tooltip":"Most recent heartbeat received from the plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Installed plugin version reported by Studio","connection.plugins.none":"No plugins connected","connection.log.title":"Connection Log","connection.log.empty":"No events yet","connection.time.secondsAgo":"s ago","connection.time.minutesAgo":"m ago","connection.time.hoursAgo":"h ago","common.loading":"Loading...","common.retry":"Retry","common.reconnecting":"Reconnecting...","common.expand":"Expand","common.collapse":"Collapse","tools.tab.history":"History","tools.tab.statistics":"Statistics","tools.tab.failures":"Failures","tools.col.time":"Time","tools.col.time.tooltip":"When the tool run was recorded.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Tool name and action that were executed.","tools.col.duration":"Duration","tools.col.duration.tooltip":"How long the tool took to finish.","tools.col.status":"Status","tools.col.status.tooltip":"Outcome of the recorded tool run.","tools.col.tier":"Tier","tools.col.tier.tooltip":"License tier required for the tool or action.","tools.col.tierStats.tooltip":"Basic, Pro, or Mixed summary for the tool statistics row.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Consolidated tool name in the statistics table.","tools.col.calls":"Calls","tools.col.calls.tooltip":"Total number of recorded calls for this tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Number of direct successful runs.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Number of runs that succeeded through fallback execution.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Number of blocked runs without fallback execution.","tools.col.err":"FAILED","tools.col.err.tooltip":"Number of runs that failed.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Percentage of calls that finished successfully.","tools.col.avgTime":"Avg Time","tools.col.avgTime.tooltip":"Average execution time across recorded calls.","tools.col.error":"Error","tools.filter.tool":"Tool","tools.filter.all":"All","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"This entry used a Pro-only tool or action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"The requested Pro action succeeded via a Basic fallback.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"The requested Pro action was blocked and no fallback ran.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"The tool run failed.","tools.status.ok":"OK","tools.status.ok.tooltip":"The tool run completed successfully.","tools.tier.mixed.tooltip":"This tool includes both Basic and Pro actions.","tools.detail.params":"Parameters","tools.detail.params.tooltip":"Input parameters passed to this tool run.","tools.detail.result":"Result","tools.detail.result.tooltip":"Returned result payload for this tool run.","tools.detail.requestedCommand":"Command Sent","tools.detail.executedCommand":"Executed Command","tools.detail.alternatives":"Alternatives","tools.detail.blockedMessage":"Blocked Reason","tools.detail.noFallback":"No Fallback","tools.detail.noFallback.value":"No fallback ran.","tools.detail.errorMessage":"Error Message","tools.clear.history.title":"Clear history?","tools.clear.history.message":"This permanently removes the current place tools history.","tools.clear.statistics.title":"Clear statistics?","tools.clear.statistics.message":"This permanently resets the current place tool statistics.","tools.detail.error":"Error","tools.page.prev":"Prev","tools.page.prev.tooltip":"Go to the previous page of tool history results.","tools.page.next":"Next","tools.page.next.tooltip":"Go to the next page of tool history results.","tools.empty.history":"No history entries","tools.empty.stats":"No tool statistics","tools.empty.failures":"No failures","tools.summary.total":"Total","tools.summary.calls":"calls","tools.summary.sessions":"Sessions","settings.license.title":"License","settings.license.title.tooltip":"Current license status and subscription tier.","settings.license.status":"Status","settings.license.status.tooltip":"Current license activation state.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Current subscription tier for available WEPPY Dashboard features.","settings.license.key":"Key","settings.license.key.tooltip":"Masked license key currently loaded by the server.","settings.license.keyValue.tooltip":"Masked license key currently loaded by the server.","settings.license.provider":"Provider","settings.license.provider.tooltip":"License provider used to validate this key.","settings.license.providerValue.tooltip":"License provider used to validate this key.","settings.license.active":"Active","settings.license.active.tooltip":"Current license activation state.","settings.license.status.activeCancelPending.tooltip":"Cancellation is pending, but Pro access remains active until the current billing period ends.","settings.license.inactive":"Inactive","settings.license.inactive.tooltip":"Current license activation state.","settings.license.expired":"Expired","settings.license.expired.tooltip":"Current license activation state.","settings.license.unavailable":"License info unavailable","settings.license.detail.cancelPending":"Cancellation is scheduled. Pro access remains active until the current billing period ends.","settings.license.reset":"Reset License","settings.readOnly":"Read-only","settings.readOnly.tooltip":"This section shows values that cannot be edited from the WEPPY Dashboard.","settings.unavailable":"Settings unavailable","settings.general.title":"General Settings","settings.general.title.tooltip":"Hot settings that apply immediately when changed.","settings.general.liveApply":"Live Apply","settings.general.liveApply.tooltip":"Changes in this section are applied immediately without a separate save button.","settings.general.applied":"Applied","settings.general.logLevel":"Log Level","settings.general.logLevel.tooltip":"Choose how much detail the MCP server writes to logs. Lower to ‘debug’ when tracking down a problem.","settings.general.localHistory":"Tool History Recording","settings.general.localHistory.tooltip":"Save AI tool runs to disk. Required for the Tools and History pages.","settings.general.localStatistics":"Tool Statistics Collection","settings.general.localStatistics.tooltip":"Aggregate tool usage counts. Used by the Overview statistics.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"Save structured execution context so the Changelog and Playtest views can render it.","settings.general.requestTimeout":"Action Timeout","settings.general.requestTimeout.tooltip":"Maximum time (in ms) to wait for a single tool action before failing.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Action timeout is measured in milliseconds.","settings.cold.title":"Server Environment","settings.cold.title.tooltip":"Read-only server environment values loaded at startup.","settings.cold.httpPort.tooltip":"Port number used by the MCP WEPPY Dashboard HTTP server.","settings.cold.httpHost.tooltip":"Host interface that the MCP WEPPY Dashboard HTTP server binds to.","settings.cold.dashboardAutoOpen.tooltip":"Controls whether the WEPPY Dashboard opens automatically in the browser when the server starts.","settings.cold.dashboardAutoOpen.value.tooltip":"Current startup behavior for opening the WEPPY Dashboard in a browser.","settings.cold.hint":"Set via environment variables to change these values.","settings.language.title":"Language","settings.language.title.tooltip":"Choose how the WEPPY Dashboard interface text is localized.","settings.language.dashboard":"WEPPY Dashboard Language","settings.language.dashboard.tooltip":"Overrides the WEPPY Dashboard language or follows the system language when set to Auto.","settings.language.auto":"Auto","overview.l0.title":"MCP Server Disconnected","overview.l0.message":"The MCP server is not responding. The WEPPY Dashboard will automatically attempt to reconnect.","overview.l0.step1":"Check that the MCP server process is running","overview.l0.step2":"Restart the MCP server command if needed","overview.l0.reconnecting":"Auto-reconnecting every 3s...","overview.l0.reconnectBtn":"Reconnect","overview.l0.settingsBtn":"Check Settings","overview.l1.pluginGuide":"Roblox Studio plugin is not connected","overview.l1.check1":"Is Roblox Studio running?","overview.l1.check2":"Is the WEPPY Plugin installed?","overview.l1.feedHint":"Changes will appear here once the plugin connects","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP server runtime and process status","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio plugin connection and version status","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Connected AI coding agents and their runtime state","overview.metric.agent.instancesUnit":"instances","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Current Studio to local sync activity","overview.metric.noAgent":"No Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installed MCP server version","overview.meta.session":"Session","overview.meta.session.tooltip":"Current MCP session identifier","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Operating system process identifier","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Time elapsed since the MCP server started","overview.feed.title":"Recent Game Changes","overview.feed.empty":"No recent changes","overview.changelog.title":"Session Change Summary","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instances","overview.changelog.properties":"properties","overview.changelog.assets":"assets","overview.tier.title":"Tier Usage","changelog.subtitle":"Game Change History","changelog.filter.all":"All","changelog.filter.active":"Active","changelog.filter.completed":"Completed","changelog.empty":"No changelog entries yet","changelog.basic.limit.title":"Basic preview shows the latest 3 sessions","changelog.basic.limit.body":"Upgrade to Pro to browse the full changelog timeline for this place.","changelog.basic.metricLabel":"Visible Changelog / Total","changelog.basic.visible":"visible","changelog.basic.total":"total","changelog.card.active":"Active","changelog.card.active.tooltip":"This session is still receiving new game changes.","changelog.card.completed":"Completed","changelog.card.completed.tooltip":"This session has ended and no more changes are expected.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"This session only contains the initial sync bootstrap snapshot.","changelog.card.inProgress":"in progress","changelog.card.noChanges":"No changes yet","changelog.card.noChanges.tooltip":"No game changes have been extracted for this session yet.","changelog.card.bootstrapSummary":"Initial sync snapshot","changelog.card.bootstrapSummary.tooltip":"Initial file sync writes are collapsed into a single bootstrap snapshot row.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Script changes made in this session.","changelog.card.instances":"instances","changelog.card.instances.tooltip":"Instance create, delete, move, or clone changes in this session.","changelog.card.modified":"modified","changelog.card.created":"created","changelog.card.deleted":"deleted","changelog.card.moved":"moved","changelog.card.propertiesChanged":"properties changed","changelog.card.propertiesChanged.tooltip":"Property value changes recorded for this session.","changelog.card.lightingConfigured":"Lighting configured","changelog.card.lightingConfigured.tooltip":"Lighting or atmosphere settings changed in this session.","changelog.card.terrainConfigured":"Terrain configured","changelog.card.terrainConfigured.tooltip":"Terrain data or terrain settings changed in this session.","changelog.card.assetsInserted":"assets inserted","changelog.card.assetsInserted.tooltip":"Assets inserted into the place during this session.","changelog.category.script":"Scripts","changelog.category.instance":"Instances","changelog.category.property":"Properties","changelog.category.lighting":"Lighting","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Change Summary","changelog.detail.changeSummary.tooltip":"Counts of extracted game changes grouped by category for this session.","changelog.detail.changeTimeline":"Change Timeline","changelog.detail.changeTimeline.tooltip":"Chronological list of extracted game changes for this session.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Before & After","changelog.detail.filterCategory":"Category","changelog.detail.filterCategory.tooltip":"Filter the timeline to a single change category.","changelog.detail.confidence.exact":"Exact","changelog.detail.confidence.exact.tooltip":"Both the before and after state were confirmed for this change.","changelog.detail.confidence.partial":"Partial","changelog.detail.confidence.partial.tooltip":"Only part of the before and after state could be confirmed for this change.","changelog.detail.confidence.afterOnly":"After only","changelog.detail.confidence.afterOnly.tooltip":"Only the resulting state after the change could be confirmed.","changelog.detail.confidence.intentOnly":"Intent only","changelog.detail.confidence.intentOnly.tooltip":"Only the requested action was recorded, not the resulting state.","changelog.detail.confidence.unknown":"Unknown","changelog.detail.confidence.unknown.tooltip":"This change could not be confidently classified from the available data.","changelog.detail.noChanges":"No changes in this category","changelog.detail.backToList":"Back to list","changelog.diff.empty":"No diff available","changelog.diff.unified":"Unified","changelog.diff.sideBySide":"Side by Side","changelog.diff.before":"Before","changelog.diff.after":"After","sync.overlay.title":"Roblox Studio plugin required","sync.overlay.message":"Sync status will be available once the Roblox Studio plugin connects.","sync.overlay.check1":"Is Roblox Studio running?","sync.overlay.check2":"Is the WEPPY Plugin installed?","sync.status.title":"Sync Status","sync.status.title.tooltip":"Current Studio and local file sync status for this place.","sync.status.forwardOnly":"Forward Only","sync.status.forwardOnly.tooltip":"Basic tier allows Studio to local forward sync only.","sync.status.place":"Place","sync.status.place.tooltip":"Connected Roblox place name and place ID.","sync.status.path":"Path","sync.status.path.tooltip":"Local filesystem root currently used for sync output.","sync.status.instances":"Instances","sync.status.instances.tooltip":"Total synced Roblox instances tracked in the local mirror.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total synced script files currently indexed for this place.","sync.status.state":"State","sync.status.state.tooltip":"Current runtime sync state reported by the server.","sync.directions.title":"Sync Directions","sync.directions.title.tooltip":"Per-category sync direction and apply behavior between Local and Studio.","sync.directions.type":"Type","sync.directions.type.tooltip":"Sync category affected by this rule.","sync.directions.direction":"Direction","sync.directions.direction.tooltip":"Whether each category syncs from Studio, to Studio, or both ways.","sync.directions.applyMode":"Apply Mode","sync.directions.applyMode.tooltip":"How incoming sync changes are applied for this category.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Values","sync.directions.cat.containers":"Containers","sync.directions.cat.data":"Data","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Local files on disk are always shown on the left side of the direction rail.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio is always shown on the right side of the direction rail.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Applies sync changes only when you trigger them manually.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Applies sync changes automatically when updates arrive.","sync.directions.tooltip.forward.body":"Studio changes sync to local files only","sync.directions.tooltip.bidirectional.body":"Two-way sync between Local and Studio","sync.directions.tooltip.reverse.body":"Push local file changes to Studio","sync.directions.tooltip.proRequired":"Pro required in Basic tier","sync.directions.dir.forward":"forward","sync.directions.dir.bidirectional":"bidirectional","sync.directions.dir.reverse":"reverse","sync.log.title":"Sync Log","sync.log.empty":"No sync events yet","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"A new sync output was written to disk.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"An existing synced file or instance was updated.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"A synced file or instance was removed.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"A sync event was recorded without a file mutation.","sync.upgrade.title":"Unlock Full Sync with Pro","sync.upgrade.benefit1":"Bidirectional sync — edit files, auto-apply to Studio","sync.upgrade.benefit2":"Reverse sync — push file changes back to Studio","sync.upgrade.benefit3":"Full sync history and detailed change log","sync.upgrade.buy":"Upgrade to Pro","playtest.status.title":"Playtest Status","playtest.status.title.tooltip":"Current Roblox playtest session state reported by Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Studio playtest launch mode for the current session.","playtest.status.mode.value.tooltip":"Specific Roblox Studio playtest mode currently in use.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox place currently associated with this playtest session.","playtest.status.state.running":"Running","playtest.status.state.running.tooltip":"A Roblox playtest session is currently running.","playtest.status.state.paused":"Paused","playtest.status.state.paused.tooltip":"The current Roblox playtest session is paused.","playtest.status.state.notRunning":"Not Running","playtest.status.state.notRunning.tooltip":"No Roblox playtest session is currently running.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Test History","playtest.history.title.tooltip":"Recorded automated playtest runs for this project.","playtest.history.empty":"No test results yet","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Playtest mode used for this recorded test run.","playtest.history.status.passed":"Passed","playtest.history.status.failed":"Failed","playtest.history.status.running":"Running","playtest.history.status.unknown":"Unknown","playtest.history.status.tooltip":"Recorded result state for this automated playtest run.","playtest.empty.title":"No playtest results yet","playtest.empty.message":"Test results will appear here when the AI agent runs automated tests via system_info.run_test.","playtest.empty.message.before":"Test results will appear here when the AI agent runs automated tests via","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"WEPPY Dashboard automation entry point that runs Roblox playtest checks through the system_info tool.","playtest.report.title":"Selected Report","playtest.report.title.tooltip":"Detailed output for the currently selected automated playtest run.","playtest.report.content":"Report","playtest.report.content.tooltip":"Markdown summary for the selected automated playtest run.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Execution logs captured for the selected automated playtest run.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"No report content available","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest is a Pro-only feature","playtest.basic.desc":"Control playtesting from the WEPPY Dashboard, run automated tests, and view detailed test reports.","playtest.basic.benefit1":"One-click play/pause/stop controls","playtest.basic.benefit2":"Automated test execution via AI agent","playtest.basic.benefit3":"Test history with pass/fail tracking","playtest.basic.benefit4":"Detailed markdown test reports","playtest.sample.badge":"Preview of the Pro playtest view","playtest.sample.title":"You are previewing the playtest screen that becomes available after upgrading to Pro.","playtest.sample.message":"This preview uses sample data. Live playtest control, history management, and real reports unlock with Pro.","playtest.sample.clearDisabled":"Upgrade to Pro to clear live playtest history.","playtest.sample.place":"Arena Preview","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Spawn into the arena, survive the opener, and verify the HUD responds immediately.","playtest.sample.context.expected":"The player spawns safely, the countdown UI appears within one second, and the first wave starts without errors.","playtest.sample.context.observed":"Spawn protection held, the HUD updated on time, and wave one completed with no gameplay regressions.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
70
70
 
71
71
  - Spawn flow: PASS
72
72
  - HUD countdown: PASS
@@ -76,7 +76,7 @@ This is a sample preview. Upgrade to Pro to run live playtests and save real rep
76
76
  [sample] spawn protection active
77
77
  [sample] hud countdown rendered
78
78
  [sample] wave one completed
79
- [sample] preview report finished`,"sidebar.whatsNew":"What's New","sidebar.help.group":"Help & Feedback","sidebar.help.bug":"Report a bug","sidebar.help.bug.tooltip":"Open a prefilled bug report on GitHub","sidebar.help.feature":"Suggest a feature","sidebar.help.feature.tooltip":"Suggest a new feature or improvement on GitHub","sidebar.help.discussions":"Community","sidebar.help.discussions.tooltip":"Ask questions and share ideas on GitHub Discussions","sidebar.help.troubleshooting":"Troubleshooting","sidebar.help.troubleshooting.tooltip":"Open the official troubleshooting guide on weppyai.com","header.whatsNew":"What's New","header.whatsNew.tooltip":"What's New","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"What's New","whatsNew.pageSubtitle":"Stay up to date with MCP changes","whatsNew.unreadSection":"Unread","whatsNew.allSection":"All Announcements","whatsNew.empty":"No announcements yet","whatsNew.newBadge":"NEW","whatsNew.category.release":"Release","whatsNew.category.notice":"Notice","whatsNew.category.deprecation":"Deprecated","whatsNew.category.tip":"Tip","uiStudio.title":"UI Studio","uiStudio.empty":"No screenshots saved yet. They are created automatically when an AI agent captures the current UI state.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio plugin is not connected","uiStudio.pluginGuide.message":"UI Studio shows screenshots and change history from the connected Studio place. It will update automatically after Studio and the WEPPY Plugin connect.","uiStudio.pluginGuide.check1":"Is Roblox Studio running?","uiStudio.pluginGuide.check2":"Is the WEPPY Plugin installed and running?","uiStudio.pluginGuide.waiting":"Waiting for plugin connection...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Review first","uiStudio.priorityLow":"Optional improvement","uiStudio.highPrioritySection":"Review first","uiStudio.lowPrioritySection":"Optional improvements","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analysis","uiStudio.tabs.history":"History","uiStudio.analysis.reportsTitle":"Latest Analysis by UI Target","uiStudio.analysis.recentCapturesTitle":"Recent Captures","uiStudio.analysis.detailDialog":"Analysis detail","uiStudio.analysis.targetCountLabel":"Targets analyzed","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Improvement Suggestions","uiStudio.analysis.verdict.needsFix":"Improvement Suggestions","uiStudio.analysis.verdict.review":"Improvement Suggestions","uiStudio.analysis.verdict.passed":"No Current Suggestions","uiStudio.analysis.verdictLabel":"Improvement Summary","uiStudio.analysis.thresholds":"Review basis","uiStudio.analysis.issueSummary.passed":"No additional improvement suggestions under the current review basis.","uiStudio.history.title":"Change History","uiStudio.history.empty":"No history yet. When an AI agent modifies UI using manage_ui, it will be recorded automatically.","uiStudio.history.loading":"Loading...","uiStudio.history.error":"Error","uiStudio.history.clear":"Clear","uiStudio.history.filter.actions":"Action type","uiStudio.history.filter.actionAll":"All","uiStudio.history.filter.actionCreate":"Create","uiStudio.history.filter.actionUpdate":"Update","uiStudio.history.filter.actionDelete":"Delete","uiStudio.history.filter.period":"Period","uiStudio.history.filter.dateAll":"All","uiStudio.history.filter.today":"Today","uiStudio.history.filter.yesterday":"Yesterday","uiStudio.history.filter.last7Days":"Last 7 days","uiStudio.history.filter.last30Days":"Last 30 days","uiStudio.history.filter.customRange":"Custom range","uiStudio.history.filter.reset":"Reset","uiStudio.history.filter.from":"From","uiStudio.history.filter.to":"To","uiStudio.history.row.affectedPaths":"Paths","uiStudio.history.row.mutations":"Change details","uiStudio.history.row.expand":"▾ Expand","uiStudio.history.row.collapse":"▲ Collapse","uiStudio.history.row.expandDetails":"Show {n} change details","uiStudio.history.row.collapseDetails":"Hide change details","uiStudio.history.row.toggleDetails":"Toggle change details","uiStudio.history.row.mutationsEmpty":"No change details","uiStudio.history.row.toolLabel":"UI changes ({n})","uiStudio.history.row.compare":"Before / After","uiStudio.history.row.noBeforeState":"No before state","uiStudio.history.row.noAfterState":"No after state","uiStudio.history.row.qualityPlan":"Design direction","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: unavailable","uiStudio.history.row.designCheckNone":"Suggestions: none","uiStudio.history.selection.deleteSelected":"Delete Selected","uiStudio.history.selection.selectAll":"Select All","uiStudio.history.selection.clearSelection":"Clear Selection","uiStudio.history.confirm.deleteRequestsTitle":"Delete Change Records","uiStudio.history.confirm.deleteRequestsMessage":"The selected change records will be deleted. This action cannot be undone.","uiStudio.history.confirm.clearRequestsTitle":"Clear Change History","uiStudio.history.confirm.clearRequestsMessage":"This clears the current place change history. Studio instances are not affected.","uiStudio.history.confirm.cascadeOption":"Also delete linked screenshots","uiStudio.history.drawer.close":"Close","uiStudio.actions.previewAgain":"Preview Again","uiStudio.actions.deleteSnapshot":"Delete This Screenshot","uiStudio.actions.proRequired":"Available after upgrading to Pro","uiStudio.actions.captureCurrentState":"Capture Current State","uiStudio.actions.checkSuggestionsAgain":"Re-check Suggestions","uiStudio.actions.previewRunning":"Capturing…","uiStudio.actions.previewRunningDetail":"The new screenshot file ID will appear when capture finishes.","uiStudio.actions.previewNeedsSaveCheck":"Capture complete, save needs review","uiStudio.actions.previewSaved":"New screenshot saved","uiStudio.actions.previewComplete":"Capture complete","uiStudio.actions.previewSavedDetail":"Existing screenshots are kept; this was saved as a new file.","uiStudio.actions.previewSavedPathMissing":"A new screenshot ID was returned, but the saved file path could not be confirmed.","uiStudio.actions.previewSnapshotIdMissing":"The new screenshot ID could not be confirmed. Refresh the list to verify whether it was saved.","uiStudio.actions.more":"More","uiStudio.gallery.selection.selectedCount":" selected","uiStudio.confirm.deleteSnapshotTitle":"Delete Screenshot","uiStudio.confirm.deleteSnapshotMessage":"Only this screenshot file will be deleted (the Studio instance is preserved).","uiStudio.confirm.deleteBatchTitle":"Delete Selected Screenshots","uiStudio.confirm.deleteBatchMessage":"The selected screenshots will be deleted. This action cannot be undone.","uiStudio.gallery.selectMode":"Select","uiStudio.gallery.exitSelectMode":"Cancel","uiStudio.gallery.selectAll":"Select All","uiStudio.gallery.clearSelection":"Clear Selection","uiStudio.gallery.deleteSelected":"Delete Selected","common.cancel":"Cancel","common.delete":"Delete","uiStudio.storage.title":"UI Studio Saved Data","uiStudio.storage.usageLabel":"In use","uiStudio.storage.historyBytes":"Change history","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Change records","uiStudio.storage.mutationCount":"Change details","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Last auto-cleanup","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freed","uiStudio.storage.lastRunErrors":"Errors","uiStudio.storage.loading":"Loading...","uiStudio.cleanup.policy.title":"Auto-delete Policy","uiStudio.cleanup.policy.modeOff":"Off","uiStudio.cleanup.policy.modeAge":"Age-based","uiStudio.cleanup.policy.modeSize":"Size-based","uiStudio.cleanup.policy.cascade":"Also delete linked screenshots","uiStudio.cleanup.policy.save":"Save Policy","uiStudio.cleanup.policy.runNow":"Run Now","uiStudio.cleanup.policy.proRequired":"Available after upgrading to Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirm Policy","uiStudio.cleanup.policy.confirm.messageStrict":"Applying this policy will immediately delete","uiStudio.cleanup.policy.confirm.requests":" change records","uiStudio.cleanup.policy.confirm.snapshots":" screenshots","uiStudio.cleanup.policy.confirm.freed":"freed — Apply?","uiStudio.cleanup.keepLastNDays":"Keep last {n} days","uiStudio.cleanup.selectedDelete":"Delete Selected…","uiStudio.cleanup.deleteAll":"Delete All…","uiStudio.cleanup.cleanupConfirmTitle":"Confirm Cleanup","uiStudio.cleanup.cleanupConfirmMessage":"All selected items will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manual cleanup","uiStudio.cleanup.studioPreservedNote":"This deletes saved change records and screenshots on disk only; Roblox Studio instances are not affected.","uiStudio.history.sample.bannerBadge":"Preview of the Pro change history","uiStudio.history.sample.bannerTitle":"You are previewing the UI change history that unlocks after upgrading to Pro.","uiStudio.history.sample.bannerMessage":"This preview uses sample data. Real change history, before/after comparison, and batch delete unlock with Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","uiStudio.history.sample.tooltip":"Upgrade to Pro to unlock full history","toast.serverConnected":"MCP server connected","toast.serverDisconnected":"MCP server disconnected","toast.pluginConnected":"Plugin connected","toast.pluginDisconnected":"Plugin disconnected","toast.clearSuccess":"Cleared successfully","toast.clearFailed":"Failed to clear data","common.clear":"Clear","settings.license.activate":"Activate License","settings.license.refresh":"Refresh License","settings.license.keyInput":"License Key","settings.license.disconnected":"Disconnected","settings.license.disconnected.tooltip":"Reconnect to the MCP server to manage license actions from WEPPY Dashboard.","settings.license.live.tooltip":"License actions are sent to the MCP server immediately.","settings.license.status.activationRequired":"Activation Required","settings.license.status.activationRequired.tooltip":"Manual license activation is required before WEPPY Dashboard can refresh this status.","settings.license.status.grace":"Grace","settings.license.status.grace.tooltip":"Provider verification is temporarily unavailable, but Pro access remains active during the grace period.","settings.license.status.graceBilling.tooltip":"Pro access is still available during a billing-related grace period.","settings.license.detail.graceBilling":"Pro access remains available during a billing grace period.","settings.license.detail.graceProviderUnavailable":"Provider unavailable. Pro access remains active during grace mode.","settings.license.detail.manualActivation":"Manual activation required to restore Pro access.","settings.license.detail.missingSessionToken":"Refresh is blocked because the current session token is missing.","settings.license.detail.refreshRecommended":"License verification should be refreshed soon.","connection.agents.kill":"Kill","connection.agents.kill.title":"Kill agent?","connection.agents.killed":"Agent killed","connection.agents.killFailed":"Failed to kill agent","connection.agents.lastCommand":"Last Command","connection.agents.lastCommand.tooltip":"Most recent tool call executed by this agent","connection.agents.lastSeen":"Last Seen","connection.agents.lastSeen.tooltip":"Most recent heartbeat or activity from this agent","connection.clear.title":"Clear connection log?","connection.clear.message":"This permanently removes the stored connection log for the current project.","sync.clear.title":"Clear sync log?","sync.clear.message":"This permanently removes the stored sync log for the current place.","playtest.clear.title":"Clear test history?","playtest.clear.message":"This permanently removes the stored playtest reports for the current place.","changelog.clear.title":"Clear changelog?","changelog.clear.message":"This permanently removes the stored changelog for the current place.","sync.status.placePath":"Place Path","sync.status.placePath.tooltip":"Active place directory where explorer files are synced.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Representative area","changelog.card.verification":"Verification","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Brief design direction used for this change.","uiStudio.history.row.designCheck.tooltip":"Post-change Design Check suggestion summary.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Design Check suggestions","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Check again","uiStudio.actions.designCheckRunning":"Checking suggestions...","uiStudio.actions.designCheckRunningDetail":"Review first, recommended, and optional item counts will appear when the check finishes.","uiStudio.actions.designCheckComplete":"Suggestion check complete","uiStudio.actions.designCheckNoSnapshotSaved":"This action does not save a new screenshot file.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Number of suggestions to review first. Click for details.","uiStudio.gallery.priorityMediumBadge.tooltip":"Number of recommended suggestions.","uiStudio.priorityMedium":"Review recommended","uiStudio.mediumPrioritySection":"Review recommended","uiStudio.gallery.priorityLowBadge.tooltip":"Number of optional improvements."},_f={"sidebar.overview":"개요","sidebar.changelog":"변경 이력","sidebar.connection":"연결","sidebar.sync":"동기화","sidebar.playtest":"플레이테스트","sidebar.tools":"도구","sidebar.settings":"설정","sidebar.ui_studio":"UI 스튜디오","sidebar.gate.l1":"MCP 서버를 연결해야 이 페이지를 사용할 수 있습니다.","sidebar.gate.l2":"Roblox Studio 플러그인을 연결해야 이 페이지를 사용할 수 있습니다.","header.currentProject":"현재 프로젝트","header.unknownProject":"알 수 없는 프로젝트","header.projectRoot.label":"Project Root","header.currentProject.loading":"프로젝트 루트 불러오는 중...","header.currentProject.unavailable":"프로젝트 루트를 불러올 수 없음","header.placeNotConnected":"플레이스 미연결","header.currentProject.tooltip":"현재 선택된 프로젝트 폴더입니다.","header.currentProject.loading.tooltip":"프로젝트 루트 정보를 아직 불러오는 중입니다.","header.currentProject.unavailable.tooltip":"현재 프로젝트 루트 정보를 불러올 수 없습니다.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Sync root 불러오는 중...","header.currentProjectSyncRoot.unavailable":"Sync root 정보를 불러올 수 없음","header.currentProjectSyncRoot.tooltip":"선택된 프로젝트의 현재 sync root 폴더입니다.","header.currentProjectSyncRoot.loading.tooltip":"Sync root 정보를 아직 불러오는 중입니다.","header.currentProjectSyncRoot.unavailable.tooltip":"현재 sync root 정보를 불러올 수 없습니다.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"테스트 파일 경로를 확인할 수 없습니다.","header.testFiles.tooltip":"선택된 플레이스의 현재 플레이테스트 파일 경로입니다.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"플러그인 연결 필요","header.places.liveRequired":"실시간 활성 플레이스를 확인하려면 플러그인 연결이 필요합니다.","header.place.tooltip":"연결된 Roblox 플레이스입니다.","header.placeNotConnected.tooltip":"플레이스 미연결","header.changeProjectRoot":"프로젝트 루트 변경","header.changeProjectRoot.ariaLabel":"프로젝트 루트 변경","header.changeProjectRoot.tooltip":"현재 프로젝트 루트를 변경합니다.","header.changeProjectRoot.disabledTooltip.l0":"프로젝트 루트를 변경하려면 먼저 MCP 서버 연결이 필요합니다.","header.changeProjectRoot.disabledTooltip.loading":"프로젝트 루트 정보를 아직 불러오는 중입니다.","header.changeProjectRoot.disabledTooltip.unavailable":"현재 프로젝트 루트 정보를 불러올 수 없습니다.","header.projectRootModal.initial.title":"프로젝트 루트 변경","header.projectRootModal.initial.body.connected":"프로젝트 폴더를 선택하면 MCP 프로젝트 루트가 즉시 변경되고 현재 Studio 내용이 새 <selected project folder>/weppy-project-sync 대상으로 전체 재동기화됩니다.","header.projectRootModal.initial.body.disconnected":"프로젝트 폴더를 선택하면 MCP 프로젝트 루트가 즉시 변경되고 새 <selected project folder>/weppy-project-sync 경로가 다음 sync 대상으로 사용됩니다.","header.projectRootModal.initial.nextSyncRoot":"선택 후 새 sync 대상","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"현재 sync는 즉시 중단됩니다.","header.projectRootModal.initial.warningFreshSync":"현재 Studio 내용을 기준으로 새 대상에 fresh full sync가 다시 생성됩니다.","header.projectRootModal.initial.warningNoMove":"기존 sync 폴더는 자동으로 이동되지 않습니다.","header.projectRootModal.initial.warningDeferredSync":"Studio가 아직 연결되지 않았다면 전체 재동기화는 다음 플러그인 연결 시 시작됩니다.","header.projectRootModal.confirm.title":"새 프로젝트 루트 확인","header.projectRootModal.confirm.body":"적용 전에 선택한 프로젝트 폴더를 다시 확인하세요.","header.projectRootModal.confirm.projectRoot":"선택한 프로젝트 폴더","header.projectRootModal.confirm.syncRoot":"새 sync 대상","header.projectRootModal.confirm.warningNoMove":"기존 sync 폴더는 자동으로 이동되지 않습니다.","header.projectRootModal.pick":"폴더 선택","header.projectRootModal.apply":"변경 적용","header.projectRootModal.cancel":"취소","header.projectRootModal.error":"프로젝트 루트를 변경하지 못했습니다.","status.online":"온라인","status.offline":"오프라인","status.idle":"대기","status.syncing":"동기화 중","status.error":"오류","status.initializing":"초기화 중","level.l0.title":"서버 연결 끊김","level.l0.message":"WEPPY Dashboard가 열린 뒤 서버가 종료되었거나 응답하지 않습니다.","level.l1.title":"서버 연결됨","level.l1.hint":"확인: Studio 실행 중? 플러그인 설치?","level.l2.ok":"Studio 연결됨","tier.basic":"Basic","tier.basic.tooltip":"기본 WEPPY Dashboard 기능을 제공하는 Basic 티어입니다.","tier.pro":"Pro","tier.pro.tooltip":"전체 WEPPY Dashboard 기능을 제공하는 Pro 티어입니다.","tier.mixed":"혼합","tier.upgrade":"Pro로 업그레이드","tier.compare":"Basic vs Pro 비교","tier.banner.save":"Pro로 AI 토큰 절약!","tier.comparison.comingSoon":"Basic vs Pro 비교 — 준비 중","tier.comparison.close":"닫기","tier.comparison.detailTitle":"상세 도구 카탈로그","tier.comparison.description":"설명","tier.comparison.basic.core":"핵심 MCP 워크플로우","tier.comparison.basic.core.item1":"스크립트 생성/편집","tier.comparison.basic.core.item2":"인스턴스 관리","tier.comparison.basic.core.item3":"속성 제어","tier.comparison.basic.core.item4":"선택 및 검색","tier.comparison.basic.core.item5":"태그 관리","tier.comparison.basic.core.item6":"카메라 제어","tier.comparison.basic.core.item7":"로그 모니터링","tier.comparison.basic.sync":"동기화 (Basic)","tier.comparison.basic.sync.item1":"Studio에서 로컬로 단방향 동기화","tier.comparison.basic.sync.item2":"수동 적용이 기본값","tier.comparison.pro.all":"Basic의 모든 기능 포함, 추가로","tier.comparison.pro.sync":"고급 동기화 워크플로우","tier.comparison.pro.sync.item1":"유형별 동기화 방향 설정","tier.comparison.pro.sync.item2":"유형별 적용 모드","tier.comparison.pro.sync.item3":"양방향 및 역방향 동기화","tier.comparison.pro.sync.item4":"전체 동기화, 재동기화, Studio로 푸시","tier.comparison.pro.sync.item5":"멀티 플레이스 동기화","tier.comparison.pro.playtest":"플레이테스트 제어","tier.comparison.pro.playtest.item1":"플레이, 정지, 일시정지, 재개","tier.comparison.pro.playtest.item2":"플레이테스트 상태 검사","tier.comparison.pro.playtest.item3":"자동 테스트 실행","tier.comparison.pro.creation":"고급 생성 워크플로우","tier.comparison.pro.creation.item1":"대량 작업","tier.comparison.pro.creation.item2":"터레인 생성","tier.comparison.pro.creation.item3":"에셋 검색 및 삽입","tier.comparison.pro.creation.item4":"레이캐스트 및 공간 분석","tier.comparison.pro.creation.item5":"환경 제어","tier.comparison.pro.ui":"AI UI 디자인 (UI Studio)","tier.comparison.pro.ui.item1":"design_brief — UI 요구사항 가이드 수집","tier.comparison.pro.ui.item2":"create_tree / update / delete — UI 트리 생성·수정","tier.comparison.pro.ui.item3":"preview — 현재 UI 화면 캡처","tier.comparison.pro.ui.item4":"Design Check — 터치 타겟·대비·세이프존 검증","tier.comparison.discount.label":"🎁 Gumroad 결제 시 아래 코드를 입력하면 할인 받을 수 있어요:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"4월 30일까지 유효","tier.promo.discount.hint":"🎁 Gumroad에서 WEPPY-MCP 코드 사용 · 4월 30일까지","tier.promo.discount.context":"🎁 Gumroad 결제 시 할인코드 입력:","tier.tool.query_instances.desc":"인스턴스 조회, 자식/자손 탐색, 클래스 정보, 이름·클래스 검색. Pro: 파일 트리, 프로젝트 구조, 속성·태그 검색.","tier.tool.mutate_instances.desc":"인스턴스 생성, 삭제, 복제, 이동, 이름변경, 피벗. Pro: 트리 생성, 대량 생성·삭제·복제.","tier.tool.manage_properties.desc":"속성, 어트리뷰트, 태그 조회 및 설정. Pro: 계산·상대값 설정, 대량 조회·설정, 자식 일괄 수정.","tier.tool.manage_scripts.desc":"스크립트 소스 코드 읽기, 쓰기, 생성, 삭제, 줄 편집, 검색. Pro: 스크립트 간 일괄 치환.","tier.tool.manage_lighting.desc":"Pro 전용. 조명, 대기, 하늘, 터레인 속성, 시간대 환경 설정.","tier.tool.manage_selection.desc":"선택 조회, 설정, 해제. Pro: 컨텍스트, 상세 정보, 항목 추가·제거, 변경 감시.","tier.tool.manage_camera.desc":"카메라 정보 조회, 경로 또는 좌표로 포커스, 추천 뷰 제안.","tier.tool.manage_tween.desc":"Pro 전용. 부드러운 애니메이션을 위한 트윈 생성, 재생, 일시정지, 취소.","tier.tool.manage_audio.desc":"Pro 전용. 사운드 재생, 정지, 일시정지, 재개. 오디오 리스너 설정.","tier.tool.manage_animation.desc":"Pro 전용. 애니메이션 로드, 재생, 정지. 휴머노이드·컨트롤러의 트랙 조회.","tier.tool.manage_physics.desc":"Pro 전용. 물리 충돌 그룹 등록, 그룹 간 충돌 설정, 목록 조회.","tier.tool.manage_effects.desc":"Pro 전용. 파티클 방출, 전체 삭제, 이펙트 활성화 토글.","tier.tool.manage_terrain.desc":"Pro 전용. 도형 채우기, 영역 삭제, 재질 치환, 색상 관리, 복셀 읽기·쓰기, 절차적 생성, 스무딩.","tier.tool.spatial_query.desc":"Pro 전용. 레이캐스트, 지면 찾기, 배치 확인, 영역 스캔, 평지·스폰 위치 탐색, 보행 분석, 공간 맵, 충돌 확인.","tier.tool.manage_assets.desc":"Pro 전용. 모델 삽입, 에셋 정보 조회, 크리에이터 스토어 검색, 무료 모델·패키지 삽입, 내보내기.","tier.tool.manage_sync.desc":"Pro 전용. 동기화 상태, 설정, 히스토리, 방향 설정, 동기화 파일 읽기·쓰기.","tier.tool.workspace_state.desc":"Pro 전용. 전체 동기화, 상태 캡처, 최근 변경, 뷰포트 정보, 메타데이터, 캐시 관리.","tier.tool.manage_logs.desc":"출력 로그 필터링 조회, 증분 폴링, 버퍼 삭제, 최근 오류 조회.","tier.tool.system_info.desc":"연결 상태, 사용 티어 확인. Pro: 플레이스 정보, 서비스 목록, Studio 설정, 플레이테스트 제어, 자동 테스트.","tier.tool.batch_execute.desc":"Pro 전용. 여러 명령을 한 번에 일괄 실행. 순차 처리하며 오류 시 계속 진행 옵션.","tier.tool.execute_luau.desc":"Pro 전용. Roblox Studio 샌드박스에서 임의 Luau 코드 실행.","connection.server.title":"서버 상태","connection.server.version":"버전","connection.server.version.tooltip":"설치된 MCP 서버 버전입니다.","connection.server.pid":"PID","connection.server.pid.tooltip":"운영체제에서 사용하는 프로세스 식별자입니다.","connection.server.uptime":"가동 시간","connection.server.uptime.tooltip":"MCP 서버가 시작된 뒤 경과한 시간입니다.","connection.server.session":"세션","connection.server.session.tooltip":"현재 MCP 세션 식별자입니다.","connection.server.exec":"실행 파일","connection.server.exec.tooltip":"MCP 서버를 실행한 실행 파일 경로입니다.","connection.reconnect":"수동 재연결","connection.checkSettings":"설정 확인","connection.agents.title":"AI 에이전트","connection.agents.name":"에이전트","connection.agents.cwd":"작업 디렉토리","connection.agents.cwd.tooltip":"연결된 AI 에이전트의 현재 작업 디렉토리입니다.","connection.agents.projectRoot":"프로젝트 루트","connection.agents.projectRoot.tooltip":"Sync ownership을 결정하는 프로젝트 경로","connection.agents.projectRoot.unresolved":"미확인","connection.agents.connected":"연결 시각","connection.agents.unknown":"알 수 없음","connection.agents.none":"연결된 에이전트 없음","connection.plugins.title":"플러그인","connection.plugins.place":"플레이스","connection.plugins.clientId":"클라이언트 ID","connection.plugins.clientId.tooltip":"현재 Studio 연결을 식별하는 플러그인 클라이언트 ID입니다.","connection.plugins.lastSeen":"마지막 확인","connection.plugins.lastSeen.tooltip":"플러그인에서 가장 최근에 수신한 heartbeat 시각입니다.","connection.plugins.version":"버전","connection.plugins.version.tooltip":"Studio가 보고한 설치된 플러그인 버전입니다.","connection.plugins.none":"연결된 플러그인 없음","connection.log.title":"연결 로그","connection.log.empty":"이벤트 없음","connection.time.secondsAgo":"초 전","connection.time.minutesAgo":"분 전","connection.time.hoursAgo":"시간 전","common.loading":"로딩 중...","common.retry":"재시도","common.reconnecting":"재연결 중...","common.expand":"펼치기","common.collapse":"접기","tools.tab.history":"히스토리","tools.tab.statistics":"통계","tools.tab.failures":"실패","tools.col.time":"시간","tools.col.time.tooltip":"도구 실행이 기록된 시각입니다.","tools.col.toolAction":"도구.액션","tools.col.toolAction.tooltip":"실행된 도구 이름과 액션입니다.","tools.col.duration":"소요 시간","tools.col.duration.tooltip":"도구 실행이 완료될 때까지 걸린 시간입니다.","tools.col.status":"상태","tools.col.status.tooltip":"기록된 도구 실행의 결과 상태입니다.","tools.col.tier":"티어","tools.col.tier.tooltip":"도구 또는 액션에 필요한 라이센스 티어입니다.","tools.col.tierStats.tooltip":"도구 통계 행이 Basic, Pro, Mixed 중 어느 집계인지 설명합니다.","tools.col.tool":"도구","tools.col.tool.tooltip":"통계 테이블에 표시되는 통합 도구 이름입니다.","tools.col.calls":"호출 수","tools.col.calls.tooltip":"이 도구에 대해 기록된 총 호출 횟수입니다.","tools.col.ok":"OK","tools.col.ok.tooltip":"직접 성공한 실행 횟수입니다.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"fallback 실행으로 성공한 횟수입니다.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"fallback 없이 차단된 실행 횟수입니다.","tools.col.err":"실패","tools.col.err.tooltip":"실패로 끝난 실행 횟수입니다.","tools.col.okRate":"성공률","tools.col.okRate.tooltip":"성공적으로 끝난 호출 비율입니다.","tools.col.avgTime":"평균 시간","tools.col.avgTime.tooltip":"기록된 호출들의 평균 실행 시간입니다.","tools.col.error":"오류","tools.filter.tool":"도구","tools.filter.all":"전체","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"이 항목은 Pro 전용 도구 또는 액션을 사용했습니다.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"요청한 Pro 액션이 Basic fallback으로 성공했습니다.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"요청한 Pro 액션이 차단되었고 fallback도 실행되지 않았습니다.","tools.badge.err":"실패","tools.badge.err.tooltip":"도구 실행이 실패로 끝났습니다.","tools.status.ok":"OK","tools.status.ok.tooltip":"도구 실행이 성공적으로 완료되었습니다.","tools.tier.mixed.tooltip":"이 도구에는 Basic 액션과 Pro 액션이 함께 포함됩니다.","tools.detail.params":"파라미터","tools.detail.params.tooltip":"이 도구 실행에 전달된 입력 파라미터입니다.","tools.detail.result":"결과","tools.detail.result.tooltip":"이 도구 실행에서 반환된 결과 페이로드입니다.","tools.detail.requestedCommand":"전송한 명령","tools.detail.executedCommand":"실행된 명령","tools.detail.alternatives":"대안","tools.detail.blockedMessage":"차단 사유","tools.detail.noFallback":"Fallback 없음","tools.detail.noFallback.value":"실행된 fallback이 없습니다.","tools.detail.errorMessage":"오류 메시지","tools.clear.history.title":"히스토리를 삭제할까요?","tools.clear.history.message":"현재 place의 도구 히스토리가 영구적으로 삭제됩니다.","tools.clear.statistics.title":"통계를 삭제할까요?","tools.clear.statistics.message":"현재 place의 도구 통계가 영구적으로 초기화됩니다.","tools.detail.error":"오류","tools.page.prev":"이전","tools.page.prev.tooltip":"도구 히스토리의 이전 페이지로 이동합니다.","tools.page.next":"다음","tools.page.next.tooltip":"도구 히스토리의 다음 페이지로 이동합니다.","tools.empty.history":"히스토리 없음","tools.empty.stats":"도구 통계 없음","tools.empty.failures":"실패 없음","tools.summary.total":"합계","tools.summary.calls":"호출","tools.summary.sessions":"세션","settings.license.title":"라이센스","settings.license.title.tooltip":"현재 라이센스 상태와 구독 티어입니다.","settings.license.status":"상태","settings.license.status.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.tier":"티어","settings.license.tier.tooltip":"WEPPY Dashboard 기능 범위를 결정하는 현재 구독 티어입니다.","settings.license.key":"키","settings.license.key.tooltip":"서버에 현재 로드된 마스킹된 라이센스 키입니다.","settings.license.keyValue.tooltip":"서버에 현재 로드된 마스킹된 라이센스 키입니다.","settings.license.provider":"제공자","settings.license.provider.tooltip":"이 키를 검증하는 라이센스 제공자입니다.","settings.license.providerValue.tooltip":"이 키를 검증하는 라이센스 제공자입니다.","settings.license.active":"활성","settings.license.active.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.status.activeCancelPending.tooltip":"해지가 예약되어 있지만 현재 결제 주기가 끝날 때까지 Pro 접근은 유지됩니다.","settings.license.inactive":"비활성","settings.license.inactive.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.expired":"만료","settings.license.expired.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.unavailable":"라이센스 정보를 불러올 수 없음","settings.license.detail.cancelPending":"해지가 예약되었습니다. 현재 결제 주기가 끝날 때까지 Pro 접근은 유지됩니다.","settings.license.reset":"라이센스 리셋","settings.readOnly":"읽기 전용","settings.readOnly.tooltip":"이 섹션의 값은 WEPPY Dashboard에서 수정할 수 없습니다.","settings.unavailable":"설정을 불러올 수 없음","settings.general.title":"일반 설정","settings.general.title.tooltip":"변경 즉시 적용되는 Hot 설정입니다.","settings.general.liveApply":"즉시 반영","settings.general.liveApply.tooltip":"이 섹션의 변경은 별도 저장 버튼 없이 바로 적용됩니다.","settings.general.applied":"적용됨","settings.general.logLevel":"로그 레벨","settings.general.logLevel.tooltip":"MCP 서버가 남기는 로그의 자세한 정도를 정합니다. 문제 추적이 필요하면 debug 로 낮추세요.","settings.general.localHistory":"도구 히스토리 기록","settings.general.localHistory.tooltip":"AI 도구 호출 기록을 컴퓨터에 저장합니다. Tools / History 화면에서 보기 위해 필요합니다.","settings.general.localStatistics":"도구 통계 집계","settings.general.localStatistics.tooltip":"도구 사용 횟수를 집계합니다. Overview 화면의 통계에 사용됩니다.","settings.general.contextCapture":"컨텍스트 캡처","settings.general.contextCapture.tooltip":"Changelog와 Playtest 화면에서 보기 좋도록 변경 이력을 구조화해 저장합니다.","settings.general.requestTimeout":"작업 제한 시간","settings.general.requestTimeout.tooltip":"AI 도구 한 번 실행에 대해 기다리는 최대 시간(밀리초)입니다. 시간이 지나면 실패로 처리됩니다.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"작업 제한 시간 단위는 밀리초입니다.","settings.cold.title":"서버 환경변수","settings.cold.title.tooltip":"서버 시작 시 로드되는 읽기 전용 환경변수 값입니다.","settings.cold.httpPort.tooltip":"MCP WEPPY Dashboard HTTP 서버가 사용하는 포트 번호입니다.","settings.cold.httpHost.tooltip":"MCP WEPPY Dashboard HTTP 서버가 바인딩하는 호스트 인터페이스입니다.","settings.cold.dashboardAutoOpen.tooltip":"서버 시작 시 브라우저에서 WEPPY Dashboard를 자동으로 열지 여부를 제어합니다.","settings.cold.dashboardAutoOpen.value.tooltip":"브라우저 자동 열기 현재 시작 동작입니다.","settings.cold.hint":"환경변수로 설정하세요.","settings.language.title":"언어","settings.language.title.tooltip":"WEPPY Dashboard UI 텍스트에 사용할 언어를 선택합니다.","settings.language.dashboard":"WEPPY Dashboard 언어","settings.language.dashboard.tooltip":"Auto일 때는 시스템 언어를 따르고, 아니면 선택한 언어를 강제합니다.","settings.language.auto":"자동","overview.l0.title":"MCP 서버 연결 끊김","overview.l0.message":"MCP 서버가 응답하지 않습니다. WEPPY Dashboard가 자동으로 재연결을 시도합니다.","overview.l0.step1":"MCP 서버 프로세스가 실행 중인지 확인하세요","overview.l0.step2":"필요 시 MCP 서버 명령을 다시 시작하세요","overview.l0.reconnecting":"3초마다 자동 재연결 중...","overview.l0.reconnectBtn":"수동 재연결","overview.l0.settingsBtn":"설정 확인","overview.l1.pluginGuide":"Roblox Studio 플러그인이 연결되지 않았습니다","overview.l1.check1":"Roblox Studio가 실행 중인가요?","overview.l1.check2":"WEPPY Plugin이 설치되어 있나요?","overview.l1.feedHint":"플러그인이 연결되면 변경사항이 표시됩니다","overview.metric.server":"서버","overview.metric.server.tooltip":"MCP 서버의 실행 상태와 프로세스 상태입니다.","overview.metric.plugin":"플러그인","overview.metric.plugin.tooltip":"Roblox Studio 플러그인의 연결 상태와 버전 정보입니다.","overview.metric.agent":"에이전트","overview.metric.agent.tooltip":"연결된 AI 코딩 에이전트와 현재 실행 상태입니다.","overview.metric.agent.instancesUnit":"인스턴스","overview.metric.sync":"동기화","overview.metric.sync.tooltip":"현재 Studio와 로컬 파일 간 동기화 상태입니다.","overview.metric.noAgent":"에이전트 없음","overview.meta.version":"버전","overview.meta.version.tooltip":"설치된 MCP 서버 버전입니다.","overview.meta.session":"세션","overview.meta.session.tooltip":"현재 MCP 세션 식별자입니다.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"운영체제에서 사용하는 프로세스 식별자입니다.","overview.meta.uptime":"가동 시간","overview.meta.uptime.tooltip":"MCP 서버가 시작된 뒤 경과한 시간입니다.","overview.feed.title":"최근 게임 변경","overview.feed.empty":"최근 변경사항 없음","overview.changelog.title":"세션 변경 요약","overview.changelog.entries":"합계","overview.changelog.scripts":"스크립트","overview.changelog.instances":"인스턴스","overview.changelog.properties":"속성","overview.changelog.assets":"에셋","overview.tier.title":"티어 사용 현황","changelog.subtitle":"게임 변경 이력","changelog.filter.all":"전체","changelog.filter.active":"활성","changelog.filter.completed":"완료","changelog.empty":"변경 이력이 없습니다","changelog.basic.limit.title":"Basic 미리보기에서는 최신 3개 세션만 표시됩니다","changelog.basic.limit.body":"Pro로 업그레이드하면 이 플레이스의 전체 변경 이력 타임라인을 확인할 수 있습니다.","changelog.basic.metricLabel":"표시 중인 변경 이력 / 전체","changelog.basic.visible":"표시 중","changelog.basic.total":"전체","changelog.card.active":"활성","changelog.card.active.tooltip":"이 세션은 아직 새 게임 변경을 계속 수집 중입니다.","changelog.card.completed":"완료","changelog.card.completed.tooltip":"이 세션은 종료되어 더 이상 새 변경이 추가되지 않습니다.","changelog.card.bootstrapStatus":"초기화","changelog.card.bootstrapStatus.tooltip":"이 세션에는 초기 동기화 기준 기록만 포함됩니다.","changelog.card.inProgress":"진행 중","changelog.card.noChanges":"아직 변경사항 없음","changelog.card.noChanges.tooltip":"이 세션에서는 아직 추출된 게임 변경이 없습니다.","changelog.card.bootstrapSummary":"초기 동기화 기준 기록","changelog.card.bootstrapSummary.tooltip":"초기 파일 동기화 쓰기 작업은 하나의 기준 기록 행으로 축약됩니다.","changelog.card.sessionIntent":"세션 의도","changelog.card.scripts":"스크립트","changelog.card.scripts.tooltip":"이 세션에서 발생한 스크립트 변경입니다.","changelog.card.instances":"인스턴스","changelog.card.instances.tooltip":"이 세션에서 발생한 인스턴스 생성, 삭제, 이동, 복제 변경입니다.","changelog.card.modified":"수정","changelog.card.created":"생성","changelog.card.deleted":"삭제","changelog.card.moved":"이동","changelog.card.propertiesChanged":"속성 변경","changelog.card.propertiesChanged.tooltip":"이 세션에서 기록된 속성 값 변경입니다.","changelog.card.lightingConfigured":"라이팅 설정됨","changelog.card.lightingConfigured.tooltip":"이 세션에서 라이팅 또는 대기 설정이 변경되었습니다.","changelog.card.terrainConfigured":"터레인 설정됨","changelog.card.terrainConfigured.tooltip":"이 세션에서 터레인 데이터 또는 터레인 설정이 변경되었습니다.","changelog.card.assetsInserted":"에셋 삽입","changelog.card.assetsInserted.tooltip":"이 세션 동안 플레이스에 삽입된 에셋입니다.","changelog.category.script":"스크립트","changelog.category.instance":"인스턴스","changelog.category.property":"속성","changelog.category.lighting":"라이팅","changelog.category.terrain":"터레인","changelog.category.asset":"에셋","changelog.detail.changeSummary":"변경 요약","changelog.detail.changeSummary.tooltip":"이 세션에서 추출된 게임 변경 수를 카테고리별로 묶어서 보여줍니다.","changelog.detail.changeTimeline":"변경 타임라인","changelog.detail.changeTimeline.tooltip":"이 세션에서 추출된 게임 변경을 시간순으로 보여줍니다.","changelog.detail.context.title":"컨텍스트 요약","changelog.detail.context.tooltip":"이 체인지로그 세션에 연결된 구조화된 실행 컨텍스트입니다.","changelog.detail.verification.title":"검증","changelog.detail.verification.tooltip":"이 체인지로그 세션에 연결된 검증 신호입니다.","changelog.detail.verification.label":"결과","changelog.detail.verification.status":"상태","changelog.detail.verification.timestamp":"기록 시각","changelog.detail.beforeAfter":"변경 전후 비교","changelog.detail.filterCategory":"카테고리","changelog.detail.filterCategory.tooltip":"타임라인을 하나의 변경 카테고리만 보이도록 필터링합니다.","changelog.detail.confidence.exact":"정확","changelog.detail.confidence.exact.tooltip":"이 변경은 변경 전과 변경 후 상태가 모두 확인되었습니다.","changelog.detail.confidence.partial":"부분 확인","changelog.detail.confidence.partial.tooltip":"이 변경은 변경 전후 상태 중 일부만 확인되었습니다.","changelog.detail.confidence.afterOnly":"결과만 확인","changelog.detail.confidence.afterOnly.tooltip":"이 변경은 적용 후 결과 상태만 확인되었습니다.","changelog.detail.confidence.intentOnly":"의도만 기록","changelog.detail.confidence.intentOnly.tooltip":"요청된 작업 의도만 기록되었고 결과 상태는 확인되지 않았습니다.","changelog.detail.confidence.unknown":"알 수 없음","changelog.detail.confidence.unknown.tooltip":"사용 가능한 데이터만으로는 이 변경을 신뢰도 있게 분류할 수 없습니다.","changelog.detail.noChanges":"이 카테고리에 변경사항 없음","changelog.detail.backToList":"목록으로 돌아가기","changelog.diff.empty":"비교할 내용 없음","changelog.diff.unified":"통합","changelog.diff.sideBySide":"나란히 비교","changelog.diff.before":"변경 전","changelog.diff.after":"변경 후","sync.overlay.title":"Roblox Studio 플러그인이 필요합니다","sync.overlay.message":"Roblox Studio 플러그인이 연결되면 동기화 상태를 확인할 수 있습니다.","sync.overlay.check1":"Roblox Studio가 실행 중인가요?","sync.overlay.check2":"WEPPY Plugin이 설치되어 있나요?","sync.status.title":"동기화 상태","sync.status.title.tooltip":"이 플레이스의 Studio와 로컬 파일 동기화 상태입니다.","sync.status.forwardOnly":"단방향만","sync.status.forwardOnly.tooltip":"Basic 티어에서는 Studio에서 로컬로 가는 단방향 동기화만 사용할 수 있습니다.","sync.status.place":"플레이스","sync.status.place.tooltip":"연결된 Roblox 플레이스 이름과 플레이스 ID입니다.","sync.status.path":"경로","sync.status.path.tooltip":"현재 동기화 출력에 사용하는 로컬 파일 시스템 루트입니다.","sync.status.instances":"인스턴스","sync.status.instances.tooltip":"로컬 미러에 추적 중인 동기화된 Roblox 인스턴스 수입니다.","sync.status.scripts":"스크립트","sync.status.scripts.tooltip":"이 플레이스에 대해 현재 인덱싱된 동기화 스크립트 파일 수입니다.","sync.status.state":"상태","sync.status.state.tooltip":"서버가 보고한 현재 동기화 런타임 상태입니다.","sync.directions.title":"동기화 방향","sync.directions.title.tooltip":"Local과 Studio 사이의 카테고리별 동기화 방향과 적용 방식입니다.","sync.directions.type":"유형","sync.directions.type.tooltip":"이 규칙이 적용되는 동기화 카테고리입니다.","sync.directions.direction":"방향","sync.directions.direction.tooltip":"각 카테고리가 Studio에서만, Studio로만, 또는 양방향으로 동기화되는지 나타냅니다.","sync.directions.applyMode":"적용 모드","sync.directions.applyMode.tooltip":"이 카테고리에 들어오는 동기화 변경을 적용하는 방식입니다.","sync.directions.cat.scripts":"스크립트","sync.directions.cat.values":"값","sync.directions.cat.containers":"컨테이너","sync.directions.cat.data":"데이터","sync.directions.cat.services":"서비스","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"방향 레일의 왼쪽은 항상 디스크의 로컬 파일을 의미합니다.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"방향 레일의 오른쪽은 항상 Roblox Studio를 의미합니다.","sync.directions.mode.manual":"수동","sync.directions.mode.manual.tooltip":"직접 실행할 때만 동기화 변경을 적용합니다.","sync.directions.mode.auto":"자동","sync.directions.mode.auto.tooltip":"업데이트가 들어오면 동기화 변경을 자동으로 적용합니다.","sync.directions.tooltip.forward.body":"Studio 변경 사항을 로컬 파일로만 동기화합니다","sync.directions.tooltip.bidirectional.body":"Local과 Studio 사이에 양방향 동기화를 사용합니다","sync.directions.tooltip.reverse.body":"로컬 파일 변경 사항을 Studio로 푸시합니다","sync.directions.tooltip.proRequired":"Basic 티어에서는 Pro가 필요합니다","sync.directions.dir.forward":"순방향","sync.directions.dir.bidirectional":"양방향","sync.directions.dir.reverse":"역방향","sync.log.title":"동기화 로그","sync.log.empty":"동기화 이벤트 없음","sync.log.type.write":"쓰기","sync.log.type.write.tooltip":"새 동기화 출력이 디스크에 기록되었습니다.","sync.log.type.update":"업데이트","sync.log.type.update.tooltip":"기존 동기화 파일 또는 인스턴스가 갱신되었습니다.","sync.log.type.delete":"삭제","sync.log.type.delete.tooltip":"동기화된 파일 또는 인스턴스가 제거되었습니다.","sync.log.type.idle":"대기","sync.log.type.idle.tooltip":"파일 변경 없이 동기화 이벤트만 기록되었습니다.","sync.upgrade.title":"Pro로 완전한 동기화 기능 해제","sync.upgrade.benefit1":"양방향 동기화 — 파일 편집 시 Studio에 자동 반영","sync.upgrade.benefit2":"역방향 동기화 — 파일 변경을 Studio로 전송","sync.upgrade.benefit3":"전체 동기화 히스토리 및 상세 변경 로그","sync.upgrade.buy":"Pro로 업그레이드","playtest.status.title":"플레이테스트 상태","playtest.status.title.tooltip":"Studio가 보고한 현재 Roblox 플레이테스트 세션 상태입니다.","playtest.status.mode":"모드","playtest.status.mode.tooltip":"현재 세션에 사용 중인 Studio 플레이테스트 실행 모드입니다.","playtest.status.mode.value.tooltip":"현재 적용 중인 Roblox Studio 플레이테스트 모드의 구체적인 값입니다.","playtest.status.mode.play":"플레이","playtest.status.mode.run":"실행","playtest.status.mode.server":"서버","playtest.status.mode.edit":"편집","playtest.status.place.tooltip":"이 플레이테스트 세션과 연결된 Roblox 플레이스입니다.","playtest.status.state.running":"실행 중","playtest.status.state.running.tooltip":"현재 Roblox 플레이테스트 세션이 실행 중입니다.","playtest.status.state.paused":"일시정지","playtest.status.state.paused.tooltip":"현재 Roblox 플레이테스트 세션이 일시정지 상태입니다.","playtest.status.state.notRunning":"실행 안 함","playtest.status.state.notRunning.tooltip":"현재 실행 중인 Roblox 플레이테스트 세션이 없습니다.","playtest.control.play":"플레이","playtest.control.pause":"일시정지","playtest.control.resume":"재개","playtest.control.stop":"정지","playtest.history.title":"테스트 히스토리","playtest.history.title.tooltip":"이 프로젝트에서 기록된 자동 플레이테스트 실행 이력입니다.","playtest.history.empty":"테스트 결과 없음","playtest.history.mode":"모드","playtest.history.mode.tooltip":"이 기록된 테스트 실행에 사용된 플레이테스트 모드입니다.","playtest.history.status.passed":"성공","playtest.history.status.failed":"실패","playtest.history.status.running":"실행 중","playtest.history.status.unknown":"알 수 없음","playtest.history.status.tooltip":"이 자동 플레이테스트 실행의 기록된 결과 상태입니다.","playtest.empty.title":"아직 플레이테스트 결과가 없습니다","playtest.empty.message":"AI 에이전트가 system_info.run_test로 자동 테스트를 실행하면 결과가 표시됩니다.","playtest.empty.message.before":"AI 에이전트가 자동 테스트를","playtest.empty.message.after":"로 실행하면 결과가 여기에 표시됩니다.","playtest.empty.runTest.tooltip":"system_info 도구를 통해 Roblox 플레이테스트 검사를 실행하는 WEPPY Dashboard 자동화 진입점입니다.","playtest.report.title":"선택된 리포트","playtest.report.title.tooltip":"현재 선택된 자동 플레이테스트 실행의 상세 출력입니다.","playtest.report.content":"리포트","playtest.report.content.tooltip":"선택된 자동 플레이테스트 실행의 마크다운 요약입니다.","playtest.report.logs":"로그","playtest.report.logs.tooltip":"선택된 자동 플레이테스트 실행에서 수집된 실행 로그입니다.","playtest.context.contextId":"컨텍스트 ID","playtest.context.why":"이 테스트를 실행한 이유","playtest.context.expected":"예상 결과","playtest.context.observed":"관찰 결과","playtest.report.empty":"리포트 내용 없음","playtest.basic.icon":"🎮","playtest.basic.title":"플레이테스트는 Pro 전용 기능입니다","playtest.basic.desc":"WEPPY Dashboard에서 플레이테스트를 제어하고, 자동 테스트를 실행하며, 상세한 테스트 리포트를 확인하세요.","playtest.basic.benefit1":"원클릭 플레이/일시정지/정지 제어","playtest.basic.benefit2":"AI 에이전트를 통한 자동 테스트 실행","playtest.basic.benefit3":"성공/실패 추적이 가능한 테스트 히스토리","playtest.basic.benefit4":"상세한 마크다운 테스트 리포트","playtest.sample.badge":"Pro 플레이테스트 화면 미리보기","playtest.sample.title":"현재 보고 있는 화면은 Pro 업그레이드 후 사용할 수 있는 플레이테스트 화면 예시입니다.","playtest.sample.message":"이 미리보기는 샘플 데이터로 구성되어 있습니다. 실시간 플레이테스트 제어, 히스토리 관리, 실제 리포트 저장은 Pro 구매 후 사용할 수 있습니다.","playtest.sample.clearDisabled":"실제 플레이테스트 기록 삭제는 Pro에서 사용할 수 있습니다.","playtest.sample.place":"아레나 미리보기","playtest.sample.history.name":"샘플 아레나 스모크 테스트","playtest.sample.context.why":"아레나에 스폰한 뒤 첫 구간을 버티고 HUD가 즉시 반응하는지 확인합니다.","playtest.sample.context.expected":"플레이어가 안전하게 스폰되고, 1초 안에 카운트다운 UI가 표시되며, 첫 웨이브가 오류 없이 시작되어야 합니다.","playtest.sample.context.observed":"스폰 보호가 정상 동작했고, HUD가 제때 갱신되었으며, 첫 웨이브가 회귀 없이 완료되었습니다.","playtest.sample.report.markdown":`# 샘플 아레나 스모크 테스트
79
+ [sample] preview report finished`,"sidebar.whatsNew":"What's New","sidebar.help.group":"Help & Feedback","sidebar.help.bug":"Report a bug","sidebar.help.bug.tooltip":"Open a prefilled bug report on GitHub","sidebar.help.feature":"Suggest a feature","sidebar.help.feature.tooltip":"Suggest a new feature or improvement on GitHub","sidebar.help.discussions":"Community","sidebar.help.discussions.tooltip":"Ask questions and share ideas on GitHub Discussions","sidebar.help.troubleshooting":"Troubleshooting","sidebar.help.troubleshooting.tooltip":"Open the official troubleshooting guide on weppyai.com","header.whatsNew":"What's New","header.whatsNew.tooltip":"What's New","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"What's New","whatsNew.pageSubtitle":"Stay up to date with MCP changes","whatsNew.unreadSection":"Unread","whatsNew.allSection":"All Announcements","whatsNew.empty":"No announcements yet","whatsNew.newBadge":"NEW","whatsNew.category.release":"Release","whatsNew.category.notice":"Notice","whatsNew.category.deprecation":"Deprecated","whatsNew.category.tip":"Tip","uiStudio.title":"UI Studio","uiStudio.empty":"No screenshots saved yet. They are created automatically when an AI agent captures the current UI state.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio plugin is not connected","uiStudio.pluginGuide.message":"UI Studio shows screenshots and change history from the connected Studio place. It will update automatically after Studio and the WEPPY Plugin connect.","uiStudio.pluginGuide.check1":"Is Roblox Studio running?","uiStudio.pluginGuide.check2":"Is the WEPPY Plugin installed and running?","uiStudio.pluginGuide.waiting":"Waiting for plugin connection...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Review first","uiStudio.priorityLow":"Optional improvement","uiStudio.highPrioritySection":"Review first","uiStudio.lowPrioritySection":"Optional improvements","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analysis","uiStudio.tabs.history":"History","uiStudio.analysis.reportsTitle":"Latest Analysis by UI Target","uiStudio.analysis.recentCapturesTitle":"Recent Captures","uiStudio.analysis.detailDialog":"Analysis detail","uiStudio.analysis.targetCountLabel":"Targets analyzed","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Improvement Suggestions","uiStudio.analysis.verdict.needsFix":"Improvement Suggestions","uiStudio.analysis.verdict.review":"Improvement Suggestions","uiStudio.analysis.verdict.passed":"No Current Suggestions","uiStudio.analysis.verdictLabel":"Improvement Summary","uiStudio.analysis.thresholds":"Review basis","uiStudio.analysis.issueSummary.passed":"No additional improvement suggestions under the current review basis.","uiStudio.history.title":"Change History","uiStudio.history.empty":"No history yet. When an AI agent modifies UI using manage_ui, it will be recorded automatically.","uiStudio.history.loading":"Loading...","uiStudio.history.error":"Error","uiStudio.history.clear":"Clear","uiStudio.history.filter.actions":"Action type","uiStudio.history.filter.actionAll":"All","uiStudio.history.filter.actionCreate":"Create","uiStudio.history.filter.actionUpdate":"Update","uiStudio.history.filter.actionDelete":"Delete","uiStudio.history.filter.period":"Period","uiStudio.history.filter.dateAll":"All","uiStudio.history.filter.today":"Today","uiStudio.history.filter.yesterday":"Yesterday","uiStudio.history.filter.last7Days":"Last 7 days","uiStudio.history.filter.last30Days":"Last 30 days","uiStudio.history.filter.customRange":"Custom range","uiStudio.history.filter.reset":"Reset","uiStudio.history.filter.from":"From","uiStudio.history.filter.to":"To","uiStudio.history.row.affectedPaths":"Paths","uiStudio.history.row.mutations":"Change details","uiStudio.history.row.expand":"▾ Expand","uiStudio.history.row.collapse":"▲ Collapse","uiStudio.history.row.expandDetails":"Show {n} change details","uiStudio.history.row.collapseDetails":"Hide change details","uiStudio.history.row.toggleDetails":"Toggle change details","uiStudio.history.row.mutationsEmpty":"No change details","uiStudio.history.row.toolLabel":"UI changes ({n})","uiStudio.history.row.compare":"Before / After","uiStudio.history.row.noBeforeState":"No before state","uiStudio.history.row.noAfterState":"No after state","uiStudio.history.row.qualityPlan":"Design direction","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: unavailable","uiStudio.history.row.designCheckNone":"Suggestions: none","uiStudio.history.selection.deleteSelected":"Delete Selected","uiStudio.history.selection.selectAll":"Select All","uiStudio.history.selection.clearSelection":"Clear Selection","uiStudio.history.confirm.deleteRequestsTitle":"Delete Change Records","uiStudio.history.confirm.deleteRequestsMessage":"The selected change records will be deleted. This action cannot be undone.","uiStudio.history.confirm.clearRequestsTitle":"Clear Change History","uiStudio.history.confirm.clearRequestsMessage":"This clears the current place change history. Studio instances are not affected.","uiStudio.history.confirm.cascadeOption":"Also delete linked screenshots","uiStudio.history.drawer.close":"Close","uiStudio.actions.previewAgain":"Preview Again","uiStudio.actions.deleteSnapshot":"Delete This Screenshot","uiStudio.actions.proRequired":"Available after upgrading to Pro","uiStudio.actions.captureCurrentState":"Capture Current State","uiStudio.actions.checkSuggestionsAgain":"Re-check Suggestions","uiStudio.actions.previewRunning":"Capturing…","uiStudio.actions.previewRunningDetail":"The new screenshot file ID will appear when capture finishes.","uiStudio.actions.previewNeedsSaveCheck":"Capture complete, save needs review","uiStudio.actions.previewSaved":"New screenshot saved","uiStudio.actions.previewComplete":"Capture complete","uiStudio.actions.previewSavedDetail":"Existing screenshots are kept; this was saved as a new file.","uiStudio.actions.previewSavedPathMissing":"A new screenshot ID was returned, but the saved file path could not be confirmed.","uiStudio.actions.previewSnapshotIdMissing":"The new screenshot ID could not be confirmed. Refresh the list to verify whether it was saved.","uiStudio.actions.more":"More","uiStudio.gallery.selection.selectedCount":" selected","uiStudio.confirm.deleteSnapshotTitle":"Delete Screenshot","uiStudio.confirm.deleteSnapshotMessage":"Only this screenshot file will be deleted (the Studio instance is preserved).","uiStudio.confirm.deleteBatchTitle":"Delete Selected Screenshots","uiStudio.confirm.deleteBatchMessage":"The selected screenshots will be deleted. This action cannot be undone.","uiStudio.gallery.selectMode":"Select","uiStudio.gallery.exitSelectMode":"Cancel","uiStudio.gallery.selectAll":"Select All","uiStudio.gallery.clearSelection":"Clear Selection","uiStudio.gallery.deleteSelected":"Delete Selected","common.cancel":"Cancel","common.delete":"Delete","uiStudio.storage.title":"UI Studio Saved Data","uiStudio.storage.usageLabel":"In use","uiStudio.storage.historyBytes":"Change history","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Change records","uiStudio.storage.mutationCount":"Change details","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Last auto-cleanup","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freed","uiStudio.storage.lastRunErrors":"Errors","uiStudio.storage.loading":"Loading...","uiStudio.cleanup.policy.title":"Auto-delete Policy","uiStudio.cleanup.policy.modeOff":"Off","uiStudio.cleanup.policy.modeAge":"Age-based","uiStudio.cleanup.policy.modeSize":"Size-based","uiStudio.cleanup.policy.cascade":"Also delete linked screenshots","uiStudio.cleanup.policy.save":"Save Policy","uiStudio.cleanup.policy.runNow":"Run Now","uiStudio.cleanup.policy.proRequired":"Available after upgrading to Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirm Policy","uiStudio.cleanup.policy.confirm.messageStrict":"Applying this policy will immediately delete","uiStudio.cleanup.policy.confirm.requests":" change records","uiStudio.cleanup.policy.confirm.snapshots":" screenshots","uiStudio.cleanup.policy.confirm.freed":"freed — Apply?","uiStudio.cleanup.keepLastNDays":"Keep last {n} days","uiStudio.cleanup.selectedDelete":"Delete Selected…","uiStudio.cleanup.deleteAll":"Delete All…","uiStudio.cleanup.cleanupConfirmTitle":"Confirm Cleanup","uiStudio.cleanup.cleanupConfirmMessage":"All selected items will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manual cleanup","uiStudio.cleanup.studioPreservedNote":"This deletes saved change records and screenshots on disk only; Roblox Studio instances are not affected.","uiStudio.history.sample.bannerBadge":"Preview of the Pro change history","uiStudio.history.sample.bannerTitle":"You are previewing the UI change history that unlocks after upgrading to Pro.","uiStudio.history.sample.bannerMessage":"This preview uses sample data. Real change history, before/after comparison, and batch delete unlock with Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","uiStudio.history.sample.tooltip":"Upgrade to Pro to unlock full history","toast.serverConnected":"MCP server connected","toast.serverDisconnected":"MCP server disconnected","toast.pluginConnected":"Plugin connected","toast.pluginDisconnected":"Plugin disconnected","toast.clearSuccess":"Cleared successfully","toast.clearFailed":"Failed to clear data","common.clear":"Clear","settings.license.activate":"Activate License","settings.license.refresh":"Refresh License","settings.license.keyInput":"License Key","settings.license.disconnected":"Disconnected","settings.license.disconnected.tooltip":"Reconnect to the MCP server to manage license actions from WEPPY Dashboard.","settings.license.live.tooltip":"License actions are sent to the MCP server immediately.","settings.license.status.activationRequired":"Activation Required","settings.license.status.activationRequired.tooltip":"Manual license activation is required before WEPPY Dashboard can refresh this status.","settings.license.status.grace":"Grace","settings.license.status.grace.tooltip":"Provider verification is temporarily unavailable, but Pro access remains active during the grace period.","settings.license.status.graceBilling.tooltip":"Pro access is still available during a billing-related grace period.","settings.license.detail.graceBilling":"Pro access remains available during a billing grace period.","settings.license.detail.graceProviderUnavailable":"Provider unavailable. Pro access remains active during grace mode.","settings.license.detail.manualActivation":"Manual activation required to restore Pro access.","settings.license.detail.missingSessionToken":"Refresh is blocked because the current session token is missing.","settings.license.detail.refreshRecommended":"License verification should be refreshed soon.","connection.agents.kill":"Kill","connection.agents.kill.title":"Kill agent?","connection.agents.killed":"Agent killed","connection.agents.killFailed":"Failed to kill agent","connection.agents.lastCommand":"Last Command","connection.agents.lastCommand.tooltip":"Most recent tool call executed by this agent","connection.agents.lastSeen":"Last Seen","connection.agents.lastSeen.tooltip":"Most recent heartbeat or activity from this agent","connection.clear.title":"Clear connection log?","connection.clear.message":"This permanently removes the stored connection log for the current project.","sync.clear.title":"Clear sync log?","sync.clear.message":"This permanently removes the stored sync log for the current place.","playtest.clear.title":"Clear test history?","playtest.clear.message":"This permanently removes the stored playtest reports for the current place.","changelog.clear.title":"Clear changelog?","changelog.clear.message":"This permanently removes the stored changelog for the current place.","sync.status.placePath":"Place Path","sync.status.placePath.tooltip":"Active place directory where explorer files are synced.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Representative area","changelog.card.verification":"Verification","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Brief design direction used for this change.","uiStudio.history.row.designCheck.tooltip":"Post-change Design Check suggestion summary.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Design Check suggestions","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Check again","uiStudio.actions.designCheckRunning":"Checking suggestions...","uiStudio.actions.designCheckRunningDetail":"Review first, recommended, and optional item counts will appear when the check finishes.","uiStudio.actions.designCheckComplete":"Suggestion check complete","uiStudio.actions.designCheckNoSnapshotSaved":"This action does not save a new screenshot file.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Number of suggestions to review first. Click for details.","uiStudio.gallery.priorityMediumBadge.tooltip":"Number of recommended suggestions.","uiStudio.priorityMedium":"Review recommended","uiStudio.mediumPrioritySection":"Review recommended","uiStudio.gallery.priorityLowBadge.tooltip":"Number of optional improvements."},_f={"sidebar.overview":"개요","sidebar.changelog":"변경 이력","sidebar.connection":"연결","sidebar.sync":"동기화","sidebar.playtest":"플레이테스트","sidebar.tools":"도구","sidebar.settings":"설정","sidebar.ui_studio":"UI 스튜디오","sidebar.gate.l1":"MCP 서버를 연결해야 이 페이지를 사용할 수 있습니다.","sidebar.gate.l2":"Roblox Studio 플러그인을 연결해야 이 페이지를 사용할 수 있습니다.","header.currentProject":"현재 프로젝트","header.unknownProject":"알 수 없는 프로젝트","header.projectRoot.label":"Project Root","header.currentProject.loading":"프로젝트 루트 불러오는 중...","header.currentProject.unavailable":"프로젝트 루트를 불러올 수 없음","header.placeNotConnected":"플레이스 미연결","header.currentProject.tooltip":"현재 선택된 프로젝트 폴더입니다.","header.currentProject.loading.tooltip":"프로젝트 루트 정보를 아직 불러오는 중입니다.","header.currentProject.unavailable.tooltip":"현재 프로젝트 루트 정보를 불러올 수 없습니다.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Sync root 불러오는 중...","header.currentProjectSyncRoot.unavailable":"Sync root 정보를 불러올 수 없음","header.currentProjectSyncRoot.tooltip":"선택된 프로젝트의 현재 sync root 폴더입니다.","header.currentProjectSyncRoot.loading.tooltip":"Sync root 정보를 아직 불러오는 중입니다.","header.currentProjectSyncRoot.unavailable.tooltip":"현재 sync root 정보를 불러올 수 없습니다.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"테스트 파일 경로를 확인할 수 없습니다.","header.testFiles.tooltip":"선택된 플레이스의 현재 플레이테스트 파일 경로입니다.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"플러그인 연결 필요","header.places.liveRequired":"실시간 활성 플레이스를 확인하려면 플러그인 연결이 필요합니다.","header.place.tooltip":"연결된 Roblox 플레이스입니다.","header.placeNotConnected.tooltip":"플레이스 미연결","header.changeProjectRoot":"프로젝트 루트 변경","header.changeProjectRoot.ariaLabel":"프로젝트 루트 변경","header.changeProjectRoot.tooltip":"현재 프로젝트 루트를 변경합니다.","header.changeProjectRoot.disabledTooltip.l0":"프로젝트 루트를 변경하려면 먼저 MCP 서버 연결이 필요합니다.","header.changeProjectRoot.disabledTooltip.loading":"프로젝트 루트 정보를 아직 불러오는 중입니다.","header.changeProjectRoot.disabledTooltip.unavailable":"현재 프로젝트 루트 정보를 불러올 수 없습니다.","header.projectRootModal.initial.title":"프로젝트 루트 변경","header.projectRootModal.initial.body.connected":"프로젝트 폴더를 선택하면 MCP 프로젝트 루트가 즉시 변경되고 현재 Studio 내용이 새 <selected project folder>/weppy-project-sync 대상으로 전체 재동기화됩니다.","header.projectRootModal.initial.body.disconnected":"프로젝트 폴더를 선택하면 MCP 프로젝트 루트가 즉시 변경되고 새 <selected project folder>/weppy-project-sync 경로가 다음 sync 대상으로 사용됩니다.","header.projectRootModal.initial.nextSyncRoot":"선택 후 새 sync 대상","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"현재 sync는 즉시 중단됩니다.","header.projectRootModal.initial.warningFreshSync":"현재 Studio 내용을 기준으로 새 대상에 fresh full sync가 다시 생성됩니다.","header.projectRootModal.initial.warningNoMove":"기존 sync 폴더는 자동으로 이동되지 않습니다.","header.projectRootModal.initial.warningDeferredSync":"Studio가 아직 연결되지 않았다면 전체 재동기화는 다음 플러그인 연결 시 시작됩니다.","header.projectRootModal.confirm.title":"새 프로젝트 루트 확인","header.projectRootModal.confirm.body":"적용 전에 선택한 프로젝트 폴더를 다시 확인하세요.","header.projectRootModal.confirm.projectRoot":"선택한 프로젝트 폴더","header.projectRootModal.confirm.syncRoot":"새 sync 대상","header.projectRootModal.confirm.warningNoMove":"기존 sync 폴더는 자동으로 이동되지 않습니다.","header.projectRootModal.pick":"폴더 선택","header.projectRootModal.apply":"변경 적용","header.projectRootModal.cancel":"취소","header.projectRootModal.error":"프로젝트 루트를 변경하지 못했습니다.","status.online":"온라인","status.offline":"오프라인","status.idle":"대기","status.syncing":"동기화 중","status.error":"오류","status.initializing":"초기화 중","level.l0.title":"서버 연결 끊김","level.l0.message":"WEPPY Dashboard가 열린 뒤 서버가 종료되었거나 응답하지 않습니다.","level.l1.title":"서버 연결됨","level.l1.hint":"확인: Studio 실행 중? 플러그인 설치?","level.l2.ok":"Studio 연결됨","tier.basic":"Basic","tier.basic.tooltip":"기본 WEPPY Dashboard 기능을 제공하는 Basic 티어입니다.","tier.pro":"Pro","tier.pro.tooltip":"전체 WEPPY Dashboard 기능을 제공하는 Pro 티어입니다.","tier.mixed":"혼합","tier.upgrade":"Pro로 업그레이드","tier.compare":"Basic vs Pro 비교","tier.banner.save":"Pro로 AI 토큰 절약!","tier.comparison.comingSoon":"Basic vs Pro 비교 — 준비 중","tier.comparison.close":"닫기","tier.comparison.detailTitle":"상세 도구 카탈로그","tier.comparison.description":"설명","tier.comparison.basic.core":"핵심 MCP 워크플로우","tier.comparison.basic.core.item1":"스크립트 생성/편집","tier.comparison.basic.core.item2":"인스턴스 관리","tier.comparison.basic.core.item3":"속성 제어","tier.comparison.basic.core.item4":"선택 및 검색","tier.comparison.basic.core.item5":"태그 관리","tier.comparison.basic.core.item6":"카메라 제어","tier.comparison.basic.core.item7":"로그 모니터링","tier.comparison.basic.sync":"동기화 (Basic)","tier.comparison.basic.sync.item1":"Studio에서 로컬로 단방향 동기화","tier.comparison.basic.sync.item2":"수동 적용이 기본값","tier.comparison.pro.all":"Basic의 모든 기능 포함, 추가로","tier.comparison.pro.sync":"고급 동기화 워크플로우","tier.comparison.pro.sync.item1":"유형별 동기화 방향 설정","tier.comparison.pro.sync.item2":"유형별 적용 모드","tier.comparison.pro.sync.item3":"양방향 및 역방향 동기화","tier.comparison.pro.sync.item4":"전체 동기화, 재동기화, Studio로 푸시","tier.comparison.pro.sync.item5":"멀티 플레이스 동기화","tier.comparison.pro.playtest":"플레이테스트 제어","tier.comparison.pro.playtest.item1":"플레이, 정지, 일시정지, 재개","tier.comparison.pro.playtest.item2":"플레이테스트 상태 검사","tier.comparison.pro.playtest.item3":"자동 테스트 실행","tier.comparison.pro.creation":"고급 생성 워크플로우","tier.comparison.pro.creation.item1":"대량 작업","tier.comparison.pro.creation.item2":"터레인 생성","tier.comparison.pro.creation.item3":"에셋 검색 및 삽입","tier.comparison.pro.creation.item4":"레이캐스트 및 공간 분석","tier.comparison.pro.creation.item5":"환경 제어","tier.comparison.pro.ui":"AI UI 디자인 (UI Studio)","tier.comparison.pro.ui.item1":"요청과 Studio 상태를 바탕으로 UI 방향 정리","tier.comparison.pro.ui.item2":"메뉴, HUD, 버튼, 패널 생성·수정·삭제","tier.comparison.pro.ui.item3":"현재 UI 화면 캡처","tier.comparison.pro.ui.item4":"터치·대비·세이프존 개선 제안 확인","tier.comparison.discount.label":"🎁 Gumroad 결제 시 아래 코드를 입력하면 할인 받을 수 있어요:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"4월 30일까지 유효","tier.promo.discount.hint":"🎁 Gumroad에서 WEPPY-MCP 코드 사용 · 4월 30일까지","tier.promo.discount.context":"🎁 Gumroad 결제 시 할인코드 입력:","tier.tool.query_instances.desc":"인스턴스 조회, 자식/자손 탐색, 클래스 정보, 이름·클래스 검색. Pro: 파일 트리, 프로젝트 구조, 속성·태그 검색.","tier.tool.mutate_instances.desc":"인스턴스 생성, 삭제, 복제, 이동, 이름변경, 피벗. Pro: 트리 생성, 대량 생성·삭제·복제.","tier.tool.manage_properties.desc":"속성, 어트리뷰트, 태그 조회 및 설정. Pro: 계산·상대값 설정, 대량 조회·설정, 자식 일괄 수정.","tier.tool.manage_scripts.desc":"스크립트 소스 코드 읽기, 쓰기, 생성, 삭제, 줄 편집, 검색. Pro: 스크립트 간 일괄 치환.","tier.tool.manage_ui.desc":"Pro 전용. 게임 스타일의 메뉴, HUD, 버튼, 라벨, 이미지 패널을 생성·개선하고 화면 캡처와 개선 제안을 확인합니다.","tier.tool.manage_ui.action.design_brief":"UI 방향 정리","tier.tool.manage_ui.action.create_tree":"새 UI 만들기","tier.tool.manage_ui.action.update":"기존 UI 수정","tier.tool.manage_ui.action.delete":"UI 삭제","tier.tool.manage_ui.action.preview":"UI 화면 캡처","tier.tool.manage_ui.action.check":"개선 제안 확인","tier.tool.manage_lighting.desc":"Pro 전용. 조명, 대기, 하늘, 터레인 속성, 시간대 환경 설정.","tier.tool.manage_selection.desc":"선택 조회, 설정, 해제. Pro: 컨텍스트, 상세 정보, 항목 추가·제거, 변경 감시.","tier.tool.manage_camera.desc":"카메라 정보 조회, 경로 또는 좌표로 포커스, 추천 뷰 제안.","tier.tool.manage_tween.desc":"Pro 전용. 부드러운 애니메이션을 위한 트윈 생성, 재생, 일시정지, 취소.","tier.tool.manage_audio.desc":"Pro 전용. 사운드 재생, 정지, 일시정지, 재개. 오디오 리스너 설정.","tier.tool.manage_animation.desc":"Pro 전용. 애니메이션 로드, 재생, 정지. 휴머노이드·컨트롤러의 트랙 조회.","tier.tool.manage_physics.desc":"Pro 전용. 물리 충돌 그룹 등록, 그룹 간 충돌 설정, 목록 조회.","tier.tool.manage_effects.desc":"Pro 전용. 파티클 방출, 전체 삭제, 이펙트 활성화 토글.","tier.tool.manage_terrain.desc":"Pro 전용. 도형 채우기, 영역 삭제, 재질 치환, 색상 관리, 복셀 읽기·쓰기, 절차적 생성, 스무딩.","tier.tool.spatial_query.desc":"Pro 전용. 레이캐스트, 지면 찾기, 배치 확인, 영역 스캔, 평지·스폰 위치 탐색, 보행 분석, 공간 맵, 충돌 확인.","tier.tool.manage_assets.desc":"Pro 전용. 모델 삽입, 에셋 정보 조회, 크리에이터 스토어 검색, 무료 모델·패키지 삽입, 내보내기.","tier.tool.manage_sync.desc":"Pro 전용. 동기화 상태, 설정, 히스토리, 방향 설정, 동기화 파일 읽기·쓰기.","tier.tool.workspace_state.desc":"Pro 전용. 전체 동기화, 상태 캡처, 최근 변경, 뷰포트 정보, 메타데이터, 캐시 관리.","tier.tool.manage_logs.desc":"출력 로그 필터링 조회, 증분 폴링, 버퍼 삭제, 최근 오류 조회.","tier.tool.system_info.desc":"연결 상태, 사용 티어 확인. Pro: 플레이스 정보, 서비스 목록, Studio 설정, 플레이테스트 제어, 자동 테스트.","tier.tool.manage_studio.desc":"Pro 전용. 스크린샷과 QA 흐름을 위해 UI 프리뷰 같은 Studio 편집기 보기 설정을 전환합니다. 게임 UI 오브젝트는 변경하지 않습니다.","tier.tool.batch_execute.desc":"Pro 전용. 여러 명령을 한 번에 일괄 실행. 순차 처리하며 오류 시 계속 진행 옵션.","tier.tool.execute_luau.desc":"Pro 전용. Roblox Studio 샌드박스에서 임의 Luau 코드 실행.","connection.server.title":"서버 상태","connection.server.version":"버전","connection.server.version.tooltip":"설치된 MCP 서버 버전입니다.","connection.server.pid":"PID","connection.server.pid.tooltip":"운영체제에서 사용하는 프로세스 식별자입니다.","connection.server.uptime":"가동 시간","connection.server.uptime.tooltip":"MCP 서버가 시작된 뒤 경과한 시간입니다.","connection.server.session":"세션","connection.server.session.tooltip":"현재 MCP 세션 식별자입니다.","connection.server.exec":"실행 파일","connection.server.exec.tooltip":"MCP 서버를 실행한 실행 파일 경로입니다.","connection.reconnect":"수동 재연결","connection.checkSettings":"설정 확인","connection.agents.title":"AI 에이전트","connection.agents.name":"에이전트","connection.agents.cwd":"작업 디렉토리","connection.agents.cwd.tooltip":"연결된 AI 에이전트의 현재 작업 디렉토리입니다.","connection.agents.projectRoot":"프로젝트 루트","connection.agents.projectRoot.tooltip":"Sync ownership을 결정하는 프로젝트 경로","connection.agents.projectRoot.unresolved":"미확인","connection.agents.connected":"연결 시각","connection.agents.unknown":"알 수 없음","connection.agents.none":"연결된 에이전트 없음","connection.plugins.title":"플러그인","connection.plugins.place":"플레이스","connection.plugins.clientId":"클라이언트 ID","connection.plugins.clientId.tooltip":"현재 Studio 연결을 식별하는 플러그인 클라이언트 ID입니다.","connection.plugins.lastSeen":"마지막 확인","connection.plugins.lastSeen.tooltip":"플러그인에서 가장 최근에 수신한 heartbeat 시각입니다.","connection.plugins.version":"버전","connection.plugins.version.tooltip":"Studio가 보고한 설치된 플러그인 버전입니다.","connection.plugins.none":"연결된 플러그인 없음","connection.log.title":"연결 로그","connection.log.empty":"이벤트 없음","connection.time.secondsAgo":"초 전","connection.time.minutesAgo":"분 전","connection.time.hoursAgo":"시간 전","common.loading":"로딩 중...","common.retry":"재시도","common.reconnecting":"재연결 중...","common.expand":"펼치기","common.collapse":"접기","tools.tab.history":"히스토리","tools.tab.statistics":"통계","tools.tab.failures":"실패","tools.col.time":"시간","tools.col.time.tooltip":"도구 실행이 기록된 시각입니다.","tools.col.toolAction":"도구.액션","tools.col.toolAction.tooltip":"실행된 도구 이름과 액션입니다.","tools.col.duration":"소요 시간","tools.col.duration.tooltip":"도구 실행이 완료될 때까지 걸린 시간입니다.","tools.col.status":"상태","tools.col.status.tooltip":"기록된 도구 실행의 결과 상태입니다.","tools.col.tier":"티어","tools.col.tier.tooltip":"도구 또는 액션에 필요한 라이센스 티어입니다.","tools.col.tierStats.tooltip":"도구 통계 행이 Basic, Pro, Mixed 중 어느 집계인지 설명합니다.","tools.col.tool":"도구","tools.col.tool.tooltip":"통계 테이블에 표시되는 통합 도구 이름입니다.","tools.col.calls":"호출 수","tools.col.calls.tooltip":"이 도구에 대해 기록된 총 호출 횟수입니다.","tools.col.ok":"OK","tools.col.ok.tooltip":"직접 성공한 실행 횟수입니다.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"fallback 실행으로 성공한 횟수입니다.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"fallback 없이 차단된 실행 횟수입니다.","tools.col.err":"실패","tools.col.err.tooltip":"실패로 끝난 실행 횟수입니다.","tools.col.okRate":"성공률","tools.col.okRate.tooltip":"성공적으로 끝난 호출 비율입니다.","tools.col.avgTime":"평균 시간","tools.col.avgTime.tooltip":"기록된 호출들의 평균 실행 시간입니다.","tools.col.error":"오류","tools.filter.tool":"도구","tools.filter.all":"전체","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"이 항목은 Pro 전용 도구 또는 액션을 사용했습니다.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"요청한 Pro 액션이 Basic fallback으로 성공했습니다.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"요청한 Pro 액션이 차단되었고 fallback도 실행되지 않았습니다.","tools.badge.err":"실패","tools.badge.err.tooltip":"도구 실행이 실패로 끝났습니다.","tools.status.ok":"OK","tools.status.ok.tooltip":"도구 실행이 성공적으로 완료되었습니다.","tools.tier.mixed.tooltip":"이 도구에는 Basic 액션과 Pro 액션이 함께 포함됩니다.","tools.detail.params":"파라미터","tools.detail.params.tooltip":"이 도구 실행에 전달된 입력 파라미터입니다.","tools.detail.result":"결과","tools.detail.result.tooltip":"이 도구 실행에서 반환된 결과 페이로드입니다.","tools.detail.requestedCommand":"전송한 명령","tools.detail.executedCommand":"실행된 명령","tools.detail.alternatives":"대안","tools.detail.blockedMessage":"차단 사유","tools.detail.noFallback":"Fallback 없음","tools.detail.noFallback.value":"실행된 fallback이 없습니다.","tools.detail.errorMessage":"오류 메시지","tools.clear.history.title":"히스토리를 삭제할까요?","tools.clear.history.message":"현재 place의 도구 히스토리가 영구적으로 삭제됩니다.","tools.clear.statistics.title":"통계를 삭제할까요?","tools.clear.statistics.message":"현재 place의 도구 통계가 영구적으로 초기화됩니다.","tools.detail.error":"오류","tools.page.prev":"이전","tools.page.prev.tooltip":"도구 히스토리의 이전 페이지로 이동합니다.","tools.page.next":"다음","tools.page.next.tooltip":"도구 히스토리의 다음 페이지로 이동합니다.","tools.empty.history":"히스토리 없음","tools.empty.stats":"도구 통계 없음","tools.empty.failures":"실패 없음","tools.summary.total":"합계","tools.summary.calls":"호출","tools.summary.sessions":"세션","settings.license.title":"라이센스","settings.license.title.tooltip":"현재 라이센스 상태와 구독 티어입니다.","settings.license.status":"상태","settings.license.status.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.tier":"티어","settings.license.tier.tooltip":"WEPPY Dashboard 기능 범위를 결정하는 현재 구독 티어입니다.","settings.license.key":"키","settings.license.key.tooltip":"서버에 현재 로드된 마스킹된 라이센스 키입니다.","settings.license.keyValue.tooltip":"서버에 현재 로드된 마스킹된 라이센스 키입니다.","settings.license.provider":"제공자","settings.license.provider.tooltip":"이 키를 검증하는 라이센스 제공자입니다.","settings.license.providerValue.tooltip":"이 키를 검증하는 라이센스 제공자입니다.","settings.license.active":"활성","settings.license.active.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.status.activeCancelPending.tooltip":"해지가 예약되어 있지만 현재 결제 주기가 끝날 때까지 Pro 접근은 유지됩니다.","settings.license.inactive":"비활성","settings.license.inactive.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.expired":"만료","settings.license.expired.tooltip":"현재 라이센스 활성화 상태입니다.","settings.license.unavailable":"라이센스 정보를 불러올 수 없음","settings.license.detail.cancelPending":"해지가 예약되었습니다. 현재 결제 주기가 끝날 때까지 Pro 접근은 유지됩니다.","settings.license.reset":"라이센스 리셋","settings.readOnly":"읽기 전용","settings.readOnly.tooltip":"이 섹션의 값은 WEPPY Dashboard에서 수정할 수 없습니다.","settings.unavailable":"설정을 불러올 수 없음","settings.general.title":"일반 설정","settings.general.title.tooltip":"변경 즉시 적용되는 Hot 설정입니다.","settings.general.liveApply":"즉시 반영","settings.general.liveApply.tooltip":"이 섹션의 변경은 별도 저장 버튼 없이 바로 적용됩니다.","settings.general.applied":"적용됨","settings.general.logLevel":"로그 레벨","settings.general.logLevel.tooltip":"MCP 서버가 남기는 로그의 자세한 정도를 정합니다. 문제 추적이 필요하면 debug 로 낮추세요.","settings.general.localHistory":"도구 히스토리 기록","settings.general.localHistory.tooltip":"AI 도구 호출 기록을 컴퓨터에 저장합니다. Tools / History 화면에서 보기 위해 필요합니다.","settings.general.localStatistics":"도구 통계 집계","settings.general.localStatistics.tooltip":"도구 사용 횟수를 집계합니다. Overview 화면의 통계에 사용됩니다.","settings.general.contextCapture":"컨텍스트 캡처","settings.general.contextCapture.tooltip":"Changelog와 Playtest 화면에서 보기 좋도록 변경 이력을 구조화해 저장합니다.","settings.general.requestTimeout":"작업 제한 시간","settings.general.requestTimeout.tooltip":"AI 도구 한 번 실행에 대해 기다리는 최대 시간(밀리초)입니다. 시간이 지나면 실패로 처리됩니다.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"작업 제한 시간 단위는 밀리초입니다.","settings.cold.title":"서버 환경변수","settings.cold.title.tooltip":"서버 시작 시 로드되는 읽기 전용 환경변수 값입니다.","settings.cold.httpPort.tooltip":"MCP WEPPY Dashboard HTTP 서버가 사용하는 포트 번호입니다.","settings.cold.httpHost.tooltip":"MCP WEPPY Dashboard HTTP 서버가 바인딩하는 호스트 인터페이스입니다.","settings.cold.dashboardAutoOpen.tooltip":"서버 시작 시 브라우저에서 WEPPY Dashboard를 자동으로 열지 여부를 제어합니다.","settings.cold.dashboardAutoOpen.value.tooltip":"브라우저 자동 열기 현재 시작 동작입니다.","settings.cold.hint":"환경변수로 설정하세요.","settings.language.title":"언어","settings.language.title.tooltip":"WEPPY Dashboard UI 텍스트에 사용할 언어를 선택합니다.","settings.language.dashboard":"WEPPY Dashboard 언어","settings.language.dashboard.tooltip":"Auto일 때는 시스템 언어를 따르고, 아니면 선택한 언어를 강제합니다.","settings.language.auto":"자동","overview.l0.title":"MCP 서버 연결 끊김","overview.l0.message":"MCP 서버가 응답하지 않습니다. WEPPY Dashboard가 자동으로 재연결을 시도합니다.","overview.l0.step1":"MCP 서버 프로세스가 실행 중인지 확인하세요","overview.l0.step2":"필요 시 MCP 서버 명령을 다시 시작하세요","overview.l0.reconnecting":"3초마다 자동 재연결 중...","overview.l0.reconnectBtn":"수동 재연결","overview.l0.settingsBtn":"설정 확인","overview.l1.pluginGuide":"Roblox Studio 플러그인이 연결되지 않았습니다","overview.l1.check1":"Roblox Studio가 실행 중인가요?","overview.l1.check2":"WEPPY Plugin이 설치되어 있나요?","overview.l1.feedHint":"플러그인이 연결되면 변경사항이 표시됩니다","overview.metric.server":"서버","overview.metric.server.tooltip":"MCP 서버의 실행 상태와 프로세스 상태입니다.","overview.metric.plugin":"플러그인","overview.metric.plugin.tooltip":"Roblox Studio 플러그인의 연결 상태와 버전 정보입니다.","overview.metric.agent":"에이전트","overview.metric.agent.tooltip":"연결된 AI 코딩 에이전트와 현재 실행 상태입니다.","overview.metric.agent.instancesUnit":"인스턴스","overview.metric.sync":"동기화","overview.metric.sync.tooltip":"현재 Studio와 로컬 파일 간 동기화 상태입니다.","overview.metric.noAgent":"에이전트 없음","overview.meta.version":"버전","overview.meta.version.tooltip":"설치된 MCP 서버 버전입니다.","overview.meta.session":"세션","overview.meta.session.tooltip":"현재 MCP 세션 식별자입니다.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"운영체제에서 사용하는 프로세스 식별자입니다.","overview.meta.uptime":"가동 시간","overview.meta.uptime.tooltip":"MCP 서버가 시작된 뒤 경과한 시간입니다.","overview.feed.title":"최근 게임 변경","overview.feed.empty":"최근 변경사항 없음","overview.changelog.title":"세션 변경 요약","overview.changelog.entries":"합계","overview.changelog.scripts":"스크립트","overview.changelog.instances":"인스턴스","overview.changelog.properties":"속성","overview.changelog.assets":"에셋","overview.tier.title":"티어 사용 현황","changelog.subtitle":"게임 변경 이력","changelog.filter.all":"전체","changelog.filter.active":"활성","changelog.filter.completed":"완료","changelog.empty":"변경 이력이 없습니다","changelog.basic.limit.title":"Basic 미리보기에서는 최신 3개 세션만 표시됩니다","changelog.basic.limit.body":"Pro로 업그레이드하면 이 플레이스의 전체 변경 이력 타임라인을 확인할 수 있습니다.","changelog.basic.metricLabel":"표시 중인 변경 이력 / 전체","changelog.basic.visible":"표시 중","changelog.basic.total":"전체","changelog.card.active":"활성","changelog.card.active.tooltip":"이 세션은 아직 새 게임 변경을 계속 수집 중입니다.","changelog.card.completed":"완료","changelog.card.completed.tooltip":"이 세션은 종료되어 더 이상 새 변경이 추가되지 않습니다.","changelog.card.bootstrapStatus":"초기화","changelog.card.bootstrapStatus.tooltip":"이 세션에는 초기 동기화 기준 기록만 포함됩니다.","changelog.card.inProgress":"진행 중","changelog.card.noChanges":"아직 변경사항 없음","changelog.card.noChanges.tooltip":"이 세션에서는 아직 추출된 게임 변경이 없습니다.","changelog.card.bootstrapSummary":"초기 동기화 기준 기록","changelog.card.bootstrapSummary.tooltip":"초기 파일 동기화 쓰기 작업은 하나의 기준 기록 행으로 축약됩니다.","changelog.card.sessionIntent":"세션 의도","changelog.card.scripts":"스크립트","changelog.card.scripts.tooltip":"이 세션에서 발생한 스크립트 변경입니다.","changelog.card.instances":"인스턴스","changelog.card.instances.tooltip":"이 세션에서 발생한 인스턴스 생성, 삭제, 이동, 복제 변경입니다.","changelog.card.modified":"수정","changelog.card.created":"생성","changelog.card.deleted":"삭제","changelog.card.moved":"이동","changelog.card.propertiesChanged":"속성 변경","changelog.card.propertiesChanged.tooltip":"이 세션에서 기록된 속성 값 변경입니다.","changelog.card.lightingConfigured":"라이팅 설정됨","changelog.card.lightingConfigured.tooltip":"이 세션에서 라이팅 또는 대기 설정이 변경되었습니다.","changelog.card.terrainConfigured":"터레인 설정됨","changelog.card.terrainConfigured.tooltip":"이 세션에서 터레인 데이터 또는 터레인 설정이 변경되었습니다.","changelog.card.assetsInserted":"에셋 삽입","changelog.card.assetsInserted.tooltip":"이 세션 동안 플레이스에 삽입된 에셋입니다.","changelog.category.script":"스크립트","changelog.category.instance":"인스턴스","changelog.category.property":"속성","changelog.category.lighting":"라이팅","changelog.category.terrain":"터레인","changelog.category.asset":"에셋","changelog.detail.changeSummary":"변경 요약","changelog.detail.changeSummary.tooltip":"이 세션에서 추출된 게임 변경 수를 카테고리별로 묶어서 보여줍니다.","changelog.detail.changeTimeline":"변경 타임라인","changelog.detail.changeTimeline.tooltip":"이 세션에서 추출된 게임 변경을 시간순으로 보여줍니다.","changelog.detail.context.title":"컨텍스트 요약","changelog.detail.context.tooltip":"이 체인지로그 세션에 연결된 구조화된 실행 컨텍스트입니다.","changelog.detail.verification.title":"검증","changelog.detail.verification.tooltip":"이 체인지로그 세션에 연결된 검증 신호입니다.","changelog.detail.verification.label":"결과","changelog.detail.verification.status":"상태","changelog.detail.verification.timestamp":"기록 시각","changelog.detail.beforeAfter":"변경 전후 비교","changelog.detail.filterCategory":"카테고리","changelog.detail.filterCategory.tooltip":"타임라인을 하나의 변경 카테고리만 보이도록 필터링합니다.","changelog.detail.confidence.exact":"정확","changelog.detail.confidence.exact.tooltip":"이 변경은 변경 전과 변경 후 상태가 모두 확인되었습니다.","changelog.detail.confidence.partial":"부분 확인","changelog.detail.confidence.partial.tooltip":"이 변경은 변경 전후 상태 중 일부만 확인되었습니다.","changelog.detail.confidence.afterOnly":"결과만 확인","changelog.detail.confidence.afterOnly.tooltip":"이 변경은 적용 후 결과 상태만 확인되었습니다.","changelog.detail.confidence.intentOnly":"의도만 기록","changelog.detail.confidence.intentOnly.tooltip":"요청된 작업 의도만 기록되었고 결과 상태는 확인되지 않았습니다.","changelog.detail.confidence.unknown":"알 수 없음","changelog.detail.confidence.unknown.tooltip":"사용 가능한 데이터만으로는 이 변경을 신뢰도 있게 분류할 수 없습니다.","changelog.detail.noChanges":"이 카테고리에 변경사항 없음","changelog.detail.backToList":"목록으로 돌아가기","changelog.diff.empty":"비교할 내용 없음","changelog.diff.unified":"통합","changelog.diff.sideBySide":"나란히 비교","changelog.diff.before":"변경 전","changelog.diff.after":"변경 후","sync.overlay.title":"Roblox Studio 플러그인이 필요합니다","sync.overlay.message":"Roblox Studio 플러그인이 연결되면 동기화 상태를 확인할 수 있습니다.","sync.overlay.check1":"Roblox Studio가 실행 중인가요?","sync.overlay.check2":"WEPPY Plugin이 설치되어 있나요?","sync.status.title":"동기화 상태","sync.status.title.tooltip":"이 플레이스의 Studio와 로컬 파일 동기화 상태입니다.","sync.status.forwardOnly":"단방향만","sync.status.forwardOnly.tooltip":"Basic 티어에서는 Studio에서 로컬로 가는 단방향 동기화만 사용할 수 있습니다.","sync.status.place":"플레이스","sync.status.place.tooltip":"연결된 Roblox 플레이스 이름과 플레이스 ID입니다.","sync.status.path":"경로","sync.status.path.tooltip":"현재 동기화 출력에 사용하는 로컬 파일 시스템 루트입니다.","sync.status.instances":"인스턴스","sync.status.instances.tooltip":"로컬 미러에 추적 중인 동기화된 Roblox 인스턴스 수입니다.","sync.status.scripts":"스크립트","sync.status.scripts.tooltip":"이 플레이스에 대해 현재 인덱싱된 동기화 스크립트 파일 수입니다.","sync.status.state":"상태","sync.status.state.tooltip":"서버가 보고한 현재 동기화 런타임 상태입니다.","sync.directions.title":"동기화 방향","sync.directions.title.tooltip":"Local과 Studio 사이의 카테고리별 동기화 방향과 적용 방식입니다.","sync.directions.type":"유형","sync.directions.type.tooltip":"이 규칙이 적용되는 동기화 카테고리입니다.","sync.directions.direction":"방향","sync.directions.direction.tooltip":"각 카테고리가 Studio에서만, Studio로만, 또는 양방향으로 동기화되는지 나타냅니다.","sync.directions.applyMode":"적용 모드","sync.directions.applyMode.tooltip":"이 카테고리에 들어오는 동기화 변경을 적용하는 방식입니다.","sync.directions.cat.scripts":"스크립트","sync.directions.cat.values":"값","sync.directions.cat.containers":"컨테이너","sync.directions.cat.data":"데이터","sync.directions.cat.services":"서비스","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"방향 레일의 왼쪽은 항상 디스크의 로컬 파일을 의미합니다.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"방향 레일의 오른쪽은 항상 Roblox Studio를 의미합니다.","sync.directions.mode.manual":"수동","sync.directions.mode.manual.tooltip":"직접 실행할 때만 동기화 변경을 적용합니다.","sync.directions.mode.auto":"자동","sync.directions.mode.auto.tooltip":"업데이트가 들어오면 동기화 변경을 자동으로 적용합니다.","sync.directions.tooltip.forward.body":"Studio 변경 사항을 로컬 파일로만 동기화합니다","sync.directions.tooltip.bidirectional.body":"Local과 Studio 사이에 양방향 동기화를 사용합니다","sync.directions.tooltip.reverse.body":"로컬 파일 변경 사항을 Studio로 푸시합니다","sync.directions.tooltip.proRequired":"Basic 티어에서는 Pro가 필요합니다","sync.directions.dir.forward":"순방향","sync.directions.dir.bidirectional":"양방향","sync.directions.dir.reverse":"역방향","sync.log.title":"동기화 로그","sync.log.empty":"동기화 이벤트 없음","sync.log.type.write":"쓰기","sync.log.type.write.tooltip":"새 동기화 출력이 디스크에 기록되었습니다.","sync.log.type.update":"업데이트","sync.log.type.update.tooltip":"기존 동기화 파일 또는 인스턴스가 갱신되었습니다.","sync.log.type.delete":"삭제","sync.log.type.delete.tooltip":"동기화된 파일 또는 인스턴스가 제거되었습니다.","sync.log.type.idle":"대기","sync.log.type.idle.tooltip":"파일 변경 없이 동기화 이벤트만 기록되었습니다.","sync.upgrade.title":"Pro로 완전한 동기화 기능 해제","sync.upgrade.benefit1":"양방향 동기화 — 파일 편집 시 Studio에 자동 반영","sync.upgrade.benefit2":"역방향 동기화 — 파일 변경을 Studio로 전송","sync.upgrade.benefit3":"전체 동기화 히스토리 및 상세 변경 로그","sync.upgrade.buy":"Pro로 업그레이드","playtest.status.title":"플레이테스트 상태","playtest.status.title.tooltip":"Studio가 보고한 현재 Roblox 플레이테스트 세션 상태입니다.","playtest.status.mode":"모드","playtest.status.mode.tooltip":"현재 세션에 사용 중인 Studio 플레이테스트 실행 모드입니다.","playtest.status.mode.value.tooltip":"현재 적용 중인 Roblox Studio 플레이테스트 모드의 구체적인 값입니다.","playtest.status.mode.play":"플레이","playtest.status.mode.run":"실행","playtest.status.mode.server":"서버","playtest.status.mode.edit":"편집","playtest.status.place.tooltip":"이 플레이테스트 세션과 연결된 Roblox 플레이스입니다.","playtest.status.state.running":"실행 중","playtest.status.state.running.tooltip":"현재 Roblox 플레이테스트 세션이 실행 중입니다.","playtest.status.state.paused":"일시정지","playtest.status.state.paused.tooltip":"현재 Roblox 플레이테스트 세션이 일시정지 상태입니다.","playtest.status.state.notRunning":"실행 안 함","playtest.status.state.notRunning.tooltip":"현재 실행 중인 Roblox 플레이테스트 세션이 없습니다.","playtest.control.play":"플레이","playtest.control.pause":"일시정지","playtest.control.resume":"재개","playtest.control.stop":"정지","playtest.history.title":"테스트 히스토리","playtest.history.title.tooltip":"이 프로젝트에서 기록된 자동 플레이테스트 실행 이력입니다.","playtest.history.empty":"테스트 결과 없음","playtest.history.mode":"모드","playtest.history.mode.tooltip":"이 기록된 테스트 실행에 사용된 플레이테스트 모드입니다.","playtest.history.status.passed":"성공","playtest.history.status.failed":"실패","playtest.history.status.running":"실행 중","playtest.history.status.unknown":"알 수 없음","playtest.history.status.tooltip":"이 자동 플레이테스트 실행의 기록된 결과 상태입니다.","playtest.empty.title":"아직 플레이테스트 결과가 없습니다","playtest.empty.message":"AI 에이전트가 system_info.run_test로 자동 테스트를 실행하면 결과가 표시됩니다.","playtest.empty.message.before":"AI 에이전트가 자동 테스트를","playtest.empty.message.after":"로 실행하면 결과가 여기에 표시됩니다.","playtest.empty.runTest.tooltip":"system_info 도구를 통해 Roblox 플레이테스트 검사를 실행하는 WEPPY Dashboard 자동화 진입점입니다.","playtest.report.title":"선택된 리포트","playtest.report.title.tooltip":"현재 선택된 자동 플레이테스트 실행의 상세 출력입니다.","playtest.report.content":"리포트","playtest.report.content.tooltip":"선택된 자동 플레이테스트 실행의 마크다운 요약입니다.","playtest.report.logs":"로그","playtest.report.logs.tooltip":"선택된 자동 플레이테스트 실행에서 수집된 실행 로그입니다.","playtest.context.contextId":"컨텍스트 ID","playtest.context.why":"이 테스트를 실행한 이유","playtest.context.expected":"예상 결과","playtest.context.observed":"관찰 결과","playtest.report.empty":"리포트 내용 없음","playtest.basic.icon":"🎮","playtest.basic.title":"플레이테스트는 Pro 전용 기능입니다","playtest.basic.desc":"WEPPY Dashboard에서 플레이테스트를 제어하고, 자동 테스트를 실행하며, 상세한 테스트 리포트를 확인하세요.","playtest.basic.benefit1":"원클릭 플레이/일시정지/정지 제어","playtest.basic.benefit2":"AI 에이전트를 통한 자동 테스트 실행","playtest.basic.benefit3":"성공/실패 추적이 가능한 테스트 히스토리","playtest.basic.benefit4":"상세한 마크다운 테스트 리포트","playtest.sample.badge":"Pro 플레이테스트 화면 미리보기","playtest.sample.title":"현재 보고 있는 화면은 Pro 업그레이드 후 사용할 수 있는 플레이테스트 화면 예시입니다.","playtest.sample.message":"이 미리보기는 샘플 데이터로 구성되어 있습니다. 실시간 플레이테스트 제어, 히스토리 관리, 실제 리포트 저장은 Pro 구매 후 사용할 수 있습니다.","playtest.sample.clearDisabled":"실제 플레이테스트 기록 삭제는 Pro에서 사용할 수 있습니다.","playtest.sample.place":"아레나 미리보기","playtest.sample.history.name":"샘플 아레나 스모크 테스트","playtest.sample.context.why":"아레나에 스폰한 뒤 첫 구간을 버티고 HUD가 즉시 반응하는지 확인합니다.","playtest.sample.context.expected":"플레이어가 안전하게 스폰되고, 1초 안에 카운트다운 UI가 표시되며, 첫 웨이브가 오류 없이 시작되어야 합니다.","playtest.sample.context.observed":"스폰 보호가 정상 동작했고, HUD가 제때 갱신되었으며, 첫 웨이브가 회귀 없이 완료되었습니다.","playtest.sample.report.markdown":`# 샘플 아레나 스모크 테스트
80
80
 
81
81
  - 스폰 흐름: 통과
82
82
  - HUD 카운트다운: 통과
@@ -86,7 +86,7 @@ This is a sample preview. Upgrade to Pro to run live playtests and save real rep
86
86
  [sample] 스폰 보호 활성화
87
87
  [sample] HUD 카운트다운 렌더링
88
88
  [sample] 1웨이브 완료
89
- [sample] 미리보기 리포트 종료`,"sidebar.whatsNew":"새 소식","sidebar.help.group":"도움말 및 피드백","sidebar.help.bug":"버그 신고","sidebar.help.bug.tooltip":"GitHub에 환경 정보가 채워진 버그 리포트 열기","sidebar.help.feature":"기능 제안","sidebar.help.feature.tooltip":"GitHub에서 새 기능 또는 개선 제안하기","sidebar.help.discussions":"커뮤니티","sidebar.help.discussions.tooltip":"GitHub Discussions에서 질문하고 아이디어 공유하기","sidebar.help.troubleshooting":"문제 해결","sidebar.help.troubleshooting.tooltip":"weppyai.com 공식 문제 해결 가이드 열기","header.whatsNew":"새 소식","header.whatsNew.tooltip":"새 소식","upgrade.title":"Pro로 업그레이드","upgrade.tagline":"Pro로 기능 확장","upgrade.cta":"Pro 업그레이드","upgrade.validUntil":"{{date}}까지","whatsNew.pageTitle":"새 소식","whatsNew.pageSubtitle":"MCP의 주요 변경사항을 확인하세요","whatsNew.unreadSection":"안 읽음","whatsNew.allSection":"전체 공지","whatsNew.empty":"공지가 없습니다","whatsNew.newBadge":"NEW","whatsNew.category.release":"릴리스","whatsNew.category.notice":"공지","whatsNew.category.deprecation":"지원 중단","whatsNew.category.tip":"팁","uiStudio.title":"UI 스튜디오","uiStudio.empty":"저장된 화면 캡처가 없습니다. AI 에이전트가 현재 UI 상태를 캡처하면 자동 생성됩니다.","uiStudio.loading":"불러오는 중…","uiStudio.pluginGuide.title":"Roblox Studio 플러그인이 연결되지 않았습니다","uiStudio.pluginGuide.message":"UI Studio는 연결된 Studio place의 화면 캡처와 변경 이력을 표시합니다. Studio와 WEPPY Plugin을 연결하면 자동으로 갱신됩니다.","uiStudio.pluginGuide.check1":"Roblox Studio가 실행 중인가요?","uiStudio.pluginGuide.check2":"WEPPY Plugin이 설치되어 실행 중인가요?","uiStudio.pluginGuide.waiting":"플러그인 연결을 기다리는 중...","uiStudio.capturedAt":"캡처 시각","uiStudio.scope":"범위","uiStudio.target":"대상","uiStudio.briefId":"브리프 ID","uiStudio.detailClose":"닫기","uiStudio.colCheck":"항목","uiStudio.colPriority":"우선순위","uiStudio.colCurrent":"현재","uiStudio.colRecommended":"권장","uiStudio.colSuggestion":"제안","uiStudio.priorityHigh":"우선 검토","uiStudio.priorityLow":"선택 개선","uiStudio.highPrioritySection":"우선 검토","uiStudio.lowPrioritySection":"선택 개선","uiStudio.groupSummary":"개 항목","uiStudio.fixLabel":"조치","uiStudio.copyFixCommand":"AI 지시문으로 복사","uiStudio.copiedToClipboard":"복사됨","uiStudio.fullPath":"전체 경로","uiStudio.falsePositiveWarning":"이 그룹은 오탐 가능성이 있습니다","uiStudio.noSuggestions":"현재 개선 제안 없음","uiStudio.sample.badge":"Pro UI 스튜디오 미리보기","uiStudio.sample.title":"Pro 업그레이드 후 이용 가능한 UI 스튜디오를 미리 보고 있습니다.","uiStudio.sample.message":"이 미리보기는 샘플 데이터입니다. 실제 화면 캡처, 검토 이력, AI 자동 수정 요청은 Pro에서 제공됩니다.","uiStudio.tabs.analysis":"분석","uiStudio.tabs.history":"변경 이력","uiStudio.analysis.reportsTitle":"UI 대상별 최신 분석","uiStudio.analysis.recentCapturesTitle":"최근 캡처","uiStudio.analysis.detailDialog":"분석 상세","uiStudio.analysis.targetCountLabel":"분석 대상","uiStudio.analysis.captureLabel":"캡처","uiStudio.analysis.verdict.hasSuggestions":"개선 제안 있음","uiStudio.analysis.verdict.needsFix":"개선 제안 있음","uiStudio.analysis.verdict.review":"개선 제안 있음","uiStudio.analysis.verdict.passed":"현재 개선 제안 없음","uiStudio.analysis.verdictLabel":"개선 요약","uiStudio.analysis.thresholds":"검토 기준","uiStudio.analysis.issueSummary.passed":"현재 검토 기준에서 추가 개선 제안은 없습니다.","uiStudio.history.title":"변경 이력","uiStudio.history.empty":"아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.","uiStudio.history.loading":"로딩 중...","uiStudio.history.error":"오류","uiStudio.history.clear":"전체 삭제","uiStudio.history.filter.actions":"작업 유형","uiStudio.history.filter.actionAll":"전체","uiStudio.history.filter.actionCreate":"생성","uiStudio.history.filter.actionUpdate":"수정","uiStudio.history.filter.actionDelete":"삭제","uiStudio.history.filter.period":"기간","uiStudio.history.filter.dateAll":"전체","uiStudio.history.filter.today":"오늘","uiStudio.history.filter.yesterday":"어제","uiStudio.history.filter.last7Days":"최근 7일","uiStudio.history.filter.last30Days":"최근 30일","uiStudio.history.filter.customRange":"직접 지정","uiStudio.history.filter.reset":"초기화","uiStudio.history.filter.from":"시작일","uiStudio.history.filter.to":"종료일","uiStudio.history.row.affectedPaths":"경로","uiStudio.history.row.mutations":"변경 상세","uiStudio.history.row.expand":"▾ 펼치기","uiStudio.history.row.collapse":"▲ 닫기","uiStudio.history.row.expandDetails":"변경 상세 {n}건","uiStudio.history.row.collapseDetails":"변경 상세 닫기","uiStudio.history.row.toggleDetails":"변경 상세 토글","uiStudio.history.row.mutationsEmpty":"변경 내역 없음","uiStudio.history.row.toolLabel":"UI 변경 {n}건","uiStudio.history.row.compare":"전후 비교","uiStudio.history.row.noBeforeState":"이전 상태 없음","uiStudio.history.row.noAfterState":"이후 상태 없음","uiStudio.history.row.qualityPlan":"디자인 방향","uiStudio.history.row.designCheck":"개선 제안","uiStudio.history.row.designCheckUnavailable":"개선 제안: 요약 없음","uiStudio.history.row.designCheckNone":"개선 제안: 현재 없음","uiStudio.history.selection.deleteSelected":"선택 삭제","uiStudio.history.selection.selectAll":"모두 선택","uiStudio.history.selection.clearSelection":"선택 해제","uiStudio.history.confirm.deleteRequestsTitle":"변경 기록 삭제","uiStudio.history.confirm.deleteRequestsMessage":"선택한 변경 기록을 삭제합니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.history.confirm.clearRequestsTitle":"변경 이력 삭제","uiStudio.history.confirm.clearRequestsMessage":"현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다.","uiStudio.history.confirm.cascadeOption":"연결된 화면 캡처도 함께 삭제","uiStudio.history.drawer.close":"닫기","uiStudio.actions.previewAgain":"다시 미리보기","uiStudio.actions.deleteSnapshot":"이 화면 캡처 삭제","uiStudio.actions.proRequired":"Pro 업그레이드 후 사용 가능","uiStudio.actions.captureCurrentState":"현재 상태 캡처","uiStudio.actions.checkSuggestionsAgain":"개선 제안 다시 확인","uiStudio.actions.previewRunning":"캡처 중…","uiStudio.actions.previewRunningDetail":"완료되면 새 화면 캡처 파일 ID를 표시합니다.","uiStudio.actions.previewNeedsSaveCheck":"캡처 완료, 저장 확인 필요","uiStudio.actions.previewSaved":"새 화면 캡처 저장 완료","uiStudio.actions.previewComplete":"캡처 완료","uiStudio.actions.previewSavedDetail":"기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.","uiStudio.actions.previewSavedPathMissing":"새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.","uiStudio.actions.previewSnapshotIdMissing":"새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.","uiStudio.actions.more":"더 보기","uiStudio.gallery.selection.selectedCount":"개 선택됨","uiStudio.confirm.deleteSnapshotTitle":"화면 캡처 삭제","uiStudio.confirm.deleteSnapshotMessage":"이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존).","uiStudio.confirm.deleteBatchTitle":"화면 캡처 일괄 삭제","uiStudio.confirm.deleteBatchMessage":"선택한 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.gallery.selectMode":"선택 모드","uiStudio.gallery.exitSelectMode":"취소","uiStudio.gallery.selectAll":"모두 선택","uiStudio.gallery.clearSelection":"선택 해제","uiStudio.gallery.deleteSelected":"선택 삭제","common.cancel":"취소","common.delete":"삭제","uiStudio.storage.title":"UI Studio 저장 데이터","uiStudio.storage.usageLabel":"사용 중","uiStudio.storage.historyBytes":"변경 이력","uiStudio.storage.snapshotBytes":"화면 캡처","uiStudio.storage.requestCount":"변경 기록","uiStudio.storage.mutationCount":"변경 상세","uiStudio.storage.snapshotCount":"화면 캡처","uiStudio.storage.countSuffix":"개","uiStudio.storage.lastRun":"마지막 자동 정리","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"회수","uiStudio.storage.lastRunErrors":"오류","uiStudio.storage.loading":"로딩 중...","uiStudio.cleanup.policy.title":"자동 삭제 정책","uiStudio.cleanup.policy.modeOff":"사용 안 함 (off)","uiStudio.cleanup.policy.modeAge":"기간 기반 (age)","uiStudio.cleanup.policy.modeSize":"용량 기반 (size)","uiStudio.cleanup.policy.cascade":"연결된 화면 캡처도 함께 삭제","uiStudio.cleanup.policy.save":"정책 저장","uiStudio.cleanup.policy.runNow":"지금 정리","uiStudio.cleanup.policy.proRequired":"Pro 업그레이드 후 사용 가능","uiStudio.cleanup.policy.daysUnit":"일","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"정책 적용 확인","uiStudio.cleanup.policy.confirm.messageStrict":"이 정책으로 즉시","uiStudio.cleanup.policy.confirm.requests":"건","uiStudio.cleanup.policy.confirm.snapshots":"개 화면 캡처","uiStudio.cleanup.policy.confirm.freed":"가 삭제됩니다 — 적용?","uiStudio.cleanup.keepLastNDays":"최근 {n}일만 남기기","uiStudio.cleanup.selectedDelete":"선택 삭제…","uiStudio.cleanup.deleteAll":"전체 삭제…","uiStudio.cleanup.cleanupConfirmTitle":"정리 확인","uiStudio.cleanup.cleanupConfirmMessage":"선택한 항목이 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"7일 이전 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"30일 이전 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.all":"개의 저장된 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.label":"수동 정리","uiStudio.cleanup.studioPreservedNote":"이 작업은 디스크의 저장된 변경 기록과 화면 캡처만 삭제하며, Roblox Studio 인스턴스는 변경되지 않습니다.","uiStudio.history.sample.bannerBadge":"Pro 변경 이력 미리보기","uiStudio.history.sample.bannerTitle":"Pro 업그레이드 후 이용 가능한 UI 변경 이력 화면을 미리 보고 있습니다.","uiStudio.history.sample.bannerMessage":"이 미리보기는 샘플 데이터입니다. 실제 변경 이력, 전후 비교, 일괄 삭제는 Pro에서 제공됩니다.","uiStudio.fix.touchTarget.label":"터치 타겟 크기","uiStudio.fix.touchTarget.description":"모바일에서 손가락으로 누르기 편한 최소 크기를 만족하는지 확인합니다.","uiStudio.fix.touchTarget.howToFix":"버튼 Size를 44x44 px 이상으로 키우거나 UIPadding으로 터치 영역을 확장하세요.","uiStudio.fix.contrast.label":"텍스트 대비","uiStudio.fix.contrast.description":"텍스트와 배경의 명암 비율이 WCAG 접근성 기준을 만족하는지 확인합니다.","uiStudio.fix.contrast.howToFix":"TextColor3를 더 밝은 색(예: #FFFFFF)으로 바꾸거나 BackgroundColor3를 어둡게 조정하세요.","uiStudio.fix.contrast.falsePositive":"이모지 아이콘은 색상이 고정되어 대비 규칙이 오탐하는 경우가 있습니다.","uiStudio.fix.textScaled.label":"TextScaled 사용","uiStudio.fix.textScaled.description":"TextScaled가 켜져 있으나 UITextSizeConstraint가 없으면 언어 확장 시 레이아웃이 깨질 수 있습니다.","uiStudio.fix.textScaled.howToFix":"해당 TextLabel에 UITextSizeConstraint 자식을 추가하고 MaxTextSize를 지정하세요.","uiStudio.fix.safezone.label":"세이프존 배치","uiStudio.fix.safezone.description":"버튼이 플랫폼별 세이프존 안에 있는지 확인합니다.","uiStudio.fix.safezone.howToFix":"Position을 세이프존 안쪽으로 이동하거나 부모 Frame을 축소하세요.","uiStudio.fix.minTextSize.label":"최소 폰트 크기","uiStudio.fix.minTextSize.description":"텍스트가 너무 작아 가독성이 떨어지는지 확인합니다.","uiStudio.fix.minTextSize.howToFix":"본문 기준 TextSize를 14 이상으로 올리세요.","uiStudio.sample.history.request1.label":"HUD 레이아웃 초기 생성","uiStudio.sample.history.request2.label":"Inventory 모달 디자인 업데이트","uiStudio.sample.history.request3.label":"HUD HealthBar 색상 수정","uiStudio.sample.history.request4.label":"Inventory 탭 버튼 터치 타겟 확대","uiStudio.sample.history.request5.label":"Settings 팝업 삭제","uiStudio.sample.history.request6.label":"HUD 미니맵 컴포넌트 추가","uiStudio.sample.history.request1.mutation1.diff":"Frame + HealthBar + StaminaBar 생성","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"AnchorPoint, Position, Size 설정","uiStudio.sample.history.request1.mutation5.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request2.mutation1.diff":"BackgroundColor3 어둡게 조정 (대비 개선)","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, BorderColor3 설정","uiStudio.sample.history.request2.mutation4.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (빨간 계열)","uiStudio.sample.history.request3.mutation2.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui 제거 (Settings 전용 UI)","uiStudio.sample.history.request6.mutation1.diff":"Frame + MapImage + PlayerDot 생성 시도","uiStudio.sample.history.request6.mutation2.diff":"Size, Position, BackgroundTransparency 설정","uiStudio.sample.history.request6.mutation3.diff":"ImageLabel 설정 중 서버 재시작으로 중단","uiStudio.sample.history.request6.mutation4.diff":"불완전 화면 캡처 저장","uiStudio.sample.history.request6.mutation3.error":"server_restart: 연결 끊김","uiStudio.sample.history.request6.mutation4.error":"partial snapshot: 누락된 레이어 있음","uiStudio.sample.history.detail.backgroundColor":"배경색","uiStudio.sample.history.detail.anchorPoint":"앵커","uiStudio.sample.history.detail.position":"위치","uiStudio.sample.history.detail.size":"사이즈","uiStudio.sample.history.detail.textColor":"글자색","uiStudio.sample.history.detail.textSize":"글자 크기","uiStudio.sample.history.detail.borderSize":"테두리 크기","uiStudio.sample.history.detail.borderColor":"테두리색","settings.dataHistory.title":"데이터 및 이력","settings.dataHistory.title.tooltip":"대시보드에 저장된 데이터를 한 곳에서 관리합니다.","settings.dataHistory.collapse":"{title} 접기","settings.dataHistory.expand":"{title} 펼치기","settings.dataHistory.scope":"현재 프로젝트","settings.dataHistory.scope.tooltip":"삭제 작업은 항목에 따라 현재 프로젝트와 활성 place에 적용됩니다.","settings.dataHistory.intro":"저장된 대시보드 데이터를 확인하고, 관련 페이지로 이동하거나, 저장 기록을 한 곳에서 삭제합니다.","settings.dataHistory.toolsActivity.title":"도구 실행 기록","settings.dataHistory.toolsActivity.description":"Tools 페이지에 표시되는 저장된 도구 실행 기록입니다.","settings.dataHistory.toolStats.title":"도구 사용 통계","settings.dataHistory.toolStats.description":"도구 호출 수와 상태별 집계입니다.","settings.dataHistory.syncLog.title":"동기화 로그","settings.dataHistory.syncLog.description":"활성 place의 파일 동기화 이벤트 기록입니다.","settings.dataHistory.playtest.title":"플레이테스트 리포트","settings.dataHistory.playtest.description":"저장된 자동 플레이테스트 리포트와 로그입니다.","settings.dataHistory.projectChanges.title":"프로젝트 변경 요약","settings.dataHistory.projectChanges.description":"저장된 프로젝트 변경 요약입니다.","settings.dataHistory.connectionLog.title":"연결 로그","settings.dataHistory.connectionLog.description":"MCP와 Studio 연결 이벤트 기록입니다.","settings.dataHistory.uiStudio.title":"UI Studio 이력 및 화면 캡처","settings.dataHistory.uiStudio.tooltip":"저장된 UI Studio 변경 기록, 화면 캡처, 자동 삭제 정책을 관리합니다.","settings.dataHistory.uiStudio.description":"저장된 UI Studio 변경 기록, 화면 캡처, 정리 정책입니다.","settings.dataHistory.uiStudio.clear.title":"UI Studio 저장 데이터를 삭제할까요?","settings.dataHistory.uiStudio.clear.message":"저장된 UI Studio 변경 기록과 화면 캡처만 삭제됩니다. Roblox Studio 인스턴스와 프로젝트 오브젝트는 변경되지 않습니다.","settings.dataHistory.uiStudio.clear.success":"UI Studio 저장 데이터를 삭제했습니다.","settings.dataHistory.uiStudio.clear.failed":"UI Studio 저장 데이터를 삭제하지 못했습니다.","settings.dataHistory.metric.unavailable":"확인 불가","settings.dataHistory.metric.sizeUnavailable":"용량 확인 불가","settings.dataHistory.metric.records":"건","settings.dataHistory.metric.runs":"회","settings.dataHistory.metric.sessions":"세션","settings.dataHistory.metric.reports":"개 리포트","settings.dataHistory.open":"열기","settings.dataHistory.clear.title":"저장 데이터를 삭제할까요?","settings.dataHistory.clear.message":"대시보드에 저장된 기록만 삭제됩니다. Roblox Studio 인스턴스와 프로젝트 오브젝트는 변경되지 않습니다.","settings.dataHistory.clear.success":"저장 데이터를 삭제했습니다.","settings.dataHistory.clear.failed":"저장 데이터를 삭제하지 못했습니다.","uiStudio.history.sample.tooltip":"전체 이력은 Pro 업그레이드 후 이용 가능합니다","toast.serverConnected":"MCP 서버 연결됨","toast.serverDisconnected":"MCP 서버 연결 끊김","toast.pluginConnected":"플러그인 연결됨","toast.pluginDisconnected":"플러그인 연결 끊김","toast.clearSuccess":"삭제되었습니다","toast.clearFailed":"삭제하지 못했습니다","common.clear":"비우기","settings.license.activate":"라이센스 활성화","settings.license.refresh":"라이센스 새로고침","settings.license.keyInput":"라이센스 키","settings.license.disconnected":"연결 끊김","settings.license.disconnected.tooltip":"WEPPY Dashboard에서 라이센스를 관리하려면 먼저 MCP 서버에 다시 연결하세요.","settings.license.live.tooltip":"라이센스 작업은 MCP 서버에 즉시 반영됩니다.","settings.license.status.activationRequired":"활성화 필요","settings.license.status.activationRequired.tooltip":"WEPPY Dashboard가 이 상태를 갱신하려면 먼저 수동으로 라이센스를 활성화해야 합니다.","settings.license.status.grace":"유예","settings.license.status.grace.tooltip":"공급자 검증이 일시적으로 불가하지만, 유예 기간 동안 Pro 접근은 유지됩니다.","settings.license.status.graceBilling.tooltip":"결제 관련 유예 기간 동안 Pro 접근은 유지됩니다.","settings.license.detail.graceBilling":"결제 유예 기간 동안 Pro 접근이 유지됩니다.","settings.license.detail.graceProviderUnavailable":"공급자 사용 불가. 유예 모드 동안 Pro 접근은 유지됩니다.","settings.license.detail.manualActivation":"Pro 접근을 복구하려면 수동 활성화가 필요합니다.","settings.license.detail.missingSessionToken":"현재 세션 토큰이 없어 새로고침이 차단되었습니다.","settings.license.detail.refreshRecommended":"라이센스 검증을 곧 새로고침해야 합니다.","connection.agents.kill":"종료","connection.agents.kill.title":"에이전트를 종료할까요?","connection.agents.killed":"에이전트가 종료되었습니다","connection.agents.killFailed":"에이전트를 종료하지 못했습니다","connection.agents.lastCommand":"최근 명령","connection.agents.lastCommand.tooltip":"이 에이전트가 가장 최근에 실행한 도구 호출입니다.","connection.agents.lastSeen":"마지막 활동","connection.agents.lastSeen.tooltip":"이 에이전트의 가장 최근 heartbeat 또는 활동 시각입니다.","connection.clear.title":"연결 로그를 비울까요?","connection.clear.message":"현재 프로젝트에 저장된 연결 로그가 영구적으로 삭제됩니다.","sync.clear.title":"동기화 로그를 비울까요?","sync.clear.message":"현재 플레이스에 저장된 동기화 로그가 영구적으로 삭제됩니다.","playtest.clear.title":"테스트 히스토리를 비울까요?","playtest.clear.message":"현재 플레이스에 저장된 플레이테스트 리포트가 영구적으로 삭제됩니다.","changelog.clear.title":"변경 이력을 비울까요?","changelog.clear.message":"현재 플레이스에 저장된 변경 이력이 영구적으로 삭제됩니다.","sync.status.placePath":"플레이스 경로","sync.status.placePath.tooltip":"Explorer 파일이 동기화되는 현재 플레이스 디렉토리입니다.","tier.progress.label":"Pro / 전체","changelog.card.representativeArea":"대표 영역","changelog.card.verification":"검증","uiStudio.tabs.analysis.tooltip":"AI가 캡처한 화면을 한눈에 보고, 개선이 필요한 UI를 빠르게 찾는 화면입니다.","uiStudio.tabs.history.tooltip":"AI가 UI를 수정한 모든 기록을 시간순으로 보여줍니다. 변경 전·후 화면을 비교할 수 있습니다.","uiStudio.title.tooltip":"AI가 만든 UI 화면을 모아두고 개선 제안을 확인하는 공간입니다.","uiStudio.analysis.reportsTitle.tooltip":"각 UI(예: 인벤토리 창, 메인 메뉴)별로 가장 최근 캡처와 개선 제안 요약을 보여줍니다.","uiStudio.analysis.verdict.hasSuggestions.tooltip":"이 UI에서 더 좋아질 수 있는 부분이 발견됐습니다. 카드를 눌러 상세 내용을 확인하세요.","uiStudio.analysis.verdict.passed.tooltip":"현재 검사 기준에서는 개선할 부분이 발견되지 않았습니다.","uiStudio.analysis.counts.tooltip":"주요는 먼저 검토하면 좋은 핵심 항목, 참고는 다듬으면 좋은 부가 항목입니다.","uiStudio.analysis.thresholds.tooltip":"이 분석에 사용된 기준 세트입니다 (기본값 또는 사용자 정의).","uiStudio.analysis.recentCapturesTitle.tooltip":"최근에 저장된 모든 캡처를 시간순으로 보여줍니다.","uiStudio.gallery.selectAll.tooltip":"현재 보이는 모든 캡처를 한 번에 선택합니다.","uiStudio.gallery.clearSelection.tooltip":"현재 선택된 캡처를 모두 해제합니다.","uiStudio.gallery.deleteSelected.tooltip":"선택한 캡처 파일만 삭제합니다. Studio의 실제 UI는 그대로 유지됩니다.","uiStudio.gallery.cardCheckbox.tooltip":"이 캡처를 선택합니다. 여러 개 선택해 한 번에 삭제할 수 있습니다.","uiStudio.detailClose.tooltip":"이 상세 패널을 닫습니다.","uiStudio.actions.captureCurrentState.tooltip":"지금 Studio에 표시되고 있는 UI를 새 캡처로 저장합니다. 기존 캡처는 그대로 남습니다.","uiStudio.actions.checkSuggestionsAgain.tooltip":"현재 캡처를 새로 캡처하지 않고 개선 제안만 다시 계산합니다.","uiStudio.actions.more.tooltip":"추가 작업 메뉴를 엽니다.","uiStudio.actions.deleteSnapshot.tooltip":"이 캡처 파일만 삭제합니다. Studio의 실제 UI는 변경되지 않습니다.","uiStudio.capturedAt.tooltip":"이 화면이 저장된 시각입니다.","uiStudio.scope.tooltip":"캡처 대상 범위입니다 (예: 화면 전체 또는 특정 UI).","uiStudio.target.tooltip":"캡처된 UI 인스턴스의 정확한 경로입니다.","uiStudio.briefId.tooltip":"이 UI를 만든 디자인 지시서(Design Brief)의 식별자입니다.","uiStudio.analysis.verdictLabel.tooltip":"이 캡처에 대한 전반적인 개선 판정입니다.","uiStudio.suggestionGroup.tooltip":"같은 종류의 개선 제안을 묶어서 보여줍니다. 헤더를 클릭해 펼치거나 접을 수 있습니다.","uiStudio.groupSummary.tooltip":"이 항목에 해당하는 UI 요소의 개수입니다.","uiStudio.colCurrent.tooltip":"현재 적용된 값입니다.","uiStudio.colRecommended.tooltip":"권장하는 값입니다.","uiStudio.copyFixCommand.tooltip":"이 문제를 AI에게 설명해 한 번에 고치게 할 수 있는 지시문을 복사합니다.","uiStudio.falsePositiveWarning.tooltip":"이 검사 항목은 실제로는 문제가 아닐 수도 있으니 직접 확인 후 적용하세요.","uiStudio.history.filter.actions.tooltip":"AI가 수행한 변경 종류로 기록을 거를 수 있습니다.","uiStudio.history.filter.period.tooltip":"기록을 시간 범위로 거를 수 있습니다.","uiStudio.history.filter.from.tooltip":"조회를 시작할 날짜입니다.","uiStudio.history.filter.to.tooltip":"조회를 종료할 날짜입니다.","uiStudio.history.filter.actionAll.tooltip":"모든 종류의 작업을 보여줍니다.","uiStudio.history.filter.actionCreate.tooltip":"새 UI를 만든 작업만 보여줍니다.","uiStudio.history.filter.actionUpdate.tooltip":"기존 UI를 수정한 작업만 보여줍니다.","uiStudio.history.filter.actionDelete.tooltip":"UI를 삭제한 작업만 보여줍니다.","uiStudio.history.filter.dateAll.tooltip":"전체 기간을 봅니다.","uiStudio.history.filter.today.tooltip":"오늘 발생한 변경만 봅니다.","uiStudio.history.filter.yesterday.tooltip":"어제 발생한 변경만 봅니다.","uiStudio.history.filter.last7Days.tooltip":"최근 7일간의 변경만 봅니다.","uiStudio.history.filter.last30Days.tooltip":"최근 30일간의 변경만 봅니다.","uiStudio.history.filter.customRange.tooltip":"직접 시작일과 종료일을 지정합니다.","uiStudio.history.filter.reset.tooltip":"모든 필터를 초기 상태로 되돌립니다.","uiStudio.history.title.tooltip":"AI가 UI를 수정한 모든 작업을 시간순으로 모아둔 곳입니다.","uiStudio.history.clear.tooltip":"현재 프로젝트의 모든 변경 이력을 삭제합니다. Studio의 실제 UI는 영향받지 않습니다.","uiStudio.history.row.compare.tooltip":"변경 전과 후 화면을 나란히 비교해 봅니다. 클릭하면 큰 화면으로 확인할 수 있습니다.","uiStudio.history.row.extraPaths.tooltip":"이 작업으로 함께 변경된 다른 UI의 개수입니다.","uiStudio.history.row.noBeforeState.tooltip":"변경 전 시점의 캡처가 저장되지 않았습니다.","uiStudio.history.row.noAfterState.tooltip":"변경 후 시점의 캡처가 저장되지 않았습니다.","uiStudio.history.row.affectedPaths.tooltip":"이 작업으로 영향을 받은 UI의 개수입니다.","uiStudio.history.row.mutations.tooltip":"속성 변경 등 세부 작업의 개수입니다.","uiStudio.history.row.qualityPlan.tooltip":"이 변경에 사용된 brief 디자인 방향입니다.","uiStudio.history.row.designCheck.tooltip":"변경 이후 Design Check 개선 제안 요약입니다.","uiStudio.history.row.toggleDetails.tooltip":"어떤 속성이 어떻게 바뀌었는지 한 줄씩 자세히 보여줍니다.","uiStudio.compare.before.tooltip":"AI가 변경하기 직전에 저장된 화면입니다.","uiStudio.compare.after.tooltip":"AI가 변경한 직후에 저장된 화면입니다.","uiStudio.compare.path.tooltip":"이 화면의 UI 인스턴스 경로입니다.","uiStudio.storage.title.tooltip":"UI Studio가 디스크에 저장한 변경 이력과 캡처의 사용량을 보여줍니다.","uiStudio.storage.usageLabel.tooltip":"현재 이 프로젝트에서 UI Studio가 사용 중인 디스크 용량입니다.","uiStudio.storage.historyBytes.tooltip":"변경 기록 데이터(JSON)가 차지하는 용량입니다.","uiStudio.storage.snapshotBytes.tooltip":"캡처된 PNG 이미지 파일이 차지하는 용량입니다.","uiStudio.storage.requestCount.tooltip":"AI가 UI를 수정한 작업의 개수입니다.","uiStudio.storage.mutationCount.tooltip":"각 작업 안의 세부 변경 항목 개수입니다 (속성 변경 한 줄 = 1개).","uiStudio.storage.snapshotCount.tooltip":"저장된 캡처 이미지 파일의 개수입니다.","uiStudio.storage.lastRun.tooltip":"자동 삭제 정책이 가장 최근에 실행된 시각과 결과입니다.","uiStudio.cleanup.label.tooltip":"원할 때 직접 변경 이력과 캡처를 정리할 수 있습니다.","uiStudio.cleanup.keep7.tooltip":"지금부터 7일 이전의 변경 이력과 캡처를 모두 삭제합니다.","uiStudio.cleanup.keep30.tooltip":"지금부터 30일 이전의 변경 이력과 캡처를 모두 삭제합니다.","uiStudio.cleanup.deleteAll.tooltip":"이 프로젝트에 저장된 모든 변경 이력과 캡처를 삭제합니다. Studio의 실제 UI는 변경되지 않습니다.","uiStudio.cleanup.policy.title.tooltip":"오래되거나 용량을 차지하는 캡처를 자동으로 정리하는 규칙입니다.","uiStudio.cleanup.policy.modeOff.tooltip":"자동 정리를 끕니다. 직접 정리하기 전까지 모든 데이터가 유지됩니다.","uiStudio.cleanup.policy.modeAge.tooltip":"지정한 일수보다 오래된 데이터를 자동으로 삭제합니다.","uiStudio.cleanup.policy.modeSize.tooltip":"총 사용량이 지정한 크기를 넘으면 오래된 데이터부터 자동으로 삭제합니다.","uiStudio.cleanup.policy.agePreset.tooltip":"이 일수보다 오래된 데이터를 삭제합니다.","uiStudio.cleanup.policy.ageInput.tooltip":"1일에서 365일 사이로 직접 입력할 수 있습니다.","uiStudio.cleanup.policy.sizePreset.tooltip":"총 사용량이 이 크기를 넘지 않도록 유지합니다.","uiStudio.cleanup.policy.sizeInput.tooltip":"50MB에서 10000MB(10GB) 사이로 직접 입력할 수 있습니다.","uiStudio.cleanup.policy.cascade.tooltip":"변경 이력만이 아니라 그 이력에 연결된 캡처 이미지도 함께 삭제합니다. 끄면 이미지는 남깁니다.","uiStudio.cleanup.policy.save.tooltip":"현재 입력한 자동 삭제 규칙을 저장합니다. 저장 후부터 백그라운드에서 적용됩니다.","uiStudio.cleanup.policy.runNow.tooltip":"다음 자동 실행을 기다리지 않고 현재 규칙을 즉시 한 번 실행합니다.","settings.license.refresh.tooltip":"라이센스 서버에서 최신 상태를 다시 가져옵니다. 결제·취소 후 상태가 바로 반영되지 않을 때 사용하세요.","settings.license.reset.tooltip":"현재 등록된 라이센스 키를 제거합니다. 다른 키로 다시 활성화할 때 사용하세요.","settings.license.activate.tooltip":"입력한 라이센스 키로 Pro 기능을 활성화합니다.","tier.upgrade.tooltip":"Pro로 업그레이드하고 모든 기능을 잠금 해제합니다.","settings.language.auto.tooltip":"운영체제 언어 설정을 따릅니다. 지원되지 않는 언어이면 영어로 표시됩니다.","settings.dataHistory.open.tooltip":"이 항목을 자세히 보는 페이지로 이동합니다.","settings.dataHistory.clear.tooltip":"이 항목에 저장된 기록만 삭제합니다. Studio의 실제 데이터는 변경되지 않습니다.","settings.dataHistory.toggle.tooltip":"이 섹션을 접거나 펼칩니다.","settings.dataHistory.toolsActivity.metric.tooltip":"저장된 도구 실행 기록의 개수와 디스크 사용량입니다.","settings.dataHistory.toolStats.metric.tooltip":"집계된 총 실행 횟수와 세션 수입니다.","settings.dataHistory.syncLog.metric.tooltip":"저장된 동기화 이벤트의 개수와 디스크 사용량입니다.","settings.dataHistory.playtestReports.metric.tooltip":"저장된 플레이테스트 보고서의 개수와 디스크 사용량입니다.","settings.dataHistory.projectChanges.metric.tooltip":"저장된 프로젝트 변경 요약의 개수와 디스크 사용량입니다.","settings.dataHistory.connectionLog.metric.tooltip":"저장된 연결 이벤트의 개수와 디스크 사용량입니다.","settings.dataHistory.uiStudio.metric.tooltip":"저장된 UI Studio 변경 기록·캡처 수와 총 디스크 사용량입니다.","uiStudio.designCheckResultsTitle":"Design Check 제안","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"다시 확인","uiStudio.actions.designCheckRunning":"개선 제안 확인 중...","uiStudio.actions.designCheckRunningDetail":"완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.","uiStudio.actions.designCheckComplete":"개선 제안 확인 완료","uiStudio.actions.designCheckNoSnapshotSaved":"이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.","uiStudio.sample.designCheck.contrast":"텍스트 대비 {expected} 미만 (현재 {actual}). TextColor3 또는 BackgroundColor3 조정 필요.","uiStudio.sample.designCheck.touchTarget":"터치 타겟 {expected} 권장 (현재 {actual}). Size 또는 padding을 늘리세요.","uiStudio.sample.designCheck.minTextSize":"TextSize가 {expected} 미만입니다 (현재 {actual}). 가독성 확보를 위해 상향 조정하세요.","uiStudio.gallery.priorityHighBadge.tooltip":"우선 검토 제안 개수입니다. 클릭해서 상세 내용을 확인하세요.","uiStudio.gallery.priorityMediumBadge.tooltip":"검토 권장 제안 개수입니다.","uiStudio.priorityMedium":"검토 권장","uiStudio.mediumPrioritySection":"검토 권장","uiStudio.gallery.priorityLowBadge.tooltip":"선택 개선 제안 개수입니다."},Lf={"sidebar.overview":"Resumen","sidebar.changelog":"Historial","sidebar.connection":"Conexión","sidebar.sync":"Sincronización","sidebar.playtest":"Prueba","sidebar.tools":"Herramientas","sidebar.settings":"Configuración","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Se requiere conexión con el servidor MCP.","sidebar.gate.l2":"Se requiere conexión con el plugin de Roblox Studio.","header.currentProject":"Proyecto actual","header.unknownProject":"Proyecto desconocido","header.projectRoot.label":"Project Root","header.currentProject.loading":"Cargando raíz del proyecto...","header.currentProject.unavailable":"Raíz del proyecto no disponible","header.placeNotConnected":"Place no conectado","header.currentProject.tooltip":"Carpeta de proyecto seleccionada actualmente.","header.currentProject.loading.tooltip":"La información de la raíz del proyecto todavía se está cargando.","header.currentProject.unavailable.tooltip":"La información actual de la raíz del proyecto no está disponible.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Cargando sync root...","header.currentProjectSyncRoot.unavailable":"Sync root no disponible","header.currentProjectSyncRoot.tooltip":"Carpeta sync root actual del proyecto seleccionado.","header.currentProjectSyncRoot.loading.tooltip":"La información de sync root todavía se está cargando.","header.currentProjectSyncRoot.unavailable.tooltip":"La información actual de sync root no está disponible.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"La ruta de archivos de prueba no está disponible.","header.testFiles.tooltip":"Directorio actual de archivos de playtest para el place seleccionado.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Se requiere conexión del plugin","header.places.liveRequired":"Se requiere conexión del plugin para ver el place activo en tiempo real.","header.place.tooltip":"Place de Roblox conectado.","header.placeNotConnected.tooltip":"Place no conectado","header.changeProjectRoot":"Cambiar raíz del proyecto","header.changeProjectRoot.ariaLabel":"Cambiar raíz del proyecto","header.changeProjectRoot.tooltip":"Cambiar la raíz actual del proyecto.","header.changeProjectRoot.disabledTooltip.l0":"Primero se requiere conexión con el servidor MCP para cambiar la raíz del proyecto.","header.changeProjectRoot.disabledTooltip.loading":"La información de la raíz del proyecto todavía se está cargando.","header.changeProjectRoot.disabledTooltip.unavailable":"La información actual de la raíz del proyecto no está disponible.","header.projectRootModal.initial.title":"Cambiar raíz del proyecto","header.projectRootModal.initial.body.connected":"Después de elegir una carpeta de proyecto, MCP cambiará a la nueva raíz del proyecto y el contenido actual de Studio se resincronizará por completo en el nuevo destino <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Después de elegir una carpeta de proyecto, MCP cambiará a la nueva raíz del proyecto y usará <selected project folder>/weppy-project-sync como el próximo destino de sync.","header.projectRootModal.initial.nextSyncRoot":"Nuevo destino de sync después de la selección","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"El sync actual se detiene de inmediato.","header.projectRootModal.initial.warningFreshSync":"El contenido actual de Studio se usará para crear un fresh full sync en el nuevo destino.","header.projectRootModal.initial.warningNoMove":"Las carpetas de sync anteriores no se mueven automáticamente.","header.projectRootModal.initial.warningDeferredSync":"Si Studio no está conectado, el full resync comenzará la próxima vez que se conecte el plugin.","header.projectRootModal.confirm.title":"Confirmar nueva raíz del proyecto","header.projectRootModal.confirm.body":"Revisa la carpeta seleccionada antes de aplicar el cambio.","header.projectRootModal.confirm.projectRoot":"Carpeta de proyecto seleccionada","header.projectRootModal.confirm.syncRoot":"Nuevo destino de sync","header.projectRootModal.confirm.warningNoMove":"Las carpetas de sync existentes no se mueven automáticamente.","header.projectRootModal.pick":"Elegir carpeta","header.projectRootModal.apply":"Aplicar cambio","header.projectRootModal.cancel":"Cancelar","header.projectRootModal.error":"No se pudo cambiar la raíz del proyecto.","status.online":"En línea","status.offline":"Desconectado","status.idle":"Inactivo","status.syncing":"Sincronizando","status.error":"Error","status.initializing":"Inicializando","level.l0.title":"Servidor desconectado","level.l0.message":"WEPPY Dashboard está abierto pero el servidor MCP se detuvo o no responde.","level.l1.title":"Servidor conectado","level.l1.hint":"Verifica: ¿Roblox Studio está abierto? ¿El plugin está instalado?","level.l2.ok":"Studio conectado","tier.basic":"Basic","tier.basic.tooltip":"Nivel Basic con el conjunto estándar de funciones del WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Nivel Pro con el conjunto completo de funciones del WEPPY Dashboard.","tier.mixed":"Mixto","tier.upgrade":"Actualizar a Pro","tier.compare":"Basic vs Pro","tier.banner.save":"¡Ahorra tokens de IA con Pro!","tier.comparison.comingSoon":"Comparación Basic vs Pro — próximamente","tier.comparison.close":"Cerrar","tier.comparison.detailTitle":"Catálogo detallado de herramientas","tier.comparison.description":"Descripción","tier.comparison.basic.core":"Flujo MCP básico","tier.comparison.basic.core.item1":"Crear/editar scripts","tier.comparison.basic.core.item2":"Gestión de instancias","tier.comparison.basic.core.item3":"Control de propiedades","tier.comparison.basic.core.item4":"Selección y búsqueda","tier.comparison.basic.core.item5":"Gestión de etiquetas","tier.comparison.basic.core.item6":"Control de cámara","tier.comparison.basic.core.item7":"Monitoreo de registros","tier.comparison.basic.sync":"Sincronización (Basic)","tier.comparison.basic.sync.item1":"Sincronización unidireccional de Studio a local","tier.comparison.basic.sync.item2":"Aplicación manual por defecto","tier.comparison.pro.all":"Todo en Basic, además","tier.comparison.pro.sync":"Flujo de sincronización avanzado","tier.comparison.pro.sync.item1":"Dirección de sincronización por tipo","tier.comparison.pro.sync.item2":"Modo de aplicación por tipo","tier.comparison.pro.sync.item3":"Sincronización bidireccional e inversa","tier.comparison.pro.sync.item4":"Sincronización completa, resincronización y envío a Studio","tier.comparison.pro.sync.item5":"Sincronización multi-lugar","tier.comparison.pro.playtest":"Control de playtest","tier.comparison.pro.playtest.item1":"Reproducir, detener, pausar y reanudar","tier.comparison.pro.playtest.item2":"Inspección del estado de playtest","tier.comparison.pro.playtest.item3":"Ejecución de pruebas automatizadas","tier.comparison.pro.creation":"Flujo de creación avanzado","tier.comparison.pro.creation.item1":"Operaciones masivas","tier.comparison.pro.creation.item2":"Generación de terreno","tier.comparison.pro.creation.item3":"Búsqueda e inserción de assets","tier.comparison.pro.creation.item4":"Raycast y análisis espacial","tier.comparison.pro.creation.item5":"Control de entorno","tier.comparison.pro.ui":"Diseño de UI con IA (UI Studio)","tier.comparison.pro.ui.item1":"design_brief — recopilación guiada de requisitos de UI","tier.comparison.pro.ui.item2":"create_tree / update / delete — crear y editar la jerarquía de UI","tier.comparison.pro.ui.item3":"preview — capturar pantallas de la UI actual","tier.comparison.pro.ui.item4":"Design Check — validar objetivos táctiles, contraste y zonas seguras","tier.comparison.discount.label":"🎁 Ingresa este código en Gumroad para recibir un descuento:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Válido hasta el 30 de abril","tier.promo.discount.hint":"🎁 Usa el código WEPPY-MCP en Gumroad · Válido hasta el 30 de abril","tier.promo.discount.context":"🎁 Ingresa en Gumroad al pagar:","tier.tool.query_instances.desc":"Consulta de instancias, exploración de hijos/descendientes, info de clase, búsqueda por nombre y clase. Pro: árbol de archivos, estructura del proyecto, búsqueda por propiedad y etiqueta.","tier.tool.mutate_instances.desc":"Crear, eliminar, clonar, mover, renombrar y pivotar instancias. Pro: creación de árboles, creación/eliminación/duplicación masiva.","tier.tool.manage_properties.desc":"Consultar y establecer propiedades, atributos y etiquetas. Pro: valores calculados y relativos, consulta/establecimiento masivo, modificación masiva de hijos.","tier.tool.manage_scripts.desc":"Leer, escribir, crear, eliminar, editar líneas y buscar en scripts. Pro: reemplazo masivo entre scripts.","tier.tool.manage_lighting.desc":"Solo Pro. Configuración de iluminación, atmósfera, cielo, propiedades del terreno y hora del día.","tier.tool.manage_selection.desc":"Consultar, establecer y borrar selección. Pro: contexto, detalles, agregar/quitar elementos, monitorear cambios.","tier.tool.manage_camera.desc":"Info de cámara, enfocar por ruta o coordenadas, vista sugerida.","tier.tool.manage_tween.desc":"Solo Pro. Crear, reproducir, pausar y cancelar tweens para animaciones suaves.","tier.tool.manage_audio.desc":"Solo Pro. Reproducir, detener, pausar y reanudar sonidos. Configurar listener de audio.","tier.tool.manage_animation.desc":"Solo Pro. Cargar, reproducir y detener animaciones. Consultar tracks de humanoide/controlador.","tier.tool.manage_physics.desc":"Solo Pro. Registrar grupos de colisión, configurar colisión entre grupos, listar grupos.","tier.tool.manage_effects.desc":"Solo Pro. Emitir partículas, borrar todas, alternar activación de efectos.","tier.tool.manage_terrain.desc":"Solo Pro. Rellenar formas, borrar regiones, reemplazar materiales, gestionar colores, leer/escribir voxels, generación procedural, suavizado.","tier.tool.spatial_query.desc":"Solo Pro. Raycast, buscar suelo, verificar colocación, escaneo de área, buscar zonas planas y puntos de aparición, análisis de caminabilidad, mapa espacial, detección de colisión.","tier.tool.manage_assets.desc":"Solo Pro. Insertar modelos, consultar info de assets, buscar en tienda de creadores, insertar modelos/paquetes gratuitos, exportar.","tier.tool.manage_sync.desc":"Solo Pro. Estado de sincronización, configuración, historial, dirección, lectura/escritura de archivos sincronizados.","tier.tool.workspace_state.desc":"Solo Pro. Sincronización completa, instantánea, cambios recientes, info de viewport, metadatos, gestión de caché.","tier.tool.manage_logs.desc":"Consulta filtrada de registros, sondeo incremental, borrar buffer, consulta de errores recientes.","tier.tool.system_info.desc":"Estado de conexión, verificación de tier. Pro: info de lugar, lista de servicios, configuración de Studio, control de playtest, pruebas automáticas.","tier.tool.batch_execute.desc":"Solo Pro. Ejecutar múltiples comandos en lote. Procesamiento secuencial con opción de continuar en caso de error.","tier.tool.execute_luau.desc":"Solo Pro. Ejecutar código Luau arbitrario en el sandbox de Roblox Studio.","connection.server.title":"Estado del servidor","connection.server.version":"Versión","connection.server.version.tooltip":"Versión instalada del servidor MCP.","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificador de proceso del sistema operativo.","connection.server.uptime":"Tiempo activo","connection.server.uptime.tooltip":"Tiempo transcurrido desde que se inició el servidor MCP.","connection.server.session":"Sesión","connection.server.session.tooltip":"Identificador de la sesión MCP actual.","connection.server.exec":"Ejecutable","connection.server.exec.tooltip":"Ruta del ejecutable usado para iniciar el servidor MCP.","connection.reconnect":"Reconectar","connection.checkSettings":"Verificar configuración","connection.agents.title":"Agentes IA","connection.agents.name":"Agente","connection.agents.cwd":"Directorio","connection.agents.cwd.tooltip":"Directorio de trabajo actual del agente de IA conectado.","connection.agents.projectRoot":"Raíz del proyecto","connection.agents.projectRoot.tooltip":"Ruta del proyecto autoritativa para la propiedad de sincronización","connection.agents.projectRoot.unresolved":"Sin resolver","connection.agents.connected":"Conectado","connection.agents.unknown":"Desconocido","connection.agents.none":"Sin agentes conectados","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"ID de cliente","connection.plugins.clientId.tooltip":"Identificador único del cliente del plugin para esta conexión de Studio.","connection.plugins.lastSeen":"Última vez","connection.plugins.lastSeen.tooltip":"Heartbeat más reciente recibido desde el plugin.","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Versión instalada del plugin informada por Studio.","connection.plugins.none":"Sin plugins conectados","connection.log.title":"Registro de conexión","connection.log.empty":"Sin eventos","connection.time.secondsAgo":"s atrás","connection.time.minutesAgo":"min atrás","connection.time.hoursAgo":"h atrás","common.loading":"Cargando...","common.retry":"Reintentar","common.reconnecting":"Reconectando...","common.expand":"Expandir","common.collapse":"Contraer","tools.tab.history":"Historial","tools.tab.statistics":"Estadísticas","tools.tab.failures":"Fallos","tools.col.time":"Hora","tools.col.time.tooltip":"Momento en que se registró la ejecución de la herramienta.","tools.col.toolAction":"Herramienta.Acción","tools.col.toolAction.tooltip":"Nombre de la herramienta y acción que se ejecutó.","tools.col.duration":"Duración","tools.col.duration.tooltip":"Cuánto tardó la herramienta en finalizar.","tools.col.status":"Estado","tools.col.status.tooltip":"Resultado de la ejecución registrada.","tools.col.tier":"Nivel","tools.col.tier.tooltip":"Nivel de licencia requerido para la herramienta o acción.","tools.col.tierStats.tooltip":"Resumen Basic, Pro o Mixed para esta fila de estadísticas de herramientas.","tools.col.tool":"Herramienta","tools.col.tool.tooltip":"Nombre de la herramienta consolidada en la tabla de estadísticas.","tools.col.calls":"Llamadas","tools.col.calls.tooltip":"Número total de llamadas registradas para esta herramienta.","tools.col.ok":"OK","tools.col.ok.tooltip":"Número de ejecuciones exitosas directas.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Número de ejecuciones que tuvieron éxito mediante fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Número de ejecuciones bloqueadas sin fallback.","tools.col.err":"FALLIDO","tools.col.err.tooltip":"Número de ejecuciones que terminaron en fallo.","tools.col.okRate":"% Éxito","tools.col.okRate.tooltip":"Porcentaje de llamadas que terminaron correctamente.","tools.col.avgTime":"Tiempo promedio","tools.col.avgTime.tooltip":"Tiempo promedio de ejecución entre las llamadas registradas.","tools.col.error":"Error","tools.filter.tool":"Herramienta","tools.filter.all":"Todos","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Esta entrada usó una herramienta o acción exclusiva de Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"La acción Pro solicitada tuvo éxito mediante un fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"La acción Pro solicitada fue bloqueada y no se ejecutó ningún fallback.","tools.badge.err":"FALLIDO","tools.badge.err.tooltip":"La ejecución de la herramienta terminó en fallo.","tools.status.ok":"OK","tools.status.ok.tooltip":"La ejecución de la herramienta finalizó correctamente.","tools.tier.mixed.tooltip":"Esta herramienta incluye acciones Basic y Pro.","tools.detail.params":"Parámetros","tools.detail.params.tooltip":"Parámetros de entrada enviados en esta ejecución.","tools.detail.result":"Resultado","tools.detail.result.tooltip":"Carga útil devuelta por esta ejecución.","tools.detail.requestedCommand":"Comando enviado","tools.detail.executedCommand":"Comando ejecutado","tools.detail.alternatives":"Alternativas","tools.detail.blockedMessage":"Motivo del bloqueo","tools.detail.noFallback":"Sin fallback","tools.detail.noFallback.value":"No se ejecutó ningún fallback.","tools.detail.errorMessage":"Mensaje de error","tools.clear.history.title":"¿Borrar historial?","tools.clear.history.message":"Esto elimina permanentemente el historial de herramientas del place actual.","tools.clear.statistics.title":"¿Borrar estadísticas?","tools.clear.statistics.message":"Esto restablece permanentemente las estadísticas de herramientas del place actual.","tools.detail.error":"Error","tools.page.prev":"Anterior","tools.page.prev.tooltip":"Ir a la página anterior del historial de herramientas.","tools.page.next":"Siguiente","tools.page.next.tooltip":"Ir a la página siguiente del historial de herramientas.","tools.empty.history":"Sin entradas de historial","tools.empty.stats":"Sin estadísticas","tools.empty.failures":"Sin fallos","tools.summary.total":"Total","tools.summary.calls":"llamadas","tools.summary.sessions":"Sesiones","settings.license.title":"Licencia","settings.license.title.tooltip":"Estado actual de la licencia y nivel de suscripción.","settings.license.status":"Estado","settings.license.status.tooltip":"Estado actual de activación de la licencia.","settings.license.tier":"Nivel","settings.license.tier.tooltip":"Nivel de suscripción actual para las funciones disponibles del WEPPY Dashboard.","settings.license.key":"Clave","settings.license.key.tooltip":"Clave de licencia enmascarada cargada actualmente por el servidor.","settings.license.keyValue.tooltip":"Clave de licencia enmascarada cargada actualmente por el servidor.","settings.license.provider":"Proveedor","settings.license.provider.tooltip":"Proveedor de licencia usado para validar esta clave.","settings.license.providerValue.tooltip":"Proveedor de licencia usado para validar esta clave.","settings.license.active":"Activa","settings.license.active.tooltip":"Estado actual de activación de la licencia.","settings.license.status.activeCancelPending.tooltip":"La cancelación está pendiente, pero el acceso Pro seguirá activo hasta que termine el período de facturación actual.","settings.license.inactive":"Inactiva","settings.license.inactive.tooltip":"Estado actual de activación de la licencia.","settings.license.expired":"Expirada","settings.license.expired.tooltip":"Estado actual de activación de la licencia.","settings.license.unavailable":"Información de licencia no disponible","settings.license.detail.cancelPending":"La cancelación está programada. El acceso Pro seguirá activo hasta que termine el período de facturación actual.","settings.license.reset":"Restablecer licencia","settings.readOnly":"Solo lectura","settings.readOnly.tooltip":"Esta sección muestra valores que no se pueden editar desde el WEPPY Dashboard.","settings.unavailable":"Configuración no disponible","settings.general.title":"Configuración general","settings.general.title.tooltip":"Ajustes calientes que se aplican inmediatamente al cambiarse.","settings.general.liveApply":"Aplicar en vivo","settings.general.liveApply.tooltip":"Los cambios en esta sección se aplican al instante sin un botón de guardar aparte.","settings.general.applied":"Aplicado","settings.general.logLevel":"Nivel de log","settings.general.logLevel.tooltip":"Define cuánto detalle escribe el WEPPY Dashboard en sus registros.","settings.general.localHistory":"Registro de historial","settings.general.localHistory.tooltip":"Guarda el historial local de ejecución de herramientas para las vistas de historial del WEPPY Dashboard.","settings.general.localStatistics":"Recopilación de estadísticas","settings.general.localStatistics.tooltip":"Agrega estadísticas locales de uso para los informes del WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Tiempo de espera","settings.general.requestTimeout.tooltip":"Tiempo máximo que el WEPPY Dashboard espera una acción antes de marcarla como fallida.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"El tiempo de espera de la acción se mide en milisegundos.","settings.cold.title":"Entorno del servidor","settings.cold.title.tooltip":"Valores de entorno del servidor de solo lectura cargados al iniciar.","settings.cold.httpPort.tooltip":"Número de puerto usado por el servidor HTTP del WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Interfaz de host a la que se enlaza el servidor HTTP del WEPPY Dashboard MCP.","settings.cold.dashboardAutoOpen.tooltip":"Controla si el WEPPY Dashboard se abre automáticamente en el navegador al iniciar el servidor.","settings.cold.dashboardAutoOpen.value.tooltip":"Comportamiento actual de inicio para abrir el WEPPY Dashboard en un navegador.","settings.cold.hint":"Configure mediante variables de entorno.","settings.language.title":"Idioma","settings.language.title.tooltip":"Elige cómo se localiza el texto de la interfaz del WEPPY Dashboard.","settings.language.dashboard":"Idioma del WEPPY Dashboard","settings.language.dashboard.tooltip":"Sobrescribe el idioma del WEPPY Dashboard o usa el idioma del sistema cuando está en Automático.","settings.language.auto":"Automático","overview.l0.title":"Servidor MCP desconectado","overview.l0.message":"El servidor MCP no responde. El WEPPY Dashboard intentará reconectarse automáticamente.","overview.l0.step1":"Verifique que el proceso del servidor MCP esté ejecutándose","overview.l0.step2":"Reinicie el comando del servidor MCP si es necesario","overview.l0.reconnecting":"Reconectando automáticamente cada 3s...","overview.l0.reconnectBtn":"Reconectar","overview.l0.settingsBtn":"Verificar configuración","overview.l1.pluginGuide":"El plugin de Roblox Studio no está conectado","overview.l1.check1":"¿Roblox Studio está abierto?","overview.l1.check2":"¿El WEPPY Plugin está instalado?","overview.l1.feedHint":"Los cambios aparecerán aquí cuando el plugin se conecte","overview.metric.server":"Servidor","overview.metric.server.tooltip":"Estado de ejecución y proceso del servidor MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Estado de conexión y versión del plugin de Roblox Studio.","overview.metric.agent":"Agente","overview.metric.agent.tooltip":"Agentes de IA conectados y su estado actual.","overview.metric.agent.instancesUnit":"instancias","overview.metric.sync":"Sincronización","overview.metric.sync.tooltip":"Actividad actual de sincronización entre Studio y archivos locales.","overview.metric.noAgent":"Sin agente","overview.meta.version":"Versión","overview.meta.version.tooltip":"Versión instalada del servidor MCP.","overview.meta.session":"Sesión","overview.meta.session.tooltip":"Identificador de la sesión MCP actual.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificador de proceso del sistema operativo.","overview.meta.uptime":"Tiempo activo","overview.meta.uptime.tooltip":"Tiempo transcurrido desde que se inició el servidor MCP.","overview.feed.title":"Cambios recientes del juego","overview.feed.empty":"Sin cambios recientes","overview.changelog.title":"Resumen de cambios de sesión","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instancias","overview.changelog.properties":"propiedades","overview.changelog.assets":"assets","overview.tier.title":"Uso por nivel","changelog.subtitle":"Historial de cambios del juego","changelog.filter.all":"Todos","changelog.filter.active":"Activo","changelog.filter.completed":"Completado","changelog.empty":"Sin entradas de historial","changelog.basic.limit.title":"La vista previa Basic muestra solo las 3 sesiones más recientes","changelog.basic.limit.body":"Actualiza a Pro para explorar la línea completa del historial de cambios de este place.","changelog.basic.metricLabel":"Historial visible / Total","changelog.basic.visible":"visibles","changelog.basic.total":"total","changelog.card.active":"Activo","changelog.card.active.tooltip":"Esta sesión todavía sigue recibiendo nuevos cambios del juego.","changelog.card.completed":"Completado","changelog.card.completed.tooltip":"Esta sesión terminó y ya no se esperan más cambios.","changelog.card.bootstrapStatus":"Inicializado","changelog.card.bootstrapStatus.tooltip":"Esta sesión solo contiene la instantánea inicial de bootstrap de sincronización.","changelog.card.inProgress":"en progreso","changelog.card.noChanges":"Sin cambios aún","changelog.card.noChanges.tooltip":"Todavía no se han extraído cambios del juego para esta sesión.","changelog.card.bootstrapSummary":"Instantánea de sincronización inicial","changelog.card.bootstrapSummary.tooltip":"Las escrituras de la sincronización inicial de archivos se agrupan en una sola fila de bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Cambios de scripts realizados en esta sesión.","changelog.card.instances":"instancias","changelog.card.instances.tooltip":"Cambios de creación, eliminación, movimiento o clonado de instancias en esta sesión.","changelog.card.modified":"modificado","changelog.card.created":"creado","changelog.card.deleted":"eliminado","changelog.card.moved":"movido","changelog.card.propertiesChanged":"propiedades cambiadas","changelog.card.propertiesChanged.tooltip":"Cambios de valores de propiedades registrados para esta sesión.","changelog.card.lightingConfigured":"Iluminación configurada","changelog.card.lightingConfigured.tooltip":"La iluminación o la atmósfera cambiaron en esta sesión.","changelog.card.terrainConfigured":"Terreno configurado","changelog.card.terrainConfigured.tooltip":"Los datos o la configuración del terreno cambiaron en esta sesión.","changelog.card.assetsInserted":"assets insertados","changelog.card.assetsInserted.tooltip":"Assets insertados en el place durante esta sesión.","changelog.category.script":"Scripts","changelog.category.instance":"Instancias","changelog.category.property":"Propiedades","changelog.category.lighting":"Iluminación","changelog.category.terrain":"Terreno","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Resumen de cambios","changelog.detail.changeSummary.tooltip":"Cantidad de cambios del juego extraídos agrupados por categoría para esta sesión.","changelog.detail.changeTimeline":"Línea de tiempo","changelog.detail.changeTimeline.tooltip":"Lista cronológica de cambios del juego extraídos para esta sesión.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Antes y después","changelog.detail.filterCategory":"Categoría","changelog.detail.filterCategory.tooltip":"Filtra la línea de tiempo a una sola categoría de cambio.","changelog.detail.confidence.exact":"Exacto","changelog.detail.confidence.exact.tooltip":"Se confirmaron tanto el estado anterior como el posterior para este cambio.","changelog.detail.confidence.partial":"Parcial","changelog.detail.confidence.partial.tooltip":"Solo se pudo confirmar parte del estado anterior y posterior para este cambio.","changelog.detail.confidence.afterOnly":"Solo después","changelog.detail.confidence.afterOnly.tooltip":"Solo se pudo confirmar el estado resultante después del cambio.","changelog.detail.confidence.intentOnly":"Solo intención","changelog.detail.confidence.intentOnly.tooltip":"Solo se registró la acción solicitada, no el estado resultante.","changelog.detail.confidence.unknown":"Desconocido","changelog.detail.confidence.unknown.tooltip":"No fue posible clasificar este cambio con confianza usando los datos disponibles.","changelog.detail.noChanges":"Sin cambios en esta categoría","changelog.detail.backToList":"Volver a la lista","changelog.diff.empty":"Sin diferencias disponibles","changelog.diff.unified":"Unificado","changelog.diff.sideBySide":"Lado a lado","changelog.diff.before":"Antes","changelog.diff.after":"Después","sync.overlay.title":"Se requiere el plugin de Roblox Studio","sync.overlay.message":"El estado de sincronización estará disponible cuando el plugin de Roblox Studio se conecte.","sync.overlay.check1":"¿Roblox Studio está abierto?","sync.overlay.check2":"¿El WEPPY Plugin está instalado?","sync.status.title":"Estado de sincronización","sync.status.title.tooltip":"Estado actual de sincronización entre Studio y archivos locales para este place.","sync.status.forwardOnly":"Solo avance","sync.status.forwardOnly.tooltip":"La suscripción Basic solo permite sincronización directa de Studio a local.","sync.status.place":"Place","sync.status.place.tooltip":"Nombre e ID del place de Roblox conectado.","sync.status.path":"Ruta","sync.status.path.tooltip":"Raíz del sistema de archivos local usada actualmente para la sincronización.","sync.status.instances":"Instancias","sync.status.instances.tooltip":"Cantidad total de instancias de Roblox sincronizadas en el espejo local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Cantidad total de scripts sincronizados e indexados para este place.","sync.status.state":"Estado","sync.status.state.tooltip":"Estado de ejecución de sincronización reportado por el servidor.","sync.directions.title":"Direcciones de sincronización","sync.directions.title.tooltip":"Dirección y modo de aplicación por categoría entre Local y Studio.","sync.directions.type":"Tipo","sync.directions.type.tooltip":"Categoría de sincronización afectada por esta regla.","sync.directions.direction":"Dirección","sync.directions.direction.tooltip":"Indica si cada categoría sincroniza desde Studio, hacia Studio o en ambos sentidos.","sync.directions.applyMode":"Modo de aplicación","sync.directions.applyMode.tooltip":"Cómo se aplican los cambios de sincronización entrantes para esta categoría.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Valores","sync.directions.cat.containers":"Contenedores","sync.directions.cat.data":"Datos","sync.directions.cat.services":"Servicios","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Los archivos locales en disco siempre se muestran a la izquierda del riel de dirección.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio siempre se muestra a la derecha del riel de dirección.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Aplica los cambios de sincronización solo cuando los activas manualmente.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Aplica los cambios de sincronización automáticamente cuando llegan actualizaciones.","sync.directions.tooltip.forward.body":"Los cambios de Studio se sincronizan solo a los archivos locales","sync.directions.tooltip.bidirectional.body":"Sincronización en ambos sentidos entre Local y Studio","sync.directions.tooltip.reverse.body":"Envía cambios de archivos locales a Studio","sync.directions.tooltip.proRequired":"Se requiere Pro en el plan Basic","sync.directions.dir.forward":"adelante","sync.directions.dir.bidirectional":"bidireccional","sync.directions.dir.reverse":"inverso","sync.log.title":"Registro de sincronización","sync.log.empty":"Sin eventos de sincronización","sync.log.type.write":"ESCRIBIR","sync.log.type.write.tooltip":"Se escribió una nueva salida sincronizada en el disco.","sync.log.type.update":"ACTUALIZAR","sync.log.type.update.tooltip":"Se actualizó un archivo o una instancia ya sincronizada.","sync.log.type.delete":"ELIMINAR","sync.log.type.delete.tooltip":"Se eliminó un archivo o una instancia sincronizada.","sync.log.type.idle":"INACTIVO","sync.log.type.idle.tooltip":"Se registró un evento de sincronización sin modificar archivos.","sync.upgrade.title":"Desbloquea sincronización completa con Pro","sync.upgrade.benefit1":"Sincronización bidireccional — edita archivos, se aplica automáticamente a Studio","sync.upgrade.benefit2":"Sincronización inversa — envía cambios de archivos a Studio","sync.upgrade.benefit3":"Historial completo de sincronización y registro detallado de cambios","sync.upgrade.buy":"Actualizar a Pro","playtest.status.title":"Estado de prueba","playtest.status.title.tooltip":"Estado actual de la sesión de playtest de Roblox informado por Studio.","playtest.status.mode":"Modo","playtest.status.mode.tooltip":"Modo de inicio de playtest de Studio usado por la sesión actual.","playtest.status.mode.value.tooltip":"Modo específico de playtest de Roblox Studio que se está usando ahora.","playtest.status.mode.play":"Jugar","playtest.status.mode.run":"Ejecutar","playtest.status.mode.server":"Servidor","playtest.status.mode.edit":"Editar","playtest.status.place.tooltip":"Place de Roblox asociado actualmente con esta sesión de playtest.","playtest.status.state.running":"En ejecución","playtest.status.state.running.tooltip":"Actualmente hay una sesión de playtest de Roblox en ejecución.","playtest.status.state.paused":"Pausado","playtest.status.state.paused.tooltip":"La sesión actual de playtest de Roblox está en pausa.","playtest.status.state.notRunning":"Sin ejecutar","playtest.status.state.notRunning.tooltip":"Actualmente no hay ninguna sesión de playtest de Roblox en ejecución.","playtest.control.play":"Jugar","playtest.control.pause":"Pausar","playtest.control.resume":"Reanudar","playtest.control.stop":"Detener","playtest.history.title":"Historial de pruebas","playtest.history.title.tooltip":"Ejecuciones automatizadas de playtest registradas para este proyecto.","playtest.history.empty":"Sin resultados de prueba","playtest.history.mode":"Modo","playtest.history.mode.tooltip":"Modo de playtest usado en esta ejecución de prueba registrada.","playtest.history.status.passed":"Aprobado","playtest.history.status.failed":"Fallido","playtest.history.status.running":"En ejecución","playtest.history.status.unknown":"Desconocido","playtest.history.status.tooltip":"Estado de resultado registrado para esta ejecución automatizada de playtest.","playtest.empty.title":"Sin resultados de prueba aún","playtest.empty.message":"Los resultados aparecerán aquí cuando el agente IA ejecute pruebas automatizadas vía system_info.run_test.","playtest.empty.message.before":"Los resultados aparecerán aquí cuando el agente IA ejecute pruebas automatizadas mediante","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"Punto de automatización del WEPPY Dashboard que ejecuta verificaciones de playtest de Roblox a través de la herramienta system_info.","playtest.report.title":"Reporte seleccionado","playtest.report.title.tooltip":"Salida detallada de la ejecución automatizada de playtest seleccionada actualmente.","playtest.report.content":"Reporte","playtest.report.content.tooltip":"Resumen en Markdown de la ejecución automatizada de playtest seleccionada.","playtest.report.logs":"Registros","playtest.report.logs.tooltip":"Registros de ejecución capturados para la ejecución automatizada de playtest seleccionada.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Sin contenido de reporte","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest es una función exclusiva de Pro","playtest.basic.desc":"Controla las pruebas desde el WEPPY Dashboard, ejecuta pruebas automatizadas y visualiza reportes detallados.","playtest.basic.benefit1":"Controles de jugar/pausar/detener con un clic","playtest.basic.benefit2":"Ejecución de pruebas automatizadas vía agente IA","playtest.basic.benefit3":"Historial de pruebas con seguimiento de éxito/fallo","playtest.basic.benefit4":"Reportes de prueba detallados en markdown","playtest.sample.badge":"Vista previa de la pantalla Pro de playtest","playtest.sample.title":"Estás viendo una vista previa de la pantalla de playtest disponible después de actualizar a Pro.","playtest.sample.message":"Esta vista previa usa datos de ejemplo. El control de playtest en vivo, la gestión del historial y los reportes reales se desbloquean con Pro.","playtest.sample.clearDisabled":"Actualiza a Pro para borrar el historial real de playtest.","playtest.sample.place":"Vista previa de Arena","playtest.sample.history.name":"Prueba de humo de Arena de ejemplo","playtest.sample.context.why":"Entrar a la arena, sobrevivir a la apertura y verificar que el HUD responda de inmediato.","playtest.sample.context.expected":"El jugador aparece de forma segura, la cuenta regresiva del HUD aparece en un segundo y la primera ola inicia sin errores.","playtest.sample.context.observed":"La protección de aparición funcionó, el HUD se actualizó a tiempo y la primera ola terminó sin regresiones.","playtest.sample.report.markdown":`# Prueba de humo de Arena de ejemplo
89
+ [sample] 미리보기 리포트 종료`,"sidebar.whatsNew":"새 소식","sidebar.help.group":"도움말 및 피드백","sidebar.help.bug":"버그 신고","sidebar.help.bug.tooltip":"GitHub에 환경 정보가 채워진 버그 리포트 열기","sidebar.help.feature":"기능 제안","sidebar.help.feature.tooltip":"GitHub에서 새 기능 또는 개선 제안하기","sidebar.help.discussions":"커뮤니티","sidebar.help.discussions.tooltip":"GitHub Discussions에서 질문하고 아이디어 공유하기","sidebar.help.troubleshooting":"문제 해결","sidebar.help.troubleshooting.tooltip":"weppyai.com 공식 문제 해결 가이드 열기","header.whatsNew":"새 소식","header.whatsNew.tooltip":"새 소식","upgrade.title":"Pro로 업그레이드","upgrade.tagline":"Pro로 기능 확장","upgrade.cta":"Pro 업그레이드","upgrade.validUntil":"{{date}}까지","whatsNew.pageTitle":"새 소식","whatsNew.pageSubtitle":"MCP의 주요 변경사항을 확인하세요","whatsNew.unreadSection":"안 읽음","whatsNew.allSection":"전체 공지","whatsNew.empty":"공지가 없습니다","whatsNew.newBadge":"NEW","whatsNew.category.release":"릴리스","whatsNew.category.notice":"공지","whatsNew.category.deprecation":"지원 중단","whatsNew.category.tip":"팁","uiStudio.title":"UI 스튜디오","uiStudio.empty":"저장된 화면 캡처가 없습니다. AI 에이전트가 현재 UI 상태를 캡처하면 자동 생성됩니다.","uiStudio.loading":"불러오는 중…","uiStudio.pluginGuide.title":"Roblox Studio 플러그인이 연결되지 않았습니다","uiStudio.pluginGuide.message":"UI Studio는 연결된 Studio place의 화면 캡처와 변경 이력을 표시합니다. Studio와 WEPPY Plugin을 연결하면 자동으로 갱신됩니다.","uiStudio.pluginGuide.check1":"Roblox Studio가 실행 중인가요?","uiStudio.pluginGuide.check2":"WEPPY Plugin이 설치되어 실행 중인가요?","uiStudio.pluginGuide.waiting":"플러그인 연결을 기다리는 중...","uiStudio.capturedAt":"캡처 시각","uiStudio.scope":"범위","uiStudio.target":"대상","uiStudio.briefId":"브리프 ID","uiStudio.detailClose":"닫기","uiStudio.colCheck":"항목","uiStudio.colPriority":"우선순위","uiStudio.colCurrent":"현재","uiStudio.colRecommended":"권장","uiStudio.colSuggestion":"제안","uiStudio.priorityHigh":"우선 검토","uiStudio.priorityLow":"선택 개선","uiStudio.highPrioritySection":"우선 검토","uiStudio.lowPrioritySection":"선택 개선","uiStudio.groupSummary":"개 항목","uiStudio.fixLabel":"조치","uiStudio.copyFixCommand":"AI 지시문으로 복사","uiStudio.copiedToClipboard":"복사됨","uiStudio.fullPath":"전체 경로","uiStudio.falsePositiveWarning":"이 그룹은 오탐 가능성이 있습니다","uiStudio.noSuggestions":"현재 개선 제안 없음","uiStudio.sample.badge":"Pro UI 스튜디오 미리보기","uiStudio.sample.title":"Pro 업그레이드 후 이용 가능한 UI 스튜디오를 미리 보고 있습니다.","uiStudio.sample.message":"이 미리보기는 샘플 데이터입니다. 실제 화면 캡처, 검토 이력, AI 자동 수정 요청은 Pro에서 제공됩니다.","uiStudio.tabs.analysis":"분석","uiStudio.tabs.history":"변경 이력","uiStudio.analysis.reportsTitle":"UI 대상별 최신 분석","uiStudio.analysis.recentCapturesTitle":"최근 캡처","uiStudio.analysis.detailDialog":"분석 상세","uiStudio.analysis.targetCountLabel":"분석 대상","uiStudio.analysis.captureLabel":"캡처","uiStudio.analysis.verdict.hasSuggestions":"개선 제안 있음","uiStudio.analysis.verdict.needsFix":"개선 제안 있음","uiStudio.analysis.verdict.review":"개선 제안 있음","uiStudio.analysis.verdict.passed":"현재 개선 제안 없음","uiStudio.analysis.verdictLabel":"개선 요약","uiStudio.analysis.thresholds":"검토 기준","uiStudio.analysis.issueSummary.passed":"현재 검토 기준에서 추가 개선 제안은 없습니다.","uiStudio.history.title":"변경 이력","uiStudio.history.empty":"아직 변경 이력이 없습니다. AI 에이전트가 manage_ui 로 UI 를 수정하면 자동으로 기록됩니다.","uiStudio.history.loading":"로딩 중...","uiStudio.history.error":"오류","uiStudio.history.clear":"전체 삭제","uiStudio.history.filter.actions":"작업 유형","uiStudio.history.filter.actionAll":"전체","uiStudio.history.filter.actionCreate":"생성","uiStudio.history.filter.actionUpdate":"수정","uiStudio.history.filter.actionDelete":"삭제","uiStudio.history.filter.period":"기간","uiStudio.history.filter.dateAll":"전체","uiStudio.history.filter.today":"오늘","uiStudio.history.filter.yesterday":"어제","uiStudio.history.filter.last7Days":"최근 7일","uiStudio.history.filter.last30Days":"최근 30일","uiStudio.history.filter.customRange":"직접 지정","uiStudio.history.filter.reset":"초기화","uiStudio.history.filter.from":"시작일","uiStudio.history.filter.to":"종료일","uiStudio.history.row.affectedPaths":"경로","uiStudio.history.row.mutations":"변경 상세","uiStudio.history.row.expand":"▾ 펼치기","uiStudio.history.row.collapse":"▲ 닫기","uiStudio.history.row.expandDetails":"변경 상세 {n}건","uiStudio.history.row.collapseDetails":"변경 상세 닫기","uiStudio.history.row.toggleDetails":"변경 상세 토글","uiStudio.history.row.mutationsEmpty":"변경 내역 없음","uiStudio.history.row.toolLabel":"UI 변경 {n}건","uiStudio.history.row.compare":"전후 비교","uiStudio.history.row.noBeforeState":"이전 상태 없음","uiStudio.history.row.noAfterState":"이후 상태 없음","uiStudio.history.row.qualityPlan":"디자인 방향","uiStudio.history.row.designCheck":"개선 제안","uiStudio.history.row.designCheckUnavailable":"개선 제안: 요약 없음","uiStudio.history.row.designCheckNone":"개선 제안: 현재 없음","uiStudio.history.selection.deleteSelected":"선택 삭제","uiStudio.history.selection.selectAll":"모두 선택","uiStudio.history.selection.clearSelection":"선택 해제","uiStudio.history.confirm.deleteRequestsTitle":"변경 기록 삭제","uiStudio.history.confirm.deleteRequestsMessage":"선택한 변경 기록을 삭제합니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.history.confirm.clearRequestsTitle":"변경 이력 삭제","uiStudio.history.confirm.clearRequestsMessage":"현재 place의 변경 이력을 삭제합니다. Studio 인스턴스에는 영향을 주지 않습니다.","uiStudio.history.confirm.cascadeOption":"연결된 화면 캡처도 함께 삭제","uiStudio.history.drawer.close":"닫기","uiStudio.actions.previewAgain":"다시 미리보기","uiStudio.actions.deleteSnapshot":"이 화면 캡처 삭제","uiStudio.actions.proRequired":"Pro 업그레이드 후 사용 가능","uiStudio.actions.captureCurrentState":"현재 상태 캡처","uiStudio.actions.checkSuggestionsAgain":"개선 제안 다시 확인","uiStudio.actions.previewRunning":"캡처 중…","uiStudio.actions.previewRunningDetail":"완료되면 새 화면 캡처 파일 ID를 표시합니다.","uiStudio.actions.previewNeedsSaveCheck":"캡처 완료, 저장 확인 필요","uiStudio.actions.previewSaved":"새 화면 캡처 저장 완료","uiStudio.actions.previewComplete":"캡처 완료","uiStudio.actions.previewSavedDetail":"기존 화면 캡처는 변경하지 않고 새 파일로 저장했습니다.","uiStudio.actions.previewSavedPathMissing":"새 화면 캡처 ID는 받았지만 저장 경로를 확인하지 못했습니다.","uiStudio.actions.previewSnapshotIdMissing":"새 화면 캡처 ID를 확인하지 못했습니다. 목록을 새로고침해 저장 여부를 확인해 주세요.","uiStudio.actions.more":"더 보기","uiStudio.gallery.selection.selectedCount":"개 선택됨","uiStudio.confirm.deleteSnapshotTitle":"화면 캡처 삭제","uiStudio.confirm.deleteSnapshotMessage":"이 화면 캡처 파일만 삭제됩니다 (Studio 인스턴스 보존).","uiStudio.confirm.deleteBatchTitle":"화면 캡처 일괄 삭제","uiStudio.confirm.deleteBatchMessage":"선택한 화면 캡처를 삭제합니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.gallery.selectMode":"선택 모드","uiStudio.gallery.exitSelectMode":"취소","uiStudio.gallery.selectAll":"모두 선택","uiStudio.gallery.clearSelection":"선택 해제","uiStudio.gallery.deleteSelected":"선택 삭제","common.cancel":"취소","common.delete":"삭제","uiStudio.storage.title":"UI Studio 저장 데이터","uiStudio.storage.usageLabel":"사용 중","uiStudio.storage.historyBytes":"변경 이력","uiStudio.storage.snapshotBytes":"화면 캡처","uiStudio.storage.requestCount":"변경 기록","uiStudio.storage.mutationCount":"변경 상세","uiStudio.storage.snapshotCount":"화면 캡처","uiStudio.storage.countSuffix":"개","uiStudio.storage.lastRun":"마지막 자동 정리","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"회수","uiStudio.storage.lastRunErrors":"오류","uiStudio.storage.loading":"로딩 중...","uiStudio.cleanup.policy.title":"자동 삭제 정책","uiStudio.cleanup.policy.modeOff":"사용 안 함 (off)","uiStudio.cleanup.policy.modeAge":"기간 기반 (age)","uiStudio.cleanup.policy.modeSize":"용량 기반 (size)","uiStudio.cleanup.policy.cascade":"연결된 화면 캡처도 함께 삭제","uiStudio.cleanup.policy.save":"정책 저장","uiStudio.cleanup.policy.runNow":"지금 정리","uiStudio.cleanup.policy.proRequired":"Pro 업그레이드 후 사용 가능","uiStudio.cleanup.policy.daysUnit":"일","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"정책 적용 확인","uiStudio.cleanup.policy.confirm.messageStrict":"이 정책으로 즉시","uiStudio.cleanup.policy.confirm.requests":"건","uiStudio.cleanup.policy.confirm.snapshots":"개 화면 캡처","uiStudio.cleanup.policy.confirm.freed":"가 삭제됩니다 — 적용?","uiStudio.cleanup.keepLastNDays":"최근 {n}일만 남기기","uiStudio.cleanup.selectedDelete":"선택 삭제…","uiStudio.cleanup.deleteAll":"전체 삭제…","uiStudio.cleanup.cleanupConfirmTitle":"정리 확인","uiStudio.cleanup.cleanupConfirmMessage":"선택한 항목이 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"7일 이전 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"30일 이전 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.cleanupConfirmMessage.all":"개의 저장된 변경 기록과 화면 캡처가 삭제됩니다. 이 작업은 되돌릴 수 없습니다.","uiStudio.cleanup.label":"수동 정리","uiStudio.cleanup.studioPreservedNote":"이 작업은 디스크의 저장된 변경 기록과 화면 캡처만 삭제하며, Roblox Studio 인스턴스는 변경되지 않습니다.","uiStudio.history.sample.bannerBadge":"Pro 변경 이력 미리보기","uiStudio.history.sample.bannerTitle":"Pro 업그레이드 후 이용 가능한 UI 변경 이력 화면을 미리 보고 있습니다.","uiStudio.history.sample.bannerMessage":"이 미리보기는 샘플 데이터입니다. 실제 변경 이력, 전후 비교, 일괄 삭제는 Pro에서 제공됩니다.","uiStudio.fix.touchTarget.label":"터치 타겟 크기","uiStudio.fix.touchTarget.description":"모바일에서 손가락으로 누르기 편한 최소 크기를 만족하는지 확인합니다.","uiStudio.fix.touchTarget.howToFix":"버튼 Size를 44x44 px 이상으로 키우거나 UIPadding으로 터치 영역을 확장하세요.","uiStudio.fix.contrast.label":"텍스트 대비","uiStudio.fix.contrast.description":"텍스트와 배경의 명암 비율이 WCAG 접근성 기준을 만족하는지 확인합니다.","uiStudio.fix.contrast.howToFix":"TextColor3를 더 밝은 색(예: #FFFFFF)으로 바꾸거나 BackgroundColor3를 어둡게 조정하세요.","uiStudio.fix.contrast.falsePositive":"이모지 아이콘은 색상이 고정되어 대비 규칙이 오탐하는 경우가 있습니다.","uiStudio.fix.textScaled.label":"TextScaled 사용","uiStudio.fix.textScaled.description":"TextScaled가 켜져 있으나 UITextSizeConstraint가 없으면 언어 확장 시 레이아웃이 깨질 수 있습니다.","uiStudio.fix.textScaled.howToFix":"해당 TextLabel에 UITextSizeConstraint 자식을 추가하고 MaxTextSize를 지정하세요.","uiStudio.fix.safezone.label":"세이프존 배치","uiStudio.fix.safezone.description":"버튼이 플랫폼별 세이프존 안에 있는지 확인합니다.","uiStudio.fix.safezone.howToFix":"Position을 세이프존 안쪽으로 이동하거나 부모 Frame을 축소하세요.","uiStudio.fix.minTextSize.label":"최소 폰트 크기","uiStudio.fix.minTextSize.description":"텍스트가 너무 작아 가독성이 떨어지는지 확인합니다.","uiStudio.fix.minTextSize.howToFix":"본문 기준 TextSize를 14 이상으로 올리세요.","uiStudio.sample.history.request1.label":"HUD 레이아웃 초기 생성","uiStudio.sample.history.request2.label":"Inventory 모달 디자인 업데이트","uiStudio.sample.history.request3.label":"HUD HealthBar 색상 수정","uiStudio.sample.history.request4.label":"Inventory 탭 버튼 터치 타겟 확대","uiStudio.sample.history.request5.label":"Settings 팝업 삭제","uiStudio.sample.history.request6.label":"HUD 미니맵 컴포넌트 추가","uiStudio.sample.history.request1.mutation1.diff":"Frame + HealthBar + StaminaBar 생성","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"AnchorPoint, Position, Size 설정","uiStudio.sample.history.request1.mutation5.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request2.mutation1.diff":"BackgroundColor3 어둡게 조정 (대비 개선)","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, BorderColor3 설정","uiStudio.sample.history.request2.mutation4.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (빨간 계열)","uiStudio.sample.history.request3.mutation2.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"화면 캡처 저장 완료","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui 제거 (Settings 전용 UI)","uiStudio.sample.history.request6.mutation1.diff":"Frame + MapImage + PlayerDot 생성 시도","uiStudio.sample.history.request6.mutation2.diff":"Size, Position, BackgroundTransparency 설정","uiStudio.sample.history.request6.mutation3.diff":"ImageLabel 설정 중 서버 재시작으로 중단","uiStudio.sample.history.request6.mutation4.diff":"불완전 화면 캡처 저장","uiStudio.sample.history.request6.mutation3.error":"server_restart: 연결 끊김","uiStudio.sample.history.request6.mutation4.error":"partial snapshot: 누락된 레이어 있음","uiStudio.sample.history.detail.backgroundColor":"배경색","uiStudio.sample.history.detail.anchorPoint":"앵커","uiStudio.sample.history.detail.position":"위치","uiStudio.sample.history.detail.size":"사이즈","uiStudio.sample.history.detail.textColor":"글자색","uiStudio.sample.history.detail.textSize":"글자 크기","uiStudio.sample.history.detail.borderSize":"테두리 크기","uiStudio.sample.history.detail.borderColor":"테두리색","settings.dataHistory.title":"데이터 및 이력","settings.dataHistory.title.tooltip":"대시보드에 저장된 데이터를 한 곳에서 관리합니다.","settings.dataHistory.collapse":"{title} 접기","settings.dataHistory.expand":"{title} 펼치기","settings.dataHistory.scope":"현재 프로젝트","settings.dataHistory.scope.tooltip":"삭제 작업은 항목에 따라 현재 프로젝트와 활성 place에 적용됩니다.","settings.dataHistory.intro":"저장된 대시보드 데이터를 확인하고, 관련 페이지로 이동하거나, 저장 기록을 한 곳에서 삭제합니다.","settings.dataHistory.toolsActivity.title":"도구 실행 기록","settings.dataHistory.toolsActivity.description":"Tools 페이지에 표시되는 저장된 도구 실행 기록입니다.","settings.dataHistory.toolStats.title":"도구 사용 통계","settings.dataHistory.toolStats.description":"도구 호출 수와 상태별 집계입니다.","settings.dataHistory.syncLog.title":"동기화 로그","settings.dataHistory.syncLog.description":"활성 place의 파일 동기화 이벤트 기록입니다.","settings.dataHistory.playtest.title":"플레이테스트 리포트","settings.dataHistory.playtest.description":"저장된 자동 플레이테스트 리포트와 로그입니다.","settings.dataHistory.projectChanges.title":"프로젝트 변경 요약","settings.dataHistory.projectChanges.description":"저장된 프로젝트 변경 요약입니다.","settings.dataHistory.connectionLog.title":"연결 로그","settings.dataHistory.connectionLog.description":"MCP와 Studio 연결 이벤트 기록입니다.","settings.dataHistory.uiStudio.title":"UI Studio 이력 및 화면 캡처","settings.dataHistory.uiStudio.tooltip":"저장된 UI Studio 변경 기록, 화면 캡처, 자동 삭제 정책을 관리합니다.","settings.dataHistory.uiStudio.description":"저장된 UI Studio 변경 기록, 화면 캡처, 정리 정책입니다.","settings.dataHistory.uiStudio.clear.title":"UI Studio 저장 데이터를 삭제할까요?","settings.dataHistory.uiStudio.clear.message":"저장된 UI Studio 변경 기록과 화면 캡처만 삭제됩니다. Roblox Studio 인스턴스와 프로젝트 오브젝트는 변경되지 않습니다.","settings.dataHistory.uiStudio.clear.success":"UI Studio 저장 데이터를 삭제했습니다.","settings.dataHistory.uiStudio.clear.failed":"UI Studio 저장 데이터를 삭제하지 못했습니다.","settings.dataHistory.metric.unavailable":"확인 불가","settings.dataHistory.metric.sizeUnavailable":"용량 확인 불가","settings.dataHistory.metric.records":"건","settings.dataHistory.metric.runs":"회","settings.dataHistory.metric.sessions":"세션","settings.dataHistory.metric.reports":"개 리포트","settings.dataHistory.open":"열기","settings.dataHistory.clear.title":"저장 데이터를 삭제할까요?","settings.dataHistory.clear.message":"대시보드에 저장된 기록만 삭제됩니다. Roblox Studio 인스턴스와 프로젝트 오브젝트는 변경되지 않습니다.","settings.dataHistory.clear.success":"저장 데이터를 삭제했습니다.","settings.dataHistory.clear.failed":"저장 데이터를 삭제하지 못했습니다.","uiStudio.history.sample.tooltip":"전체 이력은 Pro 업그레이드 후 이용 가능합니다","toast.serverConnected":"MCP 서버 연결됨","toast.serverDisconnected":"MCP 서버 연결 끊김","toast.pluginConnected":"플러그인 연결됨","toast.pluginDisconnected":"플러그인 연결 끊김","toast.clearSuccess":"삭제되었습니다","toast.clearFailed":"삭제하지 못했습니다","common.clear":"비우기","settings.license.activate":"라이센스 활성화","settings.license.refresh":"라이센스 새로고침","settings.license.keyInput":"라이센스 키","settings.license.disconnected":"연결 끊김","settings.license.disconnected.tooltip":"WEPPY Dashboard에서 라이센스를 관리하려면 먼저 MCP 서버에 다시 연결하세요.","settings.license.live.tooltip":"라이센스 작업은 MCP 서버에 즉시 반영됩니다.","settings.license.status.activationRequired":"활성화 필요","settings.license.status.activationRequired.tooltip":"WEPPY Dashboard가 이 상태를 갱신하려면 먼저 수동으로 라이센스를 활성화해야 합니다.","settings.license.status.grace":"유예","settings.license.status.grace.tooltip":"공급자 검증이 일시적으로 불가하지만, 유예 기간 동안 Pro 접근은 유지됩니다.","settings.license.status.graceBilling.tooltip":"결제 관련 유예 기간 동안 Pro 접근은 유지됩니다.","settings.license.detail.graceBilling":"결제 유예 기간 동안 Pro 접근이 유지됩니다.","settings.license.detail.graceProviderUnavailable":"공급자 사용 불가. 유예 모드 동안 Pro 접근은 유지됩니다.","settings.license.detail.manualActivation":"Pro 접근을 복구하려면 수동 활성화가 필요합니다.","settings.license.detail.missingSessionToken":"현재 세션 토큰이 없어 새로고침이 차단되었습니다.","settings.license.detail.refreshRecommended":"라이센스 검증을 곧 새로고침해야 합니다.","connection.agents.kill":"종료","connection.agents.kill.title":"에이전트를 종료할까요?","connection.agents.killed":"에이전트가 종료되었습니다","connection.agents.killFailed":"에이전트를 종료하지 못했습니다","connection.agents.lastCommand":"최근 명령","connection.agents.lastCommand.tooltip":"이 에이전트가 가장 최근에 실행한 도구 호출입니다.","connection.agents.lastSeen":"마지막 활동","connection.agents.lastSeen.tooltip":"이 에이전트의 가장 최근 heartbeat 또는 활동 시각입니다.","connection.clear.title":"연결 로그를 비울까요?","connection.clear.message":"현재 프로젝트에 저장된 연결 로그가 영구적으로 삭제됩니다.","sync.clear.title":"동기화 로그를 비울까요?","sync.clear.message":"현재 플레이스에 저장된 동기화 로그가 영구적으로 삭제됩니다.","playtest.clear.title":"테스트 히스토리를 비울까요?","playtest.clear.message":"현재 플레이스에 저장된 플레이테스트 리포트가 영구적으로 삭제됩니다.","changelog.clear.title":"변경 이력을 비울까요?","changelog.clear.message":"현재 플레이스에 저장된 변경 이력이 영구적으로 삭제됩니다.","sync.status.placePath":"플레이스 경로","sync.status.placePath.tooltip":"Explorer 파일이 동기화되는 현재 플레이스 디렉토리입니다.","tier.progress.label":"Pro / 전체","changelog.card.representativeArea":"대표 영역","changelog.card.verification":"검증","uiStudio.tabs.analysis.tooltip":"AI가 캡처한 화면을 한눈에 보고, 개선이 필요한 UI를 빠르게 찾는 화면입니다.","uiStudio.tabs.history.tooltip":"AI가 UI를 수정한 모든 기록을 시간순으로 보여줍니다. 변경 전·후 화면을 비교할 수 있습니다.","uiStudio.title.tooltip":"AI가 만든 UI 화면을 모아두고 개선 제안을 확인하는 공간입니다.","uiStudio.analysis.reportsTitle.tooltip":"각 UI(예: 인벤토리 창, 메인 메뉴)별로 가장 최근 캡처와 개선 제안 요약을 보여줍니다.","uiStudio.analysis.verdict.hasSuggestions.tooltip":"이 UI에서 더 좋아질 수 있는 부분이 발견됐습니다. 카드를 눌러 상세 내용을 확인하세요.","uiStudio.analysis.verdict.passed.tooltip":"현재 검사 기준에서는 개선할 부분이 발견되지 않았습니다.","uiStudio.analysis.counts.tooltip":"주요는 먼저 검토하면 좋은 핵심 항목, 참고는 다듬으면 좋은 부가 항목입니다.","uiStudio.analysis.thresholds.tooltip":"이 분석에 사용된 기준 세트입니다 (기본값 또는 사용자 정의).","uiStudio.analysis.recentCapturesTitle.tooltip":"최근에 저장된 모든 캡처를 시간순으로 보여줍니다.","uiStudio.gallery.selectAll.tooltip":"현재 보이는 모든 캡처를 한 번에 선택합니다.","uiStudio.gallery.clearSelection.tooltip":"현재 선택된 캡처를 모두 해제합니다.","uiStudio.gallery.deleteSelected.tooltip":"선택한 캡처 파일만 삭제합니다. Studio의 실제 UI는 그대로 유지됩니다.","uiStudio.gallery.cardCheckbox.tooltip":"이 캡처를 선택합니다. 여러 개 선택해 한 번에 삭제할 수 있습니다.","uiStudio.detailClose.tooltip":"이 상세 패널을 닫습니다.","uiStudio.actions.captureCurrentState.tooltip":"지금 Studio에 표시되고 있는 UI를 새 캡처로 저장합니다. 기존 캡처는 그대로 남습니다.","uiStudio.actions.checkSuggestionsAgain.tooltip":"현재 캡처를 새로 캡처하지 않고 개선 제안만 다시 계산합니다.","uiStudio.actions.more.tooltip":"추가 작업 메뉴를 엽니다.","uiStudio.actions.deleteSnapshot.tooltip":"이 캡처 파일만 삭제합니다. Studio의 실제 UI는 변경되지 않습니다.","uiStudio.capturedAt.tooltip":"이 화면이 저장된 시각입니다.","uiStudio.scope.tooltip":"캡처 대상 범위입니다 (예: 화면 전체 또는 특정 UI).","uiStudio.target.tooltip":"캡처된 UI 인스턴스의 정확한 경로입니다.","uiStudio.briefId.tooltip":"이 UI를 만든 디자인 지시서(Design Brief)의 식별자입니다.","uiStudio.analysis.verdictLabel.tooltip":"이 캡처에 대한 전반적인 개선 판정입니다.","uiStudio.suggestionGroup.tooltip":"같은 종류의 개선 제안을 묶어서 보여줍니다. 헤더를 클릭해 펼치거나 접을 수 있습니다.","uiStudio.groupSummary.tooltip":"이 항목에 해당하는 UI 요소의 개수입니다.","uiStudio.colCurrent.tooltip":"현재 적용된 값입니다.","uiStudio.colRecommended.tooltip":"권장하는 값입니다.","uiStudio.copyFixCommand.tooltip":"이 문제를 AI에게 설명해 한 번에 고치게 할 수 있는 지시문을 복사합니다.","uiStudio.falsePositiveWarning.tooltip":"이 검사 항목은 실제로는 문제가 아닐 수도 있으니 직접 확인 후 적용하세요.","uiStudio.history.filter.actions.tooltip":"AI가 수행한 변경 종류로 기록을 거를 수 있습니다.","uiStudio.history.filter.period.tooltip":"기록을 시간 범위로 거를 수 있습니다.","uiStudio.history.filter.from.tooltip":"조회를 시작할 날짜입니다.","uiStudio.history.filter.to.tooltip":"조회를 종료할 날짜입니다.","uiStudio.history.filter.actionAll.tooltip":"모든 종류의 작업을 보여줍니다.","uiStudio.history.filter.actionCreate.tooltip":"새 UI를 만든 작업만 보여줍니다.","uiStudio.history.filter.actionUpdate.tooltip":"기존 UI를 수정한 작업만 보여줍니다.","uiStudio.history.filter.actionDelete.tooltip":"UI를 삭제한 작업만 보여줍니다.","uiStudio.history.filter.dateAll.tooltip":"전체 기간을 봅니다.","uiStudio.history.filter.today.tooltip":"오늘 발생한 변경만 봅니다.","uiStudio.history.filter.yesterday.tooltip":"어제 발생한 변경만 봅니다.","uiStudio.history.filter.last7Days.tooltip":"최근 7일간의 변경만 봅니다.","uiStudio.history.filter.last30Days.tooltip":"최근 30일간의 변경만 봅니다.","uiStudio.history.filter.customRange.tooltip":"직접 시작일과 종료일을 지정합니다.","uiStudio.history.filter.reset.tooltip":"모든 필터를 초기 상태로 되돌립니다.","uiStudio.history.title.tooltip":"AI가 UI를 수정한 모든 작업을 시간순으로 모아둔 곳입니다.","uiStudio.history.clear.tooltip":"현재 프로젝트의 모든 변경 이력을 삭제합니다. Studio의 실제 UI는 영향받지 않습니다.","uiStudio.history.row.compare.tooltip":"변경 전과 후 화면을 나란히 비교해 봅니다. 클릭하면 큰 화면으로 확인할 수 있습니다.","uiStudio.history.row.extraPaths.tooltip":"이 작업으로 함께 변경된 다른 UI의 개수입니다.","uiStudio.history.row.noBeforeState.tooltip":"변경 전 시점의 캡처가 저장되지 않았습니다.","uiStudio.history.row.noAfterState.tooltip":"변경 후 시점의 캡처가 저장되지 않았습니다.","uiStudio.history.row.affectedPaths.tooltip":"이 작업으로 영향을 받은 UI의 개수입니다.","uiStudio.history.row.mutations.tooltip":"속성 변경 등 세부 작업의 개수입니다.","uiStudio.history.row.qualityPlan.tooltip":"이 변경에 사용된 brief 디자인 방향입니다.","uiStudio.history.row.designCheck.tooltip":"변경 이후 Design Check 개선 제안 요약입니다.","uiStudio.history.row.toggleDetails.tooltip":"어떤 속성이 어떻게 바뀌었는지 한 줄씩 자세히 보여줍니다.","uiStudio.compare.before.tooltip":"AI가 변경하기 직전에 저장된 화면입니다.","uiStudio.compare.after.tooltip":"AI가 변경한 직후에 저장된 화면입니다.","uiStudio.compare.path.tooltip":"이 화면의 UI 인스턴스 경로입니다.","uiStudio.storage.title.tooltip":"UI Studio가 디스크에 저장한 변경 이력과 캡처의 사용량을 보여줍니다.","uiStudio.storage.usageLabel.tooltip":"현재 이 프로젝트에서 UI Studio가 사용 중인 디스크 용량입니다.","uiStudio.storage.historyBytes.tooltip":"변경 기록 데이터(JSON)가 차지하는 용량입니다.","uiStudio.storage.snapshotBytes.tooltip":"캡처된 PNG 이미지 파일이 차지하는 용량입니다.","uiStudio.storage.requestCount.tooltip":"AI가 UI를 수정한 작업의 개수입니다.","uiStudio.storage.mutationCount.tooltip":"각 작업 안의 세부 변경 항목 개수입니다 (속성 변경 한 줄 = 1개).","uiStudio.storage.snapshotCount.tooltip":"저장된 캡처 이미지 파일의 개수입니다.","uiStudio.storage.lastRun.tooltip":"자동 삭제 정책이 가장 최근에 실행된 시각과 결과입니다.","uiStudio.cleanup.label.tooltip":"원할 때 직접 변경 이력과 캡처를 정리할 수 있습니다.","uiStudio.cleanup.keep7.tooltip":"지금부터 7일 이전의 변경 이력과 캡처를 모두 삭제합니다.","uiStudio.cleanup.keep30.tooltip":"지금부터 30일 이전의 변경 이력과 캡처를 모두 삭제합니다.","uiStudio.cleanup.deleteAll.tooltip":"이 프로젝트에 저장된 모든 변경 이력과 캡처를 삭제합니다. Studio의 실제 UI는 변경되지 않습니다.","uiStudio.cleanup.policy.title.tooltip":"오래되거나 용량을 차지하는 캡처를 자동으로 정리하는 규칙입니다.","uiStudio.cleanup.policy.modeOff.tooltip":"자동 정리를 끕니다. 직접 정리하기 전까지 모든 데이터가 유지됩니다.","uiStudio.cleanup.policy.modeAge.tooltip":"지정한 일수보다 오래된 데이터를 자동으로 삭제합니다.","uiStudio.cleanup.policy.modeSize.tooltip":"총 사용량이 지정한 크기를 넘으면 오래된 데이터부터 자동으로 삭제합니다.","uiStudio.cleanup.policy.agePreset.tooltip":"이 일수보다 오래된 데이터를 삭제합니다.","uiStudio.cleanup.policy.ageInput.tooltip":"1일에서 365일 사이로 직접 입력할 수 있습니다.","uiStudio.cleanup.policy.sizePreset.tooltip":"총 사용량이 이 크기를 넘지 않도록 유지합니다.","uiStudio.cleanup.policy.sizeInput.tooltip":"50MB에서 10000MB(10GB) 사이로 직접 입력할 수 있습니다.","uiStudio.cleanup.policy.cascade.tooltip":"변경 이력만이 아니라 그 이력에 연결된 캡처 이미지도 함께 삭제합니다. 끄면 이미지는 남깁니다.","uiStudio.cleanup.policy.save.tooltip":"현재 입력한 자동 삭제 규칙을 저장합니다. 저장 후부터 백그라운드에서 적용됩니다.","uiStudio.cleanup.policy.runNow.tooltip":"다음 자동 실행을 기다리지 않고 현재 규칙을 즉시 한 번 실행합니다.","settings.license.refresh.tooltip":"라이센스 서버에서 최신 상태를 다시 가져옵니다. 결제·취소 후 상태가 바로 반영되지 않을 때 사용하세요.","settings.license.reset.tooltip":"현재 등록된 라이센스 키를 제거합니다. 다른 키로 다시 활성화할 때 사용하세요.","settings.license.activate.tooltip":"입력한 라이센스 키로 Pro 기능을 활성화합니다.","tier.upgrade.tooltip":"Pro로 업그레이드하고 모든 기능을 잠금 해제합니다.","settings.language.auto.tooltip":"운영체제 언어 설정을 따릅니다. 지원되지 않는 언어이면 영어로 표시됩니다.","settings.dataHistory.open.tooltip":"이 항목을 자세히 보는 페이지로 이동합니다.","settings.dataHistory.clear.tooltip":"이 항목에 저장된 기록만 삭제합니다. Studio의 실제 데이터는 변경되지 않습니다.","settings.dataHistory.toggle.tooltip":"이 섹션을 접거나 펼칩니다.","settings.dataHistory.toolsActivity.metric.tooltip":"저장된 도구 실행 기록의 개수와 디스크 사용량입니다.","settings.dataHistory.toolStats.metric.tooltip":"집계된 총 실행 횟수와 세션 수입니다.","settings.dataHistory.syncLog.metric.tooltip":"저장된 동기화 이벤트의 개수와 디스크 사용량입니다.","settings.dataHistory.playtestReports.metric.tooltip":"저장된 플레이테스트 보고서의 개수와 디스크 사용량입니다.","settings.dataHistory.projectChanges.metric.tooltip":"저장된 프로젝트 변경 요약의 개수와 디스크 사용량입니다.","settings.dataHistory.connectionLog.metric.tooltip":"저장된 연결 이벤트의 개수와 디스크 사용량입니다.","settings.dataHistory.uiStudio.metric.tooltip":"저장된 UI Studio 변경 기록·캡처 수와 총 디스크 사용량입니다.","uiStudio.designCheckResultsTitle":"Design Check 제안","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"다시 확인","uiStudio.actions.designCheckRunning":"개선 제안 확인 중...","uiStudio.actions.designCheckRunningDetail":"완료되면 우선 검토/검토 권장/선택 개선 항목 수를 표시합니다.","uiStudio.actions.designCheckComplete":"개선 제안 확인 완료","uiStudio.actions.designCheckNoSnapshotSaved":"이 작업은 화면 캡처 파일을 새로 저장하지 않습니다.","uiStudio.sample.designCheck.contrast":"텍스트 대비 {expected} 미만 (현재 {actual}). TextColor3 또는 BackgroundColor3 조정 필요.","uiStudio.sample.designCheck.touchTarget":"터치 타겟 {expected} 권장 (현재 {actual}). Size 또는 padding을 늘리세요.","uiStudio.sample.designCheck.minTextSize":"TextSize가 {expected} 미만입니다 (현재 {actual}). 가독성 확보를 위해 상향 조정하세요.","uiStudio.gallery.priorityHighBadge.tooltip":"우선 검토 제안 개수입니다. 클릭해서 상세 내용을 확인하세요.","uiStudio.gallery.priorityMediumBadge.tooltip":"검토 권장 제안 개수입니다.","uiStudio.priorityMedium":"검토 권장","uiStudio.mediumPrioritySection":"검토 권장","uiStudio.gallery.priorityLowBadge.tooltip":"선택 개선 제안 개수입니다."},Uf={"sidebar.overview":"Resumen","sidebar.changelog":"Historial","sidebar.connection":"Conexión","sidebar.sync":"Sincronización","sidebar.playtest":"Prueba","sidebar.tools":"Herramientas","sidebar.settings":"Configuración","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Se requiere conexión con el servidor MCP.","sidebar.gate.l2":"Se requiere conexión con el plugin de Roblox Studio.","header.currentProject":"Proyecto actual","header.unknownProject":"Proyecto desconocido","header.projectRoot.label":"Project Root","header.currentProject.loading":"Cargando raíz del proyecto...","header.currentProject.unavailable":"Raíz del proyecto no disponible","header.placeNotConnected":"Place no conectado","header.currentProject.tooltip":"Carpeta de proyecto seleccionada actualmente.","header.currentProject.loading.tooltip":"La información de la raíz del proyecto todavía se está cargando.","header.currentProject.unavailable.tooltip":"La información actual de la raíz del proyecto no está disponible.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Cargando sync root...","header.currentProjectSyncRoot.unavailable":"Sync root no disponible","header.currentProjectSyncRoot.tooltip":"Carpeta sync root actual del proyecto seleccionado.","header.currentProjectSyncRoot.loading.tooltip":"La información de sync root todavía se está cargando.","header.currentProjectSyncRoot.unavailable.tooltip":"La información actual de sync root no está disponible.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"La ruta de archivos de prueba no está disponible.","header.testFiles.tooltip":"Directorio actual de archivos de playtest para el place seleccionado.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Se requiere conexión del plugin","header.places.liveRequired":"Se requiere conexión del plugin para ver el place activo en tiempo real.","header.place.tooltip":"Place de Roblox conectado.","header.placeNotConnected.tooltip":"Place no conectado","header.changeProjectRoot":"Cambiar raíz del proyecto","header.changeProjectRoot.ariaLabel":"Cambiar raíz del proyecto","header.changeProjectRoot.tooltip":"Cambiar la raíz actual del proyecto.","header.changeProjectRoot.disabledTooltip.l0":"Primero se requiere conexión con el servidor MCP para cambiar la raíz del proyecto.","header.changeProjectRoot.disabledTooltip.loading":"La información de la raíz del proyecto todavía se está cargando.","header.changeProjectRoot.disabledTooltip.unavailable":"La información actual de la raíz del proyecto no está disponible.","header.projectRootModal.initial.title":"Cambiar raíz del proyecto","header.projectRootModal.initial.body.connected":"Después de elegir una carpeta de proyecto, MCP cambiará a la nueva raíz del proyecto y el contenido actual de Studio se resincronizará por completo en el nuevo destino <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Después de elegir una carpeta de proyecto, MCP cambiará a la nueva raíz del proyecto y usará <selected project folder>/weppy-project-sync como el próximo destino de sync.","header.projectRootModal.initial.nextSyncRoot":"Nuevo destino de sync después de la selección","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"El sync actual se detiene de inmediato.","header.projectRootModal.initial.warningFreshSync":"El contenido actual de Studio se usará para crear un fresh full sync en el nuevo destino.","header.projectRootModal.initial.warningNoMove":"Las carpetas de sync anteriores no se mueven automáticamente.","header.projectRootModal.initial.warningDeferredSync":"Si Studio no está conectado, el full resync comenzará la próxima vez que se conecte el plugin.","header.projectRootModal.confirm.title":"Confirmar nueva raíz del proyecto","header.projectRootModal.confirm.body":"Revisa la carpeta seleccionada antes de aplicar el cambio.","header.projectRootModal.confirm.projectRoot":"Carpeta de proyecto seleccionada","header.projectRootModal.confirm.syncRoot":"Nuevo destino de sync","header.projectRootModal.confirm.warningNoMove":"Las carpetas de sync existentes no se mueven automáticamente.","header.projectRootModal.pick":"Elegir carpeta","header.projectRootModal.apply":"Aplicar cambio","header.projectRootModal.cancel":"Cancelar","header.projectRootModal.error":"No se pudo cambiar la raíz del proyecto.","status.online":"En línea","status.offline":"Desconectado","status.idle":"Inactivo","status.syncing":"Sincronizando","status.error":"Error","status.initializing":"Inicializando","level.l0.title":"Servidor desconectado","level.l0.message":"WEPPY Dashboard está abierto pero el servidor MCP se detuvo o no responde.","level.l1.title":"Servidor conectado","level.l1.hint":"Verifica: ¿Roblox Studio está abierto? ¿El plugin está instalado?","level.l2.ok":"Studio conectado","tier.basic":"Basic","tier.basic.tooltip":"Nivel Basic con el conjunto estándar de funciones del WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Nivel Pro con el conjunto completo de funciones del WEPPY Dashboard.","tier.mixed":"Mixto","tier.upgrade":"Actualizar a Pro","tier.compare":"Basic vs Pro","tier.banner.save":"¡Ahorra tokens de IA con Pro!","tier.comparison.comingSoon":"Comparación Basic vs Pro — próximamente","tier.comparison.close":"Cerrar","tier.comparison.detailTitle":"Catálogo detallado de herramientas","tier.comparison.description":"Descripción","tier.comparison.basic.core":"Flujo MCP básico","tier.comparison.basic.core.item1":"Crear/editar scripts","tier.comparison.basic.core.item2":"Gestión de instancias","tier.comparison.basic.core.item3":"Control de propiedades","tier.comparison.basic.core.item4":"Selección y búsqueda","tier.comparison.basic.core.item5":"Gestión de etiquetas","tier.comparison.basic.core.item6":"Control de cámara","tier.comparison.basic.core.item7":"Monitoreo de registros","tier.comparison.basic.sync":"Sincronización (Basic)","tier.comparison.basic.sync.item1":"Sincronización unidireccional de Studio a local","tier.comparison.basic.sync.item2":"Aplicación manual por defecto","tier.comparison.pro.all":"Todo en Basic, además","tier.comparison.pro.sync":"Flujo de sincronización avanzado","tier.comparison.pro.sync.item1":"Dirección de sincronización por tipo","tier.comparison.pro.sync.item2":"Modo de aplicación por tipo","tier.comparison.pro.sync.item3":"Sincronización bidireccional e inversa","tier.comparison.pro.sync.item4":"Sincronización completa, resincronización y envío a Studio","tier.comparison.pro.sync.item5":"Sincronización multi-lugar","tier.comparison.pro.playtest":"Control de playtest","tier.comparison.pro.playtest.item1":"Reproducir, detener, pausar y reanudar","tier.comparison.pro.playtest.item2":"Inspección del estado de playtest","tier.comparison.pro.playtest.item3":"Ejecución de pruebas automatizadas","tier.comparison.pro.creation":"Flujo de creación avanzado","tier.comparison.pro.creation.item1":"Operaciones masivas","tier.comparison.pro.creation.item2":"Generación de terreno","tier.comparison.pro.creation.item3":"Búsqueda e inserción de assets","tier.comparison.pro.creation.item4":"Raycast y análisis espacial","tier.comparison.pro.creation.item5":"Control de entorno","tier.comparison.pro.ui":"Diseño de UI con IA (UI Studio)","tier.comparison.pro.ui.item1":"Planificar la UI desde tu solicitud y el contexto actual de Studio","tier.comparison.pro.ui.item2":"Crear, actualizar o eliminar menús, HUDs, botones y paneles","tier.comparison.pro.ui.item3":"Capturar la UI actual para revisarla","tier.comparison.pro.ui.item4":"Revisar sugerencias de toque, contraste y áreas seguras","tier.comparison.discount.label":"🎁 Ingresa este código en Gumroad para recibir un descuento:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Válido hasta el 30 de abril","tier.promo.discount.hint":"🎁 Usa el código WEPPY-MCP en Gumroad · Válido hasta el 30 de abril","tier.promo.discount.context":"🎁 Ingresa en Gumroad al pagar:","tier.tool.query_instances.desc":"Consulta de instancias, exploración de hijos/descendientes, info de clase, búsqueda por nombre y clase. Pro: árbol de archivos, estructura del proyecto, búsqueda por propiedad y etiqueta.","tier.tool.mutate_instances.desc":"Crear, eliminar, clonar, mover, renombrar y pivotar instancias. Pro: creación de árboles, creación/eliminación/duplicación masiva.","tier.tool.manage_properties.desc":"Consultar y establecer propiedades, atributos y etiquetas. Pro: valores calculados y relativos, consulta/establecimiento masivo, modificación masiva de hijos.","tier.tool.manage_scripts.desc":"Leer, escribir, crear, eliminar, editar líneas y buscar en scripts. Pro: reemplazo masivo entre scripts.","tier.tool.manage_ui.desc":"Solo Pro. Crea o mejora menús, HUDs, botones, etiquetas y paneles de imagen con estilo de juego; luego captura pantallas y revisa sugerencias.","tier.tool.manage_ui.action.design_brief":"Planificar la dirección de UI","tier.tool.manage_ui.action.create_tree":"Crear nueva UI","tier.tool.manage_ui.action.update":"Actualizar UI existente","tier.tool.manage_ui.action.delete":"Eliminar UI","tier.tool.manage_ui.action.preview":"Capturar pantalla de UI","tier.tool.manage_ui.action.check":"Revisar sugerencias de mejora","tier.tool.manage_lighting.desc":"Solo Pro. Configuración de iluminación, atmósfera, cielo, propiedades del terreno y hora del día.","tier.tool.manage_selection.desc":"Consultar, establecer y borrar selección. Pro: contexto, detalles, agregar/quitar elementos, monitorear cambios.","tier.tool.manage_camera.desc":"Info de cámara, enfocar por ruta o coordenadas, vista sugerida.","tier.tool.manage_tween.desc":"Solo Pro. Crear, reproducir, pausar y cancelar tweens para animaciones suaves.","tier.tool.manage_audio.desc":"Solo Pro. Reproducir, detener, pausar y reanudar sonidos. Configurar listener de audio.","tier.tool.manage_animation.desc":"Solo Pro. Cargar, reproducir y detener animaciones. Consultar tracks de humanoide/controlador.","tier.tool.manage_physics.desc":"Solo Pro. Registrar grupos de colisión, configurar colisión entre grupos, listar grupos.","tier.tool.manage_effects.desc":"Solo Pro. Emitir partículas, borrar todas, alternar activación de efectos.","tier.tool.manage_terrain.desc":"Solo Pro. Rellenar formas, borrar regiones, reemplazar materiales, gestionar colores, leer/escribir voxels, generación procedural, suavizado.","tier.tool.spatial_query.desc":"Solo Pro. Raycast, buscar suelo, verificar colocación, escaneo de área, buscar zonas planas y puntos de aparición, análisis de caminabilidad, mapa espacial, detección de colisión.","tier.tool.manage_assets.desc":"Solo Pro. Insertar modelos, consultar info de assets, buscar en tienda de creadores, insertar modelos/paquetes gratuitos, exportar.","tier.tool.manage_sync.desc":"Solo Pro. Estado de sincronización, configuración, historial, dirección, lectura/escritura de archivos sincronizados.","tier.tool.workspace_state.desc":"Solo Pro. Sincronización completa, instantánea, cambios recientes, info de viewport, metadatos, gestión de caché.","tier.tool.manage_logs.desc":"Consulta filtrada de registros, sondeo incremental, borrar buffer, consulta de errores recientes.","tier.tool.system_info.desc":"Estado de conexión, verificación de tier. Pro: info de lugar, lista de servicios, configuración de Studio, control de playtest, pruebas automáticas.","tier.tool.manage_studio.desc":"Solo Pro. Alterna ajustes de vista del editor de Studio, como la vista previa de UI, para capturas y QA; cambia ajustes de la sesión, no objetos de UI del juego.","tier.tool.batch_execute.desc":"Solo Pro. Ejecutar múltiples comandos en lote. Procesamiento secuencial con opción de continuar en caso de error.","tier.tool.execute_luau.desc":"Solo Pro. Ejecutar código Luau arbitrario en el sandbox de Roblox Studio.","connection.server.title":"Estado del servidor","connection.server.version":"Versión","connection.server.version.tooltip":"Versión instalada del servidor MCP.","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificador de proceso del sistema operativo.","connection.server.uptime":"Tiempo activo","connection.server.uptime.tooltip":"Tiempo transcurrido desde que se inició el servidor MCP.","connection.server.session":"Sesión","connection.server.session.tooltip":"Identificador de la sesión MCP actual.","connection.server.exec":"Ejecutable","connection.server.exec.tooltip":"Ruta del ejecutable usado para iniciar el servidor MCP.","connection.reconnect":"Reconectar","connection.checkSettings":"Verificar configuración","connection.agents.title":"Agentes IA","connection.agents.name":"Agente","connection.agents.cwd":"Directorio","connection.agents.cwd.tooltip":"Directorio de trabajo actual del agente de IA conectado.","connection.agents.projectRoot":"Raíz del proyecto","connection.agents.projectRoot.tooltip":"Ruta del proyecto autoritativa para la propiedad de sincronización","connection.agents.projectRoot.unresolved":"Sin resolver","connection.agents.connected":"Conectado","connection.agents.unknown":"Desconocido","connection.agents.none":"Sin agentes conectados","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"ID de cliente","connection.plugins.clientId.tooltip":"Identificador único del cliente del plugin para esta conexión de Studio.","connection.plugins.lastSeen":"Última vez","connection.plugins.lastSeen.tooltip":"Heartbeat más reciente recibido desde el plugin.","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Versión instalada del plugin informada por Studio.","connection.plugins.none":"Sin plugins conectados","connection.log.title":"Registro de conexión","connection.log.empty":"Sin eventos","connection.time.secondsAgo":"s atrás","connection.time.minutesAgo":"min atrás","connection.time.hoursAgo":"h atrás","common.loading":"Cargando...","common.retry":"Reintentar","common.reconnecting":"Reconectando...","common.expand":"Expandir","common.collapse":"Contraer","tools.tab.history":"Historial","tools.tab.statistics":"Estadísticas","tools.tab.failures":"Fallos","tools.col.time":"Hora","tools.col.time.tooltip":"Momento en que se registró la ejecución de la herramienta.","tools.col.toolAction":"Herramienta.Acción","tools.col.toolAction.tooltip":"Nombre de la herramienta y acción que se ejecutó.","tools.col.duration":"Duración","tools.col.duration.tooltip":"Cuánto tardó la herramienta en finalizar.","tools.col.status":"Estado","tools.col.status.tooltip":"Resultado de la ejecución registrada.","tools.col.tier":"Nivel","tools.col.tier.tooltip":"Nivel de licencia requerido para la herramienta o acción.","tools.col.tierStats.tooltip":"Resumen Basic, Pro o Mixed para esta fila de estadísticas de herramientas.","tools.col.tool":"Herramienta","tools.col.tool.tooltip":"Nombre de la herramienta consolidada en la tabla de estadísticas.","tools.col.calls":"Llamadas","tools.col.calls.tooltip":"Número total de llamadas registradas para esta herramienta.","tools.col.ok":"OK","tools.col.ok.tooltip":"Número de ejecuciones exitosas directas.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Número de ejecuciones que tuvieron éxito mediante fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Número de ejecuciones bloqueadas sin fallback.","tools.col.err":"FALLIDO","tools.col.err.tooltip":"Número de ejecuciones que terminaron en fallo.","tools.col.okRate":"% Éxito","tools.col.okRate.tooltip":"Porcentaje de llamadas que terminaron correctamente.","tools.col.avgTime":"Tiempo promedio","tools.col.avgTime.tooltip":"Tiempo promedio de ejecución entre las llamadas registradas.","tools.col.error":"Error","tools.filter.tool":"Herramienta","tools.filter.all":"Todos","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Esta entrada usó una herramienta o acción exclusiva de Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"La acción Pro solicitada tuvo éxito mediante un fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"La acción Pro solicitada fue bloqueada y no se ejecutó ningún fallback.","tools.badge.err":"FALLIDO","tools.badge.err.tooltip":"La ejecución de la herramienta terminó en fallo.","tools.status.ok":"OK","tools.status.ok.tooltip":"La ejecución de la herramienta finalizó correctamente.","tools.tier.mixed.tooltip":"Esta herramienta incluye acciones Basic y Pro.","tools.detail.params":"Parámetros","tools.detail.params.tooltip":"Parámetros de entrada enviados en esta ejecución.","tools.detail.result":"Resultado","tools.detail.result.tooltip":"Carga útil devuelta por esta ejecución.","tools.detail.requestedCommand":"Comando enviado","tools.detail.executedCommand":"Comando ejecutado","tools.detail.alternatives":"Alternativas","tools.detail.blockedMessage":"Motivo del bloqueo","tools.detail.noFallback":"Sin fallback","tools.detail.noFallback.value":"No se ejecutó ningún fallback.","tools.detail.errorMessage":"Mensaje de error","tools.clear.history.title":"¿Borrar historial?","tools.clear.history.message":"Esto elimina permanentemente el historial de herramientas del place actual.","tools.clear.statistics.title":"¿Borrar estadísticas?","tools.clear.statistics.message":"Esto restablece permanentemente las estadísticas de herramientas del place actual.","tools.detail.error":"Error","tools.page.prev":"Anterior","tools.page.prev.tooltip":"Ir a la página anterior del historial de herramientas.","tools.page.next":"Siguiente","tools.page.next.tooltip":"Ir a la página siguiente del historial de herramientas.","tools.empty.history":"Sin entradas de historial","tools.empty.stats":"Sin estadísticas","tools.empty.failures":"Sin fallos","tools.summary.total":"Total","tools.summary.calls":"llamadas","tools.summary.sessions":"Sesiones","settings.license.title":"Licencia","settings.license.title.tooltip":"Estado actual de la licencia y nivel de suscripción.","settings.license.status":"Estado","settings.license.status.tooltip":"Estado actual de activación de la licencia.","settings.license.tier":"Nivel","settings.license.tier.tooltip":"Nivel de suscripción actual para las funciones disponibles del WEPPY Dashboard.","settings.license.key":"Clave","settings.license.key.tooltip":"Clave de licencia enmascarada cargada actualmente por el servidor.","settings.license.keyValue.tooltip":"Clave de licencia enmascarada cargada actualmente por el servidor.","settings.license.provider":"Proveedor","settings.license.provider.tooltip":"Proveedor de licencia usado para validar esta clave.","settings.license.providerValue.tooltip":"Proveedor de licencia usado para validar esta clave.","settings.license.active":"Activa","settings.license.active.tooltip":"Estado actual de activación de la licencia.","settings.license.status.activeCancelPending.tooltip":"La cancelación está pendiente, pero el acceso Pro seguirá activo hasta que termine el período de facturación actual.","settings.license.inactive":"Inactiva","settings.license.inactive.tooltip":"Estado actual de activación de la licencia.","settings.license.expired":"Expirada","settings.license.expired.tooltip":"Estado actual de activación de la licencia.","settings.license.unavailable":"Información de licencia no disponible","settings.license.detail.cancelPending":"La cancelación está programada. El acceso Pro seguirá activo hasta que termine el período de facturación actual.","settings.license.reset":"Restablecer licencia","settings.readOnly":"Solo lectura","settings.readOnly.tooltip":"Esta sección muestra valores que no se pueden editar desde el WEPPY Dashboard.","settings.unavailable":"Configuración no disponible","settings.general.title":"Configuración general","settings.general.title.tooltip":"Ajustes calientes que se aplican inmediatamente al cambiarse.","settings.general.liveApply":"Aplicar en vivo","settings.general.liveApply.tooltip":"Los cambios en esta sección se aplican al instante sin un botón de guardar aparte.","settings.general.applied":"Aplicado","settings.general.logLevel":"Nivel de log","settings.general.logLevel.tooltip":"Define cuánto detalle escribe el WEPPY Dashboard en sus registros.","settings.general.localHistory":"Registro de historial","settings.general.localHistory.tooltip":"Guarda el historial local de ejecución de herramientas para las vistas de historial del WEPPY Dashboard.","settings.general.localStatistics":"Recopilación de estadísticas","settings.general.localStatistics.tooltip":"Agrega estadísticas locales de uso para los informes del WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Tiempo de espera","settings.general.requestTimeout.tooltip":"Tiempo máximo que el WEPPY Dashboard espera una acción antes de marcarla como fallida.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"El tiempo de espera de la acción se mide en milisegundos.","settings.cold.title":"Entorno del servidor","settings.cold.title.tooltip":"Valores de entorno del servidor de solo lectura cargados al iniciar.","settings.cold.httpPort.tooltip":"Número de puerto usado por el servidor HTTP del WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Interfaz de host a la que se enlaza el servidor HTTP del WEPPY Dashboard MCP.","settings.cold.dashboardAutoOpen.tooltip":"Controla si el WEPPY Dashboard se abre automáticamente en el navegador al iniciar el servidor.","settings.cold.dashboardAutoOpen.value.tooltip":"Comportamiento actual de inicio para abrir el WEPPY Dashboard en un navegador.","settings.cold.hint":"Configure mediante variables de entorno.","settings.language.title":"Idioma","settings.language.title.tooltip":"Elige cómo se localiza el texto de la interfaz del WEPPY Dashboard.","settings.language.dashboard":"Idioma del WEPPY Dashboard","settings.language.dashboard.tooltip":"Sobrescribe el idioma del WEPPY Dashboard o usa el idioma del sistema cuando está en Automático.","settings.language.auto":"Automático","overview.l0.title":"Servidor MCP desconectado","overview.l0.message":"El servidor MCP no responde. El WEPPY Dashboard intentará reconectarse automáticamente.","overview.l0.step1":"Verifique que el proceso del servidor MCP esté ejecutándose","overview.l0.step2":"Reinicie el comando del servidor MCP si es necesario","overview.l0.reconnecting":"Reconectando automáticamente cada 3s...","overview.l0.reconnectBtn":"Reconectar","overview.l0.settingsBtn":"Verificar configuración","overview.l1.pluginGuide":"El plugin de Roblox Studio no está conectado","overview.l1.check1":"¿Roblox Studio está abierto?","overview.l1.check2":"¿El WEPPY Plugin está instalado?","overview.l1.feedHint":"Los cambios aparecerán aquí cuando el plugin se conecte","overview.metric.server":"Servidor","overview.metric.server.tooltip":"Estado de ejecución y proceso del servidor MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Estado de conexión y versión del plugin de Roblox Studio.","overview.metric.agent":"Agente","overview.metric.agent.tooltip":"Agentes de IA conectados y su estado actual.","overview.metric.agent.instancesUnit":"instancias","overview.metric.sync":"Sincronización","overview.metric.sync.tooltip":"Actividad actual de sincronización entre Studio y archivos locales.","overview.metric.noAgent":"Sin agente","overview.meta.version":"Versión","overview.meta.version.tooltip":"Versión instalada del servidor MCP.","overview.meta.session":"Sesión","overview.meta.session.tooltip":"Identificador de la sesión MCP actual.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificador de proceso del sistema operativo.","overview.meta.uptime":"Tiempo activo","overview.meta.uptime.tooltip":"Tiempo transcurrido desde que se inició el servidor MCP.","overview.feed.title":"Cambios recientes del juego","overview.feed.empty":"Sin cambios recientes","overview.changelog.title":"Resumen de cambios de sesión","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instancias","overview.changelog.properties":"propiedades","overview.changelog.assets":"assets","overview.tier.title":"Uso por nivel","changelog.subtitle":"Historial de cambios del juego","changelog.filter.all":"Todos","changelog.filter.active":"Activo","changelog.filter.completed":"Completado","changelog.empty":"Sin entradas de historial","changelog.basic.limit.title":"La vista previa Basic muestra solo las 3 sesiones más recientes","changelog.basic.limit.body":"Actualiza a Pro para explorar la línea completa del historial de cambios de este place.","changelog.basic.metricLabel":"Historial visible / Total","changelog.basic.visible":"visibles","changelog.basic.total":"total","changelog.card.active":"Activo","changelog.card.active.tooltip":"Esta sesión todavía sigue recibiendo nuevos cambios del juego.","changelog.card.completed":"Completado","changelog.card.completed.tooltip":"Esta sesión terminó y ya no se esperan más cambios.","changelog.card.bootstrapStatus":"Inicializado","changelog.card.bootstrapStatus.tooltip":"Esta sesión solo contiene la instantánea inicial de bootstrap de sincronización.","changelog.card.inProgress":"en progreso","changelog.card.noChanges":"Sin cambios aún","changelog.card.noChanges.tooltip":"Todavía no se han extraído cambios del juego para esta sesión.","changelog.card.bootstrapSummary":"Instantánea de sincronización inicial","changelog.card.bootstrapSummary.tooltip":"Las escrituras de la sincronización inicial de archivos se agrupan en una sola fila de bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Cambios de scripts realizados en esta sesión.","changelog.card.instances":"instancias","changelog.card.instances.tooltip":"Cambios de creación, eliminación, movimiento o clonado de instancias en esta sesión.","changelog.card.modified":"modificado","changelog.card.created":"creado","changelog.card.deleted":"eliminado","changelog.card.moved":"movido","changelog.card.propertiesChanged":"propiedades cambiadas","changelog.card.propertiesChanged.tooltip":"Cambios de valores de propiedades registrados para esta sesión.","changelog.card.lightingConfigured":"Iluminación configurada","changelog.card.lightingConfigured.tooltip":"La iluminación o la atmósfera cambiaron en esta sesión.","changelog.card.terrainConfigured":"Terreno configurado","changelog.card.terrainConfigured.tooltip":"Los datos o la configuración del terreno cambiaron en esta sesión.","changelog.card.assetsInserted":"assets insertados","changelog.card.assetsInserted.tooltip":"Assets insertados en el place durante esta sesión.","changelog.category.script":"Scripts","changelog.category.instance":"Instancias","changelog.category.property":"Propiedades","changelog.category.lighting":"Iluminación","changelog.category.terrain":"Terreno","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Resumen de cambios","changelog.detail.changeSummary.tooltip":"Cantidad de cambios del juego extraídos agrupados por categoría para esta sesión.","changelog.detail.changeTimeline":"Línea de tiempo","changelog.detail.changeTimeline.tooltip":"Lista cronológica de cambios del juego extraídos para esta sesión.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Antes y después","changelog.detail.filterCategory":"Categoría","changelog.detail.filterCategory.tooltip":"Filtra la línea de tiempo a una sola categoría de cambio.","changelog.detail.confidence.exact":"Exacto","changelog.detail.confidence.exact.tooltip":"Se confirmaron tanto el estado anterior como el posterior para este cambio.","changelog.detail.confidence.partial":"Parcial","changelog.detail.confidence.partial.tooltip":"Solo se pudo confirmar parte del estado anterior y posterior para este cambio.","changelog.detail.confidence.afterOnly":"Solo después","changelog.detail.confidence.afterOnly.tooltip":"Solo se pudo confirmar el estado resultante después del cambio.","changelog.detail.confidence.intentOnly":"Solo intención","changelog.detail.confidence.intentOnly.tooltip":"Solo se registró la acción solicitada, no el estado resultante.","changelog.detail.confidence.unknown":"Desconocido","changelog.detail.confidence.unknown.tooltip":"No fue posible clasificar este cambio con confianza usando los datos disponibles.","changelog.detail.noChanges":"Sin cambios en esta categoría","changelog.detail.backToList":"Volver a la lista","changelog.diff.empty":"Sin diferencias disponibles","changelog.diff.unified":"Unificado","changelog.diff.sideBySide":"Lado a lado","changelog.diff.before":"Antes","changelog.diff.after":"Después","sync.overlay.title":"Se requiere el plugin de Roblox Studio","sync.overlay.message":"El estado de sincronización estará disponible cuando el plugin de Roblox Studio se conecte.","sync.overlay.check1":"¿Roblox Studio está abierto?","sync.overlay.check2":"¿El WEPPY Plugin está instalado?","sync.status.title":"Estado de sincronización","sync.status.title.tooltip":"Estado actual de sincronización entre Studio y archivos locales para este place.","sync.status.forwardOnly":"Solo avance","sync.status.forwardOnly.tooltip":"La suscripción Basic solo permite sincronización directa de Studio a local.","sync.status.place":"Place","sync.status.place.tooltip":"Nombre e ID del place de Roblox conectado.","sync.status.path":"Ruta","sync.status.path.tooltip":"Raíz del sistema de archivos local usada actualmente para la sincronización.","sync.status.instances":"Instancias","sync.status.instances.tooltip":"Cantidad total de instancias de Roblox sincronizadas en el espejo local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Cantidad total de scripts sincronizados e indexados para este place.","sync.status.state":"Estado","sync.status.state.tooltip":"Estado de ejecución de sincronización reportado por el servidor.","sync.directions.title":"Direcciones de sincronización","sync.directions.title.tooltip":"Dirección y modo de aplicación por categoría entre Local y Studio.","sync.directions.type":"Tipo","sync.directions.type.tooltip":"Categoría de sincronización afectada por esta regla.","sync.directions.direction":"Dirección","sync.directions.direction.tooltip":"Indica si cada categoría sincroniza desde Studio, hacia Studio o en ambos sentidos.","sync.directions.applyMode":"Modo de aplicación","sync.directions.applyMode.tooltip":"Cómo se aplican los cambios de sincronización entrantes para esta categoría.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Valores","sync.directions.cat.containers":"Contenedores","sync.directions.cat.data":"Datos","sync.directions.cat.services":"Servicios","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Los archivos locales en disco siempre se muestran a la izquierda del riel de dirección.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio siempre se muestra a la derecha del riel de dirección.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Aplica los cambios de sincronización solo cuando los activas manualmente.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Aplica los cambios de sincronización automáticamente cuando llegan actualizaciones.","sync.directions.tooltip.forward.body":"Los cambios de Studio se sincronizan solo a los archivos locales","sync.directions.tooltip.bidirectional.body":"Sincronización en ambos sentidos entre Local y Studio","sync.directions.tooltip.reverse.body":"Envía cambios de archivos locales a Studio","sync.directions.tooltip.proRequired":"Se requiere Pro en el plan Basic","sync.directions.dir.forward":"adelante","sync.directions.dir.bidirectional":"bidireccional","sync.directions.dir.reverse":"inverso","sync.log.title":"Registro de sincronización","sync.log.empty":"Sin eventos de sincronización","sync.log.type.write":"ESCRIBIR","sync.log.type.write.tooltip":"Se escribió una nueva salida sincronizada en el disco.","sync.log.type.update":"ACTUALIZAR","sync.log.type.update.tooltip":"Se actualizó un archivo o una instancia ya sincronizada.","sync.log.type.delete":"ELIMINAR","sync.log.type.delete.tooltip":"Se eliminó un archivo o una instancia sincronizada.","sync.log.type.idle":"INACTIVO","sync.log.type.idle.tooltip":"Se registró un evento de sincronización sin modificar archivos.","sync.upgrade.title":"Desbloquea sincronización completa con Pro","sync.upgrade.benefit1":"Sincronización bidireccional — edita archivos, se aplica automáticamente a Studio","sync.upgrade.benefit2":"Sincronización inversa — envía cambios de archivos a Studio","sync.upgrade.benefit3":"Historial completo de sincronización y registro detallado de cambios","sync.upgrade.buy":"Actualizar a Pro","playtest.status.title":"Estado de prueba","playtest.status.title.tooltip":"Estado actual de la sesión de playtest de Roblox informado por Studio.","playtest.status.mode":"Modo","playtest.status.mode.tooltip":"Modo de inicio de playtest de Studio usado por la sesión actual.","playtest.status.mode.value.tooltip":"Modo específico de playtest de Roblox Studio que se está usando ahora.","playtest.status.mode.play":"Jugar","playtest.status.mode.run":"Ejecutar","playtest.status.mode.server":"Servidor","playtest.status.mode.edit":"Editar","playtest.status.place.tooltip":"Place de Roblox asociado actualmente con esta sesión de playtest.","playtest.status.state.running":"En ejecución","playtest.status.state.running.tooltip":"Actualmente hay una sesión de playtest de Roblox en ejecución.","playtest.status.state.paused":"Pausado","playtest.status.state.paused.tooltip":"La sesión actual de playtest de Roblox está en pausa.","playtest.status.state.notRunning":"Sin ejecutar","playtest.status.state.notRunning.tooltip":"Actualmente no hay ninguna sesión de playtest de Roblox en ejecución.","playtest.control.play":"Jugar","playtest.control.pause":"Pausar","playtest.control.resume":"Reanudar","playtest.control.stop":"Detener","playtest.history.title":"Historial de pruebas","playtest.history.title.tooltip":"Ejecuciones automatizadas de playtest registradas para este proyecto.","playtest.history.empty":"Sin resultados de prueba","playtest.history.mode":"Modo","playtest.history.mode.tooltip":"Modo de playtest usado en esta ejecución de prueba registrada.","playtest.history.status.passed":"Aprobado","playtest.history.status.failed":"Fallido","playtest.history.status.running":"En ejecución","playtest.history.status.unknown":"Desconocido","playtest.history.status.tooltip":"Estado de resultado registrado para esta ejecución automatizada de playtest.","playtest.empty.title":"Sin resultados de prueba aún","playtest.empty.message":"Los resultados aparecerán aquí cuando el agente IA ejecute pruebas automatizadas vía system_info.run_test.","playtest.empty.message.before":"Los resultados aparecerán aquí cuando el agente IA ejecute pruebas automatizadas mediante","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"Punto de automatización del WEPPY Dashboard que ejecuta verificaciones de playtest de Roblox a través de la herramienta system_info.","playtest.report.title":"Reporte seleccionado","playtest.report.title.tooltip":"Salida detallada de la ejecución automatizada de playtest seleccionada actualmente.","playtest.report.content":"Reporte","playtest.report.content.tooltip":"Resumen en Markdown de la ejecución automatizada de playtest seleccionada.","playtest.report.logs":"Registros","playtest.report.logs.tooltip":"Registros de ejecución capturados para la ejecución automatizada de playtest seleccionada.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Sin contenido de reporte","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest es una función exclusiva de Pro","playtest.basic.desc":"Controla las pruebas desde el WEPPY Dashboard, ejecuta pruebas automatizadas y visualiza reportes detallados.","playtest.basic.benefit1":"Controles de jugar/pausar/detener con un clic","playtest.basic.benefit2":"Ejecución de pruebas automatizadas vía agente IA","playtest.basic.benefit3":"Historial de pruebas con seguimiento de éxito/fallo","playtest.basic.benefit4":"Reportes de prueba detallados en markdown","playtest.sample.badge":"Vista previa de la pantalla Pro de playtest","playtest.sample.title":"Estás viendo una vista previa de la pantalla de playtest disponible después de actualizar a Pro.","playtest.sample.message":"Esta vista previa usa datos de ejemplo. El control de playtest en vivo, la gestión del historial y los reportes reales se desbloquean con Pro.","playtest.sample.clearDisabled":"Actualiza a Pro para borrar el historial real de playtest.","playtest.sample.place":"Vista previa de Arena","playtest.sample.history.name":"Prueba de humo de Arena de ejemplo","playtest.sample.context.why":"Entrar a la arena, sobrevivir a la apertura y verificar que el HUD responda de inmediato.","playtest.sample.context.expected":"El jugador aparece de forma segura, la cuenta regresiva del HUD aparece en un segundo y la primera ola inicia sin errores.","playtest.sample.context.observed":"La protección de aparición funcionó, el HUD se actualizó a tiempo y la primera ola terminó sin regresiones.","playtest.sample.report.markdown":`# Prueba de humo de Arena de ejemplo
90
90
 
91
91
  - Flujo de aparición: PASS
92
92
  - Cuenta regresiva del HUD: PASS
@@ -96,7 +96,7 @@ Esta es una vista de muestra. Actualiza a Pro para ejecutar playtests reales y g
96
96
  [sample] protección de aparición activa
97
97
  [sample] cuenta regresiva del hud renderizada
98
98
  [sample] primera ola completada
99
- [sample] reporte de muestra finalizado`,"sidebar.whatsNew":"Novedades","sidebar.help.group":"Ayuda y comentarios","sidebar.help.bug":"Reportar un error","sidebar.help.bug.tooltip":"Abrir un reporte de error en GitHub con datos del entorno precargados","sidebar.help.feature":"Proponer una función","sidebar.help.feature.tooltip":"Proponer una nueva función o mejora en GitHub","sidebar.help.discussions":"Comunidad","sidebar.help.discussions.tooltip":"Hacer preguntas y compartir ideas en GitHub Discussions","sidebar.help.troubleshooting":"Solución de problemas","sidebar.help.troubleshooting.tooltip":"Abrir la guía oficial de solución de problemas en weppyai.com","header.whatsNew":"Novedades","header.whatsNew.tooltip":"Novedades","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Novedades","whatsNew.pageSubtitle":"Mantente al día con los cambios de MCP","whatsNew.unreadSection":"Sin leer","whatsNew.allSection":"Todos los anuncios","whatsNew.empty":"Aún no hay anuncios","whatsNew.newBadge":"NUEVO","whatsNew.category.release":"Versión","whatsNew.category.notice":"Aviso","whatsNew.category.deprecation":"Obsoleto","whatsNew.category.tip":"Consejo","uiStudio.title":"UI Studio","uiStudio.empty":"Aún no hay capturas guardadas. Se crean automáticamente cuando un agente de IA captura el estado actual de la UI.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"El plugin de Roblox Studio no está conectado","uiStudio.pluginGuide.message":"UI Studio muestra capturas e historial de cambios del place de Studio conectado. Se actualizará automáticamente cuando Studio y WEPPY Plugin se conecten.","uiStudio.pluginGuide.check1":"¿Roblox Studio está abierto?","uiStudio.pluginGuide.check2":"¿WEPPY Plugin está instalado y en ejecución?","uiStudio.pluginGuide.waiting":"Esperando la conexión del plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Revisar primero","uiStudio.priorityLow":"Mejora opcional","uiStudio.highPrioritySection":"Revisar primero","uiStudio.lowPrioritySection":"Mejoras opcionales","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Análisis","uiStudio.tabs.history":"Historial","uiStudio.analysis.reportsTitle":"Último análisis por destino de UI","uiStudio.analysis.recentCapturesTitle":"Capturas recientes","uiStudio.analysis.detailDialog":"Detalle del análisis","uiStudio.analysis.targetCountLabel":"Destinos analizados","uiStudio.analysis.captureLabel":"Capturas","uiStudio.analysis.verdict.hasSuggestions":"Sugerencias de mejora","uiStudio.analysis.verdict.needsFix":"Sugerencias de mejora","uiStudio.analysis.verdict.review":"Sugerencias de mejora","uiStudio.analysis.verdict.passed":"Sin sugerencias actuales","uiStudio.analysis.verdictLabel":"Resumen de mejoras","uiStudio.analysis.thresholds":"Base de revisión","uiStudio.analysis.issueSummary.passed":"No hay sugerencias adicionales con la base de revisión actual.","uiStudio.history.title":"Historial de cambios","uiStudio.history.empty":"Aún no hay historial. Cuando un agente de IA modifique la UI con manage_ui, se registrará automáticamente.","uiStudio.history.loading":"Cargando...","uiStudio.history.error":"Error","uiStudio.history.clear":"Borrar todo","uiStudio.history.filter.actions":"Tipo de acción","uiStudio.history.filter.actionAll":"Todo","uiStudio.history.filter.actionCreate":"Crear","uiStudio.history.filter.actionUpdate":"Actualizar","uiStudio.history.filter.actionDelete":"Eliminar","uiStudio.history.filter.period":"Período","uiStudio.history.filter.dateAll":"Todo","uiStudio.history.filter.today":"Hoy","uiStudio.history.filter.yesterday":"Ayer","uiStudio.history.filter.last7Days":"Últimos 7 días","uiStudio.history.filter.last30Days":"Últimos 30 días","uiStudio.history.filter.customRange":"Rango personalizado","uiStudio.history.filter.reset":"Restablecer","uiStudio.history.filter.from":"Desde","uiStudio.history.filter.to":"Hasta","uiStudio.history.row.affectedPaths":"Rutas","uiStudio.history.row.mutations":"Detalles de cambios","uiStudio.history.row.expand":"▾ Expandir","uiStudio.history.row.collapse":"▲ Contraer","uiStudio.history.row.expandDetails":"Mostrar {n} cambios","uiStudio.history.row.collapseDetails":"Ocultar cambios","uiStudio.history.row.toggleDetails":"Alternar detalles de cambios","uiStudio.history.row.mutationsEmpty":"Sin detalles de cambios","uiStudio.history.row.toolLabel":"Cambios de UI ({n})","uiStudio.history.row.compare":"Antes / Después","uiStudio.history.row.noBeforeState":"Sin estado anterior","uiStudio.history.row.noAfterState":"Sin estado posterior","uiStudio.history.row.qualityPlan":"Dirección de diseño","uiStudio.history.row.designCheck":"Sugerencias","uiStudio.history.row.designCheckUnavailable":"Sugerencias: no disponibles","uiStudio.history.row.designCheckNone":"Sugerencias: ninguna","uiStudio.history.selection.deleteSelected":"Eliminar seleccionados","uiStudio.history.selection.selectAll":"Seleccionar todo","uiStudio.history.selection.clearSelection":"Limpiar selección","uiStudio.history.confirm.deleteRequestsTitle":"Eliminar registros de cambios","uiStudio.history.confirm.deleteRequestsMessage":"Los registros de cambios seleccionados se eliminarán. Esta acción no se puede deshacer.","uiStudio.history.confirm.clearRequestsTitle":"Borrar historial de cambios","uiStudio.history.confirm.clearRequestsMessage":"Esto borra el historial de cambios del place actual. Las instancias de Studio no se ven afectadas.","uiStudio.history.confirm.cascadeOption":"También eliminar capturas vinculadas","uiStudio.history.drawer.close":"Cerrar","uiStudio.actions.previewAgain":"Vista previa de nuevo","uiStudio.actions.deleteSnapshot":"Eliminar esta captura","uiStudio.actions.proRequired":"Disponible tras actualizar a Pro","uiStudio.actions.captureCurrentState":"Capturar estado actual","uiStudio.actions.checkSuggestionsAgain":"Volver a revisar sugerencias","uiStudio.actions.previewRunning":"Capturando…","uiStudio.actions.previewRunningDetail":"El ID del nuevo archivo de captura aparecerá al finalizar.","uiStudio.actions.previewNeedsSaveCheck":"Captura completada, revisa el guardado","uiStudio.actions.previewSaved":"Nueva captura de pantalla guardada","uiStudio.actions.previewComplete":"Captura completada","uiStudio.actions.previewSavedDetail":"Las capturas existentes se mantienen; esta se guardó como un archivo nuevo.","uiStudio.actions.previewSavedPathMissing":"Se recibió un nuevo ID de captura, pero no se pudo confirmar la ruta del archivo guardado.","uiStudio.actions.previewSnapshotIdMissing":"No se pudo confirmar el nuevo ID de captura. Actualiza la lista para verificar si se guardó.","uiStudio.actions.more":"Más","uiStudio.gallery.selection.selectedCount":" seleccionados","uiStudio.confirm.deleteSnapshotTitle":"Eliminar captura","uiStudio.confirm.deleteSnapshotMessage":"Solo se eliminará este archivo de captura (la instancia de Studio se conserva).","uiStudio.confirm.deleteBatchTitle":"Eliminar capturas seleccionadas","uiStudio.confirm.deleteBatchMessage":"Se eliminarán las capturas seleccionadas. Esta acción no se puede deshacer.","uiStudio.gallery.selectMode":"Seleccionar","uiStudio.gallery.exitSelectMode":"Cancelar","uiStudio.gallery.selectAll":"Seleccionar todo","uiStudio.gallery.clearSelection":"Deseleccionar","uiStudio.gallery.deleteSelected":"Eliminar selección","common.cancel":"Cancelar","common.delete":"Eliminar","uiStudio.storage.title":"Datos guardados de UI Studio","uiStudio.storage.usageLabel":"En uso","uiStudio.storage.historyBytes":"Historial","uiStudio.storage.snapshotBytes":"Capturas de pantalla","uiStudio.storage.requestCount":"Registros de cambios","uiStudio.storage.mutationCount":"Detalles de cambios","uiStudio.storage.snapshotCount":"Capturas de pantalla","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Última limpieza automática","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"liberado","uiStudio.storage.lastRunErrors":"Errores","uiStudio.storage.loading":"Cargando...","uiStudio.cleanup.policy.title":"Política de eliminación automática","uiStudio.cleanup.policy.modeOff":"Desactivado","uiStudio.cleanup.policy.modeAge":"Por antigüedad","uiStudio.cleanup.policy.modeSize":"Por tamaño","uiStudio.cleanup.policy.cascade":"También eliminar capturas vinculadas","uiStudio.cleanup.policy.save":"Guardar política","uiStudio.cleanup.policy.runNow":"Ejecutar ahora","uiStudio.cleanup.policy.proRequired":"Disponible después de actualizar a Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmar política","uiStudio.cleanup.policy.confirm.messageStrict":"Al aplicar esta política se eliminarán inmediatamente","uiStudio.cleanup.policy.confirm.requests":" registros de cambios","uiStudio.cleanup.policy.confirm.snapshots":" capturas","uiStudio.cleanup.policy.confirm.freed":"liberado — ¿Aplicar?","uiStudio.cleanup.keepLastNDays":"Conservar últimos {n} días","uiStudio.cleanup.selectedDelete":"Eliminar selección…","uiStudio.cleanup.deleteAll":"Eliminar todo…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmar limpieza","uiStudio.cleanup.cleanupConfirmMessage":"Los elementos seleccionados serán eliminados. Esta acción no se puede deshacer.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Limpieza manual","uiStudio.cleanup.studioPreservedNote":"Esta acción elimina únicamente los archivos de historial y capturas en disco; las instancias de Roblox Studio no se ven afectadas.","uiStudio.history.sample.bannerBadge":"Vista previa del historial de cambios Pro","uiStudio.history.sample.bannerTitle":"Vista previa del historial de cambios Pro","uiStudio.history.sample.bannerMessage":"Esta vista previa usa datos de ejemplo. El historial real de registros de cambios, la comparación antes/después y la eliminación masiva se desbloquean con Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Actualiza a Pro para desbloquear el historial completo","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Servidor MCP conectado","toast.serverDisconnected":"Servidor MCP desconectado","toast.pluginConnected":"Plugin conectado","toast.pluginDisconnected":"Plugin desconectado","toast.clearSuccess":"Borrado correctamente","toast.clearFailed":"No se pudo borrar los datos","common.clear":"Borrar","settings.license.activate":"Activar licencia","settings.license.refresh":"Actualizar licencia","settings.license.keyInput":"Clave de licencia","settings.license.disconnected":"Desconectado","settings.license.disconnected.tooltip":"Reconéctese al servidor MCP para gestionar la licencia desde WEPPY Dashboard.","settings.license.live.tooltip":"Las acciones de licencia se envían inmediatamente al servidor MCP.","settings.license.status.activationRequired":"Activación requerida","settings.license.status.activationRequired.tooltip":"Se requiere activación manual de la licencia antes de que WEPPY Dashboard pueda actualizar este estado.","settings.license.status.grace":"Período de gracia","settings.license.status.grace.tooltip":"La verificación del proveedor no está disponible temporalmente, pero el acceso Pro permanece activo durante el período de gracia.","settings.license.status.graceBilling.tooltip":"El acceso Pro sigue disponible durante un período de gracia relacionado con la facturación.","settings.license.detail.graceBilling":"El acceso Pro sigue disponible durante el período de gracia de facturación.","settings.license.detail.graceProviderUnavailable":"Proveedor no disponible. El acceso Pro sigue activo en modo de gracia.","settings.license.detail.manualActivation":"Se requiere activación manual para restaurar el acceso Pro.","settings.license.detail.missingSessionToken":"La actualización está bloqueada porque falta el token de sesión actual.","settings.license.detail.refreshRecommended":"Pronto se debe actualizar la verificación de licencia.","connection.agents.kill":"Terminar","connection.agents.kill.title":"¿Terminar el agente?","connection.agents.killed":"Agente terminado","connection.agents.killFailed":"No se pudo terminar el agente","connection.agents.lastCommand":"Último comando","connection.agents.lastCommand.tooltip":"Llamada de herramienta más reciente ejecutada por este agente.","connection.agents.lastSeen":"Visto por última vez","connection.agents.lastSeen.tooltip":"Heartbeat o actividad más reciente de este agente.","connection.clear.title":"¿Borrar el registro de conexión?","connection.clear.message":"Esto elimina permanentemente el registro de conexión almacenado del proyecto actual.","sync.clear.title":"¿Borrar el registro de sincronización?","sync.clear.message":"Esto elimina permanentemente el registro de sincronización almacenado del place actual.","playtest.clear.title":"¿Borrar el historial de pruebas?","playtest.clear.message":"Esto elimina permanentemente los informes de playtest almacenados del place actual.","changelog.clear.title":"¿Borrar el changelog?","changelog.clear.message":"Esto elimina permanentemente el changelog almacenado del place actual.","sync.status.placePath":"Ruta del place","sync.status.placePath.tooltip":"Directorio del place activo donde se sincronizan los archivos del explorador.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Área representativa","changelog.card.verification":"Verificación","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Dirección de diseño del brief usada para este cambio.","uiStudio.history.row.designCheck.tooltip":"Resumen de sugerencias de Design Check después del cambio.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Sugerencias de Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Revisar de nuevo","uiStudio.actions.designCheckRunning":"Revisando sugerencias...","uiStudio.actions.designCheckRunningDetail":"Al finalizar se mostrarán los elementos para revisar primero, recomendados y opcionales.","uiStudio.actions.designCheckComplete":"Revisión de sugerencias completada","uiStudio.actions.designCheckNoSnapshotSaved":"Esta acción no guarda un nuevo archivo de captura.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Número de sugerencias para revisar primero. Haz clic para ver detalles.","uiStudio.gallery.priorityMediumBadge.tooltip":"Número de sugerencias recomendadas.","uiStudio.priorityMedium":"Revisión recomendada","uiStudio.mediumPrioritySection":"Revisión recomendada","uiStudio.gallery.priorityLowBadge.tooltip":"Número de mejoras opcionales."},Nf={"sidebar.overview":"Visão Geral","sidebar.changelog":"Histórico","sidebar.connection":"Conexão","sidebar.sync":"Sincronização","sidebar.playtest":"Teste","sidebar.tools":"Ferramentas","sidebar.settings":"Configurações","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"É necessária conexão com o servidor MCP.","sidebar.gate.l2":"É necessária conexão com o plugin do Roblox Studio.","header.currentProject":"Projeto atual","header.unknownProject":"Projeto desconhecido","header.projectRoot.label":"Project Root","header.currentProject.loading":"Carregando raiz do projeto...","header.currentProject.unavailable":"Raiz do projeto indisponível","header.placeNotConnected":"Place não conectado","header.currentProject.tooltip":"Pasta do projeto atualmente selecionada.","header.currentProject.loading.tooltip":"As informações da raiz do projeto ainda estão carregando.","header.currentProject.unavailable.tooltip":"As informações atuais da raiz do projeto estão indisponíveis.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Carregando sync root...","header.currentProjectSyncRoot.unavailable":"Sync root indisponível","header.currentProjectSyncRoot.tooltip":"Pasta sync root atual do projeto selecionado.","header.currentProjectSyncRoot.loading.tooltip":"As informações de sync root ainda estão carregando.","header.currentProjectSyncRoot.unavailable.tooltip":"As informações atuais de sync root estão indisponíveis.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"O caminho dos arquivos de teste está indisponível.","header.testFiles.tooltip":"Diretório atual dos arquivos de playtest para o place selecionado.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Conexão do plugin necessária","header.places.liveRequired":"A conexão do plugin é necessária para ver o place ativo em tempo real.","header.place.tooltip":"Place do Roblox conectado.","header.placeNotConnected.tooltip":"Place não conectado","header.changeProjectRoot":"Alterar raiz do projeto","header.changeProjectRoot.ariaLabel":"Alterar raiz do projeto","header.changeProjectRoot.tooltip":"Altere a raiz atual do projeto.","header.changeProjectRoot.disabledTooltip.l0":"A conexão com o servidor MCP é necessária primeiro para alterar a raiz do projeto.","header.changeProjectRoot.disabledTooltip.loading":"As informações da raiz do projeto ainda estão carregando.","header.changeProjectRoot.disabledTooltip.unavailable":"As informações atuais da raiz do projeto estão indisponíveis.","header.projectRootModal.initial.title":"Alterar raiz do projeto","header.projectRootModal.initial.body.connected":"Depois que você escolher uma pasta de projeto, o MCP mudará para a nova raiz do projeto e o conteúdo atual do Studio será totalmente resincronizado para o novo destino <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Depois que você escolher uma pasta de projeto, o MCP mudará para a nova raiz do projeto e usará <selected project folder>/weppy-project-sync como o próximo destino de sync.","header.projectRootModal.initial.nextSyncRoot":"Novo destino de sync após a seleção","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"O sync atual é interrompido imediatamente.","header.projectRootModal.initial.warningFreshSync":"O conteúdo atual do Studio será usado para criar um fresh full sync no novo destino.","header.projectRootModal.initial.warningNoMove":"Pastas de sync antigas não são movidas automaticamente.","header.projectRootModal.initial.warningDeferredSync":"Se o Studio não estiver conectado, o full resync começará na próxima conexão do plugin.","header.projectRootModal.confirm.title":"Confirmar nova raiz do projeto","header.projectRootModal.confirm.body":"Revise a pasta selecionada antes de aplicar a mudança.","header.projectRootModal.confirm.projectRoot":"Pasta de projeto selecionada","header.projectRootModal.confirm.syncRoot":"Novo destino do sync","header.projectRootModal.confirm.warningNoMove":"Pastas de sync existentes não são movidas automaticamente.","header.projectRootModal.pick":"Escolher pasta","header.projectRootModal.apply":"Aplicar alteração","header.projectRootModal.cancel":"Cancelar","header.projectRootModal.error":"Não foi possível alterar a raiz do projeto.","status.online":"Online","status.offline":"Offline","status.idle":"Ocioso","status.syncing":"Sincronizando","status.error":"Erro","status.initializing":"Inicializando","level.l0.title":"Servidor desconectado","level.l0.message":"O WEPPY Dashboard está aberto mas o servidor MCP parou ou não está respondendo.","level.l1.title":"Servidor conectado","level.l1.hint":"Verifique: O Roblox Studio está aberto? O plugin está instalado?","level.l2.ok":"Studio conectado","tier.basic":"Basic","tier.basic.tooltip":"Tier Basic com o conjunto padrão de recursos do WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Tier Pro com o conjunto completo de recursos do WEPPY Dashboard.","tier.mixed":"Misto","tier.upgrade":"Atualizar para Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Economize tokens de IA com Pro!","tier.comparison.comingSoon":"Comparação Basic vs Pro — em breve","tier.comparison.close":"Fechar","tier.comparison.detailTitle":"Catálogo detalhado de ferramentas","tier.comparison.description":"Descrição","tier.comparison.basic.core":"Fluxo MCP básico","tier.comparison.basic.core.item1":"Criar/editar scripts","tier.comparison.basic.core.item2":"Gerenciamento de instâncias","tier.comparison.basic.core.item3":"Controle de propriedades","tier.comparison.basic.core.item4":"Seleção e busca","tier.comparison.basic.core.item5":"Gerenciamento de tags","tier.comparison.basic.core.item6":"Controle de câmera","tier.comparison.basic.core.item7":"Monitoramento de logs","tier.comparison.basic.sync":"Sincronização (Basic)","tier.comparison.basic.sync.item1":"Sincronização unidirecional do Studio para local","tier.comparison.basic.sync.item2":"Aplicação manual como padrão","tier.comparison.pro.all":"Tudo do Basic, mais","tier.comparison.pro.sync":"Fluxo de sincronização avançado","tier.comparison.pro.sync.item1":"Direção de sincronização por tipo","tier.comparison.pro.sync.item2":"Modo de aplicação por tipo","tier.comparison.pro.sync.item3":"Sincronização bidirecional e reversa","tier.comparison.pro.sync.item4":"Sincronização completa, ressincronização e envio ao Studio","tier.comparison.pro.sync.item5":"Sincronização multi-lugar","tier.comparison.pro.playtest":"Controle de playtest","tier.comparison.pro.playtest.item1":"Reproduzir, parar, pausar e retomar","tier.comparison.pro.playtest.item2":"Inspeção do estado de playtest","tier.comparison.pro.playtest.item3":"Execução de testes automatizados","tier.comparison.pro.creation":"Fluxo de criação avançado","tier.comparison.pro.creation.item1":"Operações em massa","tier.comparison.pro.creation.item2":"Geração de terreno","tier.comparison.pro.creation.item3":"Busca e inserção de assets","tier.comparison.pro.creation.item4":"Raycast e análise espacial","tier.comparison.pro.creation.item5":"Controle de ambiente","tier.comparison.pro.ui":"Design de UI com IA (UI Studio)","tier.comparison.pro.ui.item1":"design_brief — coleta guiada de requisitos de UI","tier.comparison.pro.ui.item2":"create_tree / update / delete — criar e editar a hierarquia da UI","tier.comparison.pro.ui.item3":"preview — capturar telas da UI atual","tier.comparison.pro.ui.item4":"Design Check — validar alvos de toque, contraste e áreas seguras","tier.comparison.discount.label":"🎁 Insira este código no checkout do Gumroad para receber um desconto:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Válido até 30 de abril","tier.promo.discount.hint":"🎁 Use o código WEPPY-MCP no Gumroad · Válido até 30 de abril","tier.promo.discount.context":"🎁 Insira no Gumroad ao pagar:","tier.tool.query_instances.desc":"Consulta de instâncias, exploração de filhos/descendentes, info de classe, busca por nome e classe. Pro: árvore de arquivos, estrutura do projeto, busca por propriedade e tag.","tier.tool.mutate_instances.desc":"Criar, excluir, clonar, mover, renomear e pivotar instâncias. Pro: criação de árvores, criação/exclusão/duplicação em massa.","tier.tool.manage_properties.desc":"Consultar e definir propriedades, atributos e tags. Pro: valores calculados e relativos, consulta/definição em massa, modificação em massa de filhos.","tier.tool.manage_scripts.desc":"Ler, escrever, criar, excluir, editar linhas e buscar em scripts. Pro: substituição em massa entre scripts.","tier.tool.manage_lighting.desc":"Somente Pro. Configuração de iluminação, atmosfera, céu, propriedades do terreno e hora do dia.","tier.tool.manage_selection.desc":"Consultar, definir e limpar seleção. Pro: contexto, detalhes, adicionar/remover itens, monitorar mudanças.","tier.tool.manage_camera.desc":"Info da câmera, focar por caminho ou coordenadas, visualização sugerida.","tier.tool.manage_tween.desc":"Somente Pro. Criar, reproduzir, pausar e cancelar tweens para animações suaves.","tier.tool.manage_audio.desc":"Somente Pro. Reproduzir, parar, pausar e retomar sons. Configurar listener de áudio.","tier.tool.manage_animation.desc":"Somente Pro. Carregar, reproduzir e parar animações. Consultar tracks de humanoide/controlador.","tier.tool.manage_physics.desc":"Somente Pro. Registrar grupos de colisão, configurar colisão entre grupos, listar grupos.","tier.tool.manage_effects.desc":"Somente Pro. Emitir partículas, limpar todas, alternar ativação de efeitos.","tier.tool.manage_terrain.desc":"Somente Pro. Preencher formas, limpar regiões, substituir materiais, gerenciar cores, ler/escrever voxels, geração procedural, suavização.","tier.tool.spatial_query.desc":"Somente Pro. Raycast, encontrar chão, verificar posicionamento, varredura de área, encontrar áreas planas e pontos de spawn, análise de caminhabilidade, mapa espacial, detecção de colisão.","tier.tool.manage_assets.desc":"Somente Pro. Inserir modelos, consultar info de assets, buscar na loja de criadores, inserir modelos/pacotes gratuitos, exportar.","tier.tool.manage_sync.desc":"Somente Pro. Estado de sincronização, configuração, histórico, direção, leitura/escrita de arquivos sincronizados.","tier.tool.workspace_state.desc":"Somente Pro. Sincronização completa, snapshot, mudanças recentes, info de viewport, metadados, gerenciamento de cache.","tier.tool.manage_logs.desc":"Consulta filtrada de logs, sondagem incremental, limpar buffer, consulta de erros recentes.","tier.tool.system_info.desc":"Estado de conexão, verificação de tier. Pro: info do lugar, lista de serviços, configurações do Studio, controle de playtest, testes automáticos.","tier.tool.batch_execute.desc":"Somente Pro. Executar múltiplos comandos em lote. Processamento sequencial com opção de continuar em caso de erro.","tier.tool.execute_luau.desc":"Somente Pro. Executar código Luau arbitrário no sandbox do Roblox Studio.","connection.server.title":"Status do servidor","connection.server.version":"Versão","connection.server.version.tooltip":"Versão instalada do servidor MCP.","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificador de processo do sistema operacional.","connection.server.uptime":"Tempo ativo","connection.server.uptime.tooltip":"Tempo decorrido desde que o servidor MCP foi iniciado.","connection.server.session":"Sessão","connection.server.session.tooltip":"Identificador da sessão MCP atual.","connection.server.exec":"Executável","connection.server.exec.tooltip":"Caminho do executável usado para iniciar o servidor MCP.","connection.reconnect":"Reconectar","connection.checkSettings":"Verificar configurações","connection.agents.title":"Agentes IA","connection.agents.name":"Agente","connection.agents.cwd":"Diretório","connection.agents.cwd.tooltip":"Diretório de trabalho atual do agente de IA conectado.","connection.agents.projectRoot":"Raiz do Projeto","connection.agents.projectRoot.tooltip":"Caminho do projeto autoritativo para propriedade de sincronização","connection.agents.projectRoot.unresolved":"Não resolvido","connection.agents.connected":"Conectado","connection.agents.unknown":"Desconhecido","connection.agents.none":"Nenhum agente conectado","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"ID do cliente","connection.plugins.clientId.tooltip":"Identificador único do cliente do plugin para esta conexão do Studio.","connection.plugins.lastSeen":"Última vez","connection.plugins.lastSeen.tooltip":"Heartbeat mais recente recebido do plugin.","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Versão instalada do plugin reportada pelo Studio.","connection.plugins.none":"Nenhum plugin conectado","connection.log.title":"Log de conexão","connection.log.empty":"Nenhum evento","connection.time.secondsAgo":"s atrás","connection.time.minutesAgo":"min atrás","connection.time.hoursAgo":"h atrás","common.loading":"Carregando...","common.retry":"Tentar novamente","common.reconnecting":"Reconectando...","common.expand":"Expandir","common.collapse":"Recolher","tools.tab.history":"Histórico","tools.tab.statistics":"Estatísticas","tools.tab.failures":"Falhas","tools.col.time":"Hora","tools.col.time.tooltip":"Momento em que a execução da ferramenta foi registrada.","tools.col.toolAction":"Ferramenta.Ação","tools.col.toolAction.tooltip":"Nome da ferramenta e ação executada.","tools.col.duration":"Duração","tools.col.duration.tooltip":"Quanto tempo a ferramenta levou para terminar.","tools.col.status":"Status","tools.col.status.tooltip":"Resultado da execução registrada da ferramenta.","tools.col.tier":"Nível","tools.col.tier.tooltip":"Nível de licença exigido para a ferramenta ou ação.","tools.col.tierStats.tooltip":"Resumo Basic, Pro ou Mixed para esta linha de estatísticas da ferramenta.","tools.col.tool":"Ferramenta","tools.col.tool.tooltip":"Nome da ferramenta consolidada na tabela de estatísticas.","tools.col.calls":"Chamadas","tools.col.calls.tooltip":"Número total de chamadas registradas para esta ferramenta.","tools.col.ok":"OK","tools.col.ok.tooltip":"Número de execuções bem-sucedidas diretas.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Número de execuções que tiveram sucesso por fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Número de execuções bloqueadas sem fallback.","tools.col.err":"FALHOU","tools.col.err.tooltip":"Número de execuções que terminaram em falha.","tools.col.okRate":"% Sucesso","tools.col.okRate.tooltip":"Percentual de chamadas que terminaram com sucesso.","tools.col.avgTime":"Tempo médio","tools.col.avgTime.tooltip":"Tempo médio de execução entre as chamadas registradas.","tools.col.error":"Erro","tools.filter.tool":"Ferramenta","tools.filter.all":"Todos","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Esta entrada usou uma ferramenta ou ação exclusiva do Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"A ação Pro solicitada teve sucesso por meio de um fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"A ação Pro solicitada foi bloqueada e nenhum fallback foi executado.","tools.badge.err":"FALHOU","tools.badge.err.tooltip":"A execução da ferramenta falhou.","tools.status.ok":"OK","tools.status.ok.tooltip":"A execução da ferramenta terminou com sucesso.","tools.tier.mixed.tooltip":"Esta ferramenta inclui ações Basic e Pro.","tools.detail.params":"Parâmetros","tools.detail.params.tooltip":"Parâmetros de entrada enviados nesta execução da ferramenta.","tools.detail.result":"Resultado","tools.detail.result.tooltip":"Payload de resultado retornado por esta execução da ferramenta.","tools.detail.requestedCommand":"Comando enviado","tools.detail.executedCommand":"Comando executado","tools.detail.alternatives":"Alternativas","tools.detail.blockedMessage":"Motivo do bloqueio","tools.detail.noFallback":"Sem fallback","tools.detail.noFallback.value":"Nenhum fallback foi executado.","tools.detail.errorMessage":"Mensagem de erro","tools.clear.history.title":"Limpar histórico?","tools.clear.history.message":"Isso remove permanentemente o histórico de ferramentas do place atual.","tools.clear.statistics.title":"Limpar estatísticas?","tools.clear.statistics.message":"Isso redefine permanentemente as estatísticas de ferramentas do place atual.","tools.detail.error":"Erro","tools.page.prev":"Anterior","tools.page.prev.tooltip":"Ir para a página anterior do histórico de ferramentas.","tools.page.next":"Próximo","tools.page.next.tooltip":"Ir para a próxima página do histórico de ferramentas.","tools.empty.history":"Nenhuma entrada no histórico","tools.empty.stats":"Sem estatísticas","tools.empty.failures":"Sem falhas","tools.summary.total":"Total","tools.summary.calls":"chamadas","tools.summary.sessions":"Sessões","settings.license.title":"Licença","settings.license.title.tooltip":"Status atual da licença e nível de assinatura.","settings.license.status":"Status","settings.license.status.tooltip":"Estado atual de ativação da licença.","settings.license.tier":"Nível","settings.license.tier.tooltip":"Nível de assinatura atual para os recursos disponíveis do WEPPY Dashboard.","settings.license.key":"Chave","settings.license.key.tooltip":"Chave de licença mascarada atualmente carregada pelo servidor.","settings.license.keyValue.tooltip":"Chave de licença mascarada atualmente carregada pelo servidor.","settings.license.provider":"Provedor","settings.license.provider.tooltip":"Provedor de licença usado para validar esta chave.","settings.license.providerValue.tooltip":"Provedor de licença usado para validar esta chave.","settings.license.active":"Ativa","settings.license.active.tooltip":"Estado atual de ativação da licença.","settings.license.status.activeCancelPending.tooltip":"O cancelamento está pendente, mas o acesso Pro permanece ativo até o fim do ciclo de cobrança atual.","settings.license.inactive":"Inativa","settings.license.inactive.tooltip":"Estado atual de ativação da licença.","settings.license.expired":"Expirada","settings.license.expired.tooltip":"Estado atual de ativação da licença.","settings.license.unavailable":"Informações de licença indisponíveis","settings.license.detail.cancelPending":"O cancelamento foi agendado. O acesso Pro permanece ativo até o fim do ciclo de cobrança atual.","settings.license.reset":"Redefinir licença","settings.readOnly":"Somente leitura","settings.readOnly.tooltip":"Esta seção mostra valores que não podem ser editados pelo WEPPY Dashboard.","settings.unavailable":"Configurações indisponíveis","settings.general.title":"Configurações gerais","settings.general.title.tooltip":"Configurações quentes que são aplicadas imediatamente ao mudar.","settings.general.liveApply":"Aplicar ao vivo","settings.general.liveApply.tooltip":"As mudanças nesta seção são aplicadas imediatamente sem um botão separado de salvar.","settings.general.applied":"Aplicado","settings.general.logLevel":"Nível de log","settings.general.logLevel.tooltip":"Define quanto detalhe o WEPPY Dashboard escreve nos logs.","settings.general.localHistory":"Registro de histórico","settings.general.localHistory.tooltip":"Armazena o histórico local de execução de ferramentas para as telas de histórico do WEPPY Dashboard.","settings.general.localStatistics":"Coleta de estatísticas","settings.general.localStatistics.tooltip":"Agrega estatísticas locais de uso para os relatórios do WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Tempo limite","settings.general.requestTimeout.tooltip":"Tempo máximo que o WEPPY Dashboard espera uma ação antes de falhar.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"O tempo limite da ação é medido em milissegundos.","settings.cold.title":"Ambiente do servidor","settings.cold.title.tooltip":"Valores de ambiente do servidor somente leitura carregados na inicialização.","settings.cold.httpPort.tooltip":"Número da porta usada pelo servidor HTTP do WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Interface de host à qual o servidor HTTP do WEPPY Dashboard MCP se vincula.","settings.cold.dashboardAutoOpen.tooltip":"Controla se o WEPPY Dashboard abre automaticamente no navegador quando o servidor inicia.","settings.cold.dashboardAutoOpen.value.tooltip":"Comportamento atual de inicialização para abrir o WEPPY Dashboard no navegador.","settings.cold.hint":"Configure via variáveis de ambiente.","settings.language.title":"Idioma","settings.language.title.tooltip":"Escolha como o texto da interface do WEPPY Dashboard é localizado.","settings.language.dashboard":"Idioma do WEPPY Dashboard","settings.language.dashboard.tooltip":"Substitui o idioma do WEPPY Dashboard ou segue o idioma do sistema quando definido como Automático.","settings.language.auto":"Automático","overview.l0.title":"Servidor MCP desconectado","overview.l0.message":"O servidor MCP não está respondendo. O WEPPY Dashboard tentará reconectar automaticamente.","overview.l0.step1":"Verifique se o processo do servidor MCP está em execução","overview.l0.step2":"Reinicie o comando do servidor MCP se necessário","overview.l0.reconnecting":"Reconectando automaticamente a cada 3s...","overview.l0.reconnectBtn":"Reconectar","overview.l0.settingsBtn":"Verificar configurações","overview.l1.pluginGuide":"O plugin do Roblox Studio não está conectado","overview.l1.check1":"O Roblox Studio está aberto?","overview.l1.check2":"O WEPPY Plugin está instalado?","overview.l1.feedHint":"As alterações aparecerão aqui quando o plugin se conectar","overview.metric.server":"Servidor","overview.metric.server.tooltip":"Status de execução e processo do servidor MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Status de conexão e versão do plugin do Roblox Studio.","overview.metric.agent":"Agente","overview.metric.agent.tooltip":"Agentes de IA conectados e seu estado atual.","overview.metric.agent.instancesUnit":"instâncias","overview.metric.sync":"Sincronização","overview.metric.sync.tooltip":"Atividade atual de sincronização entre Studio e arquivos locais.","overview.metric.noAgent":"Sem agente","overview.meta.version":"Versão","overview.meta.version.tooltip":"Versão instalada do servidor MCP.","overview.meta.session":"Sessão","overview.meta.session.tooltip":"Identificador da sessão MCP atual.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificador de processo do sistema operacional.","overview.meta.uptime":"Tempo ativo","overview.meta.uptime.tooltip":"Tempo decorrido desde que o servidor MCP foi iniciado.","overview.feed.title":"Alterações recentes do jogo","overview.feed.empty":"Sem alterações recentes","overview.changelog.title":"Resumo de alterações da sessão","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instâncias","overview.changelog.properties":"propriedades","overview.changelog.assets":"assets","overview.tier.title":"Uso por nível","changelog.subtitle":"Histórico de alterações do jogo","changelog.filter.all":"Todos","changelog.filter.active":"Ativo","changelog.filter.completed":"Concluído","changelog.empty":"Nenhuma entrada no histórico","changelog.basic.limit.title":"A prévia Basic mostra apenas as 3 sessões mais recentes","changelog.basic.limit.body":"Faça upgrade para Pro para navegar pela linha do tempo completa do changelog deste place.","changelog.basic.metricLabel":"Changelog visível / Total","changelog.basic.visible":"visíveis","changelog.basic.total":"total","changelog.card.active":"Ativo","changelog.card.active.tooltip":"Esta sessão ainda está recebendo novas alterações do jogo.","changelog.card.completed":"Concluído","changelog.card.completed.tooltip":"Esta sessão terminou e não deve receber mais alterações.","changelog.card.bootstrapStatus":"Inicialização","changelog.card.bootstrapStatus.tooltip":"Esta sessão contém apenas o snapshot inicial de bootstrap da sincronização.","changelog.card.inProgress":"em andamento","changelog.card.noChanges":"Sem alterações ainda","changelog.card.noChanges.tooltip":"Ainda não foram extraídas alterações do jogo para esta sessão.","changelog.card.bootstrapSummary":"Snapshot de sincronização inicial","changelog.card.bootstrapSummary.tooltip":"As gravações da sincronização inicial de arquivos são condensadas em uma única linha de snapshot bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Alterações de script feitas nesta sessão.","changelog.card.instances":"instâncias","changelog.card.instances.tooltip":"Alterações de criação, exclusão, movimentação ou clonagem de instâncias nesta sessão.","changelog.card.modified":"modificado","changelog.card.created":"criado","changelog.card.deleted":"excluído","changelog.card.moved":"movido","changelog.card.propertiesChanged":"propriedades alteradas","changelog.card.propertiesChanged.tooltip":"Alterações de valores de propriedades registradas para esta sessão.","changelog.card.lightingConfigured":"Iluminação configurada","changelog.card.lightingConfigured.tooltip":"A iluminação ou a atmosfera foram alteradas nesta sessão.","changelog.card.terrainConfigured":"Terreno configurado","changelog.card.terrainConfigured.tooltip":"Os dados ou as configurações de terreno foram alterados nesta sessão.","changelog.card.assetsInserted":"assets inseridos","changelog.card.assetsInserted.tooltip":"Assets inseridos no place durante esta sessão.","changelog.category.script":"Scripts","changelog.category.instance":"Instâncias","changelog.category.property":"Propriedades","changelog.category.lighting":"Iluminação","changelog.category.terrain":"Terreno","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Resumo de alterações","changelog.detail.changeSummary.tooltip":"Contagem de alterações do jogo extraídas e agrupadas por categoria nesta sessão.","changelog.detail.changeTimeline":"Linha do tempo","changelog.detail.changeTimeline.tooltip":"Lista cronológica das alterações do jogo extraídas para esta sessão.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Antes e depois","changelog.detail.filterCategory":"Categoria","changelog.detail.filterCategory.tooltip":"Filtra a linha do tempo para uma única categoria de alteração.","changelog.detail.confidence.exact":"Exato","changelog.detail.confidence.exact.tooltip":"Os estados antes e depois desta alteração foram confirmados.","changelog.detail.confidence.partial":"Parcial","changelog.detail.confidence.partial.tooltip":"Apenas parte dos estados antes e depois desta alteração pôde ser confirmada.","changelog.detail.confidence.afterOnly":"Somente depois","changelog.detail.confidence.afterOnly.tooltip":"Apenas o estado resultante após a alteração pôde ser confirmado.","changelog.detail.confidence.intentOnly":"Somente intenção","changelog.detail.confidence.intentOnly.tooltip":"Apenas a ação solicitada foi registrada, não o estado resultante.","changelog.detail.confidence.unknown":"Desconhecido","changelog.detail.confidence.unknown.tooltip":"Não foi possível classificar esta alteração com confiança a partir dos dados disponíveis.","changelog.detail.noChanges":"Sem alterações nesta categoria","changelog.detail.backToList":"Voltar à lista","changelog.diff.empty":"Sem diferenças disponíveis","changelog.diff.unified":"Unificado","changelog.diff.sideBySide":"Lado a lado","changelog.diff.before":"Antes","changelog.diff.after":"Depois","sync.overlay.title":"Plugin do Roblox Studio necessário","sync.overlay.message":"O status de sincronização estará disponível quando o plugin do Roblox Studio se conectar.","sync.overlay.check1":"O Roblox Studio está aberto?","sync.overlay.check2":"O WEPPY Plugin está instalado?","sync.status.title":"Status de sincronização","sync.status.title.tooltip":"Status atual de sincronização entre o Studio e os arquivos locais deste place.","sync.status.forwardOnly":"Somente avanço","sync.status.forwardOnly.tooltip":"O tier Basic permite apenas sincronização direta do Studio para o local.","sync.status.place":"Place","sync.status.place.tooltip":"Nome e ID do place do Roblox atualmente conectado.","sync.status.path":"Caminho","sync.status.path.tooltip":"Raiz do sistema de arquivos local usada atualmente para a saída de sincronização.","sync.status.instances":"Instâncias","sync.status.instances.tooltip":"Total de instâncias do Roblox sincronizadas no espelho local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total de arquivos de script atualmente indexados para este place.","sync.status.state":"Estado","sync.status.state.tooltip":"Estado atual de execução da sincronização informado pelo servidor.","sync.directions.title":"Direções de sincronização","sync.directions.title.tooltip":"Direção e modo de aplicação por categoria entre Local e Studio.","sync.directions.type":"Tipo","sync.directions.type.tooltip":"Categoria de sincronização afetada por esta regra.","sync.directions.direction":"Direção","sync.directions.direction.tooltip":"Indica se cada categoria sincroniza do Studio, para o Studio ou nos dois sentidos.","sync.directions.applyMode":"Modo de aplicação","sync.directions.applyMode.tooltip":"Como as mudanças de sincronização recebidas são aplicadas nesta categoria.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Valores","sync.directions.cat.containers":"Contêineres","sync.directions.cat.data":"Dados","sync.directions.cat.services":"Serviços","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Os arquivos locais em disco sempre aparecem no lado esquerdo da régua de direção.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"O Roblox Studio sempre aparece no lado direito da régua de direção.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Aplica as mudanças de sincronização apenas quando você dispara manualmente.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Aplica as mudanças de sincronização automaticamente quando chegam atualizações.","sync.directions.tooltip.forward.body":"As mudanças do Studio sincronizam apenas para os arquivos locais","sync.directions.tooltip.bidirectional.body":"Sincronização de mão dupla entre Local e Studio","sync.directions.tooltip.reverse.body":"Envia mudanças dos arquivos locais para o Studio","sync.directions.tooltip.proRequired":"Pro é necessário no tier Basic","sync.directions.dir.forward":"adiante","sync.directions.dir.bidirectional":"bidirecional","sync.directions.dir.reverse":"reverso","sync.log.title":"Log de sincronização","sync.log.empty":"Sem eventos de sincronização","sync.log.type.write":"ESCREVER","sync.log.type.write.tooltip":"Uma nova saída de sincronização foi gravada no disco.","sync.log.type.update":"ATUALIZAR","sync.log.type.update.tooltip":"Um arquivo ou uma instância já sincronizada foi atualizada.","sync.log.type.delete":"EXCLUIR","sync.log.type.delete.tooltip":"Um arquivo ou uma instância sincronizada foi removida.","sync.log.type.idle":"OCIOSO","sync.log.type.idle.tooltip":"Um evento de sincronização foi registrado sem alterar arquivos.","sync.upgrade.title":"Desbloqueie sincronização completa com Pro","sync.upgrade.benefit1":"Sincronização bidirecional — edite arquivos, aplicação automática no Studio","sync.upgrade.benefit2":"Sincronização reversa — envie alterações de arquivos para o Studio","sync.upgrade.benefit3":"Histórico completo de sincronização e registro detalhado de alterações","sync.upgrade.buy":"Atualizar para Pro","playtest.status.title":"Status de teste","playtest.status.title.tooltip":"Estado atual da sessão de playtest do Roblox informado pelo Studio.","playtest.status.mode":"Modo","playtest.status.mode.tooltip":"Modo de inicialização do playtest do Studio para a sessão atual.","playtest.status.mode.value.tooltip":"Modo específico de playtest do Roblox Studio atualmente em uso.","playtest.status.mode.play":"Jogar","playtest.status.mode.run":"Executar","playtest.status.mode.server":"Servidor","playtest.status.mode.edit":"Editar","playtest.status.place.tooltip":"Place do Roblox atualmente associado a esta sessão de playtest.","playtest.status.state.running":"Executando","playtest.status.state.running.tooltip":"Uma sessão de playtest do Roblox está em execução no momento.","playtest.status.state.paused":"Pausado","playtest.status.state.paused.tooltip":"A sessão atual de playtest do Roblox está pausada.","playtest.status.state.notRunning":"Não está em execução","playtest.status.state.notRunning.tooltip":"Nenhuma sessão de playtest do Roblox está em execução no momento.","playtest.control.play":"Jogar","playtest.control.pause":"Pausar","playtest.control.resume":"Retomar","playtest.control.stop":"Parar","playtest.history.title":"Histórico de testes","playtest.history.title.tooltip":"Execuções automatizadas de playtest registradas para este projeto.","playtest.history.empty":"Sem resultados de teste","playtest.history.mode":"Modo","playtest.history.mode.tooltip":"Modo de playtest usado nesta execução de teste registrada.","playtest.history.status.passed":"Aprovado","playtest.history.status.failed":"Falhou","playtest.history.status.running":"Executando","playtest.history.status.unknown":"Desconhecido","playtest.history.status.tooltip":"Estado de resultado registrado para esta execução automatizada de playtest.","playtest.empty.title":"Sem resultados de teste ainda","playtest.empty.message":"Os resultados aparecerão aqui quando o agente IA executar testes automatizados via system_info.run_test.","playtest.empty.message.before":"Os resultados aparecerão aqui quando o agente IA executar testes automatizados por meio de","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"Ponto de automação do WEPPY Dashboard que executa verificações de playtest do Roblox por meio da ferramenta system_info.","playtest.report.title":"Relatório selecionado","playtest.report.title.tooltip":"Saída detalhada da execução automatizada de playtest atualmente selecionada.","playtest.report.content":"Relatório","playtest.report.content.tooltip":"Resumo em Markdown da execução automatizada de playtest selecionada.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Logs de execução capturados para a execução automatizada de playtest selecionada.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Sem conteúdo de relatório","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest é uma função exclusiva do Pro","playtest.basic.desc":"Controle os testes pelo WEPPY Dashboard, execute testes automatizados e visualize relatórios detalhados.","playtest.basic.benefit1":"Controles de jogar/pausar/parar com um clique","playtest.basic.benefit2":"Execução de testes automatizados via agente IA","playtest.basic.benefit3":"Histórico de testes com rastreamento de sucesso/falha","playtest.basic.benefit4":"Relatórios de teste detalhados em markdown","playtest.sample.badge":"Prévia da tela de playtest Pro","playtest.sample.title":"Você está vendo uma prévia da tela de playtest disponível após o upgrade para Pro.","playtest.sample.message":"Esta prévia usa dados de exemplo. Controle de playtest ao vivo, gerenciamento de histórico e relatórios reais são liberados com Pro.","playtest.sample.clearDisabled":"Faça upgrade para Pro para limpar o histórico real de playtest.","playtest.sample.place":"Prévia da Arena","playtest.sample.history.name":"Teste de fumaça da Arena de exemplo","playtest.sample.context.why":"Entrar na arena, sobreviver à abertura e verificar se o HUD responde imediatamente.","playtest.sample.context.expected":"O jogador surge com segurança, a contagem regressiva do HUD aparece em um segundo e a primeira onda começa sem erros.","playtest.sample.context.observed":"A proteção de spawn funcionou, o HUD atualizou no tempo certo e a primeira onda terminou sem regressões.","playtest.sample.report.markdown":`# Teste de fumaça da Arena de exemplo
99
+ [sample] reporte de muestra finalizado`,"sidebar.whatsNew":"Novedades","sidebar.help.group":"Ayuda y comentarios","sidebar.help.bug":"Reportar un error","sidebar.help.bug.tooltip":"Abrir un reporte de error en GitHub con datos del entorno precargados","sidebar.help.feature":"Proponer una función","sidebar.help.feature.tooltip":"Proponer una nueva función o mejora en GitHub","sidebar.help.discussions":"Comunidad","sidebar.help.discussions.tooltip":"Hacer preguntas y compartir ideas en GitHub Discussions","sidebar.help.troubleshooting":"Solución de problemas","sidebar.help.troubleshooting.tooltip":"Abrir la guía oficial de solución de problemas en weppyai.com","header.whatsNew":"Novedades","header.whatsNew.tooltip":"Novedades","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Novedades","whatsNew.pageSubtitle":"Mantente al día con los cambios de MCP","whatsNew.unreadSection":"Sin leer","whatsNew.allSection":"Todos los anuncios","whatsNew.empty":"Aún no hay anuncios","whatsNew.newBadge":"NUEVO","whatsNew.category.release":"Versión","whatsNew.category.notice":"Aviso","whatsNew.category.deprecation":"Obsoleto","whatsNew.category.tip":"Consejo","uiStudio.title":"UI Studio","uiStudio.empty":"Aún no hay capturas guardadas. Se crean automáticamente cuando un agente de IA captura el estado actual de la UI.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"El plugin de Roblox Studio no está conectado","uiStudio.pluginGuide.message":"UI Studio muestra capturas e historial de cambios del place de Studio conectado. Se actualizará automáticamente cuando Studio y WEPPY Plugin se conecten.","uiStudio.pluginGuide.check1":"¿Roblox Studio está abierto?","uiStudio.pluginGuide.check2":"¿WEPPY Plugin está instalado y en ejecución?","uiStudio.pluginGuide.waiting":"Esperando la conexión del plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Revisar primero","uiStudio.priorityLow":"Mejora opcional","uiStudio.highPrioritySection":"Revisar primero","uiStudio.lowPrioritySection":"Mejoras opcionales","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Análisis","uiStudio.tabs.history":"Historial","uiStudio.analysis.reportsTitle":"Último análisis por destino de UI","uiStudio.analysis.recentCapturesTitle":"Capturas recientes","uiStudio.analysis.detailDialog":"Detalle del análisis","uiStudio.analysis.targetCountLabel":"Destinos analizados","uiStudio.analysis.captureLabel":"Capturas","uiStudio.analysis.verdict.hasSuggestions":"Sugerencias de mejora","uiStudio.analysis.verdict.needsFix":"Sugerencias de mejora","uiStudio.analysis.verdict.review":"Sugerencias de mejora","uiStudio.analysis.verdict.passed":"Sin sugerencias actuales","uiStudio.analysis.verdictLabel":"Resumen de mejoras","uiStudio.analysis.thresholds":"Base de revisión","uiStudio.analysis.issueSummary.passed":"No hay sugerencias adicionales con la base de revisión actual.","uiStudio.history.title":"Historial de cambios","uiStudio.history.empty":"Aún no hay historial. Cuando un agente de IA modifique la UI con manage_ui, se registrará automáticamente.","uiStudio.history.loading":"Cargando...","uiStudio.history.error":"Error","uiStudio.history.clear":"Borrar todo","uiStudio.history.filter.actions":"Tipo de acción","uiStudio.history.filter.actionAll":"Todo","uiStudio.history.filter.actionCreate":"Crear","uiStudio.history.filter.actionUpdate":"Actualizar","uiStudio.history.filter.actionDelete":"Eliminar","uiStudio.history.filter.period":"Período","uiStudio.history.filter.dateAll":"Todo","uiStudio.history.filter.today":"Hoy","uiStudio.history.filter.yesterday":"Ayer","uiStudio.history.filter.last7Days":"Últimos 7 días","uiStudio.history.filter.last30Days":"Últimos 30 días","uiStudio.history.filter.customRange":"Rango personalizado","uiStudio.history.filter.reset":"Restablecer","uiStudio.history.filter.from":"Desde","uiStudio.history.filter.to":"Hasta","uiStudio.history.row.affectedPaths":"Rutas","uiStudio.history.row.mutations":"Detalles de cambios","uiStudio.history.row.expand":"▾ Expandir","uiStudio.history.row.collapse":"▲ Contraer","uiStudio.history.row.expandDetails":"Mostrar {n} cambios","uiStudio.history.row.collapseDetails":"Ocultar cambios","uiStudio.history.row.toggleDetails":"Alternar detalles de cambios","uiStudio.history.row.mutationsEmpty":"Sin detalles de cambios","uiStudio.history.row.toolLabel":"Cambios de UI ({n})","uiStudio.history.row.compare":"Antes / Después","uiStudio.history.row.noBeforeState":"Sin estado anterior","uiStudio.history.row.noAfterState":"Sin estado posterior","uiStudio.history.row.qualityPlan":"Dirección de diseño","uiStudio.history.row.designCheck":"Sugerencias","uiStudio.history.row.designCheckUnavailable":"Sugerencias: no disponibles","uiStudio.history.row.designCheckNone":"Sugerencias: ninguna","uiStudio.history.selection.deleteSelected":"Eliminar seleccionados","uiStudio.history.selection.selectAll":"Seleccionar todo","uiStudio.history.selection.clearSelection":"Limpiar selección","uiStudio.history.confirm.deleteRequestsTitle":"Eliminar registros de cambios","uiStudio.history.confirm.deleteRequestsMessage":"Los registros de cambios seleccionados se eliminarán. Esta acción no se puede deshacer.","uiStudio.history.confirm.clearRequestsTitle":"Borrar historial de cambios","uiStudio.history.confirm.clearRequestsMessage":"Esto borra el historial de cambios del place actual. Las instancias de Studio no se ven afectadas.","uiStudio.history.confirm.cascadeOption":"También eliminar capturas vinculadas","uiStudio.history.drawer.close":"Cerrar","uiStudio.actions.previewAgain":"Vista previa de nuevo","uiStudio.actions.deleteSnapshot":"Eliminar esta captura","uiStudio.actions.proRequired":"Disponible tras actualizar a Pro","uiStudio.actions.captureCurrentState":"Capturar estado actual","uiStudio.actions.checkSuggestionsAgain":"Volver a revisar sugerencias","uiStudio.actions.previewRunning":"Capturando…","uiStudio.actions.previewRunningDetail":"El ID del nuevo archivo de captura aparecerá al finalizar.","uiStudio.actions.previewNeedsSaveCheck":"Captura completada, revisa el guardado","uiStudio.actions.previewSaved":"Nueva captura de pantalla guardada","uiStudio.actions.previewComplete":"Captura completada","uiStudio.actions.previewSavedDetail":"Las capturas existentes se mantienen; esta se guardó como un archivo nuevo.","uiStudio.actions.previewSavedPathMissing":"Se recibió un nuevo ID de captura, pero no se pudo confirmar la ruta del archivo guardado.","uiStudio.actions.previewSnapshotIdMissing":"No se pudo confirmar el nuevo ID de captura. Actualiza la lista para verificar si se guardó.","uiStudio.actions.more":"Más","uiStudio.gallery.selection.selectedCount":" seleccionados","uiStudio.confirm.deleteSnapshotTitle":"Eliminar captura","uiStudio.confirm.deleteSnapshotMessage":"Solo se eliminará este archivo de captura (la instancia de Studio se conserva).","uiStudio.confirm.deleteBatchTitle":"Eliminar capturas seleccionadas","uiStudio.confirm.deleteBatchMessage":"Se eliminarán las capturas seleccionadas. Esta acción no se puede deshacer.","uiStudio.gallery.selectMode":"Seleccionar","uiStudio.gallery.exitSelectMode":"Cancelar","uiStudio.gallery.selectAll":"Seleccionar todo","uiStudio.gallery.clearSelection":"Deseleccionar","uiStudio.gallery.deleteSelected":"Eliminar selección","common.cancel":"Cancelar","common.delete":"Eliminar","uiStudio.storage.title":"Datos guardados de UI Studio","uiStudio.storage.usageLabel":"En uso","uiStudio.storage.historyBytes":"Historial","uiStudio.storage.snapshotBytes":"Capturas de pantalla","uiStudio.storage.requestCount":"Registros de cambios","uiStudio.storage.mutationCount":"Detalles de cambios","uiStudio.storage.snapshotCount":"Capturas de pantalla","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Última limpieza automática","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"liberado","uiStudio.storage.lastRunErrors":"Errores","uiStudio.storage.loading":"Cargando...","uiStudio.cleanup.policy.title":"Política de eliminación automática","uiStudio.cleanup.policy.modeOff":"Desactivado","uiStudio.cleanup.policy.modeAge":"Por antigüedad","uiStudio.cleanup.policy.modeSize":"Por tamaño","uiStudio.cleanup.policy.cascade":"También eliminar capturas vinculadas","uiStudio.cleanup.policy.save":"Guardar política","uiStudio.cleanup.policy.runNow":"Ejecutar ahora","uiStudio.cleanup.policy.proRequired":"Disponible después de actualizar a Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmar política","uiStudio.cleanup.policy.confirm.messageStrict":"Al aplicar esta política se eliminarán inmediatamente","uiStudio.cleanup.policy.confirm.requests":" registros de cambios","uiStudio.cleanup.policy.confirm.snapshots":" capturas","uiStudio.cleanup.policy.confirm.freed":"liberado — ¿Aplicar?","uiStudio.cleanup.keepLastNDays":"Conservar últimos {n} días","uiStudio.cleanup.selectedDelete":"Eliminar selección…","uiStudio.cleanup.deleteAll":"Eliminar todo…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmar limpieza","uiStudio.cleanup.cleanupConfirmMessage":"Los elementos seleccionados serán eliminados. Esta acción no se puede deshacer.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Limpieza manual","uiStudio.cleanup.studioPreservedNote":"Esta acción elimina únicamente los archivos de historial y capturas en disco; las instancias de Roblox Studio no se ven afectadas.","uiStudio.history.sample.bannerBadge":"Vista previa del historial de cambios Pro","uiStudio.history.sample.bannerTitle":"Vista previa del historial de cambios Pro","uiStudio.history.sample.bannerMessage":"Esta vista previa usa datos de ejemplo. El historial real de registros de cambios, la comparación antes/después y la eliminación masiva se desbloquean con Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Actualiza a Pro para desbloquear el historial completo","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Servidor MCP conectado","toast.serverDisconnected":"Servidor MCP desconectado","toast.pluginConnected":"Plugin conectado","toast.pluginDisconnected":"Plugin desconectado","toast.clearSuccess":"Borrado correctamente","toast.clearFailed":"No se pudo borrar los datos","common.clear":"Borrar","settings.license.activate":"Activar licencia","settings.license.refresh":"Actualizar licencia","settings.license.keyInput":"Clave de licencia","settings.license.disconnected":"Desconectado","settings.license.disconnected.tooltip":"Reconéctese al servidor MCP para gestionar la licencia desde WEPPY Dashboard.","settings.license.live.tooltip":"Las acciones de licencia se envían inmediatamente al servidor MCP.","settings.license.status.activationRequired":"Activación requerida","settings.license.status.activationRequired.tooltip":"Se requiere activación manual de la licencia antes de que WEPPY Dashboard pueda actualizar este estado.","settings.license.status.grace":"Período de gracia","settings.license.status.grace.tooltip":"La verificación del proveedor no está disponible temporalmente, pero el acceso Pro permanece activo durante el período de gracia.","settings.license.status.graceBilling.tooltip":"El acceso Pro sigue disponible durante un período de gracia relacionado con la facturación.","settings.license.detail.graceBilling":"El acceso Pro sigue disponible durante el período de gracia de facturación.","settings.license.detail.graceProviderUnavailable":"Proveedor no disponible. El acceso Pro sigue activo en modo de gracia.","settings.license.detail.manualActivation":"Se requiere activación manual para restaurar el acceso Pro.","settings.license.detail.missingSessionToken":"La actualización está bloqueada porque falta el token de sesión actual.","settings.license.detail.refreshRecommended":"Pronto se debe actualizar la verificación de licencia.","connection.agents.kill":"Terminar","connection.agents.kill.title":"¿Terminar el agente?","connection.agents.killed":"Agente terminado","connection.agents.killFailed":"No se pudo terminar el agente","connection.agents.lastCommand":"Último comando","connection.agents.lastCommand.tooltip":"Llamada de herramienta más reciente ejecutada por este agente.","connection.agents.lastSeen":"Visto por última vez","connection.agents.lastSeen.tooltip":"Heartbeat o actividad más reciente de este agente.","connection.clear.title":"¿Borrar el registro de conexión?","connection.clear.message":"Esto elimina permanentemente el registro de conexión almacenado del proyecto actual.","sync.clear.title":"¿Borrar el registro de sincronización?","sync.clear.message":"Esto elimina permanentemente el registro de sincronización almacenado del place actual.","playtest.clear.title":"¿Borrar el historial de pruebas?","playtest.clear.message":"Esto elimina permanentemente los informes de playtest almacenados del place actual.","changelog.clear.title":"¿Borrar el changelog?","changelog.clear.message":"Esto elimina permanentemente el changelog almacenado del place actual.","sync.status.placePath":"Ruta del place","sync.status.placePath.tooltip":"Directorio del place activo donde se sincronizan los archivos del explorador.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Área representativa","changelog.card.verification":"Verificación","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Dirección de diseño del brief usada para este cambio.","uiStudio.history.row.designCheck.tooltip":"Resumen de sugerencias de Design Check después del cambio.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Sugerencias de Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Revisar de nuevo","uiStudio.actions.designCheckRunning":"Revisando sugerencias...","uiStudio.actions.designCheckRunningDetail":"Al finalizar se mostrarán los elementos para revisar primero, recomendados y opcionales.","uiStudio.actions.designCheckComplete":"Revisión de sugerencias completada","uiStudio.actions.designCheckNoSnapshotSaved":"Esta acción no guarda un nuevo archivo de captura.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Número de sugerencias para revisar primero. Haz clic para ver detalles.","uiStudio.gallery.priorityMediumBadge.tooltip":"Número de sugerencias recomendadas.","uiStudio.priorityMedium":"Revisión recomendada","uiStudio.mediumPrioritySection":"Revisión recomendada","uiStudio.gallery.priorityLowBadge.tooltip":"Número de mejoras opcionales."},Lf={"sidebar.overview":"Visão Geral","sidebar.changelog":"Histórico","sidebar.connection":"Conexão","sidebar.sync":"Sincronização","sidebar.playtest":"Teste","sidebar.tools":"Ferramentas","sidebar.settings":"Configurações","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"É necessária conexão com o servidor MCP.","sidebar.gate.l2":"É necessária conexão com o plugin do Roblox Studio.","header.currentProject":"Projeto atual","header.unknownProject":"Projeto desconhecido","header.projectRoot.label":"Project Root","header.currentProject.loading":"Carregando raiz do projeto...","header.currentProject.unavailable":"Raiz do projeto indisponível","header.placeNotConnected":"Place não conectado","header.currentProject.tooltip":"Pasta do projeto atualmente selecionada.","header.currentProject.loading.tooltip":"As informações da raiz do projeto ainda estão carregando.","header.currentProject.unavailable.tooltip":"As informações atuais da raiz do projeto estão indisponíveis.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Carregando sync root...","header.currentProjectSyncRoot.unavailable":"Sync root indisponível","header.currentProjectSyncRoot.tooltip":"Pasta sync root atual do projeto selecionado.","header.currentProjectSyncRoot.loading.tooltip":"As informações de sync root ainda estão carregando.","header.currentProjectSyncRoot.unavailable.tooltip":"As informações atuais de sync root estão indisponíveis.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"O caminho dos arquivos de teste está indisponível.","header.testFiles.tooltip":"Diretório atual dos arquivos de playtest para o place selecionado.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Conexão do plugin necessária","header.places.liveRequired":"A conexão do plugin é necessária para ver o place ativo em tempo real.","header.place.tooltip":"Place do Roblox conectado.","header.placeNotConnected.tooltip":"Place não conectado","header.changeProjectRoot":"Alterar raiz do projeto","header.changeProjectRoot.ariaLabel":"Alterar raiz do projeto","header.changeProjectRoot.tooltip":"Altere a raiz atual do projeto.","header.changeProjectRoot.disabledTooltip.l0":"A conexão com o servidor MCP é necessária primeiro para alterar a raiz do projeto.","header.changeProjectRoot.disabledTooltip.loading":"As informações da raiz do projeto ainda estão carregando.","header.changeProjectRoot.disabledTooltip.unavailable":"As informações atuais da raiz do projeto estão indisponíveis.","header.projectRootModal.initial.title":"Alterar raiz do projeto","header.projectRootModal.initial.body.connected":"Depois que você escolher uma pasta de projeto, o MCP mudará para a nova raiz do projeto e o conteúdo atual do Studio será totalmente resincronizado para o novo destino <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Depois que você escolher uma pasta de projeto, o MCP mudará para a nova raiz do projeto e usará <selected project folder>/weppy-project-sync como o próximo destino de sync.","header.projectRootModal.initial.nextSyncRoot":"Novo destino de sync após a seleção","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"O sync atual é interrompido imediatamente.","header.projectRootModal.initial.warningFreshSync":"O conteúdo atual do Studio será usado para criar um fresh full sync no novo destino.","header.projectRootModal.initial.warningNoMove":"Pastas de sync antigas não são movidas automaticamente.","header.projectRootModal.initial.warningDeferredSync":"Se o Studio não estiver conectado, o full resync começará na próxima conexão do plugin.","header.projectRootModal.confirm.title":"Confirmar nova raiz do projeto","header.projectRootModal.confirm.body":"Revise a pasta selecionada antes de aplicar a mudança.","header.projectRootModal.confirm.projectRoot":"Pasta de projeto selecionada","header.projectRootModal.confirm.syncRoot":"Novo destino do sync","header.projectRootModal.confirm.warningNoMove":"Pastas de sync existentes não são movidas automaticamente.","header.projectRootModal.pick":"Escolher pasta","header.projectRootModal.apply":"Aplicar alteração","header.projectRootModal.cancel":"Cancelar","header.projectRootModal.error":"Não foi possível alterar a raiz do projeto.","status.online":"Online","status.offline":"Offline","status.idle":"Ocioso","status.syncing":"Sincronizando","status.error":"Erro","status.initializing":"Inicializando","level.l0.title":"Servidor desconectado","level.l0.message":"O WEPPY Dashboard está aberto mas o servidor MCP parou ou não está respondendo.","level.l1.title":"Servidor conectado","level.l1.hint":"Verifique: O Roblox Studio está aberto? O plugin está instalado?","level.l2.ok":"Studio conectado","tier.basic":"Basic","tier.basic.tooltip":"Tier Basic com o conjunto padrão de recursos do WEPPY Dashboard.","tier.pro":"Pro","tier.pro.tooltip":"Tier Pro com o conjunto completo de recursos do WEPPY Dashboard.","tier.mixed":"Misto","tier.upgrade":"Atualizar para Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Economize tokens de IA com Pro!","tier.comparison.comingSoon":"Comparação Basic vs Pro — em breve","tier.comparison.close":"Fechar","tier.comparison.detailTitle":"Catálogo detalhado de ferramentas","tier.comparison.description":"Descrição","tier.comparison.basic.core":"Fluxo MCP básico","tier.comparison.basic.core.item1":"Criar/editar scripts","tier.comparison.basic.core.item2":"Gerenciamento de instâncias","tier.comparison.basic.core.item3":"Controle de propriedades","tier.comparison.basic.core.item4":"Seleção e busca","tier.comparison.basic.core.item5":"Gerenciamento de tags","tier.comparison.basic.core.item6":"Controle de câmera","tier.comparison.basic.core.item7":"Monitoramento de logs","tier.comparison.basic.sync":"Sincronização (Basic)","tier.comparison.basic.sync.item1":"Sincronização unidirecional do Studio para local","tier.comparison.basic.sync.item2":"Aplicação manual como padrão","tier.comparison.pro.all":"Tudo do Basic, mais","tier.comparison.pro.sync":"Fluxo de sincronização avançado","tier.comparison.pro.sync.item1":"Direção de sincronização por tipo","tier.comparison.pro.sync.item2":"Modo de aplicação por tipo","tier.comparison.pro.sync.item3":"Sincronização bidirecional e reversa","tier.comparison.pro.sync.item4":"Sincronização completa, ressincronização e envio ao Studio","tier.comparison.pro.sync.item5":"Sincronização multi-lugar","tier.comparison.pro.playtest":"Controle de playtest","tier.comparison.pro.playtest.item1":"Reproduzir, parar, pausar e retomar","tier.comparison.pro.playtest.item2":"Inspeção do estado de playtest","tier.comparison.pro.playtest.item3":"Execução de testes automatizados","tier.comparison.pro.creation":"Fluxo de criação avançado","tier.comparison.pro.creation.item1":"Operações em massa","tier.comparison.pro.creation.item2":"Geração de terreno","tier.comparison.pro.creation.item3":"Busca e inserção de assets","tier.comparison.pro.creation.item4":"Raycast e análise espacial","tier.comparison.pro.creation.item5":"Controle de ambiente","tier.comparison.pro.ui":"Design de UI com IA (UI Studio)","tier.comparison.pro.ui.item1":"Planejar a UI a partir do pedido e do contexto atual do Studio","tier.comparison.pro.ui.item2":"Criar, atualizar ou remover menus, HUDs, botões e painéis","tier.comparison.pro.ui.item3":"Capturar a UI atual para revisão","tier.comparison.pro.ui.item4":"Revisar sugestões de toque, contraste e áreas seguras","tier.comparison.discount.label":"🎁 Insira este código no checkout do Gumroad para receber um desconto:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Válido até 30 de abril","tier.promo.discount.hint":"🎁 Use o código WEPPY-MCP no Gumroad · Válido até 30 de abril","tier.promo.discount.context":"🎁 Insira no Gumroad ao pagar:","tier.tool.query_instances.desc":"Consulta de instâncias, exploração de filhos/descendentes, info de classe, busca por nome e classe. Pro: árvore de arquivos, estrutura do projeto, busca por propriedade e tag.","tier.tool.mutate_instances.desc":"Criar, excluir, clonar, mover, renomear e pivotar instâncias. Pro: criação de árvores, criação/exclusão/duplicação em massa.","tier.tool.manage_properties.desc":"Consultar e definir propriedades, atributos e tags. Pro: valores calculados e relativos, consulta/definição em massa, modificação em massa de filhos.","tier.tool.manage_scripts.desc":"Ler, escrever, criar, excluir, editar linhas e buscar em scripts. Pro: substituição em massa entre scripts.","tier.tool.manage_ui.desc":"Somente Pro. Crie ou refine menus, HUDs, botões, labels e painéis de imagem com estilo de jogo; depois capture telas e revise sugestões.","tier.tool.manage_ui.action.design_brief":"Planejar direção da UI","tier.tool.manage_ui.action.create_tree":"Criar nova UI","tier.tool.manage_ui.action.update":"Atualizar UI existente","tier.tool.manage_ui.action.delete":"Remover UI","tier.tool.manage_ui.action.preview":"Capturar tela da UI","tier.tool.manage_ui.action.check":"Revisar sugestões de melhoria","tier.tool.manage_lighting.desc":"Somente Pro. Configuração de iluminação, atmosfera, céu, propriedades do terreno e hora do dia.","tier.tool.manage_selection.desc":"Consultar, definir e limpar seleção. Pro: contexto, detalhes, adicionar/remover itens, monitorar mudanças.","tier.tool.manage_camera.desc":"Info da câmera, focar por caminho ou coordenadas, visualização sugerida.","tier.tool.manage_tween.desc":"Somente Pro. Criar, reproduzir, pausar e cancelar tweens para animações suaves.","tier.tool.manage_audio.desc":"Somente Pro. Reproduzir, parar, pausar e retomar sons. Configurar listener de áudio.","tier.tool.manage_animation.desc":"Somente Pro. Carregar, reproduzir e parar animações. Consultar tracks de humanoide/controlador.","tier.tool.manage_physics.desc":"Somente Pro. Registrar grupos de colisão, configurar colisão entre grupos, listar grupos.","tier.tool.manage_effects.desc":"Somente Pro. Emitir partículas, limpar todas, alternar ativação de efeitos.","tier.tool.manage_terrain.desc":"Somente Pro. Preencher formas, limpar regiões, substituir materiais, gerenciar cores, ler/escrever voxels, geração procedural, suavização.","tier.tool.spatial_query.desc":"Somente Pro. Raycast, encontrar chão, verificar posicionamento, varredura de área, encontrar áreas planas e pontos de spawn, análise de caminhabilidade, mapa espacial, detecção de colisão.","tier.tool.manage_assets.desc":"Somente Pro. Inserir modelos, consultar info de assets, buscar na loja de criadores, inserir modelos/pacotes gratuitos, exportar.","tier.tool.manage_sync.desc":"Somente Pro. Estado de sincronização, configuração, histórico, direção, leitura/escrita de arquivos sincronizados.","tier.tool.workspace_state.desc":"Somente Pro. Sincronização completa, snapshot, mudanças recentes, info de viewport, metadados, gerenciamento de cache.","tier.tool.manage_logs.desc":"Consulta filtrada de logs, sondagem incremental, limpar buffer, consulta de erros recentes.","tier.tool.system_info.desc":"Estado de conexão, verificação de tier. Pro: info do lugar, lista de serviços, configurações do Studio, controle de playtest, testes automáticos.","tier.tool.manage_studio.desc":"Somente Pro. Alterna ajustes de visualização do editor do Studio, como preview de UI, para capturas e QA; altera a sessão do Studio, não objetos de UI do jogo.","tier.tool.batch_execute.desc":"Somente Pro. Executar múltiplos comandos em lote. Processamento sequencial com opção de continuar em caso de erro.","tier.tool.execute_luau.desc":"Somente Pro. Executar código Luau arbitrário no sandbox do Roblox Studio.","connection.server.title":"Status do servidor","connection.server.version":"Versão","connection.server.version.tooltip":"Versão instalada do servidor MCP.","connection.server.pid":"PID","connection.server.pid.tooltip":"Identificador de processo do sistema operacional.","connection.server.uptime":"Tempo ativo","connection.server.uptime.tooltip":"Tempo decorrido desde que o servidor MCP foi iniciado.","connection.server.session":"Sessão","connection.server.session.tooltip":"Identificador da sessão MCP atual.","connection.server.exec":"Executável","connection.server.exec.tooltip":"Caminho do executável usado para iniciar o servidor MCP.","connection.reconnect":"Reconectar","connection.checkSettings":"Verificar configurações","connection.agents.title":"Agentes IA","connection.agents.name":"Agente","connection.agents.cwd":"Diretório","connection.agents.cwd.tooltip":"Diretório de trabalho atual do agente de IA conectado.","connection.agents.projectRoot":"Raiz do Projeto","connection.agents.projectRoot.tooltip":"Caminho do projeto autoritativo para propriedade de sincronização","connection.agents.projectRoot.unresolved":"Não resolvido","connection.agents.connected":"Conectado","connection.agents.unknown":"Desconhecido","connection.agents.none":"Nenhum agente conectado","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"ID do cliente","connection.plugins.clientId.tooltip":"Identificador único do cliente do plugin para esta conexão do Studio.","connection.plugins.lastSeen":"Última vez","connection.plugins.lastSeen.tooltip":"Heartbeat mais recente recebido do plugin.","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Versão instalada do plugin reportada pelo Studio.","connection.plugins.none":"Nenhum plugin conectado","connection.log.title":"Log de conexão","connection.log.empty":"Nenhum evento","connection.time.secondsAgo":"s atrás","connection.time.minutesAgo":"min atrás","connection.time.hoursAgo":"h atrás","common.loading":"Carregando...","common.retry":"Tentar novamente","common.reconnecting":"Reconectando...","common.expand":"Expandir","common.collapse":"Recolher","tools.tab.history":"Histórico","tools.tab.statistics":"Estatísticas","tools.tab.failures":"Falhas","tools.col.time":"Hora","tools.col.time.tooltip":"Momento em que a execução da ferramenta foi registrada.","tools.col.toolAction":"Ferramenta.Ação","tools.col.toolAction.tooltip":"Nome da ferramenta e ação executada.","tools.col.duration":"Duração","tools.col.duration.tooltip":"Quanto tempo a ferramenta levou para terminar.","tools.col.status":"Status","tools.col.status.tooltip":"Resultado da execução registrada da ferramenta.","tools.col.tier":"Nível","tools.col.tier.tooltip":"Nível de licença exigido para a ferramenta ou ação.","tools.col.tierStats.tooltip":"Resumo Basic, Pro ou Mixed para esta linha de estatísticas da ferramenta.","tools.col.tool":"Ferramenta","tools.col.tool.tooltip":"Nome da ferramenta consolidada na tabela de estatísticas.","tools.col.calls":"Chamadas","tools.col.calls.tooltip":"Número total de chamadas registradas para esta ferramenta.","tools.col.ok":"OK","tools.col.ok.tooltip":"Número de execuções bem-sucedidas diretas.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Número de execuções que tiveram sucesso por fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Número de execuções bloqueadas sem fallback.","tools.col.err":"FALHOU","tools.col.err.tooltip":"Número de execuções que terminaram em falha.","tools.col.okRate":"% Sucesso","tools.col.okRate.tooltip":"Percentual de chamadas que terminaram com sucesso.","tools.col.avgTime":"Tempo médio","tools.col.avgTime.tooltip":"Tempo médio de execução entre as chamadas registradas.","tools.col.error":"Erro","tools.filter.tool":"Ferramenta","tools.filter.all":"Todos","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Esta entrada usou uma ferramenta ou ação exclusiva do Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"A ação Pro solicitada teve sucesso por meio de um fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"A ação Pro solicitada foi bloqueada e nenhum fallback foi executado.","tools.badge.err":"FALHOU","tools.badge.err.tooltip":"A execução da ferramenta falhou.","tools.status.ok":"OK","tools.status.ok.tooltip":"A execução da ferramenta terminou com sucesso.","tools.tier.mixed.tooltip":"Esta ferramenta inclui ações Basic e Pro.","tools.detail.params":"Parâmetros","tools.detail.params.tooltip":"Parâmetros de entrada enviados nesta execução da ferramenta.","tools.detail.result":"Resultado","tools.detail.result.tooltip":"Payload de resultado retornado por esta execução da ferramenta.","tools.detail.requestedCommand":"Comando enviado","tools.detail.executedCommand":"Comando executado","tools.detail.alternatives":"Alternativas","tools.detail.blockedMessage":"Motivo do bloqueio","tools.detail.noFallback":"Sem fallback","tools.detail.noFallback.value":"Nenhum fallback foi executado.","tools.detail.errorMessage":"Mensagem de erro","tools.clear.history.title":"Limpar histórico?","tools.clear.history.message":"Isso remove permanentemente o histórico de ferramentas do place atual.","tools.clear.statistics.title":"Limpar estatísticas?","tools.clear.statistics.message":"Isso redefine permanentemente as estatísticas de ferramentas do place atual.","tools.detail.error":"Erro","tools.page.prev":"Anterior","tools.page.prev.tooltip":"Ir para a página anterior do histórico de ferramentas.","tools.page.next":"Próximo","tools.page.next.tooltip":"Ir para a próxima página do histórico de ferramentas.","tools.empty.history":"Nenhuma entrada no histórico","tools.empty.stats":"Sem estatísticas","tools.empty.failures":"Sem falhas","tools.summary.total":"Total","tools.summary.calls":"chamadas","tools.summary.sessions":"Sessões","settings.license.title":"Licença","settings.license.title.tooltip":"Status atual da licença e nível de assinatura.","settings.license.status":"Status","settings.license.status.tooltip":"Estado atual de ativação da licença.","settings.license.tier":"Nível","settings.license.tier.tooltip":"Nível de assinatura atual para os recursos disponíveis do WEPPY Dashboard.","settings.license.key":"Chave","settings.license.key.tooltip":"Chave de licença mascarada atualmente carregada pelo servidor.","settings.license.keyValue.tooltip":"Chave de licença mascarada atualmente carregada pelo servidor.","settings.license.provider":"Provedor","settings.license.provider.tooltip":"Provedor de licença usado para validar esta chave.","settings.license.providerValue.tooltip":"Provedor de licença usado para validar esta chave.","settings.license.active":"Ativa","settings.license.active.tooltip":"Estado atual de ativação da licença.","settings.license.status.activeCancelPending.tooltip":"O cancelamento está pendente, mas o acesso Pro permanece ativo até o fim do ciclo de cobrança atual.","settings.license.inactive":"Inativa","settings.license.inactive.tooltip":"Estado atual de ativação da licença.","settings.license.expired":"Expirada","settings.license.expired.tooltip":"Estado atual de ativação da licença.","settings.license.unavailable":"Informações de licença indisponíveis","settings.license.detail.cancelPending":"O cancelamento foi agendado. O acesso Pro permanece ativo até o fim do ciclo de cobrança atual.","settings.license.reset":"Redefinir licença","settings.readOnly":"Somente leitura","settings.readOnly.tooltip":"Esta seção mostra valores que não podem ser editados pelo WEPPY Dashboard.","settings.unavailable":"Configurações indisponíveis","settings.general.title":"Configurações gerais","settings.general.title.tooltip":"Configurações quentes que são aplicadas imediatamente ao mudar.","settings.general.liveApply":"Aplicar ao vivo","settings.general.liveApply.tooltip":"As mudanças nesta seção são aplicadas imediatamente sem um botão separado de salvar.","settings.general.applied":"Aplicado","settings.general.logLevel":"Nível de log","settings.general.logLevel.tooltip":"Define quanto detalhe o WEPPY Dashboard escreve nos logs.","settings.general.localHistory":"Registro de histórico","settings.general.localHistory.tooltip":"Armazena o histórico local de execução de ferramentas para as telas de histórico do WEPPY Dashboard.","settings.general.localStatistics":"Coleta de estatísticas","settings.general.localStatistics.tooltip":"Agrega estatísticas locais de uso para os relatórios do WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Tempo limite","settings.general.requestTimeout.tooltip":"Tempo máximo que o WEPPY Dashboard espera uma ação antes de falhar.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"O tempo limite da ação é medido em milissegundos.","settings.cold.title":"Ambiente do servidor","settings.cold.title.tooltip":"Valores de ambiente do servidor somente leitura carregados na inicialização.","settings.cold.httpPort.tooltip":"Número da porta usada pelo servidor HTTP do WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Interface de host à qual o servidor HTTP do WEPPY Dashboard MCP se vincula.","settings.cold.dashboardAutoOpen.tooltip":"Controla se o WEPPY Dashboard abre automaticamente no navegador quando o servidor inicia.","settings.cold.dashboardAutoOpen.value.tooltip":"Comportamento atual de inicialização para abrir o WEPPY Dashboard no navegador.","settings.cold.hint":"Configure via variáveis de ambiente.","settings.language.title":"Idioma","settings.language.title.tooltip":"Escolha como o texto da interface do WEPPY Dashboard é localizado.","settings.language.dashboard":"Idioma do WEPPY Dashboard","settings.language.dashboard.tooltip":"Substitui o idioma do WEPPY Dashboard ou segue o idioma do sistema quando definido como Automático.","settings.language.auto":"Automático","overview.l0.title":"Servidor MCP desconectado","overview.l0.message":"O servidor MCP não está respondendo. O WEPPY Dashboard tentará reconectar automaticamente.","overview.l0.step1":"Verifique se o processo do servidor MCP está em execução","overview.l0.step2":"Reinicie o comando do servidor MCP se necessário","overview.l0.reconnecting":"Reconectando automaticamente a cada 3s...","overview.l0.reconnectBtn":"Reconectar","overview.l0.settingsBtn":"Verificar configurações","overview.l1.pluginGuide":"O plugin do Roblox Studio não está conectado","overview.l1.check1":"O Roblox Studio está aberto?","overview.l1.check2":"O WEPPY Plugin está instalado?","overview.l1.feedHint":"As alterações aparecerão aqui quando o plugin se conectar","overview.metric.server":"Servidor","overview.metric.server.tooltip":"Status de execução e processo do servidor MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Status de conexão e versão do plugin do Roblox Studio.","overview.metric.agent":"Agente","overview.metric.agent.tooltip":"Agentes de IA conectados e seu estado atual.","overview.metric.agent.instancesUnit":"instâncias","overview.metric.sync":"Sincronização","overview.metric.sync.tooltip":"Atividade atual de sincronização entre Studio e arquivos locais.","overview.metric.noAgent":"Sem agente","overview.meta.version":"Versão","overview.meta.version.tooltip":"Versão instalada do servidor MCP.","overview.meta.session":"Sessão","overview.meta.session.tooltip":"Identificador da sessão MCP atual.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Identificador de processo do sistema operacional.","overview.meta.uptime":"Tempo ativo","overview.meta.uptime.tooltip":"Tempo decorrido desde que o servidor MCP foi iniciado.","overview.feed.title":"Alterações recentes do jogo","overview.feed.empty":"Sem alterações recentes","overview.changelog.title":"Resumo de alterações da sessão","overview.changelog.entries":"Total","overview.changelog.scripts":"scripts","overview.changelog.instances":"instâncias","overview.changelog.properties":"propriedades","overview.changelog.assets":"assets","overview.tier.title":"Uso por nível","changelog.subtitle":"Histórico de alterações do jogo","changelog.filter.all":"Todos","changelog.filter.active":"Ativo","changelog.filter.completed":"Concluído","changelog.empty":"Nenhuma entrada no histórico","changelog.basic.limit.title":"A prévia Basic mostra apenas as 3 sessões mais recentes","changelog.basic.limit.body":"Faça upgrade para Pro para navegar pela linha do tempo completa do changelog deste place.","changelog.basic.metricLabel":"Changelog visível / Total","changelog.basic.visible":"visíveis","changelog.basic.total":"total","changelog.card.active":"Ativo","changelog.card.active.tooltip":"Esta sessão ainda está recebendo novas alterações do jogo.","changelog.card.completed":"Concluído","changelog.card.completed.tooltip":"Esta sessão terminou e não deve receber mais alterações.","changelog.card.bootstrapStatus":"Inicialização","changelog.card.bootstrapStatus.tooltip":"Esta sessão contém apenas o snapshot inicial de bootstrap da sincronização.","changelog.card.inProgress":"em andamento","changelog.card.noChanges":"Sem alterações ainda","changelog.card.noChanges.tooltip":"Ainda não foram extraídas alterações do jogo para esta sessão.","changelog.card.bootstrapSummary":"Snapshot de sincronização inicial","changelog.card.bootstrapSummary.tooltip":"As gravações da sincronização inicial de arquivos são condensadas em uma única linha de snapshot bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"scripts","changelog.card.scripts.tooltip":"Alterações de script feitas nesta sessão.","changelog.card.instances":"instâncias","changelog.card.instances.tooltip":"Alterações de criação, exclusão, movimentação ou clonagem de instâncias nesta sessão.","changelog.card.modified":"modificado","changelog.card.created":"criado","changelog.card.deleted":"excluído","changelog.card.moved":"movido","changelog.card.propertiesChanged":"propriedades alteradas","changelog.card.propertiesChanged.tooltip":"Alterações de valores de propriedades registradas para esta sessão.","changelog.card.lightingConfigured":"Iluminação configurada","changelog.card.lightingConfigured.tooltip":"A iluminação ou a atmosfera foram alteradas nesta sessão.","changelog.card.terrainConfigured":"Terreno configurado","changelog.card.terrainConfigured.tooltip":"Os dados ou as configurações de terreno foram alterados nesta sessão.","changelog.card.assetsInserted":"assets inseridos","changelog.card.assetsInserted.tooltip":"Assets inseridos no place durante esta sessão.","changelog.category.script":"Scripts","changelog.category.instance":"Instâncias","changelog.category.property":"Propriedades","changelog.category.lighting":"Iluminação","changelog.category.terrain":"Terreno","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Resumo de alterações","changelog.detail.changeSummary.tooltip":"Contagem de alterações do jogo extraídas e agrupadas por categoria nesta sessão.","changelog.detail.changeTimeline":"Linha do tempo","changelog.detail.changeTimeline.tooltip":"Lista cronológica das alterações do jogo extraídas para esta sessão.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Antes e depois","changelog.detail.filterCategory":"Categoria","changelog.detail.filterCategory.tooltip":"Filtra a linha do tempo para uma única categoria de alteração.","changelog.detail.confidence.exact":"Exato","changelog.detail.confidence.exact.tooltip":"Os estados antes e depois desta alteração foram confirmados.","changelog.detail.confidence.partial":"Parcial","changelog.detail.confidence.partial.tooltip":"Apenas parte dos estados antes e depois desta alteração pôde ser confirmada.","changelog.detail.confidence.afterOnly":"Somente depois","changelog.detail.confidence.afterOnly.tooltip":"Apenas o estado resultante após a alteração pôde ser confirmado.","changelog.detail.confidence.intentOnly":"Somente intenção","changelog.detail.confidence.intentOnly.tooltip":"Apenas a ação solicitada foi registrada, não o estado resultante.","changelog.detail.confidence.unknown":"Desconhecido","changelog.detail.confidence.unknown.tooltip":"Não foi possível classificar esta alteração com confiança a partir dos dados disponíveis.","changelog.detail.noChanges":"Sem alterações nesta categoria","changelog.detail.backToList":"Voltar à lista","changelog.diff.empty":"Sem diferenças disponíveis","changelog.diff.unified":"Unificado","changelog.diff.sideBySide":"Lado a lado","changelog.diff.before":"Antes","changelog.diff.after":"Depois","sync.overlay.title":"Plugin do Roblox Studio necessário","sync.overlay.message":"O status de sincronização estará disponível quando o plugin do Roblox Studio se conectar.","sync.overlay.check1":"O Roblox Studio está aberto?","sync.overlay.check2":"O WEPPY Plugin está instalado?","sync.status.title":"Status de sincronização","sync.status.title.tooltip":"Status atual de sincronização entre o Studio e os arquivos locais deste place.","sync.status.forwardOnly":"Somente avanço","sync.status.forwardOnly.tooltip":"O tier Basic permite apenas sincronização direta do Studio para o local.","sync.status.place":"Place","sync.status.place.tooltip":"Nome e ID do place do Roblox atualmente conectado.","sync.status.path":"Caminho","sync.status.path.tooltip":"Raiz do sistema de arquivos local usada atualmente para a saída de sincronização.","sync.status.instances":"Instâncias","sync.status.instances.tooltip":"Total de instâncias do Roblox sincronizadas no espelho local.","sync.status.scripts":"Scripts","sync.status.scripts.tooltip":"Total de arquivos de script atualmente indexados para este place.","sync.status.state":"Estado","sync.status.state.tooltip":"Estado atual de execução da sincronização informado pelo servidor.","sync.directions.title":"Direções de sincronização","sync.directions.title.tooltip":"Direção e modo de aplicação por categoria entre Local e Studio.","sync.directions.type":"Tipo","sync.directions.type.tooltip":"Categoria de sincronização afetada por esta regra.","sync.directions.direction":"Direção","sync.directions.direction.tooltip":"Indica se cada categoria sincroniza do Studio, para o Studio ou nos dois sentidos.","sync.directions.applyMode":"Modo de aplicação","sync.directions.applyMode.tooltip":"Como as mudanças de sincronização recebidas são aplicadas nesta categoria.","sync.directions.cat.scripts":"Scripts","sync.directions.cat.values":"Valores","sync.directions.cat.containers":"Contêineres","sync.directions.cat.data":"Dados","sync.directions.cat.services":"Serviços","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"Os arquivos locais em disco sempre aparecem no lado esquerdo da régua de direção.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"O Roblox Studio sempre aparece no lado direito da régua de direção.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Aplica as mudanças de sincronização apenas quando você dispara manualmente.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Aplica as mudanças de sincronização automaticamente quando chegam atualizações.","sync.directions.tooltip.forward.body":"As mudanças do Studio sincronizam apenas para os arquivos locais","sync.directions.tooltip.bidirectional.body":"Sincronização de mão dupla entre Local e Studio","sync.directions.tooltip.reverse.body":"Envia mudanças dos arquivos locais para o Studio","sync.directions.tooltip.proRequired":"Pro é necessário no tier Basic","sync.directions.dir.forward":"adiante","sync.directions.dir.bidirectional":"bidirecional","sync.directions.dir.reverse":"reverso","sync.log.title":"Log de sincronização","sync.log.empty":"Sem eventos de sincronização","sync.log.type.write":"ESCREVER","sync.log.type.write.tooltip":"Uma nova saída de sincronização foi gravada no disco.","sync.log.type.update":"ATUALIZAR","sync.log.type.update.tooltip":"Um arquivo ou uma instância já sincronizada foi atualizada.","sync.log.type.delete":"EXCLUIR","sync.log.type.delete.tooltip":"Um arquivo ou uma instância sincronizada foi removida.","sync.log.type.idle":"OCIOSO","sync.log.type.idle.tooltip":"Um evento de sincronização foi registrado sem alterar arquivos.","sync.upgrade.title":"Desbloqueie sincronização completa com Pro","sync.upgrade.benefit1":"Sincronização bidirecional — edite arquivos, aplicação automática no Studio","sync.upgrade.benefit2":"Sincronização reversa — envie alterações de arquivos para o Studio","sync.upgrade.benefit3":"Histórico completo de sincronização e registro detalhado de alterações","sync.upgrade.buy":"Atualizar para Pro","playtest.status.title":"Status de teste","playtest.status.title.tooltip":"Estado atual da sessão de playtest do Roblox informado pelo Studio.","playtest.status.mode":"Modo","playtest.status.mode.tooltip":"Modo de inicialização do playtest do Studio para a sessão atual.","playtest.status.mode.value.tooltip":"Modo específico de playtest do Roblox Studio atualmente em uso.","playtest.status.mode.play":"Jogar","playtest.status.mode.run":"Executar","playtest.status.mode.server":"Servidor","playtest.status.mode.edit":"Editar","playtest.status.place.tooltip":"Place do Roblox atualmente associado a esta sessão de playtest.","playtest.status.state.running":"Executando","playtest.status.state.running.tooltip":"Uma sessão de playtest do Roblox está em execução no momento.","playtest.status.state.paused":"Pausado","playtest.status.state.paused.tooltip":"A sessão atual de playtest do Roblox está pausada.","playtest.status.state.notRunning":"Não está em execução","playtest.status.state.notRunning.tooltip":"Nenhuma sessão de playtest do Roblox está em execução no momento.","playtest.control.play":"Jogar","playtest.control.pause":"Pausar","playtest.control.resume":"Retomar","playtest.control.stop":"Parar","playtest.history.title":"Histórico de testes","playtest.history.title.tooltip":"Execuções automatizadas de playtest registradas para este projeto.","playtest.history.empty":"Sem resultados de teste","playtest.history.mode":"Modo","playtest.history.mode.tooltip":"Modo de playtest usado nesta execução de teste registrada.","playtest.history.status.passed":"Aprovado","playtest.history.status.failed":"Falhou","playtest.history.status.running":"Executando","playtest.history.status.unknown":"Desconhecido","playtest.history.status.tooltip":"Estado de resultado registrado para esta execução automatizada de playtest.","playtest.empty.title":"Sem resultados de teste ainda","playtest.empty.message":"Os resultados aparecerão aqui quando o agente IA executar testes automatizados via system_info.run_test.","playtest.empty.message.before":"Os resultados aparecerão aqui quando o agente IA executar testes automatizados por meio de","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"Ponto de automação do WEPPY Dashboard que executa verificações de playtest do Roblox por meio da ferramenta system_info.","playtest.report.title":"Relatório selecionado","playtest.report.title.tooltip":"Saída detalhada da execução automatizada de playtest atualmente selecionada.","playtest.report.content":"Relatório","playtest.report.content.tooltip":"Resumo em Markdown da execução automatizada de playtest selecionada.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Logs de execução capturados para a execução automatizada de playtest selecionada.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Sem conteúdo de relatório","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest é uma função exclusiva do Pro","playtest.basic.desc":"Controle os testes pelo WEPPY Dashboard, execute testes automatizados e visualize relatórios detalhados.","playtest.basic.benefit1":"Controles de jogar/pausar/parar com um clique","playtest.basic.benefit2":"Execução de testes automatizados via agente IA","playtest.basic.benefit3":"Histórico de testes com rastreamento de sucesso/falha","playtest.basic.benefit4":"Relatórios de teste detalhados em markdown","playtest.sample.badge":"Prévia da tela de playtest Pro","playtest.sample.title":"Você está vendo uma prévia da tela de playtest disponível após o upgrade para Pro.","playtest.sample.message":"Esta prévia usa dados de exemplo. Controle de playtest ao vivo, gerenciamento de histórico e relatórios reais são liberados com Pro.","playtest.sample.clearDisabled":"Faça upgrade para Pro para limpar o histórico real de playtest.","playtest.sample.place":"Prévia da Arena","playtest.sample.history.name":"Teste de fumaça da Arena de exemplo","playtest.sample.context.why":"Entrar na arena, sobreviver à abertura e verificar se o HUD responde imediatamente.","playtest.sample.context.expected":"O jogador surge com segurança, a contagem regressiva do HUD aparece em um segundo e a primeira onda começa sem erros.","playtest.sample.context.observed":"A proteção de spawn funcionou, o HUD atualizou no tempo certo e a primeira onda terminou sem regressões.","playtest.sample.report.markdown":`# Teste de fumaça da Arena de exemplo
100
100
 
101
101
  - Fluxo de spawn: PASS
102
102
  - Contagem do HUD: PASS
@@ -106,7 +106,7 @@ Isto é uma prévia de amostra. Faça upgrade para Pro para executar playtests a
106
106
  [sample] proteção de spawn ativa
107
107
  [sample] contagem do hud renderizada
108
108
  [sample] primeira onda concluída
109
- [sample] relatório de amostra finalizado`,"sidebar.whatsNew":"Novidades","sidebar.help.group":"Ajuda e feedback","sidebar.help.bug":"Reportar um bug","sidebar.help.bug.tooltip":"Abrir um relatório de bug no GitHub com dados do ambiente preenchidos","sidebar.help.feature":"Sugerir um recurso","sidebar.help.feature.tooltip":"Sugerir um novo recurso ou melhoria no GitHub","sidebar.help.discussions":"Comunidade","sidebar.help.discussions.tooltip":"Fazer perguntas e compartilhar ideias no GitHub Discussions","sidebar.help.troubleshooting":"Solução de problemas","sidebar.help.troubleshooting.tooltip":"Abrir o guia oficial de solução de problemas no weppyai.com","header.whatsNew":"Novidades","header.whatsNew.tooltip":"Novidades","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Novidades","whatsNew.pageSubtitle":"Fique por dentro das mudanças do MCP","whatsNew.unreadSection":"Não lidos","whatsNew.allSection":"Todos os anúncios","whatsNew.empty":"Nenhum anúncio ainda","whatsNew.newBadge":"NOVO","whatsNew.category.release":"Versão","whatsNew.category.notice":"Aviso","whatsNew.category.deprecation":"Descontinuado","whatsNew.category.tip":"Dica","uiStudio.title":"UI Studio","uiStudio.empty":"Ainda não há capturas de tela salvas. Elas são criadas automaticamente quando um agente de IA captura o estado atual da UI.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"O plugin do Roblox Studio não está conectado","uiStudio.pluginGuide.message":"O UI Studio mostra capturas de tela e histórico de alterações do place do Studio conectado. Ele será atualizado automaticamente quando o Studio e o WEPPY Plugin se conectarem.","uiStudio.pluginGuide.check1":"O Roblox Studio está em execução?","uiStudio.pluginGuide.check2":"O WEPPY Plugin está instalado e em execução?","uiStudio.pluginGuide.waiting":"Aguardando conexão do plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Revisar primeiro","uiStudio.priorityLow":"Melhoria opcional","uiStudio.highPrioritySection":"Revisar primeiro","uiStudio.lowPrioritySection":"Melhorias opcionais","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Análise","uiStudio.tabs.history":"Histórico","uiStudio.analysis.reportsTitle":"Última análise por destino de UI","uiStudio.analysis.recentCapturesTitle":"Capturas recentes","uiStudio.analysis.detailDialog":"Detalhes da análise","uiStudio.analysis.targetCountLabel":"Destinos analisados","uiStudio.analysis.captureLabel":"Capturas","uiStudio.analysis.verdict.hasSuggestions":"Sugestões de melhoria","uiStudio.analysis.verdict.needsFix":"Sugestões de melhoria","uiStudio.analysis.verdict.review":"Sugestões de melhoria","uiStudio.analysis.verdict.passed":"Sem sugestões atuais","uiStudio.analysis.verdictLabel":"Resumo de melhorias","uiStudio.analysis.thresholds":"Base de revisão","uiStudio.analysis.issueSummary.passed":"Não há sugestões adicionais com a base de revisão atual.","uiStudio.history.title":"Histórico de Alterações","uiStudio.history.empty":"Ainda não há histórico de alterações. Quando um agente de IA modificar a UI com manage_ui, será registrado automaticamente.","uiStudio.history.loading":"Carregando...","uiStudio.history.error":"Erro","uiStudio.history.clear":"Limpar tudo","uiStudio.history.filter.actions":"Tipo de ação","uiStudio.history.filter.actionAll":"Tudo","uiStudio.history.filter.actionCreate":"Criar","uiStudio.history.filter.actionUpdate":"Atualizar","uiStudio.history.filter.actionDelete":"Excluir","uiStudio.history.filter.period":"Período","uiStudio.history.filter.dateAll":"Tudo","uiStudio.history.filter.today":"Hoje","uiStudio.history.filter.yesterday":"Ontem","uiStudio.history.filter.last7Days":"Últimos 7 dias","uiStudio.history.filter.last30Days":"Últimos 30 dias","uiStudio.history.filter.customRange":"Intervalo personalizado","uiStudio.history.filter.reset":"Redefinir","uiStudio.history.filter.from":"De","uiStudio.history.filter.to":"Até","uiStudio.history.row.affectedPaths":"Caminhos","uiStudio.history.row.mutations":"Detalhes de alterações","uiStudio.history.row.expand":"▾ Expandir","uiStudio.history.row.collapse":"▲ Recolher","uiStudio.history.row.expandDetails":"Mostrar {n} alterações","uiStudio.history.row.collapseDetails":"Ocultar alterações","uiStudio.history.row.toggleDetails":"Alternar detalhes das alterações","uiStudio.history.row.mutationsEmpty":"Sem detalhes de alterações","uiStudio.history.row.toolLabel":"Alterações de UI ({n})","uiStudio.history.row.compare":"Antes / Depois","uiStudio.history.row.noBeforeState":"Sem estado anterior","uiStudio.history.row.noAfterState":"Sem estado posterior","uiStudio.history.row.qualityPlan":"Direção de design","uiStudio.history.row.designCheck":"Sugestões","uiStudio.history.row.designCheckUnavailable":"Sugestões: indisponível","uiStudio.history.row.designCheckNone":"Sugestões: nenhuma","uiStudio.history.selection.deleteSelected":"Excluir selecionados","uiStudio.history.selection.selectAll":"Selecionar tudo","uiStudio.history.selection.clearSelection":"Limpar seleção","uiStudio.history.confirm.deleteRequestsTitle":"Excluir registros de alterações","uiStudio.history.confirm.deleteRequestsMessage":"Os registros de alterações selecionados serão excluídos. Esta ação não pode ser desfeita.","uiStudio.history.confirm.clearRequestsTitle":"Limpar Histórico de Alterações","uiStudio.history.confirm.clearRequestsMessage":"Isso limpa o histórico de alterações do place atual. As instâncias do Studio não são afetadas.","uiStudio.history.confirm.cascadeOption":"Também excluir capturas vinculadas","uiStudio.history.drawer.close":"Fechar","uiStudio.actions.previewAgain":"Pré-visualizar Novamente","uiStudio.actions.deleteSnapshot":"Excluir Esta Captura de Tela","uiStudio.actions.proRequired":"Disponível após atualizar para o Pro","uiStudio.actions.captureCurrentState":"Capturar estado atual","uiStudio.actions.checkSuggestionsAgain":"Reverificar sugestões","uiStudio.actions.previewRunning":"Capturando…","uiStudio.actions.previewRunningDetail":"O ID do novo arquivo de captura de tela aparecerá ao finalizar.","uiStudio.actions.previewNeedsSaveCheck":"Captura concluída, verifique o salvamento","uiStudio.actions.previewSaved":"Nova captura de tela salva","uiStudio.actions.previewComplete":"Captura concluída","uiStudio.actions.previewSavedDetail":"As capturas existentes foram mantidas; esta foi salva como um novo arquivo.","uiStudio.actions.previewSavedPathMissing":"Um novo ID de captura foi retornado, mas o caminho do arquivo salvo não pôde ser confirmado.","uiStudio.actions.previewSnapshotIdMissing":"Não foi possível confirmar o novo ID da captura. Atualize a lista para verificar se ela foi salva.","uiStudio.actions.more":"Mais","uiStudio.gallery.selection.selectedCount":" selecionado(s)","uiStudio.confirm.deleteSnapshotTitle":"Excluir Captura de Tela","uiStudio.confirm.deleteSnapshotMessage":"Apenas este arquivo de captura de tela será excluído (a instância do Studio é preservada).","uiStudio.confirm.deleteBatchTitle":"Excluir Captura de Telas Selecionados","uiStudio.confirm.deleteBatchMessage":"As capturas de tela selecionadas serão excluídas. Esta ação não pode ser desfeita.","uiStudio.gallery.selectMode":"Selecionar","uiStudio.gallery.exitSelectMode":"Cancelar","uiStudio.gallery.selectAll":"Selecionar Tudo","uiStudio.gallery.clearSelection":"Limpar Seleção","uiStudio.gallery.deleteSelected":"Excluir Seleção","common.cancel":"Cancelar","common.delete":"Excluir","uiStudio.storage.title":"Dados salvos do UI Studio","uiStudio.storage.usageLabel":"Em uso","uiStudio.storage.historyBytes":"Histórico","uiStudio.storage.snapshotBytes":"Capturas de tela","uiStudio.storage.requestCount":"Registros de alterações","uiStudio.storage.mutationCount":"Detalhes de alterações","uiStudio.storage.snapshotCount":"Capturas de tela","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Última limpeza automática","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"liberado","uiStudio.storage.lastRunErrors":"Erros","uiStudio.storage.loading":"Carregando...","uiStudio.cleanup.policy.title":"Política de exclusão automática","uiStudio.cleanup.policy.modeOff":"Desativado","uiStudio.cleanup.policy.modeAge":"Por idade","uiStudio.cleanup.policy.modeSize":"Por tamanho","uiStudio.cleanup.policy.cascade":"Também excluir capturas de tela vinculadas","uiStudio.cleanup.policy.save":"Salvar política","uiStudio.cleanup.policy.runNow":"Executar agora","uiStudio.cleanup.policy.proRequired":"Disponível após atualizar para Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmar política","uiStudio.cleanup.policy.confirm.messageStrict":"Ao aplicar esta política serão excluídos imediatamente","uiStudio.cleanup.policy.confirm.requests":" registros de alterações","uiStudio.cleanup.policy.confirm.snapshots":" capturas de tela","uiStudio.cleanup.policy.confirm.freed":"liberado — Aplicar?","uiStudio.cleanup.keepLastNDays":"Manter últimos {n} dias","uiStudio.cleanup.selectedDelete":"Excluir seleção…","uiStudio.cleanup.deleteAll":"Excluir tudo…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmar limpeza","uiStudio.cleanup.cleanupConfirmMessage":"Os itens selecionados serão excluídos. Esta ação não pode ser desfeita.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Limpeza manual","uiStudio.cleanup.studioPreservedNote":"Esta ação exclui apenas os arquivos de histórico e capturas de tela no disco; as instâncias do Roblox Studio não são afetadas.","uiStudio.history.sample.bannerBadge":"Prévia do histórico de alterações Pro","uiStudio.history.sample.bannerTitle":"Prévia do histórico de alterações Pro","uiStudio.history.sample.bannerMessage":"Esta prévia usa dados de exemplo. O histórico real de alterações, a comparação antes/depois e a exclusão em lote são desbloqueados com o Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Atualize para Pro para desbloquear o histórico completo","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Servidor MCP conectado","toast.serverDisconnected":"Servidor MCP desconectado","toast.pluginConnected":"Plugin conectado","toast.pluginDisconnected":"Plugin desconectado","toast.clearSuccess":"Limpado com sucesso","toast.clearFailed":"Falha ao limpar os dados","common.clear":"Limpar","settings.license.activate":"Ativar licença","settings.license.refresh":"Atualizar licença","settings.license.keyInput":"Chave de licença","settings.license.disconnected":"Desconectado","settings.license.disconnected.tooltip":"Reconecte ao servidor MCP para gerenciar a licença pelo WEPPY Dashboard.","settings.license.live.tooltip":"As ações de licença são enviadas imediatamente ao servidor MCP.","settings.license.status.activationRequired":"Ativação necessária","settings.license.status.activationRequired.tooltip":"É necessária ativação manual da licença antes que o WEPPY Dashboard possa atualizar este status.","settings.license.status.grace":"Tolerância","settings.license.status.grace.tooltip":"A verificação do provedor está temporariamente indisponível, mas o acesso Pro permanece ativo durante o período de tolerância.","settings.license.status.graceBilling.tooltip":"O acesso Pro continua disponível durante um período de tolerância relacionado à cobrança.","settings.license.detail.graceBilling":"O acesso Pro continua disponível durante um período de tolerância de cobrança.","settings.license.detail.graceProviderUnavailable":"Provedor indisponível. O acesso Pro continua ativo no modo de tolerância.","settings.license.detail.manualActivation":"Ativação manual necessária para restaurar o acesso Pro.","settings.license.detail.missingSessionToken":"A atualização está bloqueada porque o token de sessão atual está ausente.","settings.license.detail.refreshRecommended":"A verificação de licença deve ser atualizada em breve.","connection.agents.kill":"Encerrar","connection.agents.kill.title":"Encerrar agente?","connection.agents.killed":"Agente encerrado","connection.agents.killFailed":"Falha ao encerrar o agente","connection.agents.lastCommand":"Último comando","connection.agents.lastCommand.tooltip":"Chamada de ferramenta mais recente executada por este agente.","connection.agents.lastSeen":"Visto por último","connection.agents.lastSeen.tooltip":"Heartbeat ou atividade mais recente deste agente.","connection.clear.title":"Limpar o log de conexão?","connection.clear.message":"Isso remove permanentemente o log de conexão armazenado do projeto atual.","sync.clear.title":"Limpar o log de sincronização?","sync.clear.message":"Isso remove permanentemente o log de sincronização armazenado do place atual.","playtest.clear.title":"Limpar o histórico de testes?","playtest.clear.message":"Isso remove permanentemente os relatórios de playtest armazenados do place atual.","changelog.clear.title":"Limpar o changelog?","changelog.clear.message":"Isso remove permanentemente o changelog armazenado do place atual.","sync.status.placePath":"Caminho do place","sync.status.placePath.tooltip":"Diretório do place ativo onde os arquivos do explorer são sincronizados.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Área representativa","changelog.card.verification":"Verificação","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Direção de design do briefing usada nesta alteração.","uiStudio.history.row.designCheck.tooltip":"Resumo das sugestões do Design Check após a alteração.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Sugestões do Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Verificar novamente","uiStudio.actions.designCheckRunning":"Verificando sugestões...","uiStudio.actions.designCheckRunningDetail":"Ao finalizar, serão exibidos itens para revisar primeiro, recomendados e opcionais.","uiStudio.actions.designCheckComplete":"Verificação de sugestões concluída","uiStudio.actions.designCheckNoSnapshotSaved":"Esta ação não salva um novo arquivo de captura de tela.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Número de sugestões para revisar primeiro. Clique para ver detalhes.","uiStudio.gallery.priorityMediumBadge.tooltip":"Número de sugestões recomendadas.","uiStudio.priorityMedium":"Revisão recomendada","uiStudio.mediumPrioritySection":"Revisão recomendada","uiStudio.gallery.priorityLowBadge.tooltip":"Número de melhorias opcionais."},Uf={"sidebar.overview":"概要","sidebar.changelog":"変更履歴","sidebar.connection":"接続","sidebar.sync":"同期","sidebar.playtest":"プレイテスト","sidebar.tools":"ツール","sidebar.settings":"設定","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP サーバーへの接続が必要です。","sidebar.gate.l2":"Roblox Studio プラグインへの接続が必要です。","header.currentProject":"現在のプロジェクト","header.unknownProject":"不明なプロジェクト","header.projectRoot.label":"Project Root","header.currentProject.loading":"プロジェクトルートを読み込み中...","header.currentProject.unavailable":"プロジェクトルートを読み込めません","header.placeNotConnected":"プレイス未接続","header.currentProject.tooltip":"現在選択されているプロジェクトフォルダです。","header.currentProject.loading.tooltip":"プロジェクトルート情報をまだ読み込み中です。","header.currentProject.unavailable.tooltip":"現在のプロジェクトルート情報を読み込めません。","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Sync root を読み込み中...","header.currentProjectSyncRoot.unavailable":"Sync root 情報を読み込めません","header.currentProjectSyncRoot.tooltip":"選択中のプロジェクトに対応する現在の sync root フォルダです。","header.currentProjectSyncRoot.loading.tooltip":"Sync root 情報をまだ読み込み中です。","header.currentProjectSyncRoot.unavailable.tooltip":"現在の sync root 情報を読み込めません。","header.testFiles.label":"Test Files","header.testFiles.unavailable":"テストファイルのパスを確認できません。","header.testFiles.tooltip":"選択した place の現在の playtest ファイルディレクトリです。","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"プラグイン接続が必要です","header.places.liveRequired":"現在の active place を確認するにはプラグイン接続が必要です。","header.place.tooltip":"接続中の Roblox プレイスです。","header.placeNotConnected.tooltip":"プレイス未接続","header.changeProjectRoot":"プロジェクトルートを変更","header.changeProjectRoot.ariaLabel":"プロジェクトルートを変更","header.changeProjectRoot.tooltip":"現在の project root を変更します。","header.changeProjectRoot.disabledTooltip.l0":"プロジェクトルートを変更するには、まず MCP サーバー接続が必要です。","header.changeProjectRoot.disabledTooltip.loading":"プロジェクトルート情報をまだ読み込み中です。","header.changeProjectRoot.disabledTooltip.unavailable":"現在のプロジェクトルート情報を読み込めません。","header.projectRootModal.initial.title":"プロジェクトルートを変更","header.projectRootModal.initial.body.connected":"プロジェクトフォルダを選択すると、MCP は新しい project root に切り替わり、現在の Studio 内容が新しい <selected project folder>/weppy-project-sync にフル再同期されます。","header.projectRootModal.initial.body.disconnected":"プロジェクトフォルダを選択すると、MCP は新しい project root に切り替わり、<selected project folder>/weppy-project-sync を次の sync 対象として使用します。","header.projectRootModal.initial.nextSyncRoot":"選択後の新しい sync 先","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"現在の sync は直ちに停止します。","header.projectRootModal.initial.warningFreshSync":"現在の Studio 内容を基準に、新しい対象へ fresh full sync が作成されます。","header.projectRootModal.initial.warningNoMove":"既存の sync フォルダは自動では移動されません。","header.projectRootModal.initial.warningDeferredSync":"Studio が未接続の場合、full resync は次回 plugin 接続時に開始されます。","header.projectRootModal.confirm.title":"新しいプロジェクトルートを確認","header.projectRootModal.confirm.body":"適用前に選択したプロジェクトフォルダを確認してください。","header.projectRootModal.confirm.projectRoot":"選択したプロジェクトフォルダ","header.projectRootModal.confirm.syncRoot":"新しい sync 先","header.projectRootModal.confirm.warningNoMove":"既存の sync フォルダは自動では移動されません。","header.projectRootModal.pick":"フォルダを選択","header.projectRootModal.apply":"変更を適用","header.projectRootModal.cancel":"キャンセル","header.projectRootModal.error":"プロジェクトルートを変更できませんでした。","status.online":"オンライン","status.offline":"オフライン","status.idle":"待機中","status.syncing":"同期中","status.error":"エラー","status.initializing":"初期化中","level.l0.title":"サーバー切断","level.l0.message":"WEPPY Dashboard は開いていますが、MCPサーバーが停止したか応答していません。","level.l1.title":"サーバー接続済み","level.l1.hint":"確認: Roblox Studioは実行中?プラグインはインストール済み?","level.l2.ok":"Studio接続済み","tier.basic":"Basic","tier.basic.tooltip":"標準のWEPPY Dashboard機能を提供するBasicティアです。","tier.pro":"Pro","tier.pro.tooltip":"すべてのWEPPY Dashboard機能を提供するProティアです。","tier.mixed":"混合","tier.upgrade":"Proにアップグレード","tier.compare":"Basic vs Pro","tier.banner.save":"ProでAIトークンを節約!","tier.comparison.comingSoon":"Basic vs Pro 比較 — 近日公開","tier.comparison.close":"閉じる","tier.comparison.detailTitle":"詳細ツールカタログ","tier.comparison.description":"説明","tier.comparison.basic.core":"基本MCPワークフロー","tier.comparison.basic.core.item1":"スクリプト作成・編集","tier.comparison.basic.core.item2":"インスタンス管理","tier.comparison.basic.core.item3":"プロパティ制御","tier.comparison.basic.core.item4":"選択と検索","tier.comparison.basic.core.item5":"タグ管理","tier.comparison.basic.core.item6":"カメラ制御","tier.comparison.basic.core.item7":"ログ監視","tier.comparison.basic.sync":"同期(Basic)","tier.comparison.basic.sync.item1":"Studioからローカルへの一方向同期","tier.comparison.basic.sync.item2":"手動適用がデフォルト","tier.comparison.pro.all":"Basicのすべてに加えて","tier.comparison.pro.sync":"高度な同期ワークフロー","tier.comparison.pro.sync.item1":"タイプ別同期方向","tier.comparison.pro.sync.item2":"タイプ別適用モード","tier.comparison.pro.sync.item3":"双方向・逆方向同期","tier.comparison.pro.sync.item4":"フル同期、再同期、Studioへプッシュ","tier.comparison.pro.sync.item5":"マルチプレイス同期","tier.comparison.pro.playtest":"プレイテスト制御","tier.comparison.pro.playtest.item1":"再生、停止、一時停止、再開","tier.comparison.pro.playtest.item2":"プレイテスト状態の検査","tier.comparison.pro.playtest.item3":"自動テスト実行","tier.comparison.pro.creation":"高度な作成ワークフロー","tier.comparison.pro.creation.item1":"一括操作","tier.comparison.pro.creation.item2":"テレイン生成","tier.comparison.pro.creation.item3":"アセット検索・挿入","tier.comparison.pro.creation.item4":"レイキャスト・空間分析","tier.comparison.pro.creation.item5":"環境制御","tier.comparison.pro.ui":"AI UIデザイン(UI Studio)","tier.comparison.pro.ui.item1":"design_brief — UI要件のガイド付き収集","tier.comparison.pro.ui.item2":"create_tree / update / delete — UI階層の作成・編集","tier.comparison.pro.ui.item3":"preview — 現在のUI画面をキャプチャ","tier.comparison.pro.ui.item4":"Design Check — タッチターゲット、コントラスト、セーフゾーンを検証","tier.comparison.discount.label":"🎁 Gumroad決済時にこのコードを入力すると割引が受けられます:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"4月30日まで有効","tier.promo.discount.hint":"🎁 GumroadでWEPPY-MCPコードを使用 · 4月30日まで","tier.promo.discount.context":"🎁 Gumroad決済時に入力:","tier.tool.query_instances.desc":"インスタンス照会、子孫探索、クラス情報、名前・クラス検索。Pro: ファイルツリー、プロジェクト構造、プロパティ・タグ検索。","tier.tool.mutate_instances.desc":"インスタンスの作成、削除、複製、移動、名前変更、ピボット。Pro: ツリー作成、一括作成・削除・複製。","tier.tool.manage_properties.desc":"プロパティ、属性、タグの取得・設定。Pro: 計算・相対値設定、一括取得・設定、子の一括変更。","tier.tool.manage_scripts.desc":"スクリプトソースの読取・書込・作成・削除・行編集・検索。Pro: スクリプト間一括置換。","tier.tool.manage_lighting.desc":"Pro専用。照明、大気、空、テレイン属性、時間帯の環境設定。","tier.tool.manage_selection.desc":"選択の取得、設定、解除。Pro: コンテキスト、詳細、項目の追加・削除、変更監視。","tier.tool.manage_camera.desc":"カメラ情報取得、パスまたは座標でフォーカス、推奨ビュー提案。","tier.tool.manage_tween.desc":"Pro専用。滑らかなアニメーションのためのトゥイーン作成、再生、一時停止、キャンセル。","tier.tool.manage_audio.desc":"Pro専用。サウンドの再生、停止、一時停止、再開。オーディオリスナー設定。","tier.tool.manage_animation.desc":"Pro専用。アニメーションのロード、再生、停止。ヒューマノイド・コントローラーのトラック照会。","tier.tool.manage_physics.desc":"Pro専用。物理衝突グループの登録、グループ間衝突設定、一覧照会。","tier.tool.manage_effects.desc":"Pro専用。パーティクル放出、全消去、エフェクト有効化トグル。","tier.tool.manage_terrain.desc":"Pro専用。図形充填、領域消去、マテリアル置換、色管理、ボクセル読書、手続き生成、スムージング。","tier.tool.spatial_query.desc":"Pro専用。レイキャスト、地面検索、配置確認、領域スキャン、平地・スポーン位置探索、歩行分析、空間マップ、衝突確認。","tier.tool.manage_assets.desc":"Pro専用。モデル挿入、アセット情報照会、クリエイターストア検索、無料モデル・パッケージ挿入、エクスポート。","tier.tool.manage_sync.desc":"Pro専用。同期状態、設定、履歴、方向設定、同期ファイル読書。","tier.tool.workspace_state.desc":"Pro専用。フル同期、スナップショット、最近の変更、ビューポート情報、メタデータ、キャッシュ管理。","tier.tool.manage_logs.desc":"出力ログのフィルタリング照会、増分ポーリング、バッファ消去、最近のエラー照会。","tier.tool.system_info.desc":"接続状態、使用ティア確認。Pro: プレイス情報、サービス一覧、Studio設定、プレイテスト制御、自動テスト。","tier.tool.batch_execute.desc":"Pro専用。複数コマンドを一括実行。順次処理、エラー時続行オプション。","tier.tool.execute_luau.desc":"Pro専用。Roblox Studioサンドボックスで任意のLuauコードを実行。","connection.server.title":"サーバーステータス","connection.server.version":"バージョン","connection.server.version.tooltip":"インストールされているMCPサーバーのバージョンです。","connection.server.pid":"PID","connection.server.pid.tooltip":"OSが使用するプロセス識別子です。","connection.server.uptime":"稼働時間","connection.server.uptime.tooltip":"MCPサーバーの起動後に経過した時間です。","connection.server.session":"セッション","connection.server.session.tooltip":"現在のMCPセッション識別子です。","connection.server.exec":"実行ファイル","connection.server.exec.tooltip":"MCPサーバーを起動した実行ファイルのパスです。","connection.reconnect":"再接続","connection.checkSettings":"設定を確認","connection.agents.title":"AIエージェント","connection.agents.name":"エージェント","connection.agents.cwd":"作業ディレクトリ","connection.agents.cwd.tooltip":"接続中のAIエージェントの現在の作業ディレクトリです。","connection.agents.projectRoot":"プロジェクトルート","connection.agents.projectRoot.tooltip":"同期オーナーシップの権威あるプロジェクトパス","connection.agents.projectRoot.unresolved":"未解決","connection.agents.connected":"接続時刻","connection.agents.unknown":"不明","connection.agents.none":"接続中のエージェントなし","connection.plugins.title":"プラグイン","connection.plugins.place":"プレイス","connection.plugins.clientId":"クライアントID","connection.plugins.clientId.tooltip":"このStudio接続を識別するプラグインクライアントIDです。","connection.plugins.lastSeen":"最終確認","connection.plugins.lastSeen.tooltip":"プラグインから最後に受信したハートビート時刻です。","connection.plugins.version":"バージョン","connection.plugins.version.tooltip":"Studioが報告したインストール済みプラグインのバージョンです。","connection.plugins.none":"接続中のプラグインなし","connection.log.title":"接続ログ","connection.log.empty":"イベントなし","connection.time.secondsAgo":"秒前","connection.time.minutesAgo":"分前","connection.time.hoursAgo":"時間前","common.loading":"読み込み中...","common.retry":"再試行","common.reconnecting":"再接続中...","common.expand":"展開","common.collapse":"折りたたむ","tools.tab.history":"履歴","tools.tab.statistics":"統計","tools.tab.failures":"失敗","tools.col.time":"時刻","tools.col.time.tooltip":"ツール実行が記録された時刻です。","tools.col.toolAction":"ツール.アクション","tools.col.toolAction.tooltip":"実行されたツール名とアクションです。","tools.col.duration":"所要時間","tools.col.duration.tooltip":"ツール完了までにかかった時間です。","tools.col.status":"ステータス","tools.col.status.tooltip":"記録されたツール実行の結果です。","tools.col.tier":"ティア","tools.col.tier.tooltip":"そのツールまたはアクションに必要なライセンスティアです。","tools.col.tierStats.tooltip":"ツール統計行がBasic、Pro、Mixedのどれに当たるかを示します。","tools.col.tool":"ツール","tools.col.tool.tooltip":"統計テーブルに表示される統合ツール名です。","tools.col.calls":"呼び出し数","tools.col.calls.tooltip":"このツールで記録された総呼び出し回数です。","tools.col.ok":"OK","tools.col.ok.tooltip":"直接成功した実行回数です。","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"fallback 実行で成功した回数です。","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"fallback なしでブロックされた実行回数です。","tools.col.err":"失敗","tools.col.err.tooltip":"失敗で終了した実行回数です。","tools.col.okRate":"成功率","tools.col.okRate.tooltip":"正常に完了した呼び出しの割合です。","tools.col.avgTime":"平均時間","tools.col.avgTime.tooltip":"記録された呼び出し全体の平均実行時間です。","tools.col.error":"エラー","tools.filter.tool":"ツール","tools.filter.all":"すべて","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"この項目はPro専用のツールまたはアクションを使用しました。","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"要求したProアクションがBasic fallbackで成功しました。","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"要求したProアクションはブロックされ、fallbackも実行されませんでした。","tools.badge.err":"失敗","tools.badge.err.tooltip":"ツール実行が失敗で終了しました。","tools.status.ok":"OK","tools.status.ok.tooltip":"ツール実行が正常に完了しました。","tools.tier.mixed.tooltip":"このツールにはBasicとProのアクションが両方含まれます。","tools.detail.params":"パラメータ","tools.detail.params.tooltip":"このツール実行に渡された入力パラメータです。","tools.detail.result":"結果","tools.detail.result.tooltip":"このツール実行から返された結果ペイロードです。","tools.detail.requestedCommand":"送信したコマンド","tools.detail.executedCommand":"実行コマンド","tools.detail.alternatives":"代替候補","tools.detail.blockedMessage":"ブロック理由","tools.detail.noFallback":"Fallback なし","tools.detail.noFallback.value":"実行された fallback はありません。","tools.detail.errorMessage":"エラーメッセージ","tools.clear.history.title":"履歴を削除しますか?","tools.clear.history.message":"現在の place のツール履歴を完全に削除します。","tools.clear.statistics.title":"統計を削除しますか?","tools.clear.statistics.message":"現在の place のツール統計を完全にリセットします。","tools.detail.error":"エラー","tools.page.prev":"前へ","tools.page.prev.tooltip":"ツール履歴の前のページへ移動します。","tools.page.next":"次へ","tools.page.next.tooltip":"ツール履歴の次のページへ移動します。","tools.empty.history":"履歴なし","tools.empty.stats":"ツール統計なし","tools.empty.failures":"失敗なし","tools.summary.total":"合計","tools.summary.calls":"呼び出し","tools.summary.sessions":"セッション","settings.license.title":"ライセンス","settings.license.title.tooltip":"現在のライセンス状態とサブスクリプションティアです。","settings.license.status":"ステータス","settings.license.status.tooltip":"現在のライセンス有効化状態です。","settings.license.tier":"ティア","settings.license.tier.tooltip":"利用できるWEPPY Dashboard機能を決める現在のサブスクリプションティアです。","settings.license.key":"キー","settings.license.key.tooltip":"現在サーバーに読み込まれているマスク済みライセンスキーです。","settings.license.keyValue.tooltip":"現在サーバーに読み込まれているマスク済みライセンスキーです。","settings.license.provider":"プロバイダー","settings.license.provider.tooltip":"このキーを検証するライセンスプロバイダーです。","settings.license.providerValue.tooltip":"このキーを検証するライセンスプロバイダーです。","settings.license.active":"有効","settings.license.active.tooltip":"現在のライセンス有効化状態です。","settings.license.status.activeCancelPending.tooltip":"解約は予約済みですが、現在の請求期間が終了するまでは Pro アクセスが維持されます。","settings.license.inactive":"無効","settings.license.inactive.tooltip":"現在のライセンス有効化状態です。","settings.license.expired":"期限切れ","settings.license.expired.tooltip":"現在のライセンス有効化状態です。","settings.license.unavailable":"ライセンス情報を取得できません","settings.license.detail.cancelPending":"解約が予約されました。現在の請求期間が終了するまでは Pro アクセスが維持されます。","settings.license.reset":"ライセンスをリセット","settings.readOnly":"読み取り専用","settings.readOnly.tooltip":"このセクションの値はWEPPY Dashboardから編集できません。","settings.unavailable":"設定を取得できません","settings.general.title":"一般設定","settings.general.title.tooltip":"変更すると即時反映されるHot設定です。","settings.general.liveApply":"即時反映","settings.general.liveApply.tooltip":"このセクションの変更は別の保存ボタンなしですぐ適用されます。","settings.general.applied":"適用済み","settings.general.logLevel":"ログレベル","settings.general.logLevel.tooltip":"WEPPY Dashboardログに出力する詳細度を設定します。","settings.general.localHistory":"ツール履歴記録","settings.general.localHistory.tooltip":"WEPPY Dashboard履歴画面用にローカルのツール実行履歴を保存します。","settings.general.localStatistics":"ツール統計収集","settings.general.localStatistics.tooltip":"WEPPY Dashboard表示用にローカル利用統計を集計します。","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"操作タイムアウト","settings.general.requestTimeout.tooltip":"操作を失敗扱いにするまでWEPPY Dashboardが待機する最大時間です。","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"操作タイムアウトの単位はミリ秒です。","settings.cold.title":"サーバー環境変数","settings.cold.title.tooltip":"サーバー起動時に読み込まれる読み取り専用の環境変数です。","settings.cold.httpPort.tooltip":"MCPWEPPY DashboardHTTPサーバーが使用するポート番号です。","settings.cold.httpHost.tooltip":"MCPWEPPY DashboardHTTPサーバーがバインドするホストインターフェースです。","settings.cold.dashboardAutoOpen.tooltip":"サーバー起動時にブラウザーでWEPPY Dashboardを自動で開くかどうかを制御します。","settings.cold.dashboardAutoOpen.value.tooltip":"ブラウザー自動起動の現在の起動動作です。","settings.cold.hint":"環境変数で設定してください。","settings.language.title":"言語","settings.language.title.tooltip":"WEPPY DashboardUIテキストの表示言語を選択します。","settings.language.dashboard":"WEPPY Dashboard言語","settings.language.dashboard.tooltip":"Autoではシステム言語を使い、それ以外では選択した言語を強制します。","settings.language.auto":"自動","overview.l0.title":"MCPサーバー切断","overview.l0.message":"MCPサーバーが応答していません。WEPPY Dashboardが自動的に再接続を試みます。","overview.l0.step1":"MCPサーバープロセスが実行中か確認してください","overview.l0.step2":"必要に応じてMCPサーバーコマンドを再起動してください","overview.l0.reconnecting":"3秒ごとに自動再接続中...","overview.l0.reconnectBtn":"再接続","overview.l0.settingsBtn":"設定を確認","overview.l1.pluginGuide":"Roblox Studioプラグインが接続されていません","overview.l1.check1":"Roblox Studioは実行中ですか?","overview.l1.check2":"WEPPY Pluginはインストール済みですか?","overview.l1.feedHint":"プラグインが接続されると変更がここに表示されます","overview.metric.server":"サーバー","overview.metric.server.tooltip":"MCPサーバーの実行状態とプロセス状態です。","overview.metric.plugin":"プラグイン","overview.metric.plugin.tooltip":"Roblox Studioプラグインの接続状態とバージョン情報です。","overview.metric.agent":"エージェント","overview.metric.agent.tooltip":"接続中のAIコーディングエージェントと現在の実行状態です。","overview.metric.agent.instancesUnit":"インスタンス","overview.metric.sync":"同期","overview.metric.sync.tooltip":"現在のStudioとローカルファイル間の同期状態です。","overview.metric.noAgent":"エージェントなし","overview.meta.version":"バージョン","overview.meta.version.tooltip":"インストールされているMCPサーバーのバージョンです。","overview.meta.session":"セッション","overview.meta.session.tooltip":"現在のMCPセッション識別子です。","overview.meta.pid":"PID","overview.meta.pid.tooltip":"OSが使用するプロセス識別子です。","overview.meta.uptime":"稼働時間","overview.meta.uptime.tooltip":"MCPサーバーの起動後に経過した時間です。","overview.feed.title":"最近のゲーム変更","overview.feed.empty":"最近の変更なし","overview.changelog.title":"セッション変更サマリー","overview.changelog.entries":"合計","overview.changelog.scripts":"スクリプト","overview.changelog.instances":"インスタンス","overview.changelog.properties":"プロパティ","overview.changelog.assets":"アセット","overview.tier.title":"ティア使用状況","changelog.subtitle":"ゲーム変更履歴","changelog.filter.all":"すべて","changelog.filter.active":"アクティブ","changelog.filter.completed":"完了","changelog.empty":"変更履歴がありません","changelog.basic.limit.title":"Basicプレビューでは最新3セッションのみ表示されます","changelog.basic.limit.body":"Proにアップグレードすると、このプレイスの完全な変更履歴タイムラインを確認できます。","changelog.basic.metricLabel":"表示中の変更履歴 / 全体","changelog.basic.visible":"表示中","changelog.basic.total":"全体","changelog.card.active":"アクティブ","changelog.card.active.tooltip":"このセッションはまだ新しいゲーム変更を受信しています。","changelog.card.completed":"完了","changelog.card.completed.tooltip":"このセッションは終了しており、これ以上変更は追加されません。","changelog.card.bootstrapStatus":"初期化","changelog.card.bootstrapStatus.tooltip":"このセッションには初期同期ブートストラップのスナップショットのみが含まれます。","changelog.card.inProgress":"進行中","changelog.card.noChanges":"変更なし","changelog.card.noChanges.tooltip":"このセッションではまだ抽出されたゲーム変更がありません。","changelog.card.bootstrapSummary":"初期同期スナップショット","changelog.card.bootstrapSummary.tooltip":"初期ファイル同期の書き込みは 1 件のブートストラップスナップショット行にまとめられます。","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"スクリプト","changelog.card.scripts.tooltip":"このセッションで発生したスクリプト変更です。","changelog.card.instances":"インスタンス","changelog.card.instances.tooltip":"このセッションで発生したインスタンスの作成、削除、移動、複製です。","changelog.card.modified":"変更","changelog.card.created":"作成","changelog.card.deleted":"削除","changelog.card.moved":"移動","changelog.card.propertiesChanged":"プロパティ変更","changelog.card.propertiesChanged.tooltip":"このセッションで記録されたプロパティ値の変更です。","changelog.card.lightingConfigured":"ライティング設定済み","changelog.card.lightingConfigured.tooltip":"このセッションでライティングまたは大気設定が変更されました。","changelog.card.terrainConfigured":"テレイン設定済み","changelog.card.terrainConfigured.tooltip":"このセッションでテレインデータまたはテレイン設定が変更されました。","changelog.card.assetsInserted":"アセット挿入","changelog.card.assetsInserted.tooltip":"このセッション中にプレイスへ挿入されたアセットです。","changelog.category.script":"スクリプト","changelog.category.instance":"インスタンス","changelog.category.property":"プロパティ","changelog.category.lighting":"ライティング","changelog.category.terrain":"テレイン","changelog.category.asset":"アセット","changelog.detail.changeSummary":"変更サマリー","changelog.detail.changeSummary.tooltip":"このセッションで抽出されたゲーム変更数をカテゴリ別に表示します。","changelog.detail.changeTimeline":"変更タイムライン","changelog.detail.changeTimeline.tooltip":"このセッションで抽出されたゲーム変更を時系列で表示します。","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"変更前後の比較","changelog.detail.filterCategory":"カテゴリ","changelog.detail.filterCategory.tooltip":"タイムラインを 1 つの変更カテゴリに絞り込みます。","changelog.detail.confidence.exact":"正確","changelog.detail.confidence.exact.tooltip":"この変更は変更前と変更後の状態が両方確認されています。","changelog.detail.confidence.partial":"部分確認","changelog.detail.confidence.partial.tooltip":"この変更は変更前後の状態の一部のみ確認されています。","changelog.detail.confidence.afterOnly":"結果のみ確認","changelog.detail.confidence.afterOnly.tooltip":"この変更は適用後の結果状態のみ確認されています。","changelog.detail.confidence.intentOnly":"意図のみ記録","changelog.detail.confidence.intentOnly.tooltip":"要求された操作意図のみが記録され、結果状態は確認されていません。","changelog.detail.confidence.unknown":"不明","changelog.detail.confidence.unknown.tooltip":"利用可能なデータだけではこの変更を確実に分類できませんでした。","changelog.detail.noChanges":"このカテゴリに変更なし","changelog.detail.backToList":"一覧に戻る","changelog.diff.empty":"差分なし","changelog.diff.unified":"統合","changelog.diff.sideBySide":"並列比較","changelog.diff.before":"変更前","changelog.diff.after":"変更後","sync.overlay.title":"Roblox Studioプラグインが必要です","sync.overlay.message":"Roblox Studioプラグインが接続されると同期状態を確認できます。","sync.overlay.check1":"Roblox Studioは実行中ですか?","sync.overlay.check2":"WEPPY Pluginはインストール済みですか?","sync.status.title":"同期ステータス","sync.status.title.tooltip":"このプレイスのStudioとローカルファイルの同期状態です。","sync.status.forwardOnly":"順方向のみ","sync.status.forwardOnly.tooltip":"BasicティアではStudioからローカルへの順方向同期のみ利用できます。","sync.status.place":"プレイス","sync.status.place.tooltip":"接続中のRobloxプレイス名とプレイスIDです。","sync.status.path":"パス","sync.status.path.tooltip":"現在同期出力に使っているローカルファイルシステムのルートです。","sync.status.instances":"インスタンス","sync.status.instances.tooltip":"ローカルミラーで追跡中の同期済みRobloxインスタンス総数です。","sync.status.scripts":"スクリプト","sync.status.scripts.tooltip":"このプレイスで現在インデックスされている同期スクリプトファイル数です。","sync.status.state":"状態","sync.status.state.tooltip":"サーバーが報告した現在の同期ランタイム状態です。","sync.directions.title":"同期方向","sync.directions.title.tooltip":"LocalとStudioの間のカテゴリ別同期方向と適用方法です。","sync.directions.type":"タイプ","sync.directions.type.tooltip":"このルールが適用される同期カテゴリです。","sync.directions.direction":"方向","sync.directions.direction.tooltip":"各カテゴリがStudioから、Studioへ、または双方向で同期されるかを示します。","sync.directions.applyMode":"適用モード","sync.directions.applyMode.tooltip":"このカテゴリに届く同期変更の適用方法です。","sync.directions.cat.scripts":"スクリプト","sync.directions.cat.values":"値","sync.directions.cat.containers":"コンテナ","sync.directions.cat.data":"データ","sync.directions.cat.services":"サービス","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"方向レールの左側は常にディスク上のローカルファイルです。","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"方向レールの右側は常にRoblox Studioです。","sync.directions.mode.manual":"手動","sync.directions.mode.manual.tooltip":"手動で実行したときだけ同期変更を適用します。","sync.directions.mode.auto":"自動","sync.directions.mode.auto.tooltip":"更新を受け取ると同期変更を自動で適用します。","sync.directions.tooltip.forward.body":"Studioの変更をローカルファイルのみに同期します","sync.directions.tooltip.bidirectional.body":"LocalとStudioの間で双方向同期を行います","sync.directions.tooltip.reverse.body":"ローカルファイルの変更をStudioへ反映します","sync.directions.tooltip.proRequired":"BasicティアではProが必要です","sync.directions.dir.forward":"順方向","sync.directions.dir.bidirectional":"双方向","sync.directions.dir.reverse":"逆方向","sync.log.title":"同期ログ","sync.log.empty":"同期イベントなし","sync.log.type.write":"書き込み","sync.log.type.write.tooltip":"新しい同期出力がディスクに書き込まれました。","sync.log.type.update":"更新","sync.log.type.update.tooltip":"既存の同期ファイルまたはインスタンスが更新されました。","sync.log.type.delete":"削除","sync.log.type.delete.tooltip":"同期済みファイルまたはインスタンスが削除されました。","sync.log.type.idle":"待機","sync.log.type.idle.tooltip":"ファイル変更なしで同期イベントのみ記録されました。","sync.upgrade.title":"Proで完全な同期機能を解放","sync.upgrade.benefit1":"双方向同期 — ファイルを編集するとStudioに自動反映","sync.upgrade.benefit2":"逆方向同期 — ファイルの変更をStudioに送信","sync.upgrade.benefit3":"完全な同期履歴と詳細な変更ログ","sync.upgrade.buy":"Proにアップグレード","playtest.status.title":"プレイテストステータス","playtest.status.title.tooltip":"Studio が報告した現在の Roblox プレイテストセッション状態です。","playtest.status.mode":"モード","playtest.status.mode.tooltip":"現在のセッションで使われている Studio プレイテスト起動モードです。","playtest.status.mode.value.tooltip":"現在使用中の Roblox Studio プレイテストモードの具体的な値です。","playtest.status.mode.play":"プレイ","playtest.status.mode.run":"実行","playtest.status.mode.server":"サーバー","playtest.status.mode.edit":"編集","playtest.status.place.tooltip":"このプレイテストセッションに関連付けられた Roblox プレイスです。","playtest.status.state.running":"実行中","playtest.status.state.running.tooltip":"現在 Roblox プレイテストセッションが実行中です。","playtest.status.state.paused":"一時停止","playtest.status.state.paused.tooltip":"現在の Roblox プレイテストセッションは一時停止中です。","playtest.status.state.notRunning":"未実行","playtest.status.state.notRunning.tooltip":"現在実行中の Roblox プレイテストセッションはありません。","playtest.control.play":"プレイ","playtest.control.pause":"一時停止","playtest.control.resume":"再開","playtest.control.stop":"停止","playtest.history.title":"テスト履歴","playtest.history.title.tooltip":"このプロジェクトで記録された自動プレイテスト実行履歴です。","playtest.history.empty":"テスト結果なし","playtest.history.mode":"モード","playtest.history.mode.tooltip":"この記録済みテスト実行で使われたプレイテストモードです。","playtest.history.status.passed":"成功","playtest.history.status.failed":"失敗","playtest.history.status.running":"実行中","playtest.history.status.unknown":"不明","playtest.history.status.tooltip":"この自動プレイテスト実行で記録された結果状態です。","playtest.empty.title":"プレイテスト結果がありません","playtest.empty.message":"AIエージェントがsystem_info.run_testで自動テストを実行すると結果が表示されます。","playtest.empty.message.before":"AIエージェントが自動テストを","playtest.empty.message.after":"で実行すると結果がここに表示されます。","playtest.empty.runTest.tooltip":"system_info ツール経由で Roblox プレイテスト検証を実行するWEPPY Dashboardの自動化入口です。","playtest.report.title":"選択されたレポート","playtest.report.title.tooltip":"現在選択されている自動プレイテスト実行の詳細出力です。","playtest.report.content":"レポート","playtest.report.content.tooltip":"選択された自動プレイテスト実行の Markdown 要約です。","playtest.report.logs":"ログ","playtest.report.logs.tooltip":"選択された自動プレイテスト実行で収集された実行ログです。","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"レポート内容なし","playtest.basic.icon":"🎮","playtest.basic.title":"プレイテストはPro専用機能です","playtest.basic.desc":"WEPPY Dashboardからプレイテストを制御し、自動テストを実行し、詳細なテストレポートを確認できます。","playtest.basic.benefit1":"ワンクリックのプレイ/一時停止/停止コントロール","playtest.basic.benefit2":"AIエージェントによる自動テスト実行","playtest.basic.benefit3":"成功/失敗追跡付きテスト履歴","playtest.basic.benefit4":"詳細なマークダウンテストレポート","playtest.sample.badge":"Proプレイテスト画面のプレビュー","playtest.sample.title":"現在表示しているのは、Proにアップグレード後に利用できるプレイテスト画面のプレビューです。","playtest.sample.message":"このプレビューはサンプルデータを使用しています。ライブのプレイテスト操作、履歴管理、実際のレポート保存はPro購入後に利用できます。","playtest.sample.clearDisabled":"実際のプレイテスト履歴の削除はProで利用できます。","playtest.sample.place":"アリーナプレビュー","playtest.sample.history.name":"サンプルアリーナスモークテスト","playtest.sample.context.why":"アリーナにスポーンし、開始直後を生き残り、HUDがすぐ反応するか確認します。","playtest.sample.context.expected":"プレイヤーが安全にスポーンし、1秒以内にカウントダウンUIが表示され、最初のウェーブがエラーなく始まること。","playtest.sample.context.observed":"スポーン保護が正常に動作し、HUDは時間どおり更新され、最初のウェーブは回帰なく完了しました。","playtest.sample.report.markdown":`# サンプルアリーナスモークテスト
109
+ [sample] relatório de amostra finalizado`,"sidebar.whatsNew":"Novidades","sidebar.help.group":"Ajuda e feedback","sidebar.help.bug":"Reportar um bug","sidebar.help.bug.tooltip":"Abrir um relatório de bug no GitHub com dados do ambiente preenchidos","sidebar.help.feature":"Sugerir um recurso","sidebar.help.feature.tooltip":"Sugerir um novo recurso ou melhoria no GitHub","sidebar.help.discussions":"Comunidade","sidebar.help.discussions.tooltip":"Fazer perguntas e compartilhar ideias no GitHub Discussions","sidebar.help.troubleshooting":"Solução de problemas","sidebar.help.troubleshooting.tooltip":"Abrir o guia oficial de solução de problemas no weppyai.com","header.whatsNew":"Novidades","header.whatsNew.tooltip":"Novidades","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Novidades","whatsNew.pageSubtitle":"Fique por dentro das mudanças do MCP","whatsNew.unreadSection":"Não lidos","whatsNew.allSection":"Todos os anúncios","whatsNew.empty":"Nenhum anúncio ainda","whatsNew.newBadge":"NOVO","whatsNew.category.release":"Versão","whatsNew.category.notice":"Aviso","whatsNew.category.deprecation":"Descontinuado","whatsNew.category.tip":"Dica","uiStudio.title":"UI Studio","uiStudio.empty":"Ainda não há capturas de tela salvas. Elas são criadas automaticamente quando um agente de IA captura o estado atual da UI.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"O plugin do Roblox Studio não está conectado","uiStudio.pluginGuide.message":"O UI Studio mostra capturas de tela e histórico de alterações do place do Studio conectado. Ele será atualizado automaticamente quando o Studio e o WEPPY Plugin se conectarem.","uiStudio.pluginGuide.check1":"O Roblox Studio está em execução?","uiStudio.pluginGuide.check2":"O WEPPY Plugin está instalado e em execução?","uiStudio.pluginGuide.waiting":"Aguardando conexão do plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Revisar primeiro","uiStudio.priorityLow":"Melhoria opcional","uiStudio.highPrioritySection":"Revisar primeiro","uiStudio.lowPrioritySection":"Melhorias opcionais","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Análise","uiStudio.tabs.history":"Histórico","uiStudio.analysis.reportsTitle":"Última análise por destino de UI","uiStudio.analysis.recentCapturesTitle":"Capturas recentes","uiStudio.analysis.detailDialog":"Detalhes da análise","uiStudio.analysis.targetCountLabel":"Destinos analisados","uiStudio.analysis.captureLabel":"Capturas","uiStudio.analysis.verdict.hasSuggestions":"Sugestões de melhoria","uiStudio.analysis.verdict.needsFix":"Sugestões de melhoria","uiStudio.analysis.verdict.review":"Sugestões de melhoria","uiStudio.analysis.verdict.passed":"Sem sugestões atuais","uiStudio.analysis.verdictLabel":"Resumo de melhorias","uiStudio.analysis.thresholds":"Base de revisão","uiStudio.analysis.issueSummary.passed":"Não há sugestões adicionais com a base de revisão atual.","uiStudio.history.title":"Histórico de Alterações","uiStudio.history.empty":"Ainda não há histórico de alterações. Quando um agente de IA modificar a UI com manage_ui, será registrado automaticamente.","uiStudio.history.loading":"Carregando...","uiStudio.history.error":"Erro","uiStudio.history.clear":"Limpar tudo","uiStudio.history.filter.actions":"Tipo de ação","uiStudio.history.filter.actionAll":"Tudo","uiStudio.history.filter.actionCreate":"Criar","uiStudio.history.filter.actionUpdate":"Atualizar","uiStudio.history.filter.actionDelete":"Excluir","uiStudio.history.filter.period":"Período","uiStudio.history.filter.dateAll":"Tudo","uiStudio.history.filter.today":"Hoje","uiStudio.history.filter.yesterday":"Ontem","uiStudio.history.filter.last7Days":"Últimos 7 dias","uiStudio.history.filter.last30Days":"Últimos 30 dias","uiStudio.history.filter.customRange":"Intervalo personalizado","uiStudio.history.filter.reset":"Redefinir","uiStudio.history.filter.from":"De","uiStudio.history.filter.to":"Até","uiStudio.history.row.affectedPaths":"Caminhos","uiStudio.history.row.mutations":"Detalhes de alterações","uiStudio.history.row.expand":"▾ Expandir","uiStudio.history.row.collapse":"▲ Recolher","uiStudio.history.row.expandDetails":"Mostrar {n} alterações","uiStudio.history.row.collapseDetails":"Ocultar alterações","uiStudio.history.row.toggleDetails":"Alternar detalhes das alterações","uiStudio.history.row.mutationsEmpty":"Sem detalhes de alterações","uiStudio.history.row.toolLabel":"Alterações de UI ({n})","uiStudio.history.row.compare":"Antes / Depois","uiStudio.history.row.noBeforeState":"Sem estado anterior","uiStudio.history.row.noAfterState":"Sem estado posterior","uiStudio.history.row.qualityPlan":"Direção de design","uiStudio.history.row.designCheck":"Sugestões","uiStudio.history.row.designCheckUnavailable":"Sugestões: indisponível","uiStudio.history.row.designCheckNone":"Sugestões: nenhuma","uiStudio.history.selection.deleteSelected":"Excluir selecionados","uiStudio.history.selection.selectAll":"Selecionar tudo","uiStudio.history.selection.clearSelection":"Limpar seleção","uiStudio.history.confirm.deleteRequestsTitle":"Excluir registros de alterações","uiStudio.history.confirm.deleteRequestsMessage":"Os registros de alterações selecionados serão excluídos. Esta ação não pode ser desfeita.","uiStudio.history.confirm.clearRequestsTitle":"Limpar Histórico de Alterações","uiStudio.history.confirm.clearRequestsMessage":"Isso limpa o histórico de alterações do place atual. As instâncias do Studio não são afetadas.","uiStudio.history.confirm.cascadeOption":"Também excluir capturas vinculadas","uiStudio.history.drawer.close":"Fechar","uiStudio.actions.previewAgain":"Pré-visualizar Novamente","uiStudio.actions.deleteSnapshot":"Excluir Esta Captura de Tela","uiStudio.actions.proRequired":"Disponível após atualizar para o Pro","uiStudio.actions.captureCurrentState":"Capturar estado atual","uiStudio.actions.checkSuggestionsAgain":"Reverificar sugestões","uiStudio.actions.previewRunning":"Capturando…","uiStudio.actions.previewRunningDetail":"O ID do novo arquivo de captura de tela aparecerá ao finalizar.","uiStudio.actions.previewNeedsSaveCheck":"Captura concluída, verifique o salvamento","uiStudio.actions.previewSaved":"Nova captura de tela salva","uiStudio.actions.previewComplete":"Captura concluída","uiStudio.actions.previewSavedDetail":"As capturas existentes foram mantidas; esta foi salva como um novo arquivo.","uiStudio.actions.previewSavedPathMissing":"Um novo ID de captura foi retornado, mas o caminho do arquivo salvo não pôde ser confirmado.","uiStudio.actions.previewSnapshotIdMissing":"Não foi possível confirmar o novo ID da captura. Atualize a lista para verificar se ela foi salva.","uiStudio.actions.more":"Mais","uiStudio.gallery.selection.selectedCount":" selecionado(s)","uiStudio.confirm.deleteSnapshotTitle":"Excluir Captura de Tela","uiStudio.confirm.deleteSnapshotMessage":"Apenas este arquivo de captura de tela será excluído (a instância do Studio é preservada).","uiStudio.confirm.deleteBatchTitle":"Excluir Captura de Telas Selecionados","uiStudio.confirm.deleteBatchMessage":"As capturas de tela selecionadas serão excluídas. Esta ação não pode ser desfeita.","uiStudio.gallery.selectMode":"Selecionar","uiStudio.gallery.exitSelectMode":"Cancelar","uiStudio.gallery.selectAll":"Selecionar Tudo","uiStudio.gallery.clearSelection":"Limpar Seleção","uiStudio.gallery.deleteSelected":"Excluir Seleção","common.cancel":"Cancelar","common.delete":"Excluir","uiStudio.storage.title":"Dados salvos do UI Studio","uiStudio.storage.usageLabel":"Em uso","uiStudio.storage.historyBytes":"Histórico","uiStudio.storage.snapshotBytes":"Capturas de tela","uiStudio.storage.requestCount":"Registros de alterações","uiStudio.storage.mutationCount":"Detalhes de alterações","uiStudio.storage.snapshotCount":"Capturas de tela","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Última limpeza automática","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"liberado","uiStudio.storage.lastRunErrors":"Erros","uiStudio.storage.loading":"Carregando...","uiStudio.cleanup.policy.title":"Política de exclusão automática","uiStudio.cleanup.policy.modeOff":"Desativado","uiStudio.cleanup.policy.modeAge":"Por idade","uiStudio.cleanup.policy.modeSize":"Por tamanho","uiStudio.cleanup.policy.cascade":"Também excluir capturas de tela vinculadas","uiStudio.cleanup.policy.save":"Salvar política","uiStudio.cleanup.policy.runNow":"Executar agora","uiStudio.cleanup.policy.proRequired":"Disponível após atualizar para Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmar política","uiStudio.cleanup.policy.confirm.messageStrict":"Ao aplicar esta política serão excluídos imediatamente","uiStudio.cleanup.policy.confirm.requests":" registros de alterações","uiStudio.cleanup.policy.confirm.snapshots":" capturas de tela","uiStudio.cleanup.policy.confirm.freed":"liberado — Aplicar?","uiStudio.cleanup.keepLastNDays":"Manter últimos {n} dias","uiStudio.cleanup.selectedDelete":"Excluir seleção…","uiStudio.cleanup.deleteAll":"Excluir tudo…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmar limpeza","uiStudio.cleanup.cleanupConfirmMessage":"Os itens selecionados serão excluídos. Esta ação não pode ser desfeita.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Limpeza manual","uiStudio.cleanup.studioPreservedNote":"Esta ação exclui apenas os arquivos de histórico e capturas de tela no disco; as instâncias do Roblox Studio não são afetadas.","uiStudio.history.sample.bannerBadge":"Prévia do histórico de alterações Pro","uiStudio.history.sample.bannerTitle":"Prévia do histórico de alterações Pro","uiStudio.history.sample.bannerMessage":"Esta prévia usa dados de exemplo. O histórico real de alterações, a comparação antes/depois e a exclusão em lote são desbloqueados com o Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Atualize para Pro para desbloquear o histórico completo","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Servidor MCP conectado","toast.serverDisconnected":"Servidor MCP desconectado","toast.pluginConnected":"Plugin conectado","toast.pluginDisconnected":"Plugin desconectado","toast.clearSuccess":"Limpado com sucesso","toast.clearFailed":"Falha ao limpar os dados","common.clear":"Limpar","settings.license.activate":"Ativar licença","settings.license.refresh":"Atualizar licença","settings.license.keyInput":"Chave de licença","settings.license.disconnected":"Desconectado","settings.license.disconnected.tooltip":"Reconecte ao servidor MCP para gerenciar a licença pelo WEPPY Dashboard.","settings.license.live.tooltip":"As ações de licença são enviadas imediatamente ao servidor MCP.","settings.license.status.activationRequired":"Ativação necessária","settings.license.status.activationRequired.tooltip":"É necessária ativação manual da licença antes que o WEPPY Dashboard possa atualizar este status.","settings.license.status.grace":"Tolerância","settings.license.status.grace.tooltip":"A verificação do provedor está temporariamente indisponível, mas o acesso Pro permanece ativo durante o período de tolerância.","settings.license.status.graceBilling.tooltip":"O acesso Pro continua disponível durante um período de tolerância relacionado à cobrança.","settings.license.detail.graceBilling":"O acesso Pro continua disponível durante um período de tolerância de cobrança.","settings.license.detail.graceProviderUnavailable":"Provedor indisponível. O acesso Pro continua ativo no modo de tolerância.","settings.license.detail.manualActivation":"Ativação manual necessária para restaurar o acesso Pro.","settings.license.detail.missingSessionToken":"A atualização está bloqueada porque o token de sessão atual está ausente.","settings.license.detail.refreshRecommended":"A verificação de licença deve ser atualizada em breve.","connection.agents.kill":"Encerrar","connection.agents.kill.title":"Encerrar agente?","connection.agents.killed":"Agente encerrado","connection.agents.killFailed":"Falha ao encerrar o agente","connection.agents.lastCommand":"Último comando","connection.agents.lastCommand.tooltip":"Chamada de ferramenta mais recente executada por este agente.","connection.agents.lastSeen":"Visto por último","connection.agents.lastSeen.tooltip":"Heartbeat ou atividade mais recente deste agente.","connection.clear.title":"Limpar o log de conexão?","connection.clear.message":"Isso remove permanentemente o log de conexão armazenado do projeto atual.","sync.clear.title":"Limpar o log de sincronização?","sync.clear.message":"Isso remove permanentemente o log de sincronização armazenado do place atual.","playtest.clear.title":"Limpar o histórico de testes?","playtest.clear.message":"Isso remove permanentemente os relatórios de playtest armazenados do place atual.","changelog.clear.title":"Limpar o changelog?","changelog.clear.message":"Isso remove permanentemente o changelog armazenado do place atual.","sync.status.placePath":"Caminho do place","sync.status.placePath.tooltip":"Diretório do place ativo onde os arquivos do explorer são sincronizados.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Área representativa","changelog.card.verification":"Verificação","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Direção de design do briefing usada nesta alteração.","uiStudio.history.row.designCheck.tooltip":"Resumo das sugestões do Design Check após a alteração.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Sugestões do Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Verificar novamente","uiStudio.actions.designCheckRunning":"Verificando sugestões...","uiStudio.actions.designCheckRunningDetail":"Ao finalizar, serão exibidos itens para revisar primeiro, recomendados e opcionais.","uiStudio.actions.designCheckComplete":"Verificação de sugestões concluída","uiStudio.actions.designCheckNoSnapshotSaved":"Esta ação não salva um novo arquivo de captura de tela.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Número de sugestões para revisar primeiro. Clique para ver detalhes.","uiStudio.gallery.priorityMediumBadge.tooltip":"Número de sugestões recomendadas.","uiStudio.priorityMedium":"Revisão recomendada","uiStudio.mediumPrioritySection":"Revisão recomendada","uiStudio.gallery.priorityLowBadge.tooltip":"Número de melhorias opcionais."},Nf={"sidebar.overview":"概要","sidebar.changelog":"変更履歴","sidebar.connection":"接続","sidebar.sync":"同期","sidebar.playtest":"プレイテスト","sidebar.tools":"ツール","sidebar.settings":"設定","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP サーバーへの接続が必要です。","sidebar.gate.l2":"Roblox Studio プラグインへの接続が必要です。","header.currentProject":"現在のプロジェクト","header.unknownProject":"不明なプロジェクト","header.projectRoot.label":"Project Root","header.currentProject.loading":"プロジェクトルートを読み込み中...","header.currentProject.unavailable":"プロジェクトルートを読み込めません","header.placeNotConnected":"プレイス未接続","header.currentProject.tooltip":"現在選択されているプロジェクトフォルダです。","header.currentProject.loading.tooltip":"プロジェクトルート情報をまだ読み込み中です。","header.currentProject.unavailable.tooltip":"現在のプロジェクトルート情報を読み込めません。","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Sync root を読み込み中...","header.currentProjectSyncRoot.unavailable":"Sync root 情報を読み込めません","header.currentProjectSyncRoot.tooltip":"選択中のプロジェクトに対応する現在の sync root フォルダです。","header.currentProjectSyncRoot.loading.tooltip":"Sync root 情報をまだ読み込み中です。","header.currentProjectSyncRoot.unavailable.tooltip":"現在の sync root 情報を読み込めません。","header.testFiles.label":"Test Files","header.testFiles.unavailable":"テストファイルのパスを確認できません。","header.testFiles.tooltip":"選択した place の現在の playtest ファイルディレクトリです。","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"プラグイン接続が必要です","header.places.liveRequired":"現在の active place を確認するにはプラグイン接続が必要です。","header.place.tooltip":"接続中の Roblox プレイスです。","header.placeNotConnected.tooltip":"プレイス未接続","header.changeProjectRoot":"プロジェクトルートを変更","header.changeProjectRoot.ariaLabel":"プロジェクトルートを変更","header.changeProjectRoot.tooltip":"現在の project root を変更します。","header.changeProjectRoot.disabledTooltip.l0":"プロジェクトルートを変更するには、まず MCP サーバー接続が必要です。","header.changeProjectRoot.disabledTooltip.loading":"プロジェクトルート情報をまだ読み込み中です。","header.changeProjectRoot.disabledTooltip.unavailable":"現在のプロジェクトルート情報を読み込めません。","header.projectRootModal.initial.title":"プロジェクトルートを変更","header.projectRootModal.initial.body.connected":"プロジェクトフォルダを選択すると、MCP は新しい project root に切り替わり、現在の Studio 内容が新しい <selected project folder>/weppy-project-sync にフル再同期されます。","header.projectRootModal.initial.body.disconnected":"プロジェクトフォルダを選択すると、MCP は新しい project root に切り替わり、<selected project folder>/weppy-project-sync を次の sync 対象として使用します。","header.projectRootModal.initial.nextSyncRoot":"選択後の新しい sync 先","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"現在の sync は直ちに停止します。","header.projectRootModal.initial.warningFreshSync":"現在の Studio 内容を基準に、新しい対象へ fresh full sync が作成されます。","header.projectRootModal.initial.warningNoMove":"既存の sync フォルダは自動では移動されません。","header.projectRootModal.initial.warningDeferredSync":"Studio が未接続の場合、full resync は次回 plugin 接続時に開始されます。","header.projectRootModal.confirm.title":"新しいプロジェクトルートを確認","header.projectRootModal.confirm.body":"適用前に選択したプロジェクトフォルダを確認してください。","header.projectRootModal.confirm.projectRoot":"選択したプロジェクトフォルダ","header.projectRootModal.confirm.syncRoot":"新しい sync 先","header.projectRootModal.confirm.warningNoMove":"既存の sync フォルダは自動では移動されません。","header.projectRootModal.pick":"フォルダを選択","header.projectRootModal.apply":"変更を適用","header.projectRootModal.cancel":"キャンセル","header.projectRootModal.error":"プロジェクトルートを変更できませんでした。","status.online":"オンライン","status.offline":"オフライン","status.idle":"待機中","status.syncing":"同期中","status.error":"エラー","status.initializing":"初期化中","level.l0.title":"サーバー切断","level.l0.message":"WEPPY Dashboard は開いていますが、MCPサーバーが停止したか応答していません。","level.l1.title":"サーバー接続済み","level.l1.hint":"確認: Roblox Studioは実行中?プラグインはインストール済み?","level.l2.ok":"Studio接続済み","tier.basic":"Basic","tier.basic.tooltip":"標準のWEPPY Dashboard機能を提供するBasicティアです。","tier.pro":"Pro","tier.pro.tooltip":"すべてのWEPPY Dashboard機能を提供するProティアです。","tier.mixed":"混合","tier.upgrade":"Proにアップグレード","tier.compare":"Basic vs Pro","tier.banner.save":"ProでAIトークンを節約!","tier.comparison.comingSoon":"Basic vs Pro 比較 — 近日公開","tier.comparison.close":"閉じる","tier.comparison.detailTitle":"詳細ツールカタログ","tier.comparison.description":"説明","tier.comparison.basic.core":"基本MCPワークフロー","tier.comparison.basic.core.item1":"スクリプト作成・編集","tier.comparison.basic.core.item2":"インスタンス管理","tier.comparison.basic.core.item3":"プロパティ制御","tier.comparison.basic.core.item4":"選択と検索","tier.comparison.basic.core.item5":"タグ管理","tier.comparison.basic.core.item6":"カメラ制御","tier.comparison.basic.core.item7":"ログ監視","tier.comparison.basic.sync":"同期(Basic)","tier.comparison.basic.sync.item1":"Studioからローカルへの一方向同期","tier.comparison.basic.sync.item2":"手動適用がデフォルト","tier.comparison.pro.all":"Basicのすべてに加えて","tier.comparison.pro.sync":"高度な同期ワークフロー","tier.comparison.pro.sync.item1":"タイプ別同期方向","tier.comparison.pro.sync.item2":"タイプ別適用モード","tier.comparison.pro.sync.item3":"双方向・逆方向同期","tier.comparison.pro.sync.item4":"フル同期、再同期、Studioへプッシュ","tier.comparison.pro.sync.item5":"マルチプレイス同期","tier.comparison.pro.playtest":"プレイテスト制御","tier.comparison.pro.playtest.item1":"再生、停止、一時停止、再開","tier.comparison.pro.playtest.item2":"プレイテスト状態の検査","tier.comparison.pro.playtest.item3":"自動テスト実行","tier.comparison.pro.creation":"高度な作成ワークフロー","tier.comparison.pro.creation.item1":"一括操作","tier.comparison.pro.creation.item2":"テレイン生成","tier.comparison.pro.creation.item3":"アセット検索・挿入","tier.comparison.pro.creation.item4":"レイキャスト・空間分析","tier.comparison.pro.creation.item5":"環境制御","tier.comparison.pro.ui":"AI UIデザイン(UI Studio)","tier.comparison.pro.ui.item1":"リクエストとStudioの状態からUIの方向性を整理","tier.comparison.pro.ui.item2":"メニュー、HUD、ボタン、パネルを作成・更新・削除","tier.comparison.pro.ui.item3":"現在のUI画面をレビュー用にキャプチャ","tier.comparison.pro.ui.item4":"タッチ、コントラスト、セーフエリアの改善提案を確認","tier.comparison.discount.label":"🎁 Gumroad決済時にこのコードを入力すると割引が受けられます:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"4月30日まで有効","tier.promo.discount.hint":"🎁 GumroadでWEPPY-MCPコードを使用 · 4月30日まで","tier.promo.discount.context":"🎁 Gumroad決済時に入力:","tier.tool.query_instances.desc":"インスタンス照会、子孫探索、クラス情報、名前・クラス検索。Pro: ファイルツリー、プロジェクト構造、プロパティ・タグ検索。","tier.tool.mutate_instances.desc":"インスタンスの作成、削除、複製、移動、名前変更、ピボット。Pro: ツリー作成、一括作成・削除・複製。","tier.tool.manage_properties.desc":"プロパティ、属性、タグの取得・設定。Pro: 計算・相対値設定、一括取得・設定、子の一括変更。","tier.tool.manage_scripts.desc":"スクリプトソースの読取・書込・作成・削除・行編集・検索。Pro: スクリプト間一括置換。","tier.tool.manage_ui.desc":"Pro専用。ゲームらしいメニュー、HUD、ボタン、ラベル、画像パネルを作成・改善し、画面キャプチャと改善提案を確認します。","tier.tool.manage_ui.action.design_brief":"UIの方向性を整理","tier.tool.manage_ui.action.create_tree":"新しいUIを作成","tier.tool.manage_ui.action.update":"既存UIを更新","tier.tool.manage_ui.action.delete":"UIを削除","tier.tool.manage_ui.action.preview":"UI画面をキャプチャ","tier.tool.manage_ui.action.check":"改善提案を確認","tier.tool.manage_lighting.desc":"Pro専用。照明、大気、空、テレイン属性、時間帯の環境設定。","tier.tool.manage_selection.desc":"選択の取得、設定、解除。Pro: コンテキスト、詳細、項目の追加・削除、変更監視。","tier.tool.manage_camera.desc":"カメラ情報取得、パスまたは座標でフォーカス、推奨ビュー提案。","tier.tool.manage_tween.desc":"Pro専用。滑らかなアニメーションのためのトゥイーン作成、再生、一時停止、キャンセル。","tier.tool.manage_audio.desc":"Pro専用。サウンドの再生、停止、一時停止、再開。オーディオリスナー設定。","tier.tool.manage_animation.desc":"Pro専用。アニメーションのロード、再生、停止。ヒューマノイド・コントローラーのトラック照会。","tier.tool.manage_physics.desc":"Pro専用。物理衝突グループの登録、グループ間衝突設定、一覧照会。","tier.tool.manage_effects.desc":"Pro専用。パーティクル放出、全消去、エフェクト有効化トグル。","tier.tool.manage_terrain.desc":"Pro専用。図形充填、領域消去、マテリアル置換、色管理、ボクセル読書、手続き生成、スムージング。","tier.tool.spatial_query.desc":"Pro専用。レイキャスト、地面検索、配置確認、領域スキャン、平地・スポーン位置探索、歩行分析、空間マップ、衝突確認。","tier.tool.manage_assets.desc":"Pro専用。モデル挿入、アセット情報照会、クリエイターストア検索、無料モデル・パッケージ挿入、エクスポート。","tier.tool.manage_sync.desc":"Pro専用。同期状態、設定、履歴、方向設定、同期ファイル読書。","tier.tool.workspace_state.desc":"Pro専用。フル同期、スナップショット、最近の変更、ビューポート情報、メタデータ、キャッシュ管理。","tier.tool.manage_logs.desc":"出力ログのフィルタリング照会、増分ポーリング、バッファ消去、最近のエラー照会。","tier.tool.system_info.desc":"接続状態、使用ティア確認。Pro: プレイス情報、サービス一覧、Studio設定、プレイテスト制御、自動テスト。","tier.tool.manage_studio.desc":"Pro専用。スクリーンショットやQAのためにUIプレビューなどStudioエディタの表示設定を切り替えます。ゲーム内UIオブジェクトは変更しません。","tier.tool.batch_execute.desc":"Pro専用。複数コマンドを一括実行。順次処理、エラー時続行オプション。","tier.tool.execute_luau.desc":"Pro専用。Roblox Studioサンドボックスで任意のLuauコードを実行。","connection.server.title":"サーバーステータス","connection.server.version":"バージョン","connection.server.version.tooltip":"インストールされているMCPサーバーのバージョンです。","connection.server.pid":"PID","connection.server.pid.tooltip":"OSが使用するプロセス識別子です。","connection.server.uptime":"稼働時間","connection.server.uptime.tooltip":"MCPサーバーの起動後に経過した時間です。","connection.server.session":"セッション","connection.server.session.tooltip":"現在のMCPセッション識別子です。","connection.server.exec":"実行ファイル","connection.server.exec.tooltip":"MCPサーバーを起動した実行ファイルのパスです。","connection.reconnect":"再接続","connection.checkSettings":"設定を確認","connection.agents.title":"AIエージェント","connection.agents.name":"エージェント","connection.agents.cwd":"作業ディレクトリ","connection.agents.cwd.tooltip":"接続中のAIエージェントの現在の作業ディレクトリです。","connection.agents.projectRoot":"プロジェクトルート","connection.agents.projectRoot.tooltip":"同期オーナーシップの権威あるプロジェクトパス","connection.agents.projectRoot.unresolved":"未解決","connection.agents.connected":"接続時刻","connection.agents.unknown":"不明","connection.agents.none":"接続中のエージェントなし","connection.plugins.title":"プラグイン","connection.plugins.place":"プレイス","connection.plugins.clientId":"クライアントID","connection.plugins.clientId.tooltip":"このStudio接続を識別するプラグインクライアントIDです。","connection.plugins.lastSeen":"最終確認","connection.plugins.lastSeen.tooltip":"プラグインから最後に受信したハートビート時刻です。","connection.plugins.version":"バージョン","connection.plugins.version.tooltip":"Studioが報告したインストール済みプラグインのバージョンです。","connection.plugins.none":"接続中のプラグインなし","connection.log.title":"接続ログ","connection.log.empty":"イベントなし","connection.time.secondsAgo":"秒前","connection.time.minutesAgo":"分前","connection.time.hoursAgo":"時間前","common.loading":"読み込み中...","common.retry":"再試行","common.reconnecting":"再接続中...","common.expand":"展開","common.collapse":"折りたたむ","tools.tab.history":"履歴","tools.tab.statistics":"統計","tools.tab.failures":"失敗","tools.col.time":"時刻","tools.col.time.tooltip":"ツール実行が記録された時刻です。","tools.col.toolAction":"ツール.アクション","tools.col.toolAction.tooltip":"実行されたツール名とアクションです。","tools.col.duration":"所要時間","tools.col.duration.tooltip":"ツール完了までにかかった時間です。","tools.col.status":"ステータス","tools.col.status.tooltip":"記録されたツール実行の結果です。","tools.col.tier":"ティア","tools.col.tier.tooltip":"そのツールまたはアクションに必要なライセンスティアです。","tools.col.tierStats.tooltip":"ツール統計行がBasic、Pro、Mixedのどれに当たるかを示します。","tools.col.tool":"ツール","tools.col.tool.tooltip":"統計テーブルに表示される統合ツール名です。","tools.col.calls":"呼び出し数","tools.col.calls.tooltip":"このツールで記録された総呼び出し回数です。","tools.col.ok":"OK","tools.col.ok.tooltip":"直接成功した実行回数です。","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"fallback 実行で成功した回数です。","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"fallback なしでブロックされた実行回数です。","tools.col.err":"失敗","tools.col.err.tooltip":"失敗で終了した実行回数です。","tools.col.okRate":"成功率","tools.col.okRate.tooltip":"正常に完了した呼び出しの割合です。","tools.col.avgTime":"平均時間","tools.col.avgTime.tooltip":"記録された呼び出し全体の平均実行時間です。","tools.col.error":"エラー","tools.filter.tool":"ツール","tools.filter.all":"すべて","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"この項目はPro専用のツールまたはアクションを使用しました。","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"要求したProアクションがBasic fallbackで成功しました。","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"要求したProアクションはブロックされ、fallbackも実行されませんでした。","tools.badge.err":"失敗","tools.badge.err.tooltip":"ツール実行が失敗で終了しました。","tools.status.ok":"OK","tools.status.ok.tooltip":"ツール実行が正常に完了しました。","tools.tier.mixed.tooltip":"このツールにはBasicとProのアクションが両方含まれます。","tools.detail.params":"パラメータ","tools.detail.params.tooltip":"このツール実行に渡された入力パラメータです。","tools.detail.result":"結果","tools.detail.result.tooltip":"このツール実行から返された結果ペイロードです。","tools.detail.requestedCommand":"送信したコマンド","tools.detail.executedCommand":"実行コマンド","tools.detail.alternatives":"代替候補","tools.detail.blockedMessage":"ブロック理由","tools.detail.noFallback":"Fallback なし","tools.detail.noFallback.value":"実行された fallback はありません。","tools.detail.errorMessage":"エラーメッセージ","tools.clear.history.title":"履歴を削除しますか?","tools.clear.history.message":"現在の place のツール履歴を完全に削除します。","tools.clear.statistics.title":"統計を削除しますか?","tools.clear.statistics.message":"現在の place のツール統計を完全にリセットします。","tools.detail.error":"エラー","tools.page.prev":"前へ","tools.page.prev.tooltip":"ツール履歴の前のページへ移動します。","tools.page.next":"次へ","tools.page.next.tooltip":"ツール履歴の次のページへ移動します。","tools.empty.history":"履歴なし","tools.empty.stats":"ツール統計なし","tools.empty.failures":"失敗なし","tools.summary.total":"合計","tools.summary.calls":"呼び出し","tools.summary.sessions":"セッション","settings.license.title":"ライセンス","settings.license.title.tooltip":"現在のライセンス状態とサブスクリプションティアです。","settings.license.status":"ステータス","settings.license.status.tooltip":"現在のライセンス有効化状態です。","settings.license.tier":"ティア","settings.license.tier.tooltip":"利用できるWEPPY Dashboard機能を決める現在のサブスクリプションティアです。","settings.license.key":"キー","settings.license.key.tooltip":"現在サーバーに読み込まれているマスク済みライセンスキーです。","settings.license.keyValue.tooltip":"現在サーバーに読み込まれているマスク済みライセンスキーです。","settings.license.provider":"プロバイダー","settings.license.provider.tooltip":"このキーを検証するライセンスプロバイダーです。","settings.license.providerValue.tooltip":"このキーを検証するライセンスプロバイダーです。","settings.license.active":"有効","settings.license.active.tooltip":"現在のライセンス有効化状態です。","settings.license.status.activeCancelPending.tooltip":"解約は予約済みですが、現在の請求期間が終了するまでは Pro アクセスが維持されます。","settings.license.inactive":"無効","settings.license.inactive.tooltip":"現在のライセンス有効化状態です。","settings.license.expired":"期限切れ","settings.license.expired.tooltip":"現在のライセンス有効化状態です。","settings.license.unavailable":"ライセンス情報を取得できません","settings.license.detail.cancelPending":"解約が予約されました。現在の請求期間が終了するまでは Pro アクセスが維持されます。","settings.license.reset":"ライセンスをリセット","settings.readOnly":"読み取り専用","settings.readOnly.tooltip":"このセクションの値はWEPPY Dashboardから編集できません。","settings.unavailable":"設定を取得できません","settings.general.title":"一般設定","settings.general.title.tooltip":"変更すると即時反映されるHot設定です。","settings.general.liveApply":"即時反映","settings.general.liveApply.tooltip":"このセクションの変更は別の保存ボタンなしですぐ適用されます。","settings.general.applied":"適用済み","settings.general.logLevel":"ログレベル","settings.general.logLevel.tooltip":"WEPPY Dashboardログに出力する詳細度を設定します。","settings.general.localHistory":"ツール履歴記録","settings.general.localHistory.tooltip":"WEPPY Dashboard履歴画面用にローカルのツール実行履歴を保存します。","settings.general.localStatistics":"ツール統計収集","settings.general.localStatistics.tooltip":"WEPPY Dashboard表示用にローカル利用統計を集計します。","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"操作タイムアウト","settings.general.requestTimeout.tooltip":"操作を失敗扱いにするまでWEPPY Dashboardが待機する最大時間です。","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"操作タイムアウトの単位はミリ秒です。","settings.cold.title":"サーバー環境変数","settings.cold.title.tooltip":"サーバー起動時に読み込まれる読み取り専用の環境変数です。","settings.cold.httpPort.tooltip":"MCPWEPPY DashboardHTTPサーバーが使用するポート番号です。","settings.cold.httpHost.tooltip":"MCPWEPPY DashboardHTTPサーバーがバインドするホストインターフェースです。","settings.cold.dashboardAutoOpen.tooltip":"サーバー起動時にブラウザーでWEPPY Dashboardを自動で開くかどうかを制御します。","settings.cold.dashboardAutoOpen.value.tooltip":"ブラウザー自動起動の現在の起動動作です。","settings.cold.hint":"環境変数で設定してください。","settings.language.title":"言語","settings.language.title.tooltip":"WEPPY DashboardUIテキストの表示言語を選択します。","settings.language.dashboard":"WEPPY Dashboard言語","settings.language.dashboard.tooltip":"Autoではシステム言語を使い、それ以外では選択した言語を強制します。","settings.language.auto":"自動","overview.l0.title":"MCPサーバー切断","overview.l0.message":"MCPサーバーが応答していません。WEPPY Dashboardが自動的に再接続を試みます。","overview.l0.step1":"MCPサーバープロセスが実行中か確認してください","overview.l0.step2":"必要に応じてMCPサーバーコマンドを再起動してください","overview.l0.reconnecting":"3秒ごとに自動再接続中...","overview.l0.reconnectBtn":"再接続","overview.l0.settingsBtn":"設定を確認","overview.l1.pluginGuide":"Roblox Studioプラグインが接続されていません","overview.l1.check1":"Roblox Studioは実行中ですか?","overview.l1.check2":"WEPPY Pluginはインストール済みですか?","overview.l1.feedHint":"プラグインが接続されると変更がここに表示されます","overview.metric.server":"サーバー","overview.metric.server.tooltip":"MCPサーバーの実行状態とプロセス状態です。","overview.metric.plugin":"プラグイン","overview.metric.plugin.tooltip":"Roblox Studioプラグインの接続状態とバージョン情報です。","overview.metric.agent":"エージェント","overview.metric.agent.tooltip":"接続中のAIコーディングエージェントと現在の実行状態です。","overview.metric.agent.instancesUnit":"インスタンス","overview.metric.sync":"同期","overview.metric.sync.tooltip":"現在のStudioとローカルファイル間の同期状態です。","overview.metric.noAgent":"エージェントなし","overview.meta.version":"バージョン","overview.meta.version.tooltip":"インストールされているMCPサーバーのバージョンです。","overview.meta.session":"セッション","overview.meta.session.tooltip":"現在のMCPセッション識別子です。","overview.meta.pid":"PID","overview.meta.pid.tooltip":"OSが使用するプロセス識別子です。","overview.meta.uptime":"稼働時間","overview.meta.uptime.tooltip":"MCPサーバーの起動後に経過した時間です。","overview.feed.title":"最近のゲーム変更","overview.feed.empty":"最近の変更なし","overview.changelog.title":"セッション変更サマリー","overview.changelog.entries":"合計","overview.changelog.scripts":"スクリプト","overview.changelog.instances":"インスタンス","overview.changelog.properties":"プロパティ","overview.changelog.assets":"アセット","overview.tier.title":"ティア使用状況","changelog.subtitle":"ゲーム変更履歴","changelog.filter.all":"すべて","changelog.filter.active":"アクティブ","changelog.filter.completed":"完了","changelog.empty":"変更履歴がありません","changelog.basic.limit.title":"Basicプレビューでは最新3セッションのみ表示されます","changelog.basic.limit.body":"Proにアップグレードすると、このプレイスの完全な変更履歴タイムラインを確認できます。","changelog.basic.metricLabel":"表示中の変更履歴 / 全体","changelog.basic.visible":"表示中","changelog.basic.total":"全体","changelog.card.active":"アクティブ","changelog.card.active.tooltip":"このセッションはまだ新しいゲーム変更を受信しています。","changelog.card.completed":"完了","changelog.card.completed.tooltip":"このセッションは終了しており、これ以上変更は追加されません。","changelog.card.bootstrapStatus":"初期化","changelog.card.bootstrapStatus.tooltip":"このセッションには初期同期ブートストラップのスナップショットのみが含まれます。","changelog.card.inProgress":"進行中","changelog.card.noChanges":"変更なし","changelog.card.noChanges.tooltip":"このセッションではまだ抽出されたゲーム変更がありません。","changelog.card.bootstrapSummary":"初期同期スナップショット","changelog.card.bootstrapSummary.tooltip":"初期ファイル同期の書き込みは 1 件のブートストラップスナップショット行にまとめられます。","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"スクリプト","changelog.card.scripts.tooltip":"このセッションで発生したスクリプト変更です。","changelog.card.instances":"インスタンス","changelog.card.instances.tooltip":"このセッションで発生したインスタンスの作成、削除、移動、複製です。","changelog.card.modified":"変更","changelog.card.created":"作成","changelog.card.deleted":"削除","changelog.card.moved":"移動","changelog.card.propertiesChanged":"プロパティ変更","changelog.card.propertiesChanged.tooltip":"このセッションで記録されたプロパティ値の変更です。","changelog.card.lightingConfigured":"ライティング設定済み","changelog.card.lightingConfigured.tooltip":"このセッションでライティングまたは大気設定が変更されました。","changelog.card.terrainConfigured":"テレイン設定済み","changelog.card.terrainConfigured.tooltip":"このセッションでテレインデータまたはテレイン設定が変更されました。","changelog.card.assetsInserted":"アセット挿入","changelog.card.assetsInserted.tooltip":"このセッション中にプレイスへ挿入されたアセットです。","changelog.category.script":"スクリプト","changelog.category.instance":"インスタンス","changelog.category.property":"プロパティ","changelog.category.lighting":"ライティング","changelog.category.terrain":"テレイン","changelog.category.asset":"アセット","changelog.detail.changeSummary":"変更サマリー","changelog.detail.changeSummary.tooltip":"このセッションで抽出されたゲーム変更数をカテゴリ別に表示します。","changelog.detail.changeTimeline":"変更タイムライン","changelog.detail.changeTimeline.tooltip":"このセッションで抽出されたゲーム変更を時系列で表示します。","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"変更前後の比較","changelog.detail.filterCategory":"カテゴリ","changelog.detail.filterCategory.tooltip":"タイムラインを 1 つの変更カテゴリに絞り込みます。","changelog.detail.confidence.exact":"正確","changelog.detail.confidence.exact.tooltip":"この変更は変更前と変更後の状態が両方確認されています。","changelog.detail.confidence.partial":"部分確認","changelog.detail.confidence.partial.tooltip":"この変更は変更前後の状態の一部のみ確認されています。","changelog.detail.confidence.afterOnly":"結果のみ確認","changelog.detail.confidence.afterOnly.tooltip":"この変更は適用後の結果状態のみ確認されています。","changelog.detail.confidence.intentOnly":"意図のみ記録","changelog.detail.confidence.intentOnly.tooltip":"要求された操作意図のみが記録され、結果状態は確認されていません。","changelog.detail.confidence.unknown":"不明","changelog.detail.confidence.unknown.tooltip":"利用可能なデータだけではこの変更を確実に分類できませんでした。","changelog.detail.noChanges":"このカテゴリに変更なし","changelog.detail.backToList":"一覧に戻る","changelog.diff.empty":"差分なし","changelog.diff.unified":"統合","changelog.diff.sideBySide":"並列比較","changelog.diff.before":"変更前","changelog.diff.after":"変更後","sync.overlay.title":"Roblox Studioプラグインが必要です","sync.overlay.message":"Roblox Studioプラグインが接続されると同期状態を確認できます。","sync.overlay.check1":"Roblox Studioは実行中ですか?","sync.overlay.check2":"WEPPY Pluginはインストール済みですか?","sync.status.title":"同期ステータス","sync.status.title.tooltip":"このプレイスのStudioとローカルファイルの同期状態です。","sync.status.forwardOnly":"順方向のみ","sync.status.forwardOnly.tooltip":"BasicティアではStudioからローカルへの順方向同期のみ利用できます。","sync.status.place":"プレイス","sync.status.place.tooltip":"接続中のRobloxプレイス名とプレイスIDです。","sync.status.path":"パス","sync.status.path.tooltip":"現在同期出力に使っているローカルファイルシステムのルートです。","sync.status.instances":"インスタンス","sync.status.instances.tooltip":"ローカルミラーで追跡中の同期済みRobloxインスタンス総数です。","sync.status.scripts":"スクリプト","sync.status.scripts.tooltip":"このプレイスで現在インデックスされている同期スクリプトファイル数です。","sync.status.state":"状態","sync.status.state.tooltip":"サーバーが報告した現在の同期ランタイム状態です。","sync.directions.title":"同期方向","sync.directions.title.tooltip":"LocalとStudioの間のカテゴリ別同期方向と適用方法です。","sync.directions.type":"タイプ","sync.directions.type.tooltip":"このルールが適用される同期カテゴリです。","sync.directions.direction":"方向","sync.directions.direction.tooltip":"各カテゴリがStudioから、Studioへ、または双方向で同期されるかを示します。","sync.directions.applyMode":"適用モード","sync.directions.applyMode.tooltip":"このカテゴリに届く同期変更の適用方法です。","sync.directions.cat.scripts":"スクリプト","sync.directions.cat.values":"値","sync.directions.cat.containers":"コンテナ","sync.directions.cat.data":"データ","sync.directions.cat.services":"サービス","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"方向レールの左側は常にディスク上のローカルファイルです。","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"方向レールの右側は常にRoblox Studioです。","sync.directions.mode.manual":"手動","sync.directions.mode.manual.tooltip":"手動で実行したときだけ同期変更を適用します。","sync.directions.mode.auto":"自動","sync.directions.mode.auto.tooltip":"更新を受け取ると同期変更を自動で適用します。","sync.directions.tooltip.forward.body":"Studioの変更をローカルファイルのみに同期します","sync.directions.tooltip.bidirectional.body":"LocalとStudioの間で双方向同期を行います","sync.directions.tooltip.reverse.body":"ローカルファイルの変更をStudioへ反映します","sync.directions.tooltip.proRequired":"BasicティアではProが必要です","sync.directions.dir.forward":"順方向","sync.directions.dir.bidirectional":"双方向","sync.directions.dir.reverse":"逆方向","sync.log.title":"同期ログ","sync.log.empty":"同期イベントなし","sync.log.type.write":"書き込み","sync.log.type.write.tooltip":"新しい同期出力がディスクに書き込まれました。","sync.log.type.update":"更新","sync.log.type.update.tooltip":"既存の同期ファイルまたはインスタンスが更新されました。","sync.log.type.delete":"削除","sync.log.type.delete.tooltip":"同期済みファイルまたはインスタンスが削除されました。","sync.log.type.idle":"待機","sync.log.type.idle.tooltip":"ファイル変更なしで同期イベントのみ記録されました。","sync.upgrade.title":"Proで完全な同期機能を解放","sync.upgrade.benefit1":"双方向同期 — ファイルを編集するとStudioに自動反映","sync.upgrade.benefit2":"逆方向同期 — ファイルの変更をStudioに送信","sync.upgrade.benefit3":"完全な同期履歴と詳細な変更ログ","sync.upgrade.buy":"Proにアップグレード","playtest.status.title":"プレイテストステータス","playtest.status.title.tooltip":"Studio が報告した現在の Roblox プレイテストセッション状態です。","playtest.status.mode":"モード","playtest.status.mode.tooltip":"現在のセッションで使われている Studio プレイテスト起動モードです。","playtest.status.mode.value.tooltip":"現在使用中の Roblox Studio プレイテストモードの具体的な値です。","playtest.status.mode.play":"プレイ","playtest.status.mode.run":"実行","playtest.status.mode.server":"サーバー","playtest.status.mode.edit":"編集","playtest.status.place.tooltip":"このプレイテストセッションに関連付けられた Roblox プレイスです。","playtest.status.state.running":"実行中","playtest.status.state.running.tooltip":"現在 Roblox プレイテストセッションが実行中です。","playtest.status.state.paused":"一時停止","playtest.status.state.paused.tooltip":"現在の Roblox プレイテストセッションは一時停止中です。","playtest.status.state.notRunning":"未実行","playtest.status.state.notRunning.tooltip":"現在実行中の Roblox プレイテストセッションはありません。","playtest.control.play":"プレイ","playtest.control.pause":"一時停止","playtest.control.resume":"再開","playtest.control.stop":"停止","playtest.history.title":"テスト履歴","playtest.history.title.tooltip":"このプロジェクトで記録された自動プレイテスト実行履歴です。","playtest.history.empty":"テスト結果なし","playtest.history.mode":"モード","playtest.history.mode.tooltip":"この記録済みテスト実行で使われたプレイテストモードです。","playtest.history.status.passed":"成功","playtest.history.status.failed":"失敗","playtest.history.status.running":"実行中","playtest.history.status.unknown":"不明","playtest.history.status.tooltip":"この自動プレイテスト実行で記録された結果状態です。","playtest.empty.title":"プレイテスト結果がありません","playtest.empty.message":"AIエージェントがsystem_info.run_testで自動テストを実行すると結果が表示されます。","playtest.empty.message.before":"AIエージェントが自動テストを","playtest.empty.message.after":"で実行すると結果がここに表示されます。","playtest.empty.runTest.tooltip":"system_info ツール経由で Roblox プレイテスト検証を実行するWEPPY Dashboardの自動化入口です。","playtest.report.title":"選択されたレポート","playtest.report.title.tooltip":"現在選択されている自動プレイテスト実行の詳細出力です。","playtest.report.content":"レポート","playtest.report.content.tooltip":"選択された自動プレイテスト実行の Markdown 要約です。","playtest.report.logs":"ログ","playtest.report.logs.tooltip":"選択された自動プレイテスト実行で収集された実行ログです。","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"レポート内容なし","playtest.basic.icon":"🎮","playtest.basic.title":"プレイテストはPro専用機能です","playtest.basic.desc":"WEPPY Dashboardからプレイテストを制御し、自動テストを実行し、詳細なテストレポートを確認できます。","playtest.basic.benefit1":"ワンクリックのプレイ/一時停止/停止コントロール","playtest.basic.benefit2":"AIエージェントによる自動テスト実行","playtest.basic.benefit3":"成功/失敗追跡付きテスト履歴","playtest.basic.benefit4":"詳細なマークダウンテストレポート","playtest.sample.badge":"Proプレイテスト画面のプレビュー","playtest.sample.title":"現在表示しているのは、Proにアップグレード後に利用できるプレイテスト画面のプレビューです。","playtest.sample.message":"このプレビューはサンプルデータを使用しています。ライブのプレイテスト操作、履歴管理、実際のレポート保存はPro購入後に利用できます。","playtest.sample.clearDisabled":"実際のプレイテスト履歴の削除はProで利用できます。","playtest.sample.place":"アリーナプレビュー","playtest.sample.history.name":"サンプルアリーナスモークテスト","playtest.sample.context.why":"アリーナにスポーンし、開始直後を生き残り、HUDがすぐ反応するか確認します。","playtest.sample.context.expected":"プレイヤーが安全にスポーンし、1秒以内にカウントダウンUIが表示され、最初のウェーブがエラーなく始まること。","playtest.sample.context.observed":"スポーン保護が正常に動作し、HUDは時間どおり更新され、最初のウェーブは回帰なく完了しました。","playtest.sample.report.markdown":`# サンプルアリーナスモークテスト
110
110
 
111
111
  - スポーンフロー: PASS
112
112
  - HUDカウントダウン: PASS
@@ -116,7 +116,7 @@ Isto é uma prévia de amostra. Faça upgrade para Pro para executar playtests a
116
116
  [sample] スポーン保護有効
117
117
  [sample] hudカウントダウン描画
118
118
  [sample] 第1ウェーブ完了
119
- [sample] プレビュー報告終了`,"sidebar.whatsNew":"新着情報","sidebar.help.group":"ヘルプとフィードバック","sidebar.help.bug":"バグを報告","sidebar.help.bug.tooltip":"環境情報を事前入力した状態で GitHub のバグ報告を開く","sidebar.help.feature":"機能を提案","sidebar.help.feature.tooltip":"GitHub で新機能や改善を提案する","sidebar.help.discussions":"コミュニティ","sidebar.help.discussions.tooltip":"GitHub Discussions で質問やアイデアを共有する","sidebar.help.troubleshooting":"トラブルシューティング","sidebar.help.troubleshooting.tooltip":"weppyai.com の公式トラブルシューティングガイドを開く","header.whatsNew":"新着情報","header.whatsNew.tooltip":"新着情報","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"新着情報","whatsNew.pageSubtitle":"MCPの最新変更をチェック","whatsNew.unreadSection":"未読","whatsNew.allSection":"すべてのお知らせ","whatsNew.empty":"お知らせはまだありません","whatsNew.newBadge":"NEW","whatsNew.category.release":"リリース","whatsNew.category.notice":"お知らせ","whatsNew.category.deprecation":"非推奨","whatsNew.category.tip":"ヒント","uiStudio.title":"UI Studio","uiStudio.empty":"保存されたスクリーンショットはまだありません。AIエージェントが現在のUI状態をキャプチャすると自動作成されます。","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio プラグインが接続されていません","uiStudio.pluginGuide.message":"UI Studio は、接続された Studio place のスクリーンショットと変更履歴を表示します。Studio と WEPPY Plugin が接続されると自動的に更新されます。","uiStudio.pluginGuide.check1":"Roblox Studio は起動していますか?","uiStudio.pluginGuide.check2":"WEPPY Plugin はインストールされ、実行されていますか?","uiStudio.pluginGuide.waiting":"プラグイン接続を待機中...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"優先確認","uiStudio.priorityLow":"任意改善","uiStudio.highPrioritySection":"優先確認","uiStudio.lowPrioritySection":"任意改善","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"分析","uiStudio.tabs.history":"変更履歴","uiStudio.analysis.reportsTitle":"UI 対象別の最新分析","uiStudio.analysis.recentCapturesTitle":"最近のキャプチャ","uiStudio.analysis.detailDialog":"分析詳細","uiStudio.analysis.targetCountLabel":"分析対象","uiStudio.analysis.captureLabel":"キャプチャ","uiStudio.analysis.verdict.hasSuggestions":"改善提案あり","uiStudio.analysis.verdict.needsFix":"改善提案あり","uiStudio.analysis.verdict.review":"改善提案あり","uiStudio.analysis.verdict.passed":"現在の改善提案なし","uiStudio.analysis.verdictLabel":"改善サマリー","uiStudio.analysis.thresholds":"レビュー基準","uiStudio.analysis.issueSummary.passed":"現在のレビュー基準では、追加の改善提案はありません。","uiStudio.history.title":"変更履歴","uiStudio.history.empty":"まだ変更履歴がありません。AIエージェントがmanage_uiでUIを変更すると自動的に記録されます。","uiStudio.history.loading":"読み込み中...","uiStudio.history.error":"エラー","uiStudio.history.clear":"すべて削除","uiStudio.history.filter.actions":"アクション種別","uiStudio.history.filter.actionAll":"すべて","uiStudio.history.filter.actionCreate":"作成","uiStudio.history.filter.actionUpdate":"更新","uiStudio.history.filter.actionDelete":"削除","uiStudio.history.filter.period":"期間","uiStudio.history.filter.dateAll":"すべて","uiStudio.history.filter.today":"今日","uiStudio.history.filter.yesterday":"昨日","uiStudio.history.filter.last7Days":"過去 7 日","uiStudio.history.filter.last30Days":"過去 30 日","uiStudio.history.filter.customRange":"範囲指定","uiStudio.history.filter.reset":"リセット","uiStudio.history.filter.from":"開始","uiStudio.history.filter.to":"終了","uiStudio.history.row.affectedPaths":"パス","uiStudio.history.row.mutations":"変更詳細","uiStudio.history.row.expand":"▾ 展開","uiStudio.history.row.collapse":"▲ 閉じる","uiStudio.history.row.expandDetails":"変更詳細 {n} 件","uiStudio.history.row.collapseDetails":"変更詳細を閉じる","uiStudio.history.row.toggleDetails":"変更詳細を切り替え","uiStudio.history.row.mutationsEmpty":"変更詳細なし","uiStudio.history.row.toolLabel":"UI変更({n}件)","uiStudio.history.row.compare":"前後比較","uiStudio.history.row.noBeforeState":"変更前なし","uiStudio.history.row.noAfterState":"変更後なし","uiStudio.history.row.qualityPlan":"デザイン方針","uiStudio.history.row.designCheck":"改善提案","uiStudio.history.row.designCheckUnavailable":"改善提案: 要約なし","uiStudio.history.row.designCheckNone":"改善提案: 現在なし","uiStudio.history.selection.deleteSelected":"選択を削除","uiStudio.history.selection.selectAll":"すべて選択","uiStudio.history.selection.clearSelection":"選択解除","uiStudio.history.confirm.deleteRequestsTitle":"変更記録を削除","uiStudio.history.confirm.deleteRequestsMessage":"選択した変更記録を削除します。この操作は元に戻せません。","uiStudio.history.confirm.clearRequestsTitle":"変更履歴を削除","uiStudio.history.confirm.clearRequestsMessage":"現在の place の変更履歴を削除します。Studio インスタンスには影響しません。","uiStudio.history.confirm.cascadeOption":"リンクされたスクリーンショットも削除","uiStudio.history.drawer.close":"閉じる","uiStudio.actions.previewAgain":"再プレビュー","uiStudio.actions.deleteSnapshot":"このスクリーンショットを削除","uiStudio.actions.proRequired":"Proにアップグレード後に利用可能","uiStudio.actions.captureCurrentState":"現在の状態をキャプチャ","uiStudio.actions.checkSuggestionsAgain":"提案を再確認","uiStudio.actions.previewRunning":"キャプチャ中…","uiStudio.actions.previewRunningDetail":"完了すると新しいスクリーンショットファイル ID が表示されます。","uiStudio.actions.previewNeedsSaveCheck":"キャプチャ完了、保存確認が必要","uiStudio.actions.previewSaved":"新しいスクリーンショットを保存しました","uiStudio.actions.previewComplete":"キャプチャ完了","uiStudio.actions.previewSavedDetail":"既存のスクリーンショットは変更せず、新しいファイルとして保存しました。","uiStudio.actions.previewSavedPathMissing":"新しいスクリーンショット ID は返されましたが、保存先パスを確認できませんでした。","uiStudio.actions.previewSnapshotIdMissing":"新しいスクリーンショット ID を確認できませんでした。リストを更新して保存状況を確認してください。","uiStudio.actions.more":"その他","uiStudio.gallery.selection.selectedCount":" 件選択中","uiStudio.confirm.deleteSnapshotTitle":"スクリーンショットを削除","uiStudio.confirm.deleteSnapshotMessage":"このスクリーンショットファイルのみ削除されます(Studioインスタンスは保持されます)。","uiStudio.confirm.deleteBatchTitle":"スクリーンショットを一括削除","uiStudio.confirm.deleteBatchMessage":"選択したスクリーンショットを削除します。この操作は元に戻せません。","uiStudio.gallery.selectMode":"選択","uiStudio.gallery.exitSelectMode":"キャンセル","uiStudio.gallery.selectAll":"すべて選択","uiStudio.gallery.clearSelection":"選択解除","uiStudio.gallery.deleteSelected":"選択削除","common.cancel":"キャンセル","common.delete":"削除","uiStudio.storage.title":"UI Studioの保存データ","uiStudio.storage.usageLabel":"使用中","uiStudio.storage.historyBytes":"履歴","uiStudio.storage.snapshotBytes":"スクリーンショット","uiStudio.storage.requestCount":"変更記録","uiStudio.storage.mutationCount":"変更詳細","uiStudio.storage.snapshotCount":"スクリーンショット","uiStudio.storage.countSuffix":"件","uiStudio.storage.lastRun":"最後の自動クリーンアップ","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"解放","uiStudio.storage.lastRunErrors":"エラー","uiStudio.storage.loading":"読み込み中...","uiStudio.cleanup.policy.title":"自動削除ポリシー","uiStudio.cleanup.policy.modeOff":"無効","uiStudio.cleanup.policy.modeAge":"期間ベース","uiStudio.cleanup.policy.modeSize":"サイズベース","uiStudio.cleanup.policy.cascade":"リンクされたスクリーンショットも削除","uiStudio.cleanup.policy.save":"ポリシーを保存","uiStudio.cleanup.policy.runNow":"今すぐ実行","uiStudio.cleanup.policy.proRequired":"Proにアップグレード後に利用可能","uiStudio.cleanup.policy.daysUnit":"日","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"ポリシーの確認","uiStudio.cleanup.policy.confirm.messageStrict":"このポリシーを適用すると直ちに削除されます","uiStudio.cleanup.policy.confirm.requests":" 件","uiStudio.cleanup.policy.confirm.snapshots":" スクリーンショット","uiStudio.cleanup.policy.confirm.freed":"解放 — 適用しますか?","uiStudio.cleanup.keepLastNDays":"直近{n}日間のみ保持","uiStudio.cleanup.selectedDelete":"選択削除…","uiStudio.cleanup.deleteAll":"全て削除…","uiStudio.cleanup.cleanupConfirmTitle":"クリーンアップの確認","uiStudio.cleanup.cleanupConfirmMessage":"選択したアイテムが削除されます。この操作は元に戻せません。","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"手動クリーンアップ","uiStudio.cleanup.studioPreservedNote":"この操作はディスク上の履歴・スクリーンショットファイルのみを削除します。Roblox Studio のインスタンスには影響しません。","uiStudio.history.sample.bannerBadge":"Pro 変更履歴プレビュー","uiStudio.history.sample.bannerTitle":"Pro変更履歴のプレビュー","uiStudio.history.sample.bannerMessage":"このプレビューはサンプルデータを使用しています。実際のリクエスト履歴、前後比較、一括削除はProでご利用いただけます。","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"全履歴はProにアップグレード後にご利用いただけます","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP サーバーに接続しました","toast.serverDisconnected":"MCP サーバーから切断されました","toast.pluginConnected":"プラグインに接続しました","toast.pluginDisconnected":"プラグインから切断されました","toast.clearSuccess":"削除しました","toast.clearFailed":"削除に失敗しました","common.clear":"クリア","settings.license.activate":"ライセンスを有効化","settings.license.refresh":"ライセンスを更新","settings.license.keyInput":"ライセンスキー","settings.license.disconnected":"切断","settings.license.disconnected.tooltip":"WEPPY Dashboard からライセンス操作を行うには、MCP サーバーに再接続してください。","settings.license.live.tooltip":"ライセンス操作は MCP サーバーに即時反映されます。","settings.license.status.activationRequired":"有効化が必要","settings.license.status.activationRequired.tooltip":"WEPPY Dashboard がこの状態を更新するには、ライセンスを手動で有効化する必要があります。","settings.license.status.grace":"猶予","settings.license.status.grace.tooltip":"プロバイダー検証が一時的に利用できませんが、猶予期間中は Pro アクセスが維持されます。","settings.license.status.graceBilling.tooltip":"請求関連の猶予期間中も Pro アクセスは利用できます。","settings.license.detail.graceBilling":"請求の猶予期間中も Pro アクセスは利用できます。","settings.license.detail.graceProviderUnavailable":"プロバイダーが利用できません。猶予モードの間も Pro アクセスは維持されます。","settings.license.detail.manualActivation":"Pro アクセスを復元するには手動での有効化が必要です。","settings.license.detail.missingSessionToken":"現在のセッショントークンが存在しないため、更新がブロックされています。","settings.license.detail.refreshRecommended":"ライセンス検証を近いうちに更新してください。","connection.agents.kill":"強制終了","connection.agents.kill.title":"エージェントを強制終了しますか?","connection.agents.killed":"エージェントを強制終了しました","connection.agents.killFailed":"エージェントの強制終了に失敗しました","connection.agents.lastCommand":"最終コマンド","connection.agents.lastCommand.tooltip":"このエージェントが最後に実行したツール呼び出しです。","connection.agents.lastSeen":"最終確認","connection.agents.lastSeen.tooltip":"このエージェントから最後に受信したハートビートまたは活動時刻です。","connection.clear.title":"接続ログをクリアしますか?","connection.clear.message":"現在のプロジェクトに保存された接続ログが完全に削除されます。","sync.clear.title":"同期ログをクリアしますか?","sync.clear.message":"現在のプレイスに保存された同期ログが完全に削除されます。","playtest.clear.title":"テスト履歴をクリアしますか?","playtest.clear.message":"現在のプレイスに保存されたプレイテストレポートが完全に削除されます。","changelog.clear.title":"変更ログをクリアしますか?","changelog.clear.message":"現在のプレイスに保存された変更ログが完全に削除されます。","sync.status.placePath":"プレイスパス","sync.status.placePath.tooltip":"Explorer ファイルが同期される現在のプレイスディレクトリです。","tier.progress.label":"Pro / 全体","changelog.card.representativeArea":"代表領域","changelog.card.verification":"検証","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"この変更で使用したブリーフのデザイン方針です。","uiStudio.history.row.designCheck.tooltip":"変更後のDesign Check改善提案の要約です。","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Design Check の提案","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"もう一度確認","uiStudio.actions.designCheckRunning":"提案を確認中...","uiStudio.actions.designCheckRunningDetail":"完了すると優先確認、確認推奨、任意改善の件数が表示されます。","uiStudio.actions.designCheckComplete":"提案の確認が完了しました","uiStudio.actions.designCheckNoSnapshotSaved":"この操作では新しいスクリーンショットファイルは保存されません。","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"優先確認する提案の数です。クリックして詳細を確認します。","uiStudio.gallery.priorityMediumBadge.tooltip":"確認推奨の提案数です。","uiStudio.priorityMedium":"確認推奨","uiStudio.mediumPrioritySection":"確認推奨","uiStudio.gallery.priorityLowBadge.tooltip":"任意改善の提案数です。"},Hf={"sidebar.overview":"Ringkasan","sidebar.changelog":"Riwayat","sidebar.connection":"Koneksi","sidebar.sync":"Sinkronisasi","sidebar.playtest":"Playtest","sidebar.tools":"Alat","sidebar.settings":"Pengaturan","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Koneksi server MCP diperlukan.","sidebar.gate.l2":"Koneksi plugin Roblox Studio diperlukan.","header.currentProject":"Proyek saat ini","header.unknownProject":"Proyek tidak dikenal","header.projectRoot.label":"Project Root","header.currentProject.loading":"Memuat project root...","header.currentProject.unavailable":"Project root tidak tersedia","header.placeNotConnected":"Place belum terhubung","header.currentProject.tooltip":"Folder proyek yang sedang dipilih.","header.currentProject.loading.tooltip":"Informasi project root masih dimuat.","header.currentProject.unavailable.tooltip":"Informasi project root saat ini tidak tersedia.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Memuat sync root...","header.currentProjectSyncRoot.unavailable":"Sync root tidak tersedia","header.currentProjectSyncRoot.tooltip":"Folder sync root saat ini untuk proyek yang dipilih.","header.currentProjectSyncRoot.loading.tooltip":"Informasi sync root masih dimuat.","header.currentProjectSyncRoot.unavailable.tooltip":"Informasi sync root saat ini tidak tersedia.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Path file test tidak tersedia.","header.testFiles.tooltip":"Direktori file playtest saat ini untuk place yang dipilih.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Koneksi plugin diperlukan","header.places.liveRequired":"Koneksi plugin diperlukan untuk melihat place aktif secara live.","header.place.tooltip":"Place Roblox yang terhubung.","header.placeNotConnected.tooltip":"Place belum terhubung","header.changeProjectRoot":"Ubah project root","header.changeProjectRoot.ariaLabel":"Ubah project root","header.changeProjectRoot.tooltip":"Ubah project root saat ini.","header.changeProjectRoot.disabledTooltip.l0":"Koneksi server MCP diperlukan terlebih dahulu sebelum project root bisa diubah.","header.changeProjectRoot.disabledTooltip.loading":"Informasi project root masih dimuat.","header.changeProjectRoot.disabledTooltip.unavailable":"Informasi project root saat ini tidak tersedia.","header.projectRootModal.initial.title":"Ubah project root","header.projectRootModal.initial.body.connected":"Setelah Anda memilih folder proyek, MCP akan beralih ke project root baru dan konten Studio saat ini akan disinkronkan ulang sepenuhnya ke target baru <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Setelah Anda memilih folder proyek, MCP akan beralih ke project root baru dan menggunakan <selected project folder>/weppy-project-sync sebagai target sync berikutnya.","header.projectRootModal.initial.nextSyncRoot":"Target sync baru setelah pemilihan","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Sync saat ini berhenti seketika.","header.projectRootModal.initial.warningFreshSync":"Konten Studio saat ini akan digunakan untuk membuat fresh full sync di target baru.","header.projectRootModal.initial.warningNoMove":"Folder sync lama tidak dipindahkan secara otomatis.","header.projectRootModal.initial.warningDeferredSync":"Jika Studio belum terhubung, full resync akan dimulai saat plugin terhubung berikutnya.","header.projectRootModal.confirm.title":"Konfirmasi project root baru","header.projectRootModal.confirm.body":"Tinjau folder proyek yang dipilih sebelum menerapkan perubahan.","header.projectRootModal.confirm.projectRoot":"Folder proyek yang dipilih","header.projectRootModal.confirm.syncRoot":"Target sync baru","header.projectRootModal.confirm.warningNoMove":"Folder sync yang ada tidak dipindahkan secara otomatis.","header.projectRootModal.pick":"Pilih folder","header.projectRootModal.apply":"Terapkan perubahan","header.projectRootModal.cancel":"Batal","header.projectRootModal.error":"Gagal mengubah project root.","status.online":"Online","status.offline":"Offline","status.idle":"Menunggu","status.syncing":"Menyinkronkan","status.error":"Error","status.initializing":"Menginisialisasi","level.l0.title":"Server terputus","level.l0.message":"WEPPY Dashboard terbuka tetapi server MCP telah berhenti atau tidak merespons.","level.l1.title":"Server terhubung","level.l1.hint":"Periksa: Apakah Roblox Studio berjalan? Apakah plugin terinstal?","level.l2.ok":"Studio terhubung","tier.basic":"Basic","tier.basic.tooltip":"Tier Basic dengan kumpulan fitur WEPPY Dashboard standar.","tier.pro":"Pro","tier.pro.tooltip":"Tier Pro dengan kumpulan fitur WEPPY Dashboard lengkap.","tier.mixed":"Campuran","tier.upgrade":"Upgrade ke Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Hemat token AI dengan Pro!","tier.comparison.comingSoon":"Perbandingan Basic vs Pro — segera hadir","tier.comparison.close":"Tutup","tier.comparison.detailTitle":"Katalog alat detail","tier.comparison.description":"Deskripsi","tier.comparison.basic.core":"Alur kerja MCP dasar","tier.comparison.basic.core.item1":"Buat/edit script","tier.comparison.basic.core.item2":"Manajemen instance","tier.comparison.basic.core.item3":"Kontrol properti","tier.comparison.basic.core.item4":"Seleksi dan pencarian","tier.comparison.basic.core.item5":"Manajemen tag","tier.comparison.basic.core.item6":"Kontrol kamera","tier.comparison.basic.core.item7":"Pemantauan log","tier.comparison.basic.sync":"Sinkronisasi (Basic)","tier.comparison.basic.sync.item1":"Sinkronisasi satu arah dari Studio ke lokal","tier.comparison.basic.sync.item2":"Penerapan manual sebagai default","tier.comparison.pro.all":"Semua di Basic, ditambah","tier.comparison.pro.sync":"Alur sinkronisasi lanjutan","tier.comparison.pro.sync.item1":"Arah sinkronisasi per tipe","tier.comparison.pro.sync.item2":"Mode penerapan per tipe","tier.comparison.pro.sync.item3":"Sinkronisasi dua arah dan terbalik","tier.comparison.pro.sync.item4":"Sinkronisasi penuh, sinkronisasi ulang, dan kirim ke Studio","tier.comparison.pro.sync.item5":"Sinkronisasi multi-tempat","tier.comparison.pro.playtest":"Kontrol playtest","tier.comparison.pro.playtest.item1":"Putar, hentikan, jeda, dan lanjutkan","tier.comparison.pro.playtest.item2":"Inspeksi status playtest","tier.comparison.pro.playtest.item3":"Eksekusi pengujian otomatis","tier.comparison.pro.creation":"Alur pembuatan lanjutan","tier.comparison.pro.creation.item1":"Operasi massal","tier.comparison.pro.creation.item2":"Pembuatan terrain","tier.comparison.pro.creation.item3":"Pencarian dan penyisipan aset","tier.comparison.pro.creation.item4":"Raycast dan analisis spasial","tier.comparison.pro.creation.item5":"Kontrol lingkungan","tier.comparison.pro.ui":"Desain UI AI (UI Studio)","tier.comparison.pro.ui.item1":"design_brief — pengumpulan kebutuhan UI terpandu","tier.comparison.pro.ui.item2":"create_tree / update / delete — buat dan edit hierarki UI","tier.comparison.pro.ui.item3":"preview — tangkap layar UI saat ini","tier.comparison.pro.ui.item4":"Design Check — validasi target sentuh, kontras, dan zona aman","tier.comparison.discount.label":"🎁 Masukkan kode ini saat checkout Gumroad untuk mendapat diskon:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Berlaku hingga 30 April","tier.promo.discount.hint":"🎁 Gunakan kode WEPPY-MCP di Gumroad · Berlaku hingga 30 April","tier.promo.discount.context":"🎁 Masukkan di Gumroad saat checkout:","tier.tool.query_instances.desc":"Kueri instance, jelajahi anak/keturunan, info kelas, cari berdasarkan nama dan kelas. Pro: pohon file, struktur proyek, pencarian berdasarkan properti dan tag.","tier.tool.mutate_instances.desc":"Buat, hapus, klon, pindah, ganti nama, dan pivot instance. Pro: pembuatan pohon, pembuatan/penghapusan/duplikasi massal.","tier.tool.manage_properties.desc":"Lihat dan atur properti, atribut, dan tag. Pro: nilai kalkulasi dan relatif, lihat/atur massal, modifikasi massal anak.","tier.tool.manage_scripts.desc":"Baca, tulis, buat, hapus, edit baris, dan cari di script. Pro: penggantian massal antar script.","tier.tool.manage_lighting.desc":"Khusus Pro. Pengaturan pencahayaan, atmosfer, langit, properti terrain, dan waktu.","tier.tool.manage_selection.desc":"Lihat, atur, dan hapus seleksi. Pro: konteks, detail, tambah/hapus item, pantau perubahan.","tier.tool.manage_camera.desc":"Info kamera, fokus berdasarkan jalur atau koordinat, saran tampilan.","tier.tool.manage_tween.desc":"Khusus Pro. Buat, putar, jeda, dan batalkan tween untuk animasi halus.","tier.tool.manage_audio.desc":"Khusus Pro. Putar, hentikan, jeda, dan lanjutkan suara. Atur listener audio.","tier.tool.manage_animation.desc":"Khusus Pro. Muat, putar, dan hentikan animasi. Lihat track humanoid/pengontrol.","tier.tool.manage_physics.desc":"Khusus Pro. Daftarkan grup tabrakan, atur tabrakan antar grup, daftar grup.","tier.tool.manage_effects.desc":"Khusus Pro. Pancarkan partikel, hapus semua, aktifkan/nonaktifkan efek.","tier.tool.manage_terrain.desc":"Khusus Pro. Isi bentuk, hapus wilayah, ganti material, kelola warna, baca/tulis voxel, pembuatan prosedural, pemulusan.","tier.tool.spatial_query.desc":"Khusus Pro. Raycast, cari tanah, periksa penempatan, pindai area, cari area datar dan titik spawn, analisis kemampuan jalan, peta spasial, deteksi tabrakan.","tier.tool.manage_assets.desc":"Khusus Pro. Sisipkan model, lihat info aset, cari di toko kreator, sisipkan model/paket gratis, ekspor.","tier.tool.manage_sync.desc":"Khusus Pro. Status sinkronisasi, konfigurasi, riwayat, arah, baca/tulis file tersinkronisasi.","tier.tool.workspace_state.desc":"Khusus Pro. Sinkronisasi penuh, tangkapan layar, perubahan terbaru, info viewport, metadata, manajemen cache.","tier.tool.manage_logs.desc":"Kueri log terfilter, polling inkremental, hapus buffer, kueri error terbaru.","tier.tool.system_info.desc":"Status koneksi, verifikasi tier. Pro: info tempat, daftar layanan, pengaturan Studio, kontrol playtest, pengujian otomatis.","tier.tool.batch_execute.desc":"Khusus Pro. Eksekusi beberapa perintah sekaligus. Pemrosesan berurutan dengan opsi lanjut saat error.","tier.tool.execute_luau.desc":"Khusus Pro. Jalankan kode Luau di sandbox Roblox Studio.","connection.server.title":"Status Server","connection.server.version":"Versi","connection.server.version.tooltip":"Versi server MCP yang terpasang.","connection.server.pid":"PID","connection.server.pid.tooltip":"Pengenal proses dari sistem operasi.","connection.server.uptime":"Waktu aktif","connection.server.uptime.tooltip":"Waktu yang berlalu sejak server MCP dimulai.","connection.server.session":"Sesi","connection.server.session.tooltip":"Pengenal sesi MCP saat ini.","connection.server.exec":"Eksekutabel","connection.server.exec.tooltip":"Path eksekutabel yang digunakan untuk menjalankan server MCP.","connection.reconnect":"Hubungkan ulang","connection.checkSettings":"Periksa pengaturan","connection.agents.title":"Agen AI","connection.agents.name":"Agen","connection.agents.cwd":"Direktori kerja","connection.agents.cwd.tooltip":"Direktori kerja saat ini milik agen AI yang terhubung.","connection.agents.projectRoot":"Root Proyek","connection.agents.projectRoot.tooltip":"Jalur proyek otoritatif untuk kepemilikan sinkronisasi","connection.agents.projectRoot.unresolved":"Belum terselesaikan","connection.agents.connected":"Terhubung","connection.agents.unknown":"Tidak diketahui","connection.agents.none":"Tidak ada agen terhubung","connection.plugins.title":"Plugin","connection.plugins.place":"Place","connection.plugins.clientId":"ID Klien","connection.plugins.clientId.tooltip":"Pengenal unik klien plugin untuk koneksi Studio ini.","connection.plugins.lastSeen":"Terakhir terlihat","connection.plugins.lastSeen.tooltip":"Heartbeat terbaru yang diterima dari plugin.","connection.plugins.version":"Versi","connection.plugins.version.tooltip":"Versi plugin terpasang yang dilaporkan oleh Studio.","connection.plugins.none":"Tidak ada plugin terhubung","connection.log.title":"Log Koneksi","connection.log.empty":"Belum ada event","connection.time.secondsAgo":"dtk lalu","connection.time.minutesAgo":"mnt lalu","connection.time.hoursAgo":"jam lalu","common.loading":"Memuat...","common.retry":"Coba lagi","common.reconnecting":"Menghubungkan ulang...","common.expand":"Perluas","common.collapse":"Ciutkan","tools.tab.history":"Riwayat","tools.tab.statistics":"Statistik","tools.tab.failures":"Kegagalan","tools.col.time":"Waktu","tools.col.time.tooltip":"Waktu ketika eksekusi alat dicatat.","tools.col.toolAction":"Alat.Aksi","tools.col.toolAction.tooltip":"Nama alat dan aksi yang dijalankan.","tools.col.duration":"Durasi","tools.col.duration.tooltip":"Berapa lama alat menyelesaikan eksekusi.","tools.col.status":"Status","tools.col.status.tooltip":"Hasil dari eksekusi alat yang tercatat.","tools.col.tier":"Tier","tools.col.tier.tooltip":"Tier lisensi yang dibutuhkan untuk alat atau aksi ini.","tools.col.tierStats.tooltip":"Ringkasan Basic, Pro, atau Mixed untuk baris statistik alat ini.","tools.col.tool":"Alat","tools.col.tool.tooltip":"Nama alat konsolidasi pada tabel statistik.","tools.col.calls":"Panggilan","tools.col.calls.tooltip":"Jumlah total panggilan yang tercatat untuk alat ini.","tools.col.ok":"OK","tools.col.ok.tooltip":"Jumlah eksekusi sukses langsung.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Jumlah eksekusi yang berhasil melalui fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Jumlah eksekusi yang diblokir tanpa fallback.","tools.col.err":"GAGAL","tools.col.err.tooltip":"Jumlah eksekusi yang berakhir gagal.","tools.col.okRate":"% Sukses","tools.col.okRate.tooltip":"Persentase panggilan yang selesai dengan sukses.","tools.col.avgTime":"Waktu rata-rata","tools.col.avgTime.tooltip":"Rata-rata waktu eksekusi dari panggilan yang tercatat.","tools.col.error":"Error","tools.filter.tool":"Alat","tools.filter.all":"Semua","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Entri ini menggunakan alat atau aksi khusus Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"Aksi Pro yang diminta berhasil melalui fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"Aksi Pro yang diminta diblokir dan tidak ada fallback yang dijalankan.","tools.badge.err":"GAGAL","tools.badge.err.tooltip":"Eksekusi alat berakhir gagal.","tools.status.ok":"OK","tools.status.ok.tooltip":"Eksekusi alat selesai dengan sukses.","tools.tier.mixed.tooltip":"Alat ini memiliki campuran aksi Basic dan Pro.","tools.detail.params":"Parameter","tools.detail.params.tooltip":"Parameter input yang dikirim pada eksekusi alat ini.","tools.detail.result":"Hasil","tools.detail.result.tooltip":"Payload hasil yang dikembalikan dari eksekusi alat ini.","tools.detail.requestedCommand":"Perintah dikirim","tools.detail.executedCommand":"Perintah dijalankan","tools.detail.alternatives":"Alternatif","tools.detail.blockedMessage":"Alasan diblokir","tools.detail.noFallback":"Tanpa fallback","tools.detail.noFallback.value":"Tidak ada fallback yang dijalankan.","tools.detail.errorMessage":"Pesan error","tools.clear.history.title":"Hapus riwayat?","tools.clear.history.message":"Tindakan ini akan menghapus permanen riwayat alat untuk place saat ini.","tools.clear.statistics.title":"Hapus statistik?","tools.clear.statistics.message":"Tindakan ini akan mereset permanen statistik alat untuk place saat ini.","tools.detail.error":"Error","tools.page.prev":"Sebelumnya","tools.page.prev.tooltip":"Pindah ke halaman sebelumnya pada riwayat alat.","tools.page.next":"Selanjutnya","tools.page.next.tooltip":"Pindah ke halaman berikutnya pada riwayat alat.","tools.empty.history":"Tidak ada entri riwayat","tools.empty.stats":"Tidak ada statistik alat","tools.empty.failures":"Tidak ada kegagalan","tools.summary.total":"Total","tools.summary.calls":"panggilan","tools.summary.sessions":"Sesi","settings.license.title":"Lisensi","settings.license.title.tooltip":"Status lisensi dan tier langganan saat ini.","settings.license.status":"Status","settings.license.status.tooltip":"Status aktivasi lisensi saat ini.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Tier langganan saat ini untuk fitur WEPPY Dashboard yang tersedia.","settings.license.key":"Kunci","settings.license.key.tooltip":"Kunci lisensi tersamarkan yang saat ini dimuat oleh server.","settings.license.keyValue.tooltip":"Kunci lisensi tersamarkan yang saat ini dimuat oleh server.","settings.license.provider":"Penyedia","settings.license.provider.tooltip":"Penyedia lisensi yang digunakan untuk memvalidasi kunci ini.","settings.license.providerValue.tooltip":"Penyedia lisensi yang digunakan untuk memvalidasi kunci ini.","settings.license.active":"Aktif","settings.license.active.tooltip":"Status aktivasi lisensi saat ini.","settings.license.status.activeCancelPending.tooltip":"Pembatalan sedang menunggu, tetapi akses Pro tetap aktif hingga periode penagihan saat ini berakhir.","settings.license.inactive":"Tidak aktif","settings.license.inactive.tooltip":"Status aktivasi lisensi saat ini.","settings.license.expired":"Kedaluwarsa","settings.license.expired.tooltip":"Status aktivasi lisensi saat ini.","settings.license.unavailable":"Info lisensi tidak tersedia","settings.license.detail.cancelPending":"Pembatalan telah dijadwalkan. Akses Pro tetap aktif hingga periode penagihan saat ini berakhir.","settings.license.reset":"Reset Lisensi","settings.readOnly":"Hanya baca","settings.readOnly.tooltip":"Bagian ini menampilkan nilai yang tidak bisa diedit dari WEPPY Dashboard.","settings.unavailable":"Pengaturan tidak tersedia","settings.general.title":"Pengaturan umum","settings.general.title.tooltip":"Pengaturan panas yang langsung diterapkan saat diubah.","settings.general.liveApply":"Terapkan langsung","settings.general.liveApply.tooltip":"Perubahan di bagian ini langsung diterapkan tanpa tombol simpan terpisah.","settings.general.applied":"Diterapkan","settings.general.logLevel":"Level log","settings.general.logLevel.tooltip":"Menetapkan seberapa detail WEPPY Dashboard menulis lognya.","settings.general.localHistory":"Perekaman riwayat alat","settings.general.localHistory.tooltip":"Menyimpan riwayat eksekusi alat lokal untuk tampilan riwayat WEPPY Dashboard.","settings.general.localStatistics":"Pengumpulan statistik alat","settings.general.localStatistics.tooltip":"Mengumpulkan statistik penggunaan lokal untuk pelaporan WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Batas waktu tindakan","settings.general.requestTimeout.tooltip":"Waktu maksimum WEPPY Dashboard menunggu tindakan sebelum dianggap gagal.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Batas waktu tindakan diukur dalam milidetik.","settings.cold.title":"Lingkungan server","settings.cold.title.tooltip":"Nilai lingkungan server hanya-baca yang dimuat saat startup.","settings.cold.httpPort.tooltip":"Nomor port yang digunakan oleh server HTTP WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Antarmuka host yang diikat oleh server HTTP WEPPY Dashboard MCP.","settings.cold.dashboardAutoOpen.tooltip":"Mengontrol apakah WEPPY Dashboard terbuka otomatis di browser saat server dimulai.","settings.cold.dashboardAutoOpen.value.tooltip":"Perilaku startup saat ini untuk membuka WEPPY Dashboard di browser.","settings.cold.hint":"Atur melalui variabel lingkungan.","settings.language.title":"Bahasa","settings.language.title.tooltip":"Pilih cara teks antarmuka WEPPY Dashboard dilokalkan.","settings.language.dashboard":"Bahasa WEPPY Dashboard","settings.language.dashboard.tooltip":"Mengganti bahasa WEPPY Dashboard atau mengikuti bahasa sistem saat disetel ke Otomatis.","settings.language.auto":"Otomatis","overview.l0.title":"Server MCP terputus","overview.l0.message":"Server MCP tidak merespons. WEPPY Dashboard akan mencoba menghubungkan ulang secara otomatis.","overview.l0.step1":"Periksa apakah proses server MCP sedang berjalan","overview.l0.step2":"Mulai ulang perintah server MCP jika diperlukan","overview.l0.reconnecting":"Menghubungkan ulang otomatis setiap 3 detik...","overview.l0.reconnectBtn":"Hubungkan ulang","overview.l0.settingsBtn":"Periksa pengaturan","overview.l1.pluginGuide":"Plugin Roblox Studio tidak terhubung","overview.l1.check1":"Apakah Roblox Studio sedang berjalan?","overview.l1.check2":"Apakah WEPPY Plugin sudah terinstal?","overview.l1.feedHint":"Perubahan akan muncul di sini setelah plugin terhubung","overview.metric.server":"Server","overview.metric.server.tooltip":"Status runtime dan proses server MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Status koneksi dan versi plugin Roblox Studio.","overview.metric.agent":"Agen","overview.metric.agent.tooltip":"Agen coding AI yang terhubung dan status runtime-nya.","overview.metric.agent.instancesUnit":"instansi","overview.metric.sync":"Sinkronisasi","overview.metric.sync.tooltip":"Aktivitas sinkronisasi saat ini antara Studio dan file lokal.","overview.metric.noAgent":"Tidak ada agen","overview.meta.version":"Versi","overview.meta.version.tooltip":"Versi server MCP yang terpasang.","overview.meta.session":"Sesi","overview.meta.session.tooltip":"Pengenal sesi MCP saat ini.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Pengenal proses dari sistem operasi.","overview.meta.uptime":"Waktu aktif","overview.meta.uptime.tooltip":"Waktu yang berlalu sejak server MCP dimulai.","overview.feed.title":"Perubahan game terbaru","overview.feed.empty":"Tidak ada perubahan terbaru","overview.changelog.title":"Ringkasan perubahan sesi","overview.changelog.entries":"Total","overview.changelog.scripts":"skrip","overview.changelog.instances":"instansi","overview.changelog.properties":"properti","overview.changelog.assets":"aset","overview.tier.title":"Penggunaan tier","changelog.subtitle":"Riwayat perubahan game","changelog.filter.all":"Semua","changelog.filter.active":"Aktif","changelog.filter.completed":"Selesai","changelog.empty":"Belum ada entri riwayat","changelog.basic.limit.title":"Pratinjau Basic hanya menampilkan 3 sesi terbaru","changelog.basic.limit.body":"Upgrade ke Pro untuk melihat timeline changelog lengkap untuk place ini.","changelog.basic.metricLabel":"Changelog terlihat / Total","changelog.basic.visible":"terlihat","changelog.basic.total":"total","changelog.card.active":"Aktif","changelog.card.active.tooltip":"Sesi ini masih menerima perubahan game baru.","changelog.card.completed":"Selesai","changelog.card.completed.tooltip":"Sesi ini sudah berakhir dan tidak ada perubahan baru yang diharapkan.","changelog.card.bootstrapStatus":"Inisialisasi","changelog.card.bootstrapStatus.tooltip":"Sesi ini hanya berisi tangkapan layar bootstrap sinkronisasi awal.","changelog.card.inProgress":"sedang berlangsung","changelog.card.noChanges":"Belum ada perubahan","changelog.card.noChanges.tooltip":"Belum ada perubahan game yang diekstrak untuk sesi ini.","changelog.card.bootstrapSummary":"Snapshot sinkronisasi awal","changelog.card.bootstrapSummary.tooltip":"Penulisan sinkronisasi file awal diringkas menjadi satu baris tangkapan layar bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"skrip","changelog.card.scripts.tooltip":"Perubahan skrip yang terjadi di sesi ini.","changelog.card.instances":"instansi","changelog.card.instances.tooltip":"Perubahan pembuatan, penghapusan, pemindahan, atau kloning instansi di sesi ini.","changelog.card.modified":"diubah","changelog.card.created":"dibuat","changelog.card.deleted":"dihapus","changelog.card.moved":"dipindahkan","changelog.card.propertiesChanged":"properti diubah","changelog.card.propertiesChanged.tooltip":"Perubahan nilai properti yang tercatat untuk sesi ini.","changelog.card.lightingConfigured":"Pencahayaan dikonfigurasi","changelog.card.lightingConfigured.tooltip":"Pencahayaan atau pengaturan atmosfer berubah di sesi ini.","changelog.card.terrainConfigured":"Terrain dikonfigurasi","changelog.card.terrainConfigured.tooltip":"Data terrain atau pengaturan terrain berubah di sesi ini.","changelog.card.assetsInserted":"aset disisipkan","changelog.card.assetsInserted.tooltip":"Aset yang dimasukkan ke place selama sesi ini.","changelog.category.script":"Skrip","changelog.category.instance":"Instansi","changelog.category.property":"Properti","changelog.category.lighting":"Pencahayaan","changelog.category.terrain":"Terrain","changelog.category.asset":"Aset","changelog.detail.changeSummary":"Ringkasan perubahan","changelog.detail.changeSummary.tooltip":"Jumlah perubahan game yang diekstrak dan dikelompokkan per kategori untuk sesi ini.","changelog.detail.changeTimeline":"Timeline perubahan","changelog.detail.changeTimeline.tooltip":"Daftar kronologis perubahan game yang diekstrak untuk sesi ini.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Sebelum & Sesudah","changelog.detail.filterCategory":"Kategori","changelog.detail.filterCategory.tooltip":"Filter timeline ke satu kategori perubahan.","changelog.detail.confidence.exact":"Tepat","changelog.detail.confidence.exact.tooltip":"Status sebelum dan sesudah perubahan ini sama-sama terkonfirmasi.","changelog.detail.confidence.partial":"Parsial","changelog.detail.confidence.partial.tooltip":"Hanya sebagian status sebelum dan sesudah perubahan ini yang bisa dikonfirmasi.","changelog.detail.confidence.afterOnly":"Hanya sesudah","changelog.detail.confidence.afterOnly.tooltip":"Hanya status hasil setelah perubahan yang bisa dikonfirmasi.","changelog.detail.confidence.intentOnly":"Hanya niat","changelog.detail.confidence.intentOnly.tooltip":"Hanya aksi yang diminta yang tercatat, bukan status hasilnya.","changelog.detail.confidence.unknown":"Tidak diketahui","changelog.detail.confidence.unknown.tooltip":"Perubahan ini tidak dapat diklasifikasikan dengan yakin dari data yang tersedia.","changelog.detail.noChanges":"Tidak ada perubahan di kategori ini","changelog.detail.backToList":"Kembali ke daftar","changelog.diff.empty":"Tidak ada perbedaan","changelog.diff.unified":"Terpadu","changelog.diff.sideBySide":"Berdampingan","changelog.diff.before":"Sebelum","changelog.diff.after":"Sesudah","sync.overlay.title":"Plugin Roblox Studio diperlukan","sync.overlay.message":"Status sinkronisasi akan tersedia setelah plugin Roblox Studio terhubung.","sync.overlay.check1":"Apakah Roblox Studio sedang berjalan?","sync.overlay.check2":"Apakah WEPPY Plugin sudah terinstal?","sync.status.title":"Status sinkronisasi","sync.status.title.tooltip":"Status sinkronisasi Studio dan file lokal untuk place ini.","sync.status.forwardOnly":"Hanya maju","sync.status.forwardOnly.tooltip":"Tier Basic hanya mengizinkan sinkronisasi maju dari Studio ke lokal.","sync.status.place":"Place","sync.status.place.tooltip":"Nama place Roblox yang terhubung beserta ID place-nya.","sync.status.path":"Path","sync.status.path.tooltip":"Root sistem file lokal yang saat ini dipakai untuk output sinkronisasi.","sync.status.instances":"Instansi","sync.status.instances.tooltip":"Jumlah total instance Roblox yang disinkronkan di mirror lokal.","sync.status.scripts":"Skrip","sync.status.scripts.tooltip":"Jumlah total file skrip yang saat ini diindeks untuk place ini.","sync.status.state":"Status","sync.status.state.tooltip":"Status runtime sinkronisasi saat ini yang dilaporkan server.","sync.directions.title":"Arah sinkronisasi","sync.directions.title.tooltip":"Arah sinkronisasi per kategori dan cara penerapannya antara Local dan Studio.","sync.directions.type":"Tipe","sync.directions.type.tooltip":"Kategori sinkronisasi yang dipengaruhi aturan ini.","sync.directions.direction":"Arah","sync.directions.direction.tooltip":"Menunjukkan apakah tiap kategori sinkron dari Studio, ke Studio, atau dua arah.","sync.directions.applyMode":"Mode penerapan","sync.directions.applyMode.tooltip":"Cara perubahan sinkronisasi masuk diterapkan untuk kategori ini.","sync.directions.cat.scripts":"Skrip","sync.directions.cat.values":"Nilai","sync.directions.cat.containers":"Kontainer","sync.directions.cat.data":"Data","sync.directions.cat.services":"Layanan","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"File lokal di disk selalu ditampilkan di sisi kiri rel arah.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio selalu ditampilkan di sisi kanan rel arah.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Menerapkan perubahan sinkronisasi hanya saat Anda memicunya secara manual.","sync.directions.mode.auto":"Otomatis","sync.directions.mode.auto.tooltip":"Menerapkan perubahan sinkronisasi otomatis saat pembaruan datang.","sync.directions.tooltip.forward.body":"Perubahan dari Studio hanya disinkronkan ke file lokal","sync.directions.tooltip.bidirectional.body":"Sinkronisasi dua arah antara Local dan Studio","sync.directions.tooltip.reverse.body":"Dorong perubahan file lokal ke Studio","sync.directions.tooltip.proRequired":"Pro diperlukan pada tier Basic","sync.directions.dir.forward":"maju","sync.directions.dir.bidirectional":"dua arah","sync.directions.dir.reverse":"mundur","sync.log.title":"Log sinkronisasi","sync.log.empty":"Tidak ada event sinkronisasi","sync.log.type.write":"TULIS","sync.log.type.write.tooltip":"Output sinkronisasi baru ditulis ke disk.","sync.log.type.update":"PERBARUI","sync.log.type.update.tooltip":"File atau instance yang sudah tersinkron diperbarui.","sync.log.type.delete":"HAPUS","sync.log.type.delete.tooltip":"File atau instance tersinkron telah dihapus.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Event sinkronisasi dicatat tanpa perubahan file.","sync.upgrade.title":"Buka fitur sinkronisasi penuh dengan Pro","sync.upgrade.benefit1":"Sinkronisasi dua arah — edit file, otomatis diterapkan ke Studio","sync.upgrade.benefit2":"Sinkronisasi mundur — kirim perubahan file ke Studio","sync.upgrade.benefit3":"Riwayat sinkronisasi lengkap dan log perubahan detail","sync.upgrade.buy":"Upgrade ke Pro","playtest.status.title":"Status playtest","playtest.status.title.tooltip":"Status sesi playtest Roblox saat ini yang dilaporkan oleh Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Mode peluncuran playtest Studio untuk sesi saat ini.","playtest.status.mode.value.tooltip":"Mode playtest Roblox Studio spesifik yang sedang dipakai saat ini.","playtest.status.mode.play":"Main","playtest.status.mode.run":"Jalankan","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Place Roblox yang saat ini terkait dengan sesi playtest ini.","playtest.status.state.running":"Berjalan","playtest.status.state.running.tooltip":"Sesi playtest Roblox saat ini sedang berjalan.","playtest.status.state.paused":"Dijeda","playtest.status.state.paused.tooltip":"Sesi playtest Roblox saat ini sedang dijeda.","playtest.status.state.notRunning":"Tidak berjalan","playtest.status.state.notRunning.tooltip":"Saat ini tidak ada sesi playtest Roblox yang sedang berjalan.","playtest.control.play":"Main","playtest.control.pause":"Jeda","playtest.control.resume":"Lanjutkan","playtest.control.stop":"Berhenti","playtest.history.title":"Riwayat tes","playtest.history.title.tooltip":"Riwayat eksekusi playtest otomatis yang tercatat untuk proyek ini.","playtest.history.empty":"Belum ada hasil tes","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Mode playtest yang digunakan pada eksekusi tes yang tercatat ini.","playtest.history.status.passed":"Berhasil","playtest.history.status.failed":"Gagal","playtest.history.status.running":"Berjalan","playtest.history.status.unknown":"Tidak diketahui","playtest.history.status.tooltip":"Status hasil yang tercatat untuk eksekusi playtest otomatis ini.","playtest.empty.title":"Belum ada hasil playtest","playtest.empty.message":"Hasil akan muncul di sini saat agen AI menjalankan tes otomatis via system_info.run_test.","playtest.empty.message.before":"Hasil akan muncul di sini saat agen AI menjalankan tes otomatis melalui","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"Titik otomatisasi WEPPY Dashboard yang menjalankan pemeriksaan playtest Roblox melalui tool system_info.","playtest.report.title":"Laporan terpilih","playtest.report.title.tooltip":"Output detail untuk eksekusi playtest otomatis yang sedang dipilih.","playtest.report.content":"Laporan","playtest.report.content.tooltip":"Ringkasan Markdown untuk eksekusi playtest otomatis yang dipilih.","playtest.report.logs":"Log","playtest.report.logs.tooltip":"Log eksekusi yang ditangkap untuk eksekusi playtest otomatis yang dipilih.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Tidak ada konten laporan","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest adalah fitur khusus Pro","playtest.basic.desc":"Kontrol playtest dari WEPPY Dashboard, jalankan tes otomatis, dan lihat laporan tes detail.","playtest.basic.benefit1":"Kontrol main/jeda/berhenti sekali klik","playtest.basic.benefit2":"Eksekusi tes otomatis via agen AI","playtest.basic.benefit3":"Riwayat tes dengan pelacakan berhasil/gagal","playtest.basic.benefit4":"Laporan tes detail dalam markdown","playtest.sample.badge":"Pratinjau tampilan playtest Pro","playtest.sample.title":"Anda sedang melihat pratinjau layar playtest yang tersedia setelah upgrade ke Pro.","playtest.sample.message":"Pratinjau ini menggunakan data sampel. Kontrol playtest langsung, pengelolaan riwayat, dan laporan nyata tersedia setelah upgrade ke Pro.","playtest.sample.clearDisabled":"Upgrade ke Pro untuk menghapus riwayat playtest nyata.","playtest.sample.place":"Pratinjau Arena","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Masuk ke arena, bertahan pada fase awal, dan pastikan HUD merespons segera.","playtest.sample.context.expected":"Pemain spawn dengan aman, UI hitung mundur muncul dalam satu detik, dan wave pertama dimulai tanpa error.","playtest.sample.context.observed":"Proteksi spawn bekerja, HUD diperbarui tepat waktu, dan wave pertama selesai tanpa regresi.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
119
+ [sample] プレビュー報告終了`,"sidebar.whatsNew":"新着情報","sidebar.help.group":"ヘルプとフィードバック","sidebar.help.bug":"バグを報告","sidebar.help.bug.tooltip":"環境情報を事前入力した状態で GitHub のバグ報告を開く","sidebar.help.feature":"機能を提案","sidebar.help.feature.tooltip":"GitHub で新機能や改善を提案する","sidebar.help.discussions":"コミュニティ","sidebar.help.discussions.tooltip":"GitHub Discussions で質問やアイデアを共有する","sidebar.help.troubleshooting":"トラブルシューティング","sidebar.help.troubleshooting.tooltip":"weppyai.com の公式トラブルシューティングガイドを開く","header.whatsNew":"新着情報","header.whatsNew.tooltip":"新着情報","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"新着情報","whatsNew.pageSubtitle":"MCPの最新変更をチェック","whatsNew.unreadSection":"未読","whatsNew.allSection":"すべてのお知らせ","whatsNew.empty":"お知らせはまだありません","whatsNew.newBadge":"NEW","whatsNew.category.release":"リリース","whatsNew.category.notice":"お知らせ","whatsNew.category.deprecation":"非推奨","whatsNew.category.tip":"ヒント","uiStudio.title":"UI Studio","uiStudio.empty":"保存されたスクリーンショットはまだありません。AIエージェントが現在のUI状態をキャプチャすると自動作成されます。","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio プラグインが接続されていません","uiStudio.pluginGuide.message":"UI Studio は、接続された Studio place のスクリーンショットと変更履歴を表示します。Studio と WEPPY Plugin が接続されると自動的に更新されます。","uiStudio.pluginGuide.check1":"Roblox Studio は起動していますか?","uiStudio.pluginGuide.check2":"WEPPY Plugin はインストールされ、実行されていますか?","uiStudio.pluginGuide.waiting":"プラグイン接続を待機中...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"優先確認","uiStudio.priorityLow":"任意改善","uiStudio.highPrioritySection":"優先確認","uiStudio.lowPrioritySection":"任意改善","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"分析","uiStudio.tabs.history":"変更履歴","uiStudio.analysis.reportsTitle":"UI 対象別の最新分析","uiStudio.analysis.recentCapturesTitle":"最近のキャプチャ","uiStudio.analysis.detailDialog":"分析詳細","uiStudio.analysis.targetCountLabel":"分析対象","uiStudio.analysis.captureLabel":"キャプチャ","uiStudio.analysis.verdict.hasSuggestions":"改善提案あり","uiStudio.analysis.verdict.needsFix":"改善提案あり","uiStudio.analysis.verdict.review":"改善提案あり","uiStudio.analysis.verdict.passed":"現在の改善提案なし","uiStudio.analysis.verdictLabel":"改善サマリー","uiStudio.analysis.thresholds":"レビュー基準","uiStudio.analysis.issueSummary.passed":"現在のレビュー基準では、追加の改善提案はありません。","uiStudio.history.title":"変更履歴","uiStudio.history.empty":"まだ変更履歴がありません。AIエージェントがmanage_uiでUIを変更すると自動的に記録されます。","uiStudio.history.loading":"読み込み中...","uiStudio.history.error":"エラー","uiStudio.history.clear":"すべて削除","uiStudio.history.filter.actions":"アクション種別","uiStudio.history.filter.actionAll":"すべて","uiStudio.history.filter.actionCreate":"作成","uiStudio.history.filter.actionUpdate":"更新","uiStudio.history.filter.actionDelete":"削除","uiStudio.history.filter.period":"期間","uiStudio.history.filter.dateAll":"すべて","uiStudio.history.filter.today":"今日","uiStudio.history.filter.yesterday":"昨日","uiStudio.history.filter.last7Days":"過去 7 日","uiStudio.history.filter.last30Days":"過去 30 日","uiStudio.history.filter.customRange":"範囲指定","uiStudio.history.filter.reset":"リセット","uiStudio.history.filter.from":"開始","uiStudio.history.filter.to":"終了","uiStudio.history.row.affectedPaths":"パス","uiStudio.history.row.mutations":"変更詳細","uiStudio.history.row.expand":"▾ 展開","uiStudio.history.row.collapse":"▲ 閉じる","uiStudio.history.row.expandDetails":"変更詳細 {n} 件","uiStudio.history.row.collapseDetails":"変更詳細を閉じる","uiStudio.history.row.toggleDetails":"変更詳細を切り替え","uiStudio.history.row.mutationsEmpty":"変更詳細なし","uiStudio.history.row.toolLabel":"UI変更({n}件)","uiStudio.history.row.compare":"前後比較","uiStudio.history.row.noBeforeState":"変更前なし","uiStudio.history.row.noAfterState":"変更後なし","uiStudio.history.row.qualityPlan":"デザイン方針","uiStudio.history.row.designCheck":"改善提案","uiStudio.history.row.designCheckUnavailable":"改善提案: 要約なし","uiStudio.history.row.designCheckNone":"改善提案: 現在なし","uiStudio.history.selection.deleteSelected":"選択を削除","uiStudio.history.selection.selectAll":"すべて選択","uiStudio.history.selection.clearSelection":"選択解除","uiStudio.history.confirm.deleteRequestsTitle":"変更記録を削除","uiStudio.history.confirm.deleteRequestsMessage":"選択した変更記録を削除します。この操作は元に戻せません。","uiStudio.history.confirm.clearRequestsTitle":"変更履歴を削除","uiStudio.history.confirm.clearRequestsMessage":"現在の place の変更履歴を削除します。Studio インスタンスには影響しません。","uiStudio.history.confirm.cascadeOption":"リンクされたスクリーンショットも削除","uiStudio.history.drawer.close":"閉じる","uiStudio.actions.previewAgain":"再プレビュー","uiStudio.actions.deleteSnapshot":"このスクリーンショットを削除","uiStudio.actions.proRequired":"Proにアップグレード後に利用可能","uiStudio.actions.captureCurrentState":"現在の状態をキャプチャ","uiStudio.actions.checkSuggestionsAgain":"提案を再確認","uiStudio.actions.previewRunning":"キャプチャ中…","uiStudio.actions.previewRunningDetail":"完了すると新しいスクリーンショットファイル ID が表示されます。","uiStudio.actions.previewNeedsSaveCheck":"キャプチャ完了、保存確認が必要","uiStudio.actions.previewSaved":"新しいスクリーンショットを保存しました","uiStudio.actions.previewComplete":"キャプチャ完了","uiStudio.actions.previewSavedDetail":"既存のスクリーンショットは変更せず、新しいファイルとして保存しました。","uiStudio.actions.previewSavedPathMissing":"新しいスクリーンショット ID は返されましたが、保存先パスを確認できませんでした。","uiStudio.actions.previewSnapshotIdMissing":"新しいスクリーンショット ID を確認できませんでした。リストを更新して保存状況を確認してください。","uiStudio.actions.more":"その他","uiStudio.gallery.selection.selectedCount":" 件選択中","uiStudio.confirm.deleteSnapshotTitle":"スクリーンショットを削除","uiStudio.confirm.deleteSnapshotMessage":"このスクリーンショットファイルのみ削除されます(Studioインスタンスは保持されます)。","uiStudio.confirm.deleteBatchTitle":"スクリーンショットを一括削除","uiStudio.confirm.deleteBatchMessage":"選択したスクリーンショットを削除します。この操作は元に戻せません。","uiStudio.gallery.selectMode":"選択","uiStudio.gallery.exitSelectMode":"キャンセル","uiStudio.gallery.selectAll":"すべて選択","uiStudio.gallery.clearSelection":"選択解除","uiStudio.gallery.deleteSelected":"選択削除","common.cancel":"キャンセル","common.delete":"削除","uiStudio.storage.title":"UI Studioの保存データ","uiStudio.storage.usageLabel":"使用中","uiStudio.storage.historyBytes":"履歴","uiStudio.storage.snapshotBytes":"スクリーンショット","uiStudio.storage.requestCount":"変更記録","uiStudio.storage.mutationCount":"変更詳細","uiStudio.storage.snapshotCount":"スクリーンショット","uiStudio.storage.countSuffix":"件","uiStudio.storage.lastRun":"最後の自動クリーンアップ","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"解放","uiStudio.storage.lastRunErrors":"エラー","uiStudio.storage.loading":"読み込み中...","uiStudio.cleanup.policy.title":"自動削除ポリシー","uiStudio.cleanup.policy.modeOff":"無効","uiStudio.cleanup.policy.modeAge":"期間ベース","uiStudio.cleanup.policy.modeSize":"サイズベース","uiStudio.cleanup.policy.cascade":"リンクされたスクリーンショットも削除","uiStudio.cleanup.policy.save":"ポリシーを保存","uiStudio.cleanup.policy.runNow":"今すぐ実行","uiStudio.cleanup.policy.proRequired":"Proにアップグレード後に利用可能","uiStudio.cleanup.policy.daysUnit":"日","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"ポリシーの確認","uiStudio.cleanup.policy.confirm.messageStrict":"このポリシーを適用すると直ちに削除されます","uiStudio.cleanup.policy.confirm.requests":" 件","uiStudio.cleanup.policy.confirm.snapshots":" スクリーンショット","uiStudio.cleanup.policy.confirm.freed":"解放 — 適用しますか?","uiStudio.cleanup.keepLastNDays":"直近{n}日間のみ保持","uiStudio.cleanup.selectedDelete":"選択削除…","uiStudio.cleanup.deleteAll":"全て削除…","uiStudio.cleanup.cleanupConfirmTitle":"クリーンアップの確認","uiStudio.cleanup.cleanupConfirmMessage":"選択したアイテムが削除されます。この操作は元に戻せません。","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"手動クリーンアップ","uiStudio.cleanup.studioPreservedNote":"この操作はディスク上の履歴・スクリーンショットファイルのみを削除します。Roblox Studio のインスタンスには影響しません。","uiStudio.history.sample.bannerBadge":"Pro 変更履歴プレビュー","uiStudio.history.sample.bannerTitle":"Pro変更履歴のプレビュー","uiStudio.history.sample.bannerMessage":"このプレビューはサンプルデータを使用しています。実際のリクエスト履歴、前後比較、一括削除はProでご利用いただけます。","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"全履歴はProにアップグレード後にご利用いただけます","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP サーバーに接続しました","toast.serverDisconnected":"MCP サーバーから切断されました","toast.pluginConnected":"プラグインに接続しました","toast.pluginDisconnected":"プラグインから切断されました","toast.clearSuccess":"削除しました","toast.clearFailed":"削除に失敗しました","common.clear":"クリア","settings.license.activate":"ライセンスを有効化","settings.license.refresh":"ライセンスを更新","settings.license.keyInput":"ライセンスキー","settings.license.disconnected":"切断","settings.license.disconnected.tooltip":"WEPPY Dashboard からライセンス操作を行うには、MCP サーバーに再接続してください。","settings.license.live.tooltip":"ライセンス操作は MCP サーバーに即時反映されます。","settings.license.status.activationRequired":"有効化が必要","settings.license.status.activationRequired.tooltip":"WEPPY Dashboard がこの状態を更新するには、ライセンスを手動で有効化する必要があります。","settings.license.status.grace":"猶予","settings.license.status.grace.tooltip":"プロバイダー検証が一時的に利用できませんが、猶予期間中は Pro アクセスが維持されます。","settings.license.status.graceBilling.tooltip":"請求関連の猶予期間中も Pro アクセスは利用できます。","settings.license.detail.graceBilling":"請求の猶予期間中も Pro アクセスは利用できます。","settings.license.detail.graceProviderUnavailable":"プロバイダーが利用できません。猶予モードの間も Pro アクセスは維持されます。","settings.license.detail.manualActivation":"Pro アクセスを復元するには手動での有効化が必要です。","settings.license.detail.missingSessionToken":"現在のセッショントークンが存在しないため、更新がブロックされています。","settings.license.detail.refreshRecommended":"ライセンス検証を近いうちに更新してください。","connection.agents.kill":"強制終了","connection.agents.kill.title":"エージェントを強制終了しますか?","connection.agents.killed":"エージェントを強制終了しました","connection.agents.killFailed":"エージェントの強制終了に失敗しました","connection.agents.lastCommand":"最終コマンド","connection.agents.lastCommand.tooltip":"このエージェントが最後に実行したツール呼び出しです。","connection.agents.lastSeen":"最終確認","connection.agents.lastSeen.tooltip":"このエージェントから最後に受信したハートビートまたは活動時刻です。","connection.clear.title":"接続ログをクリアしますか?","connection.clear.message":"現在のプロジェクトに保存された接続ログが完全に削除されます。","sync.clear.title":"同期ログをクリアしますか?","sync.clear.message":"現在のプレイスに保存された同期ログが完全に削除されます。","playtest.clear.title":"テスト履歴をクリアしますか?","playtest.clear.message":"現在のプレイスに保存されたプレイテストレポートが完全に削除されます。","changelog.clear.title":"変更ログをクリアしますか?","changelog.clear.message":"現在のプレイスに保存された変更ログが完全に削除されます。","sync.status.placePath":"プレイスパス","sync.status.placePath.tooltip":"Explorer ファイルが同期される現在のプレイスディレクトリです。","tier.progress.label":"Pro / 全体","changelog.card.representativeArea":"代表領域","changelog.card.verification":"検証","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"この変更で使用したブリーフのデザイン方針です。","uiStudio.history.row.designCheck.tooltip":"変更後のDesign Check改善提案の要約です。","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Design Check の提案","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"もう一度確認","uiStudio.actions.designCheckRunning":"提案を確認中...","uiStudio.actions.designCheckRunningDetail":"完了すると優先確認、確認推奨、任意改善の件数が表示されます。","uiStudio.actions.designCheckComplete":"提案の確認が完了しました","uiStudio.actions.designCheckNoSnapshotSaved":"この操作では新しいスクリーンショットファイルは保存されません。","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"優先確認する提案の数です。クリックして詳細を確認します。","uiStudio.gallery.priorityMediumBadge.tooltip":"確認推奨の提案数です。","uiStudio.priorityMedium":"確認推奨","uiStudio.mediumPrioritySection":"確認推奨","uiStudio.gallery.priorityLowBadge.tooltip":"任意改善の提案数です。"},Hf={"sidebar.overview":"Ringkasan","sidebar.changelog":"Riwayat","sidebar.connection":"Koneksi","sidebar.sync":"Sinkronisasi","sidebar.playtest":"Playtest","sidebar.tools":"Alat","sidebar.settings":"Pengaturan","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"Koneksi server MCP diperlukan.","sidebar.gate.l2":"Koneksi plugin Roblox Studio diperlukan.","header.currentProject":"Proyek saat ini","header.unknownProject":"Proyek tidak dikenal","header.projectRoot.label":"Project Root","header.currentProject.loading":"Memuat project root...","header.currentProject.unavailable":"Project root tidak tersedia","header.placeNotConnected":"Place belum terhubung","header.currentProject.tooltip":"Folder proyek yang sedang dipilih.","header.currentProject.loading.tooltip":"Informasi project root masih dimuat.","header.currentProject.unavailable.tooltip":"Informasi project root saat ini tidak tersedia.","header.currentProjectSyncRoot.label":"Sync Root","header.currentProjectSyncRoot.loading":"Memuat sync root...","header.currentProjectSyncRoot.unavailable":"Sync root tidak tersedia","header.currentProjectSyncRoot.tooltip":"Folder sync root saat ini untuk proyek yang dipilih.","header.currentProjectSyncRoot.loading.tooltip":"Informasi sync root masih dimuat.","header.currentProjectSyncRoot.unavailable.tooltip":"Informasi sync root saat ini tidak tersedia.","header.testFiles.label":"Test Files","header.testFiles.unavailable":"Path file test tidak tersedia.","header.testFiles.tooltip":"Direktori file playtest saat ini untuk place yang dipilih.","header.places.title":"Places","header.places.active":"Active","header.places.inactive":"Inactive","header.places.pluginRequired":"Koneksi plugin diperlukan","header.places.liveRequired":"Koneksi plugin diperlukan untuk melihat place aktif secara live.","header.place.tooltip":"Place Roblox yang terhubung.","header.placeNotConnected.tooltip":"Place belum terhubung","header.changeProjectRoot":"Ubah project root","header.changeProjectRoot.ariaLabel":"Ubah project root","header.changeProjectRoot.tooltip":"Ubah project root saat ini.","header.changeProjectRoot.disabledTooltip.l0":"Koneksi server MCP diperlukan terlebih dahulu sebelum project root bisa diubah.","header.changeProjectRoot.disabledTooltip.loading":"Informasi project root masih dimuat.","header.changeProjectRoot.disabledTooltip.unavailable":"Informasi project root saat ini tidak tersedia.","header.projectRootModal.initial.title":"Ubah project root","header.projectRootModal.initial.body.connected":"Setelah Anda memilih folder proyek, MCP akan beralih ke project root baru dan konten Studio saat ini akan disinkronkan ulang sepenuhnya ke target baru <selected project folder>/weppy-project-sync.","header.projectRootModal.initial.body.disconnected":"Setelah Anda memilih folder proyek, MCP akan beralih ke project root baru dan menggunakan <selected project folder>/weppy-project-sync sebagai target sync berikutnya.","header.projectRootModal.initial.nextSyncRoot":"Target sync baru setelah pemilihan","header.projectRootModal.initial.nextSyncRoot.placeholder":"<selected project folder>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Sync saat ini berhenti seketika.","header.projectRootModal.initial.warningFreshSync":"Konten Studio saat ini akan digunakan untuk membuat fresh full sync di target baru.","header.projectRootModal.initial.warningNoMove":"Folder sync lama tidak dipindahkan secara otomatis.","header.projectRootModal.initial.warningDeferredSync":"Jika Studio belum terhubung, full resync akan dimulai saat plugin terhubung berikutnya.","header.projectRootModal.confirm.title":"Konfirmasi project root baru","header.projectRootModal.confirm.body":"Tinjau folder proyek yang dipilih sebelum menerapkan perubahan.","header.projectRootModal.confirm.projectRoot":"Folder proyek yang dipilih","header.projectRootModal.confirm.syncRoot":"Target sync baru","header.projectRootModal.confirm.warningNoMove":"Folder sync yang ada tidak dipindahkan secara otomatis.","header.projectRootModal.pick":"Pilih folder","header.projectRootModal.apply":"Terapkan perubahan","header.projectRootModal.cancel":"Batal","header.projectRootModal.error":"Gagal mengubah project root.","status.online":"Online","status.offline":"Offline","status.idle":"Menunggu","status.syncing":"Menyinkronkan","status.error":"Error","status.initializing":"Menginisialisasi","level.l0.title":"Server terputus","level.l0.message":"WEPPY Dashboard terbuka tetapi server MCP telah berhenti atau tidak merespons.","level.l1.title":"Server terhubung","level.l1.hint":"Periksa: Apakah Roblox Studio berjalan? Apakah plugin terinstal?","level.l2.ok":"Studio terhubung","tier.basic":"Basic","tier.basic.tooltip":"Tier Basic dengan kumpulan fitur WEPPY Dashboard standar.","tier.pro":"Pro","tier.pro.tooltip":"Tier Pro dengan kumpulan fitur WEPPY Dashboard lengkap.","tier.mixed":"Campuran","tier.upgrade":"Upgrade ke Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Hemat token AI dengan Pro!","tier.comparison.comingSoon":"Perbandingan Basic vs Pro — segera hadir","tier.comparison.close":"Tutup","tier.comparison.detailTitle":"Katalog alat detail","tier.comparison.description":"Deskripsi","tier.comparison.basic.core":"Alur kerja MCP dasar","tier.comparison.basic.core.item1":"Buat/edit script","tier.comparison.basic.core.item2":"Manajemen instance","tier.comparison.basic.core.item3":"Kontrol properti","tier.comparison.basic.core.item4":"Seleksi dan pencarian","tier.comparison.basic.core.item5":"Manajemen tag","tier.comparison.basic.core.item6":"Kontrol kamera","tier.comparison.basic.core.item7":"Pemantauan log","tier.comparison.basic.sync":"Sinkronisasi (Basic)","tier.comparison.basic.sync.item1":"Sinkronisasi satu arah dari Studio ke lokal","tier.comparison.basic.sync.item2":"Penerapan manual sebagai default","tier.comparison.pro.all":"Semua di Basic, ditambah","tier.comparison.pro.sync":"Alur sinkronisasi lanjutan","tier.comparison.pro.sync.item1":"Arah sinkronisasi per tipe","tier.comparison.pro.sync.item2":"Mode penerapan per tipe","tier.comparison.pro.sync.item3":"Sinkronisasi dua arah dan terbalik","tier.comparison.pro.sync.item4":"Sinkronisasi penuh, sinkronisasi ulang, dan kirim ke Studio","tier.comparison.pro.sync.item5":"Sinkronisasi multi-tempat","tier.comparison.pro.playtest":"Kontrol playtest","tier.comparison.pro.playtest.item1":"Putar, hentikan, jeda, dan lanjutkan","tier.comparison.pro.playtest.item2":"Inspeksi status playtest","tier.comparison.pro.playtest.item3":"Eksekusi pengujian otomatis","tier.comparison.pro.creation":"Alur pembuatan lanjutan","tier.comparison.pro.creation.item1":"Operasi massal","tier.comparison.pro.creation.item2":"Pembuatan terrain","tier.comparison.pro.creation.item3":"Pencarian dan penyisipan aset","tier.comparison.pro.creation.item4":"Raycast dan analisis spasial","tier.comparison.pro.creation.item5":"Kontrol lingkungan","tier.comparison.pro.ui":"Desain UI AI (UI Studio)","tier.comparison.pro.ui.item1":"Rencanakan UI dari permintaan dan konteks Studio saat ini","tier.comparison.pro.ui.item2":"Buat, perbarui, atau hapus menu, HUD, tombol, dan panel","tier.comparison.pro.ui.item3":"Tangkap UI saat ini untuk ditinjau","tier.comparison.pro.ui.item4":"Tinjau saran sentuh, kontras, dan area aman","tier.comparison.discount.label":"🎁 Masukkan kode ini saat checkout Gumroad untuk mendapat diskon:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Berlaku hingga 30 April","tier.promo.discount.hint":"🎁 Gunakan kode WEPPY-MCP di Gumroad · Berlaku hingga 30 April","tier.promo.discount.context":"🎁 Masukkan di Gumroad saat checkout:","tier.tool.query_instances.desc":"Kueri instance, jelajahi anak/keturunan, info kelas, cari berdasarkan nama dan kelas. Pro: pohon file, struktur proyek, pencarian berdasarkan properti dan tag.","tier.tool.mutate_instances.desc":"Buat, hapus, klon, pindah, ganti nama, dan pivot instance. Pro: pembuatan pohon, pembuatan/penghapusan/duplikasi massal.","tier.tool.manage_properties.desc":"Lihat dan atur properti, atribut, dan tag. Pro: nilai kalkulasi dan relatif, lihat/atur massal, modifikasi massal anak.","tier.tool.manage_scripts.desc":"Baca, tulis, buat, hapus, edit baris, dan cari di script. Pro: penggantian massal antar script.","tier.tool.manage_ui.desc":"Khusus Pro. Buat atau perbaiki menu, HUD, tombol, label, dan panel gambar bergaya game, lalu tangkap layar dan tinjau saran peningkatan.","tier.tool.manage_ui.action.design_brief":"Rencanakan arah UI","tier.tool.manage_ui.action.create_tree":"Buat UI baru","tier.tool.manage_ui.action.update":"Perbarui UI yang ada","tier.tool.manage_ui.action.delete":"Hapus UI","tier.tool.manage_ui.action.preview":"Tangkap layar UI","tier.tool.manage_ui.action.check":"Tinjau saran peningkatan","tier.tool.manage_lighting.desc":"Khusus Pro. Pengaturan pencahayaan, atmosfer, langit, properti terrain, dan waktu.","tier.tool.manage_selection.desc":"Lihat, atur, dan hapus seleksi. Pro: konteks, detail, tambah/hapus item, pantau perubahan.","tier.tool.manage_camera.desc":"Info kamera, fokus berdasarkan jalur atau koordinat, saran tampilan.","tier.tool.manage_tween.desc":"Khusus Pro. Buat, putar, jeda, dan batalkan tween untuk animasi halus.","tier.tool.manage_audio.desc":"Khusus Pro. Putar, hentikan, jeda, dan lanjutkan suara. Atur listener audio.","tier.tool.manage_animation.desc":"Khusus Pro. Muat, putar, dan hentikan animasi. Lihat track humanoid/pengontrol.","tier.tool.manage_physics.desc":"Khusus Pro. Daftarkan grup tabrakan, atur tabrakan antar grup, daftar grup.","tier.tool.manage_effects.desc":"Khusus Pro. Pancarkan partikel, hapus semua, aktifkan/nonaktifkan efek.","tier.tool.manage_terrain.desc":"Khusus Pro. Isi bentuk, hapus wilayah, ganti material, kelola warna, baca/tulis voxel, pembuatan prosedural, pemulusan.","tier.tool.spatial_query.desc":"Khusus Pro. Raycast, cari tanah, periksa penempatan, pindai area, cari area datar dan titik spawn, analisis kemampuan jalan, peta spasial, deteksi tabrakan.","tier.tool.manage_assets.desc":"Khusus Pro. Sisipkan model, lihat info aset, cari di toko kreator, sisipkan model/paket gratis, ekspor.","tier.tool.manage_sync.desc":"Khusus Pro. Status sinkronisasi, konfigurasi, riwayat, arah, baca/tulis file tersinkronisasi.","tier.tool.workspace_state.desc":"Khusus Pro. Sinkronisasi penuh, tangkapan layar, perubahan terbaru, info viewport, metadata, manajemen cache.","tier.tool.manage_logs.desc":"Kueri log terfilter, polling inkremental, hapus buffer, kueri error terbaru.","tier.tool.system_info.desc":"Status koneksi, verifikasi tier. Pro: info tempat, daftar layanan, pengaturan Studio, kontrol playtest, pengujian otomatis.","tier.tool.manage_studio.desc":"Khusus Pro. Alihkan pengaturan tampilan editor Studio seperti preview UI untuk screenshot dan QA; ini mengubah sesi Studio, bukan objek UI game.","tier.tool.batch_execute.desc":"Khusus Pro. Eksekusi beberapa perintah sekaligus. Pemrosesan berurutan dengan opsi lanjut saat error.","tier.tool.execute_luau.desc":"Khusus Pro. Jalankan kode Luau di sandbox Roblox Studio.","connection.server.title":"Status Server","connection.server.version":"Versi","connection.server.version.tooltip":"Versi server MCP yang terpasang.","connection.server.pid":"PID","connection.server.pid.tooltip":"Pengenal proses dari sistem operasi.","connection.server.uptime":"Waktu aktif","connection.server.uptime.tooltip":"Waktu yang berlalu sejak server MCP dimulai.","connection.server.session":"Sesi","connection.server.session.tooltip":"Pengenal sesi MCP saat ini.","connection.server.exec":"Eksekutabel","connection.server.exec.tooltip":"Path eksekutabel yang digunakan untuk menjalankan server MCP.","connection.reconnect":"Hubungkan ulang","connection.checkSettings":"Periksa pengaturan","connection.agents.title":"Agen AI","connection.agents.name":"Agen","connection.agents.cwd":"Direktori kerja","connection.agents.cwd.tooltip":"Direktori kerja saat ini milik agen AI yang terhubung.","connection.agents.projectRoot":"Root Proyek","connection.agents.projectRoot.tooltip":"Jalur proyek otoritatif untuk kepemilikan sinkronisasi","connection.agents.projectRoot.unresolved":"Belum terselesaikan","connection.agents.connected":"Terhubung","connection.agents.unknown":"Tidak diketahui","connection.agents.none":"Tidak ada agen terhubung","connection.plugins.title":"Plugin","connection.plugins.place":"Place","connection.plugins.clientId":"ID Klien","connection.plugins.clientId.tooltip":"Pengenal unik klien plugin untuk koneksi Studio ini.","connection.plugins.lastSeen":"Terakhir terlihat","connection.plugins.lastSeen.tooltip":"Heartbeat terbaru yang diterima dari plugin.","connection.plugins.version":"Versi","connection.plugins.version.tooltip":"Versi plugin terpasang yang dilaporkan oleh Studio.","connection.plugins.none":"Tidak ada plugin terhubung","connection.log.title":"Log Koneksi","connection.log.empty":"Belum ada event","connection.time.secondsAgo":"dtk lalu","connection.time.minutesAgo":"mnt lalu","connection.time.hoursAgo":"jam lalu","common.loading":"Memuat...","common.retry":"Coba lagi","common.reconnecting":"Menghubungkan ulang...","common.expand":"Perluas","common.collapse":"Ciutkan","tools.tab.history":"Riwayat","tools.tab.statistics":"Statistik","tools.tab.failures":"Kegagalan","tools.col.time":"Waktu","tools.col.time.tooltip":"Waktu ketika eksekusi alat dicatat.","tools.col.toolAction":"Alat.Aksi","tools.col.toolAction.tooltip":"Nama alat dan aksi yang dijalankan.","tools.col.duration":"Durasi","tools.col.duration.tooltip":"Berapa lama alat menyelesaikan eksekusi.","tools.col.status":"Status","tools.col.status.tooltip":"Hasil dari eksekusi alat yang tercatat.","tools.col.tier":"Tier","tools.col.tier.tooltip":"Tier lisensi yang dibutuhkan untuk alat atau aksi ini.","tools.col.tierStats.tooltip":"Ringkasan Basic, Pro, atau Mixed untuk baris statistik alat ini.","tools.col.tool":"Alat","tools.col.tool.tooltip":"Nama alat konsolidasi pada tabel statistik.","tools.col.calls":"Panggilan","tools.col.calls.tooltip":"Jumlah total panggilan yang tercatat untuk alat ini.","tools.col.ok":"OK","tools.col.ok.tooltip":"Jumlah eksekusi sukses langsung.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Jumlah eksekusi yang berhasil melalui fallback.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Jumlah eksekusi yang diblokir tanpa fallback.","tools.col.err":"GAGAL","tools.col.err.tooltip":"Jumlah eksekusi yang berakhir gagal.","tools.col.okRate":"% Sukses","tools.col.okRate.tooltip":"Persentase panggilan yang selesai dengan sukses.","tools.col.avgTime":"Waktu rata-rata","tools.col.avgTime.tooltip":"Rata-rata waktu eksekusi dari panggilan yang tercatat.","tools.col.error":"Error","tools.filter.tool":"Alat","tools.filter.all":"Semua","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Entri ini menggunakan alat atau aksi khusus Pro.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"Aksi Pro yang diminta berhasil melalui fallback Basic.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"Aksi Pro yang diminta diblokir dan tidak ada fallback yang dijalankan.","tools.badge.err":"GAGAL","tools.badge.err.tooltip":"Eksekusi alat berakhir gagal.","tools.status.ok":"OK","tools.status.ok.tooltip":"Eksekusi alat selesai dengan sukses.","tools.tier.mixed.tooltip":"Alat ini memiliki campuran aksi Basic dan Pro.","tools.detail.params":"Parameter","tools.detail.params.tooltip":"Parameter input yang dikirim pada eksekusi alat ini.","tools.detail.result":"Hasil","tools.detail.result.tooltip":"Payload hasil yang dikembalikan dari eksekusi alat ini.","tools.detail.requestedCommand":"Perintah dikirim","tools.detail.executedCommand":"Perintah dijalankan","tools.detail.alternatives":"Alternatif","tools.detail.blockedMessage":"Alasan diblokir","tools.detail.noFallback":"Tanpa fallback","tools.detail.noFallback.value":"Tidak ada fallback yang dijalankan.","tools.detail.errorMessage":"Pesan error","tools.clear.history.title":"Hapus riwayat?","tools.clear.history.message":"Tindakan ini akan menghapus permanen riwayat alat untuk place saat ini.","tools.clear.statistics.title":"Hapus statistik?","tools.clear.statistics.message":"Tindakan ini akan mereset permanen statistik alat untuk place saat ini.","tools.detail.error":"Error","tools.page.prev":"Sebelumnya","tools.page.prev.tooltip":"Pindah ke halaman sebelumnya pada riwayat alat.","tools.page.next":"Selanjutnya","tools.page.next.tooltip":"Pindah ke halaman berikutnya pada riwayat alat.","tools.empty.history":"Tidak ada entri riwayat","tools.empty.stats":"Tidak ada statistik alat","tools.empty.failures":"Tidak ada kegagalan","tools.summary.total":"Total","tools.summary.calls":"panggilan","tools.summary.sessions":"Sesi","settings.license.title":"Lisensi","settings.license.title.tooltip":"Status lisensi dan tier langganan saat ini.","settings.license.status":"Status","settings.license.status.tooltip":"Status aktivasi lisensi saat ini.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Tier langganan saat ini untuk fitur WEPPY Dashboard yang tersedia.","settings.license.key":"Kunci","settings.license.key.tooltip":"Kunci lisensi tersamarkan yang saat ini dimuat oleh server.","settings.license.keyValue.tooltip":"Kunci lisensi tersamarkan yang saat ini dimuat oleh server.","settings.license.provider":"Penyedia","settings.license.provider.tooltip":"Penyedia lisensi yang digunakan untuk memvalidasi kunci ini.","settings.license.providerValue.tooltip":"Penyedia lisensi yang digunakan untuk memvalidasi kunci ini.","settings.license.active":"Aktif","settings.license.active.tooltip":"Status aktivasi lisensi saat ini.","settings.license.status.activeCancelPending.tooltip":"Pembatalan sedang menunggu, tetapi akses Pro tetap aktif hingga periode penagihan saat ini berakhir.","settings.license.inactive":"Tidak aktif","settings.license.inactive.tooltip":"Status aktivasi lisensi saat ini.","settings.license.expired":"Kedaluwarsa","settings.license.expired.tooltip":"Status aktivasi lisensi saat ini.","settings.license.unavailable":"Info lisensi tidak tersedia","settings.license.detail.cancelPending":"Pembatalan telah dijadwalkan. Akses Pro tetap aktif hingga periode penagihan saat ini berakhir.","settings.license.reset":"Reset Lisensi","settings.readOnly":"Hanya baca","settings.readOnly.tooltip":"Bagian ini menampilkan nilai yang tidak bisa diedit dari WEPPY Dashboard.","settings.unavailable":"Pengaturan tidak tersedia","settings.general.title":"Pengaturan umum","settings.general.title.tooltip":"Pengaturan panas yang langsung diterapkan saat diubah.","settings.general.liveApply":"Terapkan langsung","settings.general.liveApply.tooltip":"Perubahan di bagian ini langsung diterapkan tanpa tombol simpan terpisah.","settings.general.applied":"Diterapkan","settings.general.logLevel":"Level log","settings.general.logLevel.tooltip":"Menetapkan seberapa detail WEPPY Dashboard menulis lognya.","settings.general.localHistory":"Perekaman riwayat alat","settings.general.localHistory.tooltip":"Menyimpan riwayat eksekusi alat lokal untuk tampilan riwayat WEPPY Dashboard.","settings.general.localStatistics":"Pengumpulan statistik alat","settings.general.localStatistics.tooltip":"Mengumpulkan statistik penggunaan lokal untuk pelaporan WEPPY Dashboard.","settings.general.contextCapture":"Context Capture","settings.general.contextCapture.tooltip":"When enabled, the WEPPY Dashboard records structured execution context for changelog and playtest views.","settings.general.requestTimeout":"Batas waktu tindakan","settings.general.requestTimeout.tooltip":"Waktu maksimum WEPPY Dashboard menunggu tindakan sebelum dianggap gagal.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Batas waktu tindakan diukur dalam milidetik.","settings.cold.title":"Lingkungan server","settings.cold.title.tooltip":"Nilai lingkungan server hanya-baca yang dimuat saat startup.","settings.cold.httpPort.tooltip":"Nomor port yang digunakan oleh server HTTP WEPPY Dashboard MCP.","settings.cold.httpHost.tooltip":"Antarmuka host yang diikat oleh server HTTP WEPPY Dashboard MCP.","settings.cold.dashboardAutoOpen.tooltip":"Mengontrol apakah WEPPY Dashboard terbuka otomatis di browser saat server dimulai.","settings.cold.dashboardAutoOpen.value.tooltip":"Perilaku startup saat ini untuk membuka WEPPY Dashboard di browser.","settings.cold.hint":"Atur melalui variabel lingkungan.","settings.language.title":"Bahasa","settings.language.title.tooltip":"Pilih cara teks antarmuka WEPPY Dashboard dilokalkan.","settings.language.dashboard":"Bahasa WEPPY Dashboard","settings.language.dashboard.tooltip":"Mengganti bahasa WEPPY Dashboard atau mengikuti bahasa sistem saat disetel ke Otomatis.","settings.language.auto":"Otomatis","overview.l0.title":"Server MCP terputus","overview.l0.message":"Server MCP tidak merespons. WEPPY Dashboard akan mencoba menghubungkan ulang secara otomatis.","overview.l0.step1":"Periksa apakah proses server MCP sedang berjalan","overview.l0.step2":"Mulai ulang perintah server MCP jika diperlukan","overview.l0.reconnecting":"Menghubungkan ulang otomatis setiap 3 detik...","overview.l0.reconnectBtn":"Hubungkan ulang","overview.l0.settingsBtn":"Periksa pengaturan","overview.l1.pluginGuide":"Plugin Roblox Studio tidak terhubung","overview.l1.check1":"Apakah Roblox Studio sedang berjalan?","overview.l1.check2":"Apakah WEPPY Plugin sudah terinstal?","overview.l1.feedHint":"Perubahan akan muncul di sini setelah plugin terhubung","overview.metric.server":"Server","overview.metric.server.tooltip":"Status runtime dan proses server MCP.","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Status koneksi dan versi plugin Roblox Studio.","overview.metric.agent":"Agen","overview.metric.agent.tooltip":"Agen coding AI yang terhubung dan status runtime-nya.","overview.metric.agent.instancesUnit":"instansi","overview.metric.sync":"Sinkronisasi","overview.metric.sync.tooltip":"Aktivitas sinkronisasi saat ini antara Studio dan file lokal.","overview.metric.noAgent":"Tidak ada agen","overview.meta.version":"Versi","overview.meta.version.tooltip":"Versi server MCP yang terpasang.","overview.meta.session":"Sesi","overview.meta.session.tooltip":"Pengenal sesi MCP saat ini.","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Pengenal proses dari sistem operasi.","overview.meta.uptime":"Waktu aktif","overview.meta.uptime.tooltip":"Waktu yang berlalu sejak server MCP dimulai.","overview.feed.title":"Perubahan game terbaru","overview.feed.empty":"Tidak ada perubahan terbaru","overview.changelog.title":"Ringkasan perubahan sesi","overview.changelog.entries":"Total","overview.changelog.scripts":"skrip","overview.changelog.instances":"instansi","overview.changelog.properties":"properti","overview.changelog.assets":"aset","overview.tier.title":"Penggunaan tier","changelog.subtitle":"Riwayat perubahan game","changelog.filter.all":"Semua","changelog.filter.active":"Aktif","changelog.filter.completed":"Selesai","changelog.empty":"Belum ada entri riwayat","changelog.basic.limit.title":"Pratinjau Basic hanya menampilkan 3 sesi terbaru","changelog.basic.limit.body":"Upgrade ke Pro untuk melihat timeline changelog lengkap untuk place ini.","changelog.basic.metricLabel":"Changelog terlihat / Total","changelog.basic.visible":"terlihat","changelog.basic.total":"total","changelog.card.active":"Aktif","changelog.card.active.tooltip":"Sesi ini masih menerima perubahan game baru.","changelog.card.completed":"Selesai","changelog.card.completed.tooltip":"Sesi ini sudah berakhir dan tidak ada perubahan baru yang diharapkan.","changelog.card.bootstrapStatus":"Inisialisasi","changelog.card.bootstrapStatus.tooltip":"Sesi ini hanya berisi tangkapan layar bootstrap sinkronisasi awal.","changelog.card.inProgress":"sedang berlangsung","changelog.card.noChanges":"Belum ada perubahan","changelog.card.noChanges.tooltip":"Belum ada perubahan game yang diekstrak untuk sesi ini.","changelog.card.bootstrapSummary":"Snapshot sinkronisasi awal","changelog.card.bootstrapSummary.tooltip":"Penulisan sinkronisasi file awal diringkas menjadi satu baris tangkapan layar bootstrap.","changelog.card.sessionIntent":"Session intent","changelog.card.scripts":"skrip","changelog.card.scripts.tooltip":"Perubahan skrip yang terjadi di sesi ini.","changelog.card.instances":"instansi","changelog.card.instances.tooltip":"Perubahan pembuatan, penghapusan, pemindahan, atau kloning instansi di sesi ini.","changelog.card.modified":"diubah","changelog.card.created":"dibuat","changelog.card.deleted":"dihapus","changelog.card.moved":"dipindahkan","changelog.card.propertiesChanged":"properti diubah","changelog.card.propertiesChanged.tooltip":"Perubahan nilai properti yang tercatat untuk sesi ini.","changelog.card.lightingConfigured":"Pencahayaan dikonfigurasi","changelog.card.lightingConfigured.tooltip":"Pencahayaan atau pengaturan atmosfer berubah di sesi ini.","changelog.card.terrainConfigured":"Terrain dikonfigurasi","changelog.card.terrainConfigured.tooltip":"Data terrain atau pengaturan terrain berubah di sesi ini.","changelog.card.assetsInserted":"aset disisipkan","changelog.card.assetsInserted.tooltip":"Aset yang dimasukkan ke place selama sesi ini.","changelog.category.script":"Skrip","changelog.category.instance":"Instansi","changelog.category.property":"Properti","changelog.category.lighting":"Pencahayaan","changelog.category.terrain":"Terrain","changelog.category.asset":"Aset","changelog.detail.changeSummary":"Ringkasan perubahan","changelog.detail.changeSummary.tooltip":"Jumlah perubahan game yang diekstrak dan dikelompokkan per kategori untuk sesi ini.","changelog.detail.changeTimeline":"Timeline perubahan","changelog.detail.changeTimeline.tooltip":"Daftar kronologis perubahan game yang diekstrak untuk sesi ini.","changelog.detail.context.title":"Context Summary","changelog.detail.context.tooltip":"Structured execution context captured for this changelog session.","changelog.detail.verification.title":"Verification","changelog.detail.verification.tooltip":"Verification signals linked to this changelog session.","changelog.detail.verification.label":"Result","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Recorded at","changelog.detail.beforeAfter":"Sebelum & Sesudah","changelog.detail.filterCategory":"Kategori","changelog.detail.filterCategory.tooltip":"Filter timeline ke satu kategori perubahan.","changelog.detail.confidence.exact":"Tepat","changelog.detail.confidence.exact.tooltip":"Status sebelum dan sesudah perubahan ini sama-sama terkonfirmasi.","changelog.detail.confidence.partial":"Parsial","changelog.detail.confidence.partial.tooltip":"Hanya sebagian status sebelum dan sesudah perubahan ini yang bisa dikonfirmasi.","changelog.detail.confidence.afterOnly":"Hanya sesudah","changelog.detail.confidence.afterOnly.tooltip":"Hanya status hasil setelah perubahan yang bisa dikonfirmasi.","changelog.detail.confidence.intentOnly":"Hanya niat","changelog.detail.confidence.intentOnly.tooltip":"Hanya aksi yang diminta yang tercatat, bukan status hasilnya.","changelog.detail.confidence.unknown":"Tidak diketahui","changelog.detail.confidence.unknown.tooltip":"Perubahan ini tidak dapat diklasifikasikan dengan yakin dari data yang tersedia.","changelog.detail.noChanges":"Tidak ada perubahan di kategori ini","changelog.detail.backToList":"Kembali ke daftar","changelog.diff.empty":"Tidak ada perbedaan","changelog.diff.unified":"Terpadu","changelog.diff.sideBySide":"Berdampingan","changelog.diff.before":"Sebelum","changelog.diff.after":"Sesudah","sync.overlay.title":"Plugin Roblox Studio diperlukan","sync.overlay.message":"Status sinkronisasi akan tersedia setelah plugin Roblox Studio terhubung.","sync.overlay.check1":"Apakah Roblox Studio sedang berjalan?","sync.overlay.check2":"Apakah WEPPY Plugin sudah terinstal?","sync.status.title":"Status sinkronisasi","sync.status.title.tooltip":"Status sinkronisasi Studio dan file lokal untuk place ini.","sync.status.forwardOnly":"Hanya maju","sync.status.forwardOnly.tooltip":"Tier Basic hanya mengizinkan sinkronisasi maju dari Studio ke lokal.","sync.status.place":"Place","sync.status.place.tooltip":"Nama place Roblox yang terhubung beserta ID place-nya.","sync.status.path":"Path","sync.status.path.tooltip":"Root sistem file lokal yang saat ini dipakai untuk output sinkronisasi.","sync.status.instances":"Instansi","sync.status.instances.tooltip":"Jumlah total instance Roblox yang disinkronkan di mirror lokal.","sync.status.scripts":"Skrip","sync.status.scripts.tooltip":"Jumlah total file skrip yang saat ini diindeks untuk place ini.","sync.status.state":"Status","sync.status.state.tooltip":"Status runtime sinkronisasi saat ini yang dilaporkan server.","sync.directions.title":"Arah sinkronisasi","sync.directions.title.tooltip":"Arah sinkronisasi per kategori dan cara penerapannya antara Local dan Studio.","sync.directions.type":"Tipe","sync.directions.type.tooltip":"Kategori sinkronisasi yang dipengaruhi aturan ini.","sync.directions.direction":"Arah","sync.directions.direction.tooltip":"Menunjukkan apakah tiap kategori sinkron dari Studio, ke Studio, atau dua arah.","sync.directions.applyMode":"Mode penerapan","sync.directions.applyMode.tooltip":"Cara perubahan sinkronisasi masuk diterapkan untuk kategori ini.","sync.directions.cat.scripts":"Skrip","sync.directions.cat.values":"Nilai","sync.directions.cat.containers":"Kontainer","sync.directions.cat.data":"Data","sync.directions.cat.services":"Layanan","sync.directions.endpoint.local":"Local","sync.directions.endpoint.local.tooltip":"File lokal di disk selalu ditampilkan di sisi kiri rel arah.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio selalu ditampilkan di sisi kanan rel arah.","sync.directions.mode.manual":"Manual","sync.directions.mode.manual.tooltip":"Menerapkan perubahan sinkronisasi hanya saat Anda memicunya secara manual.","sync.directions.mode.auto":"Otomatis","sync.directions.mode.auto.tooltip":"Menerapkan perubahan sinkronisasi otomatis saat pembaruan datang.","sync.directions.tooltip.forward.body":"Perubahan dari Studio hanya disinkronkan ke file lokal","sync.directions.tooltip.bidirectional.body":"Sinkronisasi dua arah antara Local dan Studio","sync.directions.tooltip.reverse.body":"Dorong perubahan file lokal ke Studio","sync.directions.tooltip.proRequired":"Pro diperlukan pada tier Basic","sync.directions.dir.forward":"maju","sync.directions.dir.bidirectional":"dua arah","sync.directions.dir.reverse":"mundur","sync.log.title":"Log sinkronisasi","sync.log.empty":"Tidak ada event sinkronisasi","sync.log.type.write":"TULIS","sync.log.type.write.tooltip":"Output sinkronisasi baru ditulis ke disk.","sync.log.type.update":"PERBARUI","sync.log.type.update.tooltip":"File atau instance yang sudah tersinkron diperbarui.","sync.log.type.delete":"HAPUS","sync.log.type.delete.tooltip":"File atau instance tersinkron telah dihapus.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Event sinkronisasi dicatat tanpa perubahan file.","sync.upgrade.title":"Buka fitur sinkronisasi penuh dengan Pro","sync.upgrade.benefit1":"Sinkronisasi dua arah — edit file, otomatis diterapkan ke Studio","sync.upgrade.benefit2":"Sinkronisasi mundur — kirim perubahan file ke Studio","sync.upgrade.benefit3":"Riwayat sinkronisasi lengkap dan log perubahan detail","sync.upgrade.buy":"Upgrade ke Pro","playtest.status.title":"Status playtest","playtest.status.title.tooltip":"Status sesi playtest Roblox saat ini yang dilaporkan oleh Studio.","playtest.status.mode":"Mode","playtest.status.mode.tooltip":"Mode peluncuran playtest Studio untuk sesi saat ini.","playtest.status.mode.value.tooltip":"Mode playtest Roblox Studio spesifik yang sedang dipakai saat ini.","playtest.status.mode.play":"Main","playtest.status.mode.run":"Jalankan","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Place Roblox yang saat ini terkait dengan sesi playtest ini.","playtest.status.state.running":"Berjalan","playtest.status.state.running.tooltip":"Sesi playtest Roblox saat ini sedang berjalan.","playtest.status.state.paused":"Dijeda","playtest.status.state.paused.tooltip":"Sesi playtest Roblox saat ini sedang dijeda.","playtest.status.state.notRunning":"Tidak berjalan","playtest.status.state.notRunning.tooltip":"Saat ini tidak ada sesi playtest Roblox yang sedang berjalan.","playtest.control.play":"Main","playtest.control.pause":"Jeda","playtest.control.resume":"Lanjutkan","playtest.control.stop":"Berhenti","playtest.history.title":"Riwayat tes","playtest.history.title.tooltip":"Riwayat eksekusi playtest otomatis yang tercatat untuk proyek ini.","playtest.history.empty":"Belum ada hasil tes","playtest.history.mode":"Mode","playtest.history.mode.tooltip":"Mode playtest yang digunakan pada eksekusi tes yang tercatat ini.","playtest.history.status.passed":"Berhasil","playtest.history.status.failed":"Gagal","playtest.history.status.running":"Berjalan","playtest.history.status.unknown":"Tidak diketahui","playtest.history.status.tooltip":"Status hasil yang tercatat untuk eksekusi playtest otomatis ini.","playtest.empty.title":"Belum ada hasil playtest","playtest.empty.message":"Hasil akan muncul di sini saat agen AI menjalankan tes otomatis via system_info.run_test.","playtest.empty.message.before":"Hasil akan muncul di sini saat agen AI menjalankan tes otomatis melalui","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"Titik otomatisasi WEPPY Dashboard yang menjalankan pemeriksaan playtest Roblox melalui tool system_info.","playtest.report.title":"Laporan terpilih","playtest.report.title.tooltip":"Output detail untuk eksekusi playtest otomatis yang sedang dipilih.","playtest.report.content":"Laporan","playtest.report.content.tooltip":"Ringkasan Markdown untuk eksekusi playtest otomatis yang dipilih.","playtest.report.logs":"Log","playtest.report.logs.tooltip":"Log eksekusi yang ditangkap untuk eksekusi playtest otomatis yang dipilih.","playtest.context.contextId":"Context ID","playtest.context.why":"Why this test ran","playtest.context.expected":"Expected","playtest.context.observed":"Observed","playtest.report.empty":"Tidak ada konten laporan","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest adalah fitur khusus Pro","playtest.basic.desc":"Kontrol playtest dari WEPPY Dashboard, jalankan tes otomatis, dan lihat laporan tes detail.","playtest.basic.benefit1":"Kontrol main/jeda/berhenti sekali klik","playtest.basic.benefit2":"Eksekusi tes otomatis via agen AI","playtest.basic.benefit3":"Riwayat tes dengan pelacakan berhasil/gagal","playtest.basic.benefit4":"Laporan tes detail dalam markdown","playtest.sample.badge":"Pratinjau tampilan playtest Pro","playtest.sample.title":"Anda sedang melihat pratinjau layar playtest yang tersedia setelah upgrade ke Pro.","playtest.sample.message":"Pratinjau ini menggunakan data sampel. Kontrol playtest langsung, pengelolaan riwayat, dan laporan nyata tersedia setelah upgrade ke Pro.","playtest.sample.clearDisabled":"Upgrade ke Pro untuk menghapus riwayat playtest nyata.","playtest.sample.place":"Pratinjau Arena","playtest.sample.history.name":"Sample Arena Smoke Test","playtest.sample.context.why":"Masuk ke arena, bertahan pada fase awal, dan pastikan HUD merespons segera.","playtest.sample.context.expected":"Pemain spawn dengan aman, UI hitung mundur muncul dalam satu detik, dan wave pertama dimulai tanpa error.","playtest.sample.context.observed":"Proteksi spawn bekerja, HUD diperbarui tepat waktu, dan wave pertama selesai tanpa regresi.","playtest.sample.report.markdown":`# Sample Arena Smoke Test
120
120
 
121
121
  - Alur spawn: PASS
122
122
  - Hitung mundur HUD: PASS
@@ -126,7 +126,7 @@ Ini adalah pratinjau sampel. Upgrade ke Pro untuk menjalankan playtest langsung
126
126
  [sample] proteksi spawn aktif
127
127
  [sample] hitung mundur hud dirender
128
128
  [sample] wave pertama selesai
129
- [sample] laporan pratinjau selesai`,"sidebar.whatsNew":"Yang Baru","sidebar.help.group":"Bantuan & Umpan Balik","sidebar.help.bug":"Laporkan bug","sidebar.help.bug.tooltip":"Buka laporan bug di GitHub dengan data lingkungan terisi otomatis","sidebar.help.feature":"Sarankan fitur baru","sidebar.help.feature.tooltip":"Sarankan fitur baru atau peningkatan di GitHub","sidebar.help.discussions":"Komunitas","sidebar.help.discussions.tooltip":"Ajukan pertanyaan dan bagikan ide di GitHub Discussions","sidebar.help.troubleshooting":"Pemecahan masalah","sidebar.help.troubleshooting.tooltip":"Buka panduan pemecahan masalah resmi di weppyai.com","header.whatsNew":"Yang Baru","header.whatsNew.tooltip":"Yang Baru","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Yang Baru","whatsNew.pageSubtitle":"Tetap update dengan perubahan MCP","whatsNew.unreadSection":"Belum Dibaca","whatsNew.allSection":"Semua Pengumuman","whatsNew.empty":"Belum ada pengumuman","whatsNew.newBadge":"BARU","whatsNew.category.release":"Rilis","whatsNew.category.notice":"Pemberitahuan","whatsNew.category.deprecation":"Tidak Digunakan","whatsNew.category.tip":"Tips","uiStudio.title":"UI Studio","uiStudio.empty":"Belum ada tangkapan layar tersimpan. Ini dibuat otomatis saat agen AI menangkap status UI saat ini.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Plugin Roblox Studio belum terhubung","uiStudio.pluginGuide.message":"UI Studio menampilkan tangkapan layar dan riwayat perubahan dari place Studio yang terhubung. Ini akan diperbarui otomatis setelah Studio dan WEPPY Plugin terhubung.","uiStudio.pluginGuide.check1":"Apakah Roblox Studio sedang berjalan?","uiStudio.pluginGuide.check2":"Apakah WEPPY Plugin terpasang dan berjalan?","uiStudio.pluginGuide.waiting":"Menunggu koneksi plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Tinjau dahulu","uiStudio.priorityLow":"Peningkatan opsional","uiStudio.highPrioritySection":"Tinjau dahulu","uiStudio.lowPrioritySection":"Peningkatan opsional","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analisis","uiStudio.tabs.history":"Riwayat","uiStudio.analysis.reportsTitle":"Analisis Terbaru per Target UI","uiStudio.analysis.recentCapturesTitle":"Tangkapan Terbaru","uiStudio.analysis.detailDialog":"Detail analisis","uiStudio.analysis.targetCountLabel":"Target dianalisis","uiStudio.analysis.captureLabel":"Tangkapan","uiStudio.analysis.verdict.hasSuggestions":"Saran Perbaikan","uiStudio.analysis.verdict.needsFix":"Saran Perbaikan","uiStudio.analysis.verdict.review":"Saran Perbaikan","uiStudio.analysis.verdict.passed":"Tidak Ada Saran Saat Ini","uiStudio.analysis.verdictLabel":"Ringkasan Perbaikan","uiStudio.analysis.thresholds":"Basis Tinjauan","uiStudio.analysis.issueSummary.passed":"Tidak ada saran perbaikan tambahan pada basis tinjauan saat ini.","uiStudio.history.title":"Riwayat Perubahan","uiStudio.history.empty":"Belum ada riwayat perubahan. Ketika agen AI memodifikasi UI menggunakan manage_ui, akan dicatat secara otomatis.","uiStudio.history.loading":"Memuat...","uiStudio.history.error":"Kesalahan","uiStudio.history.clear":"Hapus Semua","uiStudio.history.filter.actions":"Jenis aksi","uiStudio.history.filter.actionAll":"Semua","uiStudio.history.filter.actionCreate":"Buat","uiStudio.history.filter.actionUpdate":"Perbarui","uiStudio.history.filter.actionDelete":"Hapus","uiStudio.history.filter.period":"Periode","uiStudio.history.filter.dateAll":"Semua","uiStudio.history.filter.today":"Hari Ini","uiStudio.history.filter.yesterday":"Kemarin","uiStudio.history.filter.last7Days":"7 Hari Terakhir","uiStudio.history.filter.last30Days":"30 Hari Terakhir","uiStudio.history.filter.customRange":"Rentang Kustom","uiStudio.history.filter.reset":"Setel Ulang","uiStudio.history.filter.from":"Dari","uiStudio.history.filter.to":"Hingga","uiStudio.history.row.affectedPaths":"Jalur","uiStudio.history.row.mutations":"Detail perubahan","uiStudio.history.row.expand":"▾ Perluas","uiStudio.history.row.collapse":"▲ Tutup","uiStudio.history.row.expandDetails":"Tampilkan {n} detail perubahan","uiStudio.history.row.collapseDetails":"Sembunyikan detail perubahan","uiStudio.history.row.toggleDetails":"Alihkan detail perubahan","uiStudio.history.row.mutationsEmpty":"Tidak ada detail perubahan","uiStudio.history.row.toolLabel":"Perubahan UI ({n})","uiStudio.history.row.compare":"Sebelum / Sesudah","uiStudio.history.row.noBeforeState":"Tidak ada status sebelumnya","uiStudio.history.row.noAfterState":"Tidak ada status sesudahnya","uiStudio.history.row.qualityPlan":"Arah desain","uiStudio.history.row.designCheck":"Saran","uiStudio.history.row.designCheckUnavailable":"Saran: tidak tersedia","uiStudio.history.row.designCheckNone":"Saran: tidak ada","uiStudio.history.selection.deleteSelected":"Hapus yang dipilih","uiStudio.history.selection.selectAll":"Pilih semua","uiStudio.history.selection.clearSelection":"Hapus pilihan","uiStudio.history.confirm.deleteRequestsTitle":"Hapus catatan perubahan","uiStudio.history.confirm.deleteRequestsMessage":"Catatan perubahan yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.history.confirm.clearRequestsTitle":"Hapus Riwayat Perubahan","uiStudio.history.confirm.clearRequestsMessage":"Ini menghapus riwayat perubahan place saat ini. Instance Studio tidak terpengaruh.","uiStudio.history.confirm.cascadeOption":"Juga hapus tangkapan layar terkait","uiStudio.history.drawer.close":"Tutup","uiStudio.actions.previewAgain":"Pratinjau Lagi","uiStudio.actions.deleteSnapshot":"Hapus Tangkapan Layar Ini","uiStudio.actions.proRequired":"Tersedia setelah upgrade ke Pro","uiStudio.actions.captureCurrentState":"Tangkap Keadaan Saat Ini","uiStudio.actions.checkSuggestionsAgain":"Periksa Ulang Saran","uiStudio.actions.previewRunning":"Menangkap…","uiStudio.actions.previewRunningDetail":"ID file tangkapan layar baru akan muncul setelah penangkapan selesai.","uiStudio.actions.previewNeedsSaveCheck":"Tangkapan selesai, penyimpanan perlu diperiksa","uiStudio.actions.previewSaved":"Tangkapan layar baru disimpan","uiStudio.actions.previewComplete":"Tangkapan selesai","uiStudio.actions.previewSavedDetail":"Tangkapan yang ada tetap dipertahankan; ini disimpan sebagai file baru.","uiStudio.actions.previewSavedPathMissing":"ID tangkapan baru diterima, tetapi jalur file tersimpan tidak dapat dikonfirmasi.","uiStudio.actions.previewSnapshotIdMissing":"ID tangkapan baru tidak dapat dikonfirmasi. Segarkan daftar untuk memastikan apakah sudah tersimpan.","uiStudio.actions.more":"Lainnya","uiStudio.gallery.selection.selectedCount":" dipilih","uiStudio.confirm.deleteSnapshotTitle":"Hapus Tangkapan Layar","uiStudio.confirm.deleteSnapshotMessage":"Hanya file tangkapan layar ini yang dihapus (instans Studio tetap disimpan).","uiStudio.confirm.deleteBatchTitle":"Hapus Tangkapan Layar Terpilih","uiStudio.confirm.deleteBatchMessage":"Tangkapan layar yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.gallery.selectMode":"Pilih","uiStudio.gallery.exitSelectMode":"Batal","uiStudio.gallery.selectAll":"Pilih Semua","uiStudio.gallery.clearSelection":"Batalkan Pilihan","uiStudio.gallery.deleteSelected":"Hapus Pilihan","common.cancel":"Batal","common.delete":"Hapus","uiStudio.storage.title":"Data tersimpan UI Studio","uiStudio.storage.usageLabel":"Digunakan","uiStudio.storage.historyBytes":"Riwayat","uiStudio.storage.snapshotBytes":"Tangkapan layar","uiStudio.storage.requestCount":"Catatan perubahan","uiStudio.storage.mutationCount":"Detail perubahan","uiStudio.storage.snapshotCount":"Tangkapan layar","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Pembersihan otomatis terakhir","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"dibebaskan","uiStudio.storage.lastRunErrors":"Kesalahan","uiStudio.storage.loading":"Memuat...","uiStudio.cleanup.policy.title":"Kebijakan hapus otomatis","uiStudio.cleanup.policy.modeOff":"Nonaktif","uiStudio.cleanup.policy.modeAge":"Berbasis usia","uiStudio.cleanup.policy.modeSize":"Berbasis ukuran","uiStudio.cleanup.policy.cascade":"Juga hapus tangkapan layar terkait","uiStudio.cleanup.policy.save":"Simpan kebijakan","uiStudio.cleanup.policy.runNow":"Jalankan sekarang","uiStudio.cleanup.policy.proRequired":"Tersedia setelah upgrade ke Pro","uiStudio.cleanup.policy.daysUnit":"h","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Konfirmasi kebijakan","uiStudio.cleanup.policy.confirm.messageStrict":"Menerapkan kebijakan ini akan segera menghapus","uiStudio.cleanup.policy.confirm.requests":" catatan perubahan","uiStudio.cleanup.policy.confirm.snapshots":" tangkapan layar","uiStudio.cleanup.policy.confirm.freed":"dibebaskan — Terapkan?","uiStudio.cleanup.keepLastNDays":"Simpan {n} hari terakhir","uiStudio.cleanup.selectedDelete":"Hapus pilihan…","uiStudio.cleanup.deleteAll":"Hapus semua…","uiStudio.cleanup.cleanupConfirmTitle":"Konfirmasi pembersihan","uiStudio.cleanup.cleanupConfirmMessage":"Item yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Pembersihan manual","uiStudio.cleanup.studioPreservedNote":"Tindakan ini hanya menghapus file riwayat dan tangkapan layar di disk; instans Roblox Studio tidak terpengaruh.","uiStudio.history.sample.bannerBadge":"Pratinjau riwayat perubahan Pro","uiStudio.history.sample.bannerTitle":"Pratinjau riwayat perubahan Pro","uiStudio.history.sample.bannerMessage":"Pratinjau ini menggunakan data sampel. Riwayat perubahan nyata, perbandingan sebelum/sesudah, dan penghapusan massal tersedia di Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Upgrade ke Pro untuk membuka riwayat lengkap","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Server MCP terhubung","toast.serverDisconnected":"Server MCP terputus","toast.pluginConnected":"Plugin terhubung","toast.pluginDisconnected":"Plugin terputus","toast.clearSuccess":"Berhasil dihapus","toast.clearFailed":"Gagal menghapus data","common.clear":"Hapus","settings.license.activate":"Aktifkan lisensi","settings.license.refresh":"Segarkan lisensi","settings.license.keyInput":"Kunci lisensi","settings.license.disconnected":"Terputus","settings.license.disconnected.tooltip":"Sambungkan ulang ke server MCP untuk mengelola lisensi dari WEPPY Dashboard.","settings.license.live.tooltip":"Tindakan lisensi langsung dikirim ke server MCP.","settings.license.status.activationRequired":"Aktivasi Diperlukan","settings.license.status.activationRequired.tooltip":"Aktivasi lisensi manual diperlukan sebelum WEPPY Dashboard dapat menyegarkan status ini.","settings.license.status.grace":"Masa Tenggang","settings.license.status.grace.tooltip":"Verifikasi penyedia sementara tidak tersedia, tetapi akses Pro tetap aktif selama masa tenggang.","settings.license.status.graceBilling.tooltip":"Akses Pro tetap tersedia selama masa tenggang terkait penagihan.","settings.license.detail.graceBilling":"Akses Pro tetap tersedia selama masa tenggang penagihan.","settings.license.detail.graceProviderUnavailable":"Penyedia tidak tersedia. Akses Pro tetap aktif selama mode tenggang.","settings.license.detail.manualActivation":"Aktivasi manual diperlukan untuk memulihkan akses Pro.","settings.license.detail.missingSessionToken":"Penyegaran diblokir karena token sesi saat ini tidak ada.","settings.license.detail.refreshRecommended":"Verifikasi lisensi harus segera disegarkan.","connection.agents.kill":"Hentikan","connection.agents.kill.title":"Hentikan agen?","connection.agents.killed":"Agen dihentikan","connection.agents.killFailed":"Gagal menghentikan agen","connection.agents.lastCommand":"Perintah Terakhir","connection.agents.lastCommand.tooltip":"Panggilan alat terbaru yang dijalankan oleh agen ini.","connection.agents.lastSeen":"Terakhir Terlihat","connection.agents.lastSeen.tooltip":"Heartbeat atau aktivitas terbaru dari agen ini.","connection.clear.title":"Hapus log koneksi?","connection.clear.message":"Tindakan ini menghapus secara permanen log koneksi yang tersimpan untuk proyek saat ini.","sync.clear.title":"Hapus log sinkronisasi?","sync.clear.message":"Tindakan ini menghapus secara permanen log sinkronisasi yang tersimpan untuk place saat ini.","playtest.clear.title":"Hapus riwayat tes?","playtest.clear.message":"Tindakan ini menghapus secara permanen laporan playtest yang tersimpan untuk place saat ini.","changelog.clear.title":"Hapus changelog?","changelog.clear.message":"Tindakan ini menghapus secara permanen changelog yang tersimpan untuk place saat ini.","sync.status.placePath":"Jalur Place","sync.status.placePath.tooltip":"Direktori place aktif tempat berkas explorer disinkronkan.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Area representatif","changelog.card.verification":"Verifikasi","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Arah desain brief yang digunakan untuk perubahan ini.","uiStudio.history.row.designCheck.tooltip":"Ringkasan saran Design Check setelah perubahan.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Saran Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Periksa lagi","uiStudio.actions.designCheckRunning":"Memeriksa saran...","uiStudio.actions.designCheckRunningDetail":"Jumlah item tinjau dahulu, disarankan, dan opsional akan ditampilkan setelah selesai.","uiStudio.actions.designCheckComplete":"Pemeriksaan saran selesai","uiStudio.actions.designCheckNoSnapshotSaved":"Tindakan ini tidak menyimpan file tangkapan layar baru.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Jumlah saran yang perlu ditinjau dahulu. Klik untuk detail.","uiStudio.gallery.priorityMediumBadge.tooltip":"Jumlah saran yang direkomendasikan.","uiStudio.priorityMedium":"Disarankan ditinjau","uiStudio.mediumPrioritySection":"Disarankan ditinjau","uiStudio.gallery.priorityLowBadge.tooltip":"Jumlah peningkatan opsional."},Bf={"sidebar.overview":"Übersicht","sidebar.changelog":"Änderungsprotokoll","sidebar.connection":"Verbindung","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Einstellungen","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP-Server-Verbindung erforderlich","sidebar.gate.l2":"Roblox Studio Plugin-Verbindung erforderlich","header.currentProject":"Aktuelles Projekt","header.unknownProject":"Unbekanntes Projekt","header.projectRoot.label":"Projektstamm","header.currentProject.loading":"Lade Projektstamm...","header.currentProject.unavailable":"Projektstamm nicht verfügbar","header.placeNotConnected":"Place nicht verbunden","header.currentProject.tooltip":"Aktuell ausgewählter Projektordner","header.currentProject.loading.tooltip":"Projektstamm-Informationen werden noch geladen","header.currentProject.unavailable.tooltip":"Aktuelle Projektstamm-Informationen sind nicht verfügbar","header.currentProjectSyncRoot.label":"Sync-Stamm","header.currentProjectSyncRoot.loading":"Lade Sync-Stamm...","header.currentProjectSyncRoot.unavailable":"Sync-Stamm nicht verfügbar","header.currentProjectSyncRoot.tooltip":"Aktueller Sync-Stamm-Ordner für das ausgewählte Projekt","header.currentProjectSyncRoot.loading.tooltip":"Sync-Stamm-Informationen werden noch geladen","header.currentProjectSyncRoot.unavailable.tooltip":"Aktuelle Sync-Stamm-Informationen sind nicht verfügbar","header.testFiles.label":"Testdateien","header.testFiles.unavailable":"Testdateien nicht verfügbar","header.testFiles.tooltip":"Aktuelles Playtest-Dateiverzeichnis für den ausgewählten Place","header.places.title":"Places","header.places.active":"Aktiv","header.places.inactive":"Inaktiv","header.places.pluginRequired":"Plugin-Verbindung erforderlich","header.places.liveRequired":"Plugin-Verbindung für Live Active Place erforderlich","header.place.tooltip":"Verbundener Roblox Place","header.placeNotConnected.tooltip":"Place nicht verbunden","header.changeProjectRoot":"Projektstamm ändern","header.changeProjectRoot.ariaLabel":"Projektstamm ändern","header.changeProjectRoot.tooltip":"Den aktuellen Projektstamm ändern","header.changeProjectRoot.disabledTooltip.l0":"MCP-Server-Verbindung erforderlich, bevor der Projektstamm geändert werden kann","header.changeProjectRoot.disabledTooltip.loading":"Projektstamm-Informationen werden noch geladen","header.changeProjectRoot.disabledTooltip.unavailable":"Aktuelle Projektstamm-Informationen sind nicht verfügbar","header.projectRootModal.initial.title":"Projektstamm ändern","header.projectRootModal.initial.body.connected":"Nachdem Sie einen Projektordner ausgewählt haben, wechselt MCP zum neuen Projektstamm und der aktuelle Studio-Inhalt wird vollständig in das neue <ausgewählter Projektordner>/weppy-project-sync-Ziel resynced.","header.projectRootModal.initial.body.disconnected":"Nachdem Sie einen Projektordner ausgewählt haben, wechselt MCP zum neuen Projektstamm und verwendet <ausgewählter Projektordner>/weppy-project-sync als nächstes Sync-Ziel.","header.projectRootModal.initial.nextSyncRoot":"Neues Sync-Ziel nach Auswahl","header.projectRootModal.initial.nextSyncRoot.placeholder":"<ausgewählter Projektordner>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Aktueller Sync wird sofort gestoppt.","header.projectRootModal.initial.warningFreshSync":"Der aktuelle Studio-Inhalt wird verwendet, um einen neuen Full-Sync im neuen Ziel zu erstellen.","header.projectRootModal.initial.warningNoMove":"Alte Sync-Ordner werden nicht automatisch verschoben.","header.projectRootModal.initial.warningDeferredSync":"Wenn Studio nicht verbunden ist, startet der Full Resync beim nächsten Verbinden des Plugins.","header.projectRootModal.confirm.title":"Neuen Projektstamm bestätigen","header.projectRootModal.confirm.body":"Überprüfen Sie den ausgewählten Projektordner, bevor Sie ihn anwenden.","header.projectRootModal.confirm.projectRoot":"Ausgewählter Projektordner","header.projectRootModal.confirm.syncRoot":"Neues Sync-Ziel","header.projectRootModal.confirm.warningNoMove":"Bestehende Sync-Ordner werden nicht automatisch verschoben.","header.projectRootModal.pick":"Ordner auswählen","header.projectRootModal.apply":"Änderung anwenden","header.projectRootModal.cancel":"Abbrechen","header.projectRootModal.error":"Projektstamm-Änderung fehlgeschlagen","status.online":"Online","status.offline":"Offline","status.idle":"Inaktiv","status.syncing":"Synchronisiere","status.error":"Fehler","status.initializing":"Initialisiere","level.l0.title":"Server getrennt","level.l0.message":"WEPPY Dashboard wurde geöffnet, aber der MCP-Server wurde gestoppt oder antwortet nicht.","level.l1.title":"Server verbunden","level.l1.hint":"Prüfen: Läuft Roblox Studio? Ist das Plugin installiert?","level.l2.ok":"Studio verbunden","tier.basic":"Basic","tier.basic.tooltip":"Basic-Tier mit dem Standard-Funktionsumfang des WEPPY Dashboards.","tier.pro":"Pro","tier.pro.tooltip":"Pro-Tier mit dem vollständigen Funktionsumfang des WEPPY Dashboards.","tier.mixed":"Gemischt","tier.upgrade":"Upgrade auf Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Sparen Sie KI-Token mit Pro!","tier.comparison.comingSoon":"Basic vs Pro Vergleich — in Kürze verfügbar","tier.comparison.close":"Schließen","tier.comparison.detailTitle":"Detaillierter Tool-Katalog","tier.comparison.description":"Beschreibung","tier.comparison.basic.core":"Kern-MCP-Workflow","tier.comparison.basic.core.item1":"Skript erstellen/bearbeiten","tier.comparison.basic.core.item2":"Instanzverwaltung","tier.comparison.basic.core.item3":"Eigenschaftensteuerung","tier.comparison.basic.core.item4":"Auswahl und Suche","tier.comparison.basic.core.item5":"Tag-Verwaltung","tier.comparison.basic.core.item6":"Kamerasteuerung","tier.comparison.basic.core.item7":"Protokollüberwachung","tier.comparison.basic.sync":"Sync (Basic)","tier.comparison.basic.sync.item1":"Studio zu Lokal Einweg-Sync","tier.comparison.basic.sync.item2":"Manuelles Anwenden als Standard","tier.comparison.pro.all":"Alles aus Basic, plus","tier.comparison.pro.sync":"Erweiterter Sync-Workflow","tier.comparison.pro.sync.item1":"Sync-Richtung pro Typ","tier.comparison.pro.sync.item2":"Apply-Modus pro Typ","tier.comparison.pro.sync.item3":"Bidirektionaler und Reverse-Sync","tier.comparison.pro.sync.item4":"Full Sync, Resync und Push to Studio","tier.comparison.pro.sync.item5":"Multi-Place-Sync","tier.comparison.pro.playtest":"Playtest-Steuerung","tier.comparison.pro.playtest.item1":"Play, Stop, Pause und Resume","tier.comparison.pro.playtest.item2":"Playtest-Statusinspektion","tier.comparison.pro.playtest.item3":"Automatisierte Testausführung","tier.comparison.pro.creation":"Erweiterter Erstellungs-Workflow","tier.comparison.pro.creation.item1":"Massenoperationen","tier.comparison.pro.creation.item2":"Terrain-Generierung","tier.comparison.pro.creation.item3":"Asset-Suche und -Einfügen","tier.comparison.pro.creation.item4":"Raycast und räumliche Analyse","tier.comparison.pro.creation.item5":"Umgebungssteuerung","tier.comparison.pro.ui":"KI-UI-Design (UI Studio)","tier.comparison.pro.ui.item1":"design_brief — geführte Erfassung von UI-Anforderungen","tier.comparison.pro.ui.item2":"create_tree / update / delete — UI-Hierarchie erstellen und bearbeiten","tier.comparison.pro.ui.item3":"preview — Screenshots der aktuellen UI aufnehmen","tier.comparison.pro.ui.item4":"Design Check — Touch-Ziele, Kontrast und Sicherheitszonen prüfen","tier.comparison.discount.label":"🎁 Geben Sie diesen Code beim Gumroad-Checkout für einen Rabatt ein:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Gültig bis 30. April","tier.promo.discount.hint":"🎁 Code WEPPY-MCP bei Gumroad verwenden · Gültig bis 30. April","tier.promo.discount.context":"🎁 Beim Gumroad-Checkout eingeben:","tier.tool.query_instances.desc":"Inspizieren Sie Instanzen, durchsuchen Sie Children und Descendants und prüfen Sie Klasseninformationen. Pro fügt File Tree, Projektstruktur sowie Eigenschafts- oder Tag-Suche hinzu.","tier.tool.mutate_instances.desc":"Erstellen, löschen, klonen und verschieben Sie Instanzen. Pro fügt Tree-Erstellung und Massenerstellung, -löschung oder -klonierung hinzu.","tier.tool.manage_properties.desc":"Lesen und setzen Sie Eigenschaften, Attribute und Tags. Pro fügt berechnete Updates, relative Änderungen und Massen-Eigenschaftsoperationen hinzu.","tier.tool.manage_scripts.desc":"Lesen, schreiben, erstellen, löschen, bearbeiten und durchsuchen Sie Skript-Quelltext. Pro fügt Massenersetzung über mehrere Skripte hinzu.","tier.tool.manage_lighting.desc":"Nur Pro. Konfigurieren Sie Beleuchtung, Atmosphäre, Himmel, Terrain-Eigenschaften und Tageszeit-Einstellungen.","tier.tool.manage_selection.desc":"Lesen, setzen und löschen Sie die aktuelle Studio-Auswahl. Pro fügt Kontext, Details, Hinzufügen oder Entfernen sowie Auswahl-Watch-Unterstützung hinzu.","tier.tool.manage_camera.desc":"Inspizieren Sie Kamerastatus, fokussieren Sie nach Pfad oder Position und fordern Sie vorgeschlagene Ansichten an.","tier.tool.manage_tween.desc":"Nur Pro. Erstellen, abspielen, pausieren und abbrechen von Tweens für sanfte Animationen.","tier.tool.manage_audio.desc":"Nur Pro. Sounds abspielen, stoppen, pausieren und fortsetzen sowie den Audio-Listener konfigurieren.","tier.tool.manage_animation.desc":"Nur Pro. Animationen laden, abspielen und stoppen sowie aktive Animationstracks inspizieren.","tier.tool.manage_physics.desc":"Nur Pro. Kollisionsgruppen registrieren, Gruppenkollisionen konfigurieren und verfügbare Gruppen inspizieren.","tier.tool.manage_effects.desc":"Nur Pro. Partikel emittieren, Effekte löschen und Effektstatus umschalten.","tier.tool.manage_terrain.desc":"Nur Pro. Terrain-Formen füllen, Regionen löschen, Materialien ersetzen, Terrain-Farben verwalten, Voxel lesen oder schreiben, Terrain generieren und Terrain glätten.","tier.tool.spatial_query.desc":"Nur Pro. Raycasts ausführen, Boden finden, Platzierung validieren, Bereiche scannen, nach flachen oder Spawn-Positionen suchen, Begehbarkeit analysieren, Raum kartieren und Kollisionen inspizieren.","tier.tool.manage_assets.desc":"Nur Pro. Modelle einfügen, Asset-Informationen inspizieren, im Creator Store suchen, freie Assets oder Pakete einfügen und Assets exportieren.","tier.tool.manage_sync.desc":"Nur Pro. Sync-Status, -Konfiguration, -Verlauf, -Richtungen inspizieren und synchronisierte Dateien lesen oder schreiben.","tier.tool.workspace_state.desc":"Nur Pro. Full Sync ausführen, Screenshots erfassen, kürzliche Änderungen und Viewport-Status inspizieren und zugehörige Metadaten verwalten.","tier.tool.manage_logs.desc":"Inspizieren Sie Output-Logs mit Filterung, inkrementellem Polling, Buffer-Löschung und kürzlicher Fehlersuche.","tier.tool.system_info.desc":"Verbindungsstatus und aktuellen Tier inspizieren. Pro fügt Place-Info, Services, Studio-Einstellungen, Playtest-Steuerung und automatisierte Tests hinzu.","tier.tool.batch_execute.desc":"Nur Pro. Mehrere Befehle in einem Batch ausführen, mit sequentieller Ausführung und optionalem Continue-on-Error-Verhalten.","tier.tool.execute_luau.desc":"Nur Pro. Beliebigen Luau-Code in der Roblox Studio Sandbox ausführen.","connection.server.title":"Serverstatus","connection.server.version":"Version","connection.server.version.tooltip":"Installierte MCP-Server-Version","connection.server.pid":"PID","connection.server.pid.tooltip":"Betriebssystem-Prozesskennung","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Verstrichene Zeit seit dem Start des MCP-Servers","connection.server.session":"Session","connection.server.session.tooltip":"Aktuelle MCP-Session-Kennung","connection.server.exec":"Exec","connection.server.exec.tooltip":"Ausführungspfad zum Starten des MCP-Servers","connection.reconnect":"Erneut verbinden","connection.checkSettings":"Einstellungen prüfen","connection.agents.title":"KI-Agenten","connection.agents.name":"Agent","connection.agents.cwd":"Arbeitsverzeichnis","connection.agents.cwd.tooltip":"Aktuelles Arbeitsverzeichnis für den verbundenen KI-Agent","connection.agents.projectRoot":"Projektstamm","connection.agents.projectRoot.tooltip":"Maßgeblicher Projektstamm für die Sync-Eigentümerschaft","connection.agents.projectRoot.unresolved":"Nicht aufgelöst","connection.agents.connected":"Verbunden","connection.agents.unknown":"Unbekannt","connection.agents.none":"Keine Agenten verbunden","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Client-ID","connection.plugins.clientId.tooltip":"Eindeutige Plugin-Client-Kennung für diese Studio-Verbindung","connection.plugins.lastSeen":"Zuletzt gesehen","connection.plugins.lastSeen.tooltip":"Zuletzt empfangener Heartbeat vom Plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Vom Studio gemeldete installierte Plugin-Version","connection.plugins.none":"Keine Plugins verbunden","connection.log.title":"Verbindungsprotokoll","connection.log.empty":"Noch keine Ereignisse","connection.time.secondsAgo":"s","connection.time.minutesAgo":"min","connection.time.hoursAgo":"Std","common.loading":"Lade...","common.retry":"Wiederholen","common.reconnecting":"Verbinde erneut...","common.expand":"Ausklappen","common.collapse":"Einklappen","tools.tab.history":"Verlauf","tools.tab.statistics":"Statistik","tools.tab.failures":"Fehler","tools.col.time":"Zeit","tools.col.time.tooltip":"Wann der Tool-Lauf aufgezeichnet wurde.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Name des Tools und ausgeführte Action.","tools.col.duration":"Dauer","tools.col.duration.tooltip":"Wie lange das Tool zum Beenden brauchte.","tools.col.status":"Status","tools.col.status.tooltip":"Ergebnis des aufgezeichneten Tool-Laufs.","tools.col.tier":"Tier","tools.col.tier.tooltip":"Erforderlicher Lizenz-Tier für das Tool oder die Action.","tools.col.tierStats.tooltip":"Basic-, Pro- oder Mixed-Zusammenfassung für die Statistikzeile.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Konsolidierter Tool-Name in der Statistiktabelle.","tools.col.calls":"Aufrufe","tools.col.calls.tooltip":"Gesamtzahl der aufgezeichneten Aufrufe für dieses Tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Anzahl direkt erfolgreicher Läufe.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Anzahl der Läufe, die durch Fallback-Ausführung erfolgreich waren.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Anzahl blockierter Läufe ohne Fallback-Ausführung.","tools.col.err":"FAILED","tools.col.err.tooltip":"Anzahl fehlgeschlagener Läufe.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Prozentsatz der erfolgreich abgeschlossenen Aufrufe.","tools.col.avgTime":"Durchschnittszeit","tools.col.avgTime.tooltip":"Durchschnittliche Ausführungszeit über alle aufgezeichneten Aufrufe.","tools.col.error":"Fehler","tools.filter.tool":"Tool","tools.filter.all":"Alle","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Dieser Eintrag verwendete ein Pro-exklusives Tool oder eine Action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"Die angeforderte Pro-Action wurde über einen Basic-Fallback erfolgreich ausgeführt.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"Die angeforderte Pro-Action wurde blockiert und kein Fallback wurde ausgeführt.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"Der Tool-Lauf ist fehlgeschlagen.","tools.status.ok":"OK","tools.status.ok.tooltip":"Der Tool-Lauf wurde erfolgreich abgeschlossen.","tools.tier.mixed.tooltip":"Dieses Tool enthält sowohl Basic- als auch Pro-Actions.","tools.detail.params":"Parameter","tools.detail.params.tooltip":"Eingabeparameter, die an diesen Tool-Lauf übergeben wurden.","tools.detail.result":"Ergebnis","tools.detail.result.tooltip":"Zurückgegebenes Ergebnis-Payload für diesen Tool-Lauf.","tools.detail.requestedCommand":"Gesendeter Befehl","tools.detail.executedCommand":"Ausgeführter Befehl","tools.detail.alternatives":"Alternativen","tools.detail.blockedMessage":"Blockierungsgrund","tools.detail.noFallback":"Kein Fallback","tools.detail.noFallback.value":"Kein Fallback ausgeführt.","tools.detail.errorMessage":"Fehlermeldung","tools.clear.history.title":"Verlauf löschen?","tools.clear.history.message":"Dies entfernt den aktuellen Place-Tools-Verlauf dauerhaft.","tools.clear.statistics.title":"Statistik löschen?","tools.clear.statistics.message":"Dies setzt die aktuelle Place-Tool-Statistik dauerhaft zurück.","tools.detail.error":"Fehler","tools.page.prev":"Zurück","tools.page.prev.tooltip":"Zur vorherigen Seite der Tool-Verlaufsergebnisse.","tools.page.next":"Weiter","tools.page.next.tooltip":"Zur nächsten Seite der Tool-Verlaufsergebnisse.","tools.empty.history":"Keine Verlaufseinträge","tools.empty.stats":"Keine Tool-Statistik","tools.empty.failures":"Keine Fehler","tools.summary.total":"Gesamt","tools.summary.calls":"Aufrufe","tools.summary.sessions":"Sessions","settings.license.title":"Lizenz","settings.license.title.tooltip":"Aktueller Lizenzstatus und Abonnement-Tier.","settings.license.status":"Status","settings.license.status.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Aktueller Abonnement-Tier für verfügbare WEPPY Dashboard-Funktionen.","settings.license.key":"Schlüssel","settings.license.key.tooltip":"Maskierter Lizenzschlüssel, der derzeit vom Server geladen ist.","settings.license.keyValue.tooltip":"Maskierter Lizenzschlüssel, der derzeit vom Server geladen ist.","settings.license.provider":"Anbieter","settings.license.provider.tooltip":"Lizenzanbieter zur Validierung dieses Schlüssels.","settings.license.providerValue.tooltip":"Lizenzanbieter zur Validierung dieses Schlüssels.","settings.license.active":"Aktiv","settings.license.active.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.status.activeCancelPending.tooltip":"Kündigung steht aus, aber Pro-Zugang bleibt bis zum Ende der aktuellen Abrechnungsperiode aktiv.","settings.license.inactive":"Inaktiv","settings.license.inactive.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.expired":"Abgelaufen","settings.license.expired.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.unavailable":"Lizenzinformationen nicht verfügbar","settings.license.detail.cancelPending":"Kündigung ist geplant. Pro-Zugang bleibt bis zum Ende der aktuellen Abrechnungsperiode aktiv.","settings.license.reset":"Lizenz zurücksetzen","settings.readOnly":"Schreibgeschützt","settings.readOnly.tooltip":"Dieser Abschnitt zeigt Werte, die nicht über das WEPPY Dashboard bearbeitet werden können.","settings.unavailable":"Einstellungen nicht verfügbar","settings.general.title":"Allgemeine Einstellungen","settings.general.title.tooltip":"Hot-Settings, die sofort beim Ändern angewendet werden.","settings.general.liveApply":"Live anwenden","settings.general.liveApply.tooltip":"Änderungen in diesem Abschnitt werden sofort ohne separate Speichern-Schaltfläche angewendet.","settings.general.applied":"Angewendet","settings.general.logLevel":"Log-Level","settings.general.logLevel.tooltip":"Legt fest, wie detailliert das WEPPY Dashboard in seine Logs schreibt.","settings.general.localHistory":"Tool-Verlaufsaufzeichnung","settings.general.localHistory.tooltip":"Speichert lokalen Tool-Ausführungsverlauf für die WEPPY Dashboard-Verlaufsansichten.","settings.general.localStatistics":"Tool-Statistiksammlung","settings.general.localStatistics.tooltip":"Aggregiert lokale Nutzungsstatistiken für WEPPY Dashboard-Berichte.","settings.general.contextCapture":"Kontext-Erfassung","settings.general.contextCapture.tooltip":"Wenn aktiviert, zeichnet das WEPPY Dashboard strukturierte Ausführungskontexte für Changelog- und Playtest-Ansichten auf.","settings.general.requestTimeout":"Aktions-Timeout","settings.general.requestTimeout.tooltip":"Maximale Wartezeit des WEPPY Dashboards auf eine Aktion, bevor sie fehlschlägt.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Aktions-Timeout wird in Millisekunden gemessen.","settings.cold.title":"Server-Umgebung","settings.cold.title.tooltip":"Schreibgeschützte Server-Umgebungswerte, die beim Start geladen werden.","settings.cold.httpPort.tooltip":"Portnummer, die vom MCP WEPPY Dashboard HTTP-Server verwendet wird.","settings.cold.httpHost.tooltip":"Host-Schnittstelle, an die sich der MCP WEPPY Dashboard HTTP-Server bindet.","settings.cold.dashboardAutoOpen.tooltip":"Steuert, ob das WEPPY Dashboard beim Start des Servers automatisch im Browser geöffnet wird.","settings.cold.dashboardAutoOpen.value.tooltip":"Aktuelles Startverhalten zum Öffnen des WEPPY Dashboards in einem Browser.","settings.cold.hint":"Über Umgebungsvariablen setzen, um diese Werte zu ändern.","settings.language.title":"Sprache","settings.language.title.tooltip":"Wählen Sie, wie der WEPPY Dashboard-Oberflächentext lokalisiert wird.","settings.language.dashboard":"WEPPY Dashboard-Sprache","settings.language.dashboard.tooltip":"Überschreibt die WEPPY Dashboard-Sprache oder folgt der Systemsprache, wenn auf Auto eingestellt.","settings.language.auto":"Auto","overview.l0.title":"MCP-Server getrennt","overview.l0.message":"Der MCP-Server antwortet nicht. Das WEPPY Dashboard versucht automatisch, die Verbindung wiederherzustellen.","overview.l0.step1":"Prüfen Sie, ob der MCP-Server-Prozess läuft","overview.l0.step2":"Starten Sie den MCP-Server-Befehl bei Bedarf neu","overview.l0.reconnecting":"Automatische Wiederverbindung alle 3s...","overview.l0.reconnectBtn":"Erneut verbinden","overview.l0.settingsBtn":"Einstellungen prüfen","overview.l1.pluginGuide":"Roblox Studio Plugin ist nicht verbunden","overview.l1.check1":"Läuft Roblox Studio?","overview.l1.check2":"Ist das WEPPY Plugin installiert?","overview.l1.feedHint":"Änderungen erscheinen hier, sobald das Plugin verbunden ist","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP-Server-Laufzeit und Prozessstatus","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio Plugin-Verbindungs- und Versionsstatus","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Verbundene KI-Coding-Agenten und ihr Laufzeitstatus","overview.metric.agent.instancesUnit":"Instanzen","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Aktuelle Studio-zu-Lokal-Sync-Aktivität","overview.metric.noAgent":"Kein Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installierte MCP-Server-Version","overview.meta.session":"Session","overview.meta.session.tooltip":"Aktuelle MCP-Session-Kennung","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Betriebssystem-Prozesskennung","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Verstrichene Zeit seit dem Start des MCP-Servers","overview.feed.title":"Letzte Spieländerungen","overview.feed.empty":"Keine kürzlichen Änderungen","overview.changelog.title":"Session-Änderungszusammenfassung","overview.changelog.entries":"Gesamt","overview.changelog.scripts":"Skripte","overview.changelog.instances":"Instanzen","overview.changelog.properties":"Eigenschaften","overview.changelog.assets":"Assets","overview.tier.title":"Tier-Nutzung","changelog.subtitle":"Spieländerungsverlauf","changelog.filter.all":"Alle","changelog.filter.active":"Aktiv","changelog.filter.completed":"Abgeschlossen","changelog.empty":"Noch keine Changelog-Einträge","changelog.basic.limit.title":"Basic-Vorschau zeigt die letzten 3 Sessions","changelog.basic.limit.body":"Upgraden Sie auf Pro, um die vollständige Changelog-Timeline für diesen Place zu durchsuchen.","changelog.basic.metricLabel":"Sichtbares Changelog / Gesamt","changelog.basic.visible":"sichtbar","changelog.basic.total":"gesamt","changelog.card.active":"Aktiv","changelog.card.active.tooltip":"Diese Session empfängt noch neue Spieländerungen.","changelog.card.completed":"Abgeschlossen","changelog.card.completed.tooltip":"Diese Session ist beendet und es werden keine weiteren Änderungen erwartet.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"Diese Session enthält nur den anfänglichen Sync-Bootstrap-Snapshot.","changelog.card.inProgress":"in Bearbeitung","changelog.card.noChanges":"Noch keine Änderungen","changelog.card.noChanges.tooltip":"Für diese Session wurden noch keine Spieländerungen extrahiert.","changelog.card.bootstrapSummary":"Anfänglicher Sync-Snapshot","changelog.card.bootstrapSummary.tooltip":"Anfängliche Datei-Sync-Schreibvorgänge werden zu einer einzigen Bootstrap-Snapshot-Zeile zusammengefasst.","changelog.card.sessionIntent":"Session-Absicht","changelog.card.scripts":"Skripte","changelog.card.scripts.tooltip":"In dieser Session vorgenommene Skript-Änderungen.","changelog.card.instances":"Instanzen","changelog.card.instances.tooltip":"Instanz-Erstellungs-, Lösch-, Verschiebe- oder Klonänderungen in dieser Session.","changelog.card.modified":"geändert","changelog.card.created":"erstellt","changelog.card.deleted":"gelöscht","changelog.card.moved":"verschoben","changelog.card.propertiesChanged":"Eigenschaften geändert","changelog.card.propertiesChanged.tooltip":"Für diese Session aufgezeichnete Eigenschaftswertänderungen.","changelog.card.lightingConfigured":"Beleuchtung konfiguriert","changelog.card.lightingConfigured.tooltip":"Beleuchtungs- oder Atmosphäreneinstellungen wurden in dieser Session geändert.","changelog.card.terrainConfigured":"Terrain konfiguriert","changelog.card.terrainConfigured.tooltip":"Terrain-Daten oder Terrain-Einstellungen wurden in dieser Session geändert.","changelog.card.assetsInserted":"Assets eingefügt","changelog.card.assetsInserted.tooltip":"In dieser Session in den Place eingefügte Assets.","changelog.category.script":"Skripte","changelog.category.instance":"Instanzen","changelog.category.property":"Eigenschaften","changelog.category.lighting":"Beleuchtung","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Änderungszusammenfassung","changelog.detail.changeSummary.tooltip":"Anzahl der extrahierten Spieländerungen, gruppiert nach Kategorie für diese Session.","changelog.detail.changeTimeline":"Änderungs-Timeline","changelog.detail.changeTimeline.tooltip":"Chronologische Liste der extrahierten Spieländerungen für diese Session.","changelog.detail.context.title":"Kontextzusammenfassung","changelog.detail.context.tooltip":"Strukturierter Ausführungskontext, der für diese Changelog-Session erfasst wurde.","changelog.detail.verification.title":"Verifikation","changelog.detail.verification.tooltip":"Mit dieser Changelog-Session verknüpfte Verifikationssignale.","changelog.detail.verification.label":"Ergebnis","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Aufgezeichnet am","changelog.detail.beforeAfter":"Vorher & Nachher","changelog.detail.filterCategory":"Kategorie","changelog.detail.filterCategory.tooltip":"Filtert die Timeline nach einer einzigen Änderungskategorie.","changelog.detail.confidence.exact":"Exakt","changelog.detail.confidence.exact.tooltip":"Sowohl der Vorher- als auch der Nachher-Zustand wurden für diese Änderung bestätigt.","changelog.detail.confidence.partial":"Teilweise","changelog.detail.confidence.partial.tooltip":"Nur ein Teil des Vorher- und Nachher-Zustands konnte für diese Änderung bestätigt werden.","changelog.detail.confidence.afterOnly":"Nur nachher","changelog.detail.confidence.afterOnly.tooltip":"Nur der resultierende Zustand nach der Änderung konnte bestätigt werden.","changelog.detail.confidence.intentOnly":"Nur Absicht","changelog.detail.confidence.intentOnly.tooltip":"Nur die angeforderte Aktion wurde aufgezeichnet, nicht der resultierende Zustand.","changelog.detail.confidence.unknown":"Unbekannt","changelog.detail.confidence.unknown.tooltip":"Diese Änderung konnte aus den verfügbaren Daten nicht zuverlässig klassifiziert werden.","changelog.detail.noChanges":"Keine Änderungen in dieser Kategorie","changelog.detail.backToList":"Zurück zur Liste","changelog.diff.empty":"Kein Diff verfügbar","changelog.diff.unified":"Vereinheitlicht","changelog.diff.sideBySide":"Nebeneinander","changelog.diff.before":"Vorher","changelog.diff.after":"Nachher","sync.overlay.title":"Roblox Studio Plugin erforderlich","sync.overlay.message":"Sync-Status ist verfügbar, sobald das Roblox Studio Plugin verbunden ist.","sync.overlay.check1":"Läuft Roblox Studio?","sync.overlay.check2":"Ist das WEPPY Plugin installiert?","sync.status.title":"Sync-Status","sync.status.title.tooltip":"Aktueller Studio- und lokaler Datei-Sync-Status für diesen Place.","sync.status.forwardOnly":"Nur vorwärts","sync.status.forwardOnly.tooltip":"Basic-Tier erlaubt nur Studio-zu-Lokal-Vorwärts-Sync.","sync.status.place":"Place","sync.status.place.tooltip":"Verbundener Roblox Place-Name und Place-ID.","sync.status.path":"Pfad","sync.status.path.tooltip":"Lokaler Dateisystem-Stamm, der derzeit für die Sync-Ausgabe verwendet wird.","sync.status.instances":"Instanzen","sync.status.instances.tooltip":"Gesamtzahl synchronisierter Roblox-Instanzen, die im lokalen Spiegel verfolgt werden.","sync.status.scripts":"Skripte","sync.status.scripts.tooltip":"Gesamtzahl synchronisierter Skript-Dateien, die derzeit für diesen Place indiziert sind.","sync.status.state":"Status","sync.status.state.tooltip":"Aktueller Laufzeit-Sync-Status, der vom Server gemeldet wird.","sync.directions.title":"Sync-Richtungen","sync.directions.title.tooltip":"Sync-Richtung pro Kategorie und Apply-Verhalten zwischen Lokal und Studio.","sync.directions.type":"Typ","sync.directions.type.tooltip":"Sync-Kategorie, die von dieser Regel betroffen ist.","sync.directions.direction":"Richtung","sync.directions.direction.tooltip":"Ob jede Kategorie von Studio, zu Studio oder in beide Richtungen synchronisiert.","sync.directions.applyMode":"Apply-Modus","sync.directions.applyMode.tooltip":"Wie eingehende Sync-Änderungen für diese Kategorie angewendet werden.","sync.directions.cat.scripts":"Skripte","sync.directions.cat.values":"Werte","sync.directions.cat.containers":"Container","sync.directions.cat.data":"Daten","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Lokal","sync.directions.endpoint.local.tooltip":"Lokale Dateien auf der Festplatte werden immer auf der linken Seite der Richtungsschiene angezeigt.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio wird immer auf der rechten Seite der Richtungsschiene angezeigt.","sync.directions.mode.manual":"Manuell","sync.directions.mode.manual.tooltip":"Wendet Sync-Änderungen nur an, wenn Sie sie manuell auslösen.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Wendet Sync-Änderungen automatisch an, wenn Updates eintreffen.","sync.directions.tooltip.forward.body":"Studio-Änderungen werden nur in lokale Dateien synchronisiert","sync.directions.tooltip.bidirectional.body":"Zwei-Wege-Sync zwischen Lokal und Studio","sync.directions.tooltip.reverse.body":"Lokale Dateiänderungen zu Studio pushen","sync.directions.tooltip.proRequired":"Pro im Basic-Tier erforderlich","sync.directions.dir.forward":"vorwärts","sync.directions.dir.bidirectional":"bidirektional","sync.directions.dir.reverse":"reverse","sync.log.title":"Sync-Protokoll","sync.log.empty":"Noch keine Sync-Ereignisse","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"Eine neue Sync-Ausgabe wurde auf die Festplatte geschrieben.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"Eine bestehende synchronisierte Datei oder Instanz wurde aktualisiert.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"Eine synchronisierte Datei oder Instanz wurde entfernt.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Ein Sync-Ereignis wurde ohne Dateimutation aufgezeichnet.","sync.upgrade.title":"Vollständigen Sync mit Pro freischalten","sync.upgrade.benefit1":"Bidirektionaler Sync — Dateien bearbeiten, automatisch auf Studio anwenden","sync.upgrade.benefit2":"Reverse-Sync — Dateiänderungen zurück zu Studio pushen","sync.upgrade.benefit3":"Vollständiger Sync-Verlauf und detailliertes Änderungsprotokoll","sync.upgrade.buy":"Upgrade auf Pro","playtest.status.title":"Playtest-Status","playtest.status.title.tooltip":"Aktueller Roblox Playtest-Sessionstatus, der von Studio gemeldet wird.","playtest.status.mode":"Modus","playtest.status.mode.tooltip":"Studio-Playtest-Startmodus für die aktuelle Session.","playtest.status.mode.value.tooltip":"Spezifischer Roblox Studio Playtest-Modus, der derzeit verwendet wird.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox Place, der derzeit mit dieser Playtest-Session verknüpft ist.","playtest.status.state.running":"Läuft","playtest.status.state.running.tooltip":"Eine Roblox Playtest-Session läuft derzeit.","playtest.status.state.paused":"Pausiert","playtest.status.state.paused.tooltip":"Die aktuelle Roblox Playtest-Session ist pausiert.","playtest.status.state.notRunning":"Läuft nicht","playtest.status.state.notRunning.tooltip":"Es läuft derzeit keine Roblox Playtest-Session.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Testverlauf","playtest.history.title.tooltip":"Aufgezeichnete automatisierte Playtest-Läufe für dieses Projekt.","playtest.history.empty":"Noch keine Testergebnisse","playtest.history.mode":"Modus","playtest.history.mode.tooltip":"Playtest-Modus, der für diesen aufgezeichneten Testlauf verwendet wurde.","playtest.history.status.passed":"Bestanden","playtest.history.status.failed":"Fehlgeschlagen","playtest.history.status.running":"Läuft","playtest.history.status.unknown":"Unbekannt","playtest.history.status.tooltip":"Aufgezeichneter Ergebnisstatus für diesen automatisierten Playtest-Lauf.","playtest.empty.title":"Noch keine Playtest-Ergebnisse","playtest.empty.message":"Testergebnisse erscheinen hier, wenn der KI-Agent automatisierte Tests über system_info.run_test ausführt.","playtest.empty.message.before":"Testergebnisse erscheinen hier, wenn der KI-Agent automatisierte Tests ausführt über","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"WEPPY Dashboard Automatisierungs-Einstiegspunkt, der Roblox-Playtest-Prüfungen über das system_info-Tool ausführt.","playtest.report.title":"Ausgewählter Bericht","playtest.report.title.tooltip":"Detaillierte Ausgabe für den derzeit ausgewählten automatisierten Playtest-Lauf.","playtest.report.content":"Bericht","playtest.report.content.tooltip":"Markdown-Zusammenfassung für den ausgewählten automatisierten Playtest-Lauf.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Ausführungs-Logs, die für den ausgewählten automatisierten Playtest-Lauf erfasst wurden.","playtest.context.contextId":"Kontext-ID","playtest.context.why":"Warum dieser Test ausgeführt wurde","playtest.context.expected":"Erwartet","playtest.context.observed":"Beobachtet","playtest.report.empty":"Kein Berichtsinhalt verfügbar","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest ist eine Pro-exklusive Funktion","playtest.basic.desc":"Steuern Sie Playtesting vom WEPPY Dashboard aus, führen Sie automatisierte Tests aus und sehen Sie detaillierte Testberichte.","playtest.basic.benefit1":"Ein-Klick-Play/Pause/Stop-Steuerung","playtest.basic.benefit2":"Automatisierte Testausführung über KI-Agent","playtest.basic.benefit3":"Testverlauf mit Bestanden/Fehlgeschlagen-Verfolgung","playtest.basic.benefit4":"Detaillierte Markdown-Testberichte","playtest.sample.badge":"Vorschau der Pro-Playtest-Ansicht","playtest.sample.title":"Sie sehen eine Vorschau des Playtest-Bildschirms, der nach dem Upgrade auf Pro verfügbar wird.","playtest.sample.message":"Diese Vorschau verwendet Beispieldaten. Live-Playtest-Steuerung, Verlaufsverwaltung und echte Berichte werden mit Pro freigeschaltet.","playtest.sample.clearDisabled":"Upgraden Sie auf Pro, um den Live-Playtest-Verlauf zu löschen.","playtest.sample.place":"Arena-Vorschau","playtest.sample.history.name":"Beispiel-Arena-Smoke-Test","playtest.sample.context.why":"In die Arena spawnen, den Eröffnungsangriff überleben und prüfen, ob das HUD sofort reagiert.","playtest.sample.context.expected":"Der Spieler spawnt sicher, die Countdown-UI erscheint innerhalb einer Sekunde und die erste Welle startet ohne Fehler.","playtest.sample.context.observed":"Spawn-Schutz hielt, das HUD wurde rechtzeitig aktualisiert und Welle eins wurde ohne Gameplay-Regressionen abgeschlossen.","playtest.sample.report.markdown":`# Beispiel-Arena-Smoke-Test
129
+ [sample] laporan pratinjau selesai`,"sidebar.whatsNew":"Yang Baru","sidebar.help.group":"Bantuan & Umpan Balik","sidebar.help.bug":"Laporkan bug","sidebar.help.bug.tooltip":"Buka laporan bug di GitHub dengan data lingkungan terisi otomatis","sidebar.help.feature":"Sarankan fitur baru","sidebar.help.feature.tooltip":"Sarankan fitur baru atau peningkatan di GitHub","sidebar.help.discussions":"Komunitas","sidebar.help.discussions.tooltip":"Ajukan pertanyaan dan bagikan ide di GitHub Discussions","sidebar.help.troubleshooting":"Pemecahan masalah","sidebar.help.troubleshooting.tooltip":"Buka panduan pemecahan masalah resmi di weppyai.com","header.whatsNew":"Yang Baru","header.whatsNew.tooltip":"Yang Baru","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Yang Baru","whatsNew.pageSubtitle":"Tetap update dengan perubahan MCP","whatsNew.unreadSection":"Belum Dibaca","whatsNew.allSection":"Semua Pengumuman","whatsNew.empty":"Belum ada pengumuman","whatsNew.newBadge":"BARU","whatsNew.category.release":"Rilis","whatsNew.category.notice":"Pemberitahuan","whatsNew.category.deprecation":"Tidak Digunakan","whatsNew.category.tip":"Tips","uiStudio.title":"UI Studio","uiStudio.empty":"Belum ada tangkapan layar tersimpan. Ini dibuat otomatis saat agen AI menangkap status UI saat ini.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Plugin Roblox Studio belum terhubung","uiStudio.pluginGuide.message":"UI Studio menampilkan tangkapan layar dan riwayat perubahan dari place Studio yang terhubung. Ini akan diperbarui otomatis setelah Studio dan WEPPY Plugin terhubung.","uiStudio.pluginGuide.check1":"Apakah Roblox Studio sedang berjalan?","uiStudio.pluginGuide.check2":"Apakah WEPPY Plugin terpasang dan berjalan?","uiStudio.pluginGuide.waiting":"Menunggu koneksi plugin...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Tinjau dahulu","uiStudio.priorityLow":"Peningkatan opsional","uiStudio.highPrioritySection":"Tinjau dahulu","uiStudio.lowPrioritySection":"Peningkatan opsional","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analisis","uiStudio.tabs.history":"Riwayat","uiStudio.analysis.reportsTitle":"Analisis Terbaru per Target UI","uiStudio.analysis.recentCapturesTitle":"Tangkapan Terbaru","uiStudio.analysis.detailDialog":"Detail analisis","uiStudio.analysis.targetCountLabel":"Target dianalisis","uiStudio.analysis.captureLabel":"Tangkapan","uiStudio.analysis.verdict.hasSuggestions":"Saran Perbaikan","uiStudio.analysis.verdict.needsFix":"Saran Perbaikan","uiStudio.analysis.verdict.review":"Saran Perbaikan","uiStudio.analysis.verdict.passed":"Tidak Ada Saran Saat Ini","uiStudio.analysis.verdictLabel":"Ringkasan Perbaikan","uiStudio.analysis.thresholds":"Basis Tinjauan","uiStudio.analysis.issueSummary.passed":"Tidak ada saran perbaikan tambahan pada basis tinjauan saat ini.","uiStudio.history.title":"Riwayat Perubahan","uiStudio.history.empty":"Belum ada riwayat perubahan. Ketika agen AI memodifikasi UI menggunakan manage_ui, akan dicatat secara otomatis.","uiStudio.history.loading":"Memuat...","uiStudio.history.error":"Kesalahan","uiStudio.history.clear":"Hapus Semua","uiStudio.history.filter.actions":"Jenis aksi","uiStudio.history.filter.actionAll":"Semua","uiStudio.history.filter.actionCreate":"Buat","uiStudio.history.filter.actionUpdate":"Perbarui","uiStudio.history.filter.actionDelete":"Hapus","uiStudio.history.filter.period":"Periode","uiStudio.history.filter.dateAll":"Semua","uiStudio.history.filter.today":"Hari Ini","uiStudio.history.filter.yesterday":"Kemarin","uiStudio.history.filter.last7Days":"7 Hari Terakhir","uiStudio.history.filter.last30Days":"30 Hari Terakhir","uiStudio.history.filter.customRange":"Rentang Kustom","uiStudio.history.filter.reset":"Setel Ulang","uiStudio.history.filter.from":"Dari","uiStudio.history.filter.to":"Hingga","uiStudio.history.row.affectedPaths":"Jalur","uiStudio.history.row.mutations":"Detail perubahan","uiStudio.history.row.expand":"▾ Perluas","uiStudio.history.row.collapse":"▲ Tutup","uiStudio.history.row.expandDetails":"Tampilkan {n} detail perubahan","uiStudio.history.row.collapseDetails":"Sembunyikan detail perubahan","uiStudio.history.row.toggleDetails":"Alihkan detail perubahan","uiStudio.history.row.mutationsEmpty":"Tidak ada detail perubahan","uiStudio.history.row.toolLabel":"Perubahan UI ({n})","uiStudio.history.row.compare":"Sebelum / Sesudah","uiStudio.history.row.noBeforeState":"Tidak ada status sebelumnya","uiStudio.history.row.noAfterState":"Tidak ada status sesudahnya","uiStudio.history.row.qualityPlan":"Arah desain","uiStudio.history.row.designCheck":"Saran","uiStudio.history.row.designCheckUnavailable":"Saran: tidak tersedia","uiStudio.history.row.designCheckNone":"Saran: tidak ada","uiStudio.history.selection.deleteSelected":"Hapus yang dipilih","uiStudio.history.selection.selectAll":"Pilih semua","uiStudio.history.selection.clearSelection":"Hapus pilihan","uiStudio.history.confirm.deleteRequestsTitle":"Hapus catatan perubahan","uiStudio.history.confirm.deleteRequestsMessage":"Catatan perubahan yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.history.confirm.clearRequestsTitle":"Hapus Riwayat Perubahan","uiStudio.history.confirm.clearRequestsMessage":"Ini menghapus riwayat perubahan place saat ini. Instance Studio tidak terpengaruh.","uiStudio.history.confirm.cascadeOption":"Juga hapus tangkapan layar terkait","uiStudio.history.drawer.close":"Tutup","uiStudio.actions.previewAgain":"Pratinjau Lagi","uiStudio.actions.deleteSnapshot":"Hapus Tangkapan Layar Ini","uiStudio.actions.proRequired":"Tersedia setelah upgrade ke Pro","uiStudio.actions.captureCurrentState":"Tangkap Keadaan Saat Ini","uiStudio.actions.checkSuggestionsAgain":"Periksa Ulang Saran","uiStudio.actions.previewRunning":"Menangkap…","uiStudio.actions.previewRunningDetail":"ID file tangkapan layar baru akan muncul setelah penangkapan selesai.","uiStudio.actions.previewNeedsSaveCheck":"Tangkapan selesai, penyimpanan perlu diperiksa","uiStudio.actions.previewSaved":"Tangkapan layar baru disimpan","uiStudio.actions.previewComplete":"Tangkapan selesai","uiStudio.actions.previewSavedDetail":"Tangkapan yang ada tetap dipertahankan; ini disimpan sebagai file baru.","uiStudio.actions.previewSavedPathMissing":"ID tangkapan baru diterima, tetapi jalur file tersimpan tidak dapat dikonfirmasi.","uiStudio.actions.previewSnapshotIdMissing":"ID tangkapan baru tidak dapat dikonfirmasi. Segarkan daftar untuk memastikan apakah sudah tersimpan.","uiStudio.actions.more":"Lainnya","uiStudio.gallery.selection.selectedCount":" dipilih","uiStudio.confirm.deleteSnapshotTitle":"Hapus Tangkapan Layar","uiStudio.confirm.deleteSnapshotMessage":"Hanya file tangkapan layar ini yang dihapus (instans Studio tetap disimpan).","uiStudio.confirm.deleteBatchTitle":"Hapus Tangkapan Layar Terpilih","uiStudio.confirm.deleteBatchMessage":"Tangkapan layar yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.gallery.selectMode":"Pilih","uiStudio.gallery.exitSelectMode":"Batal","uiStudio.gallery.selectAll":"Pilih Semua","uiStudio.gallery.clearSelection":"Batalkan Pilihan","uiStudio.gallery.deleteSelected":"Hapus Pilihan","common.cancel":"Batal","common.delete":"Hapus","uiStudio.storage.title":"Data tersimpan UI Studio","uiStudio.storage.usageLabel":"Digunakan","uiStudio.storage.historyBytes":"Riwayat","uiStudio.storage.snapshotBytes":"Tangkapan layar","uiStudio.storage.requestCount":"Catatan perubahan","uiStudio.storage.mutationCount":"Detail perubahan","uiStudio.storage.snapshotCount":"Tangkapan layar","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Pembersihan otomatis terakhir","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"dibebaskan","uiStudio.storage.lastRunErrors":"Kesalahan","uiStudio.storage.loading":"Memuat...","uiStudio.cleanup.policy.title":"Kebijakan hapus otomatis","uiStudio.cleanup.policy.modeOff":"Nonaktif","uiStudio.cleanup.policy.modeAge":"Berbasis usia","uiStudio.cleanup.policy.modeSize":"Berbasis ukuran","uiStudio.cleanup.policy.cascade":"Juga hapus tangkapan layar terkait","uiStudio.cleanup.policy.save":"Simpan kebijakan","uiStudio.cleanup.policy.runNow":"Jalankan sekarang","uiStudio.cleanup.policy.proRequired":"Tersedia setelah upgrade ke Pro","uiStudio.cleanup.policy.daysUnit":"h","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Konfirmasi kebijakan","uiStudio.cleanup.policy.confirm.messageStrict":"Menerapkan kebijakan ini akan segera menghapus","uiStudio.cleanup.policy.confirm.requests":" catatan perubahan","uiStudio.cleanup.policy.confirm.snapshots":" tangkapan layar","uiStudio.cleanup.policy.confirm.freed":"dibebaskan — Terapkan?","uiStudio.cleanup.keepLastNDays":"Simpan {n} hari terakhir","uiStudio.cleanup.selectedDelete":"Hapus pilihan…","uiStudio.cleanup.deleteAll":"Hapus semua…","uiStudio.cleanup.cleanupConfirmTitle":"Konfirmasi pembersihan","uiStudio.cleanup.cleanupConfirmMessage":"Item yang dipilih akan dihapus. Tindakan ini tidak dapat dibatalkan.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Pembersihan manual","uiStudio.cleanup.studioPreservedNote":"Tindakan ini hanya menghapus file riwayat dan tangkapan layar di disk; instans Roblox Studio tidak terpengaruh.","uiStudio.history.sample.bannerBadge":"Pratinjau riwayat perubahan Pro","uiStudio.history.sample.bannerTitle":"Pratinjau riwayat perubahan Pro","uiStudio.history.sample.bannerMessage":"Pratinjau ini menggunakan data sampel. Riwayat perubahan nyata, perbandingan sebelum/sesudah, dan penghapusan massal tersedia di Pro.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Upgrade ke Pro untuk membuka riwayat lengkap","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"Server MCP terhubung","toast.serverDisconnected":"Server MCP terputus","toast.pluginConnected":"Plugin terhubung","toast.pluginDisconnected":"Plugin terputus","toast.clearSuccess":"Berhasil dihapus","toast.clearFailed":"Gagal menghapus data","common.clear":"Hapus","settings.license.activate":"Aktifkan lisensi","settings.license.refresh":"Segarkan lisensi","settings.license.keyInput":"Kunci lisensi","settings.license.disconnected":"Terputus","settings.license.disconnected.tooltip":"Sambungkan ulang ke server MCP untuk mengelola lisensi dari WEPPY Dashboard.","settings.license.live.tooltip":"Tindakan lisensi langsung dikirim ke server MCP.","settings.license.status.activationRequired":"Aktivasi Diperlukan","settings.license.status.activationRequired.tooltip":"Aktivasi lisensi manual diperlukan sebelum WEPPY Dashboard dapat menyegarkan status ini.","settings.license.status.grace":"Masa Tenggang","settings.license.status.grace.tooltip":"Verifikasi penyedia sementara tidak tersedia, tetapi akses Pro tetap aktif selama masa tenggang.","settings.license.status.graceBilling.tooltip":"Akses Pro tetap tersedia selama masa tenggang terkait penagihan.","settings.license.detail.graceBilling":"Akses Pro tetap tersedia selama masa tenggang penagihan.","settings.license.detail.graceProviderUnavailable":"Penyedia tidak tersedia. Akses Pro tetap aktif selama mode tenggang.","settings.license.detail.manualActivation":"Aktivasi manual diperlukan untuk memulihkan akses Pro.","settings.license.detail.missingSessionToken":"Penyegaran diblokir karena token sesi saat ini tidak ada.","settings.license.detail.refreshRecommended":"Verifikasi lisensi harus segera disegarkan.","connection.agents.kill":"Hentikan","connection.agents.kill.title":"Hentikan agen?","connection.agents.killed":"Agen dihentikan","connection.agents.killFailed":"Gagal menghentikan agen","connection.agents.lastCommand":"Perintah Terakhir","connection.agents.lastCommand.tooltip":"Panggilan alat terbaru yang dijalankan oleh agen ini.","connection.agents.lastSeen":"Terakhir Terlihat","connection.agents.lastSeen.tooltip":"Heartbeat atau aktivitas terbaru dari agen ini.","connection.clear.title":"Hapus log koneksi?","connection.clear.message":"Tindakan ini menghapus secara permanen log koneksi yang tersimpan untuk proyek saat ini.","sync.clear.title":"Hapus log sinkronisasi?","sync.clear.message":"Tindakan ini menghapus secara permanen log sinkronisasi yang tersimpan untuk place saat ini.","playtest.clear.title":"Hapus riwayat tes?","playtest.clear.message":"Tindakan ini menghapus secara permanen laporan playtest yang tersimpan untuk place saat ini.","changelog.clear.title":"Hapus changelog?","changelog.clear.message":"Tindakan ini menghapus secara permanen changelog yang tersimpan untuk place saat ini.","sync.status.placePath":"Jalur Place","sync.status.placePath.tooltip":"Direktori place aktif tempat berkas explorer disinkronkan.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Area representatif","changelog.card.verification":"Verifikasi","uiStudio.tabs.analysis.tooltip":"Browse AI-captured UI screens and quickly find which UIs need improvement.","uiStudio.tabs.history.tooltip":"Every UI change AI made, in order. Compare before and after screens.","uiStudio.title.tooltip":"A central place to review AI-generated UI screens and improvement suggestions.","uiStudio.analysis.reportsTitle.tooltip":"Shows the latest capture and suggestion summary per UI (e.g., Inventory window, Main menu).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Some improvements were found in this UI. Click the card for details.","uiStudio.analysis.verdict.passed.tooltip":"No improvements suggested under the current review thresholds.","uiStudio.analysis.counts.tooltip":"‘Main’ are key items to review first; ‘Notes’ are nice-to-have refinements.","uiStudio.analysis.thresholds.tooltip":"The threshold set used for this review (default or custom).","uiStudio.analysis.recentCapturesTitle.tooltip":"All recently saved captures in chronological order.","uiStudio.gallery.selectAll.tooltip":"Select every visible capture at once.","uiStudio.gallery.clearSelection.tooltip":"Clear the current selection.","uiStudio.gallery.deleteSelected.tooltip":"Delete only the selected capture files. The actual UI in Roblox Studio is not affected.","uiStudio.gallery.cardCheckbox.tooltip":"Select this capture. Pick multiple to delete them together.","uiStudio.detailClose.tooltip":"Close this detail panel.","uiStudio.actions.captureCurrentState.tooltip":"Save the UI currently shown in Studio as a new capture. Existing captures are kept.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recompute suggestions for this capture without taking a new screenshot.","uiStudio.actions.more.tooltip":"Open additional actions.","uiStudio.actions.deleteSnapshot.tooltip":"Delete only this capture file. The actual UI in Roblox Studio is not affected.","uiStudio.capturedAt.tooltip":"When this screen was captured.","uiStudio.scope.tooltip":"Capture scope (full screen or a specific UI).","uiStudio.target.tooltip":"Exact path of the captured UI instance.","uiStudio.briefId.tooltip":"Identifier of the design brief that produced this UI.","uiStudio.analysis.verdictLabel.tooltip":"Overall improvement verdict for this capture.","uiStudio.suggestionGroup.tooltip":"Suggestions of the same kind grouped together. Click to expand or collapse.","uiStudio.groupSummary.tooltip":"Number of UI elements matching this group.","uiStudio.colCurrent.tooltip":"The currently applied value.","uiStudio.colRecommended.tooltip":"The recommended value.","uiStudio.copyFixCommand.tooltip":"Copy a prompt that asks the AI to fix this issue.","uiStudio.falsePositiveWarning.tooltip":"This check can produce false positives — verify before applying.","uiStudio.history.filter.actions.tooltip":"Filter records by the kind of change AI made.","uiStudio.history.filter.period.tooltip":"Filter records by time range.","uiStudio.history.filter.from.tooltip":"Start date for the query.","uiStudio.history.filter.to.tooltip":"End date for the query.","uiStudio.history.filter.actionAll.tooltip":"Show every kind of action.","uiStudio.history.filter.actionCreate.tooltip":"Show only actions that created a new UI.","uiStudio.history.filter.actionUpdate.tooltip":"Show only actions that updated an existing UI.","uiStudio.history.filter.actionDelete.tooltip":"Show only actions that deleted a UI.","uiStudio.history.filter.dateAll.tooltip":"Show the full history.","uiStudio.history.filter.today.tooltip":"Show only changes from today.","uiStudio.history.filter.yesterday.tooltip":"Show only changes from yesterday.","uiStudio.history.filter.last7Days.tooltip":"Show changes from the last 7 days.","uiStudio.history.filter.last30Days.tooltip":"Show changes from the last 30 days.","uiStudio.history.filter.customRange.tooltip":"Pick a custom start and end date.","uiStudio.history.filter.reset.tooltip":"Reset all filters to defaults.","uiStudio.history.title.tooltip":"A timeline of every UI change made by AI.","uiStudio.history.clear.tooltip":"Delete every change record for this project. The actual UI in Roblox Studio is not affected.","uiStudio.history.row.compare.tooltip":"Compare the before and after screens. Click to open the full comparison view.","uiStudio.history.row.extraPaths.tooltip":"Number of additional UIs changed in this action.","uiStudio.history.row.noBeforeState.tooltip":"No capture saved before this change.","uiStudio.history.row.noAfterState.tooltip":"No capture saved after this change.","uiStudio.history.row.affectedPaths.tooltip":"Number of UIs affected by this action.","uiStudio.history.row.mutations.tooltip":"Number of detailed changes (e.g., property edits).","uiStudio.history.row.qualityPlan.tooltip":"Arah desain brief yang digunakan untuk perubahan ini.","uiStudio.history.row.designCheck.tooltip":"Ringkasan saran Design Check setelah perubahan.","uiStudio.history.row.toggleDetails.tooltip":"Show or hide a per-line breakdown of what changed.","uiStudio.compare.before.tooltip":"The screen saved just before AI made the change.","uiStudio.compare.after.tooltip":"The screen saved just after AI made the change.","uiStudio.compare.path.tooltip":"The UI instance path for this screen.","uiStudio.storage.title.tooltip":"Disk usage of UI Studio change records and screenshots.","uiStudio.storage.usageLabel.tooltip":"Disk space currently used by UI Studio for this project.","uiStudio.storage.historyBytes.tooltip":"Space taken by change record data (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Space taken by captured PNG image files.","uiStudio.storage.requestCount.tooltip":"Number of actions where AI changed the UI.","uiStudio.storage.mutationCount.tooltip":"Number of detail changes inside actions (one property edit = 1).","uiStudio.storage.snapshotCount.tooltip":"Number of saved capture image files.","uiStudio.storage.lastRun.tooltip":"When the auto-cleanup policy last ran, and what it removed.","uiStudio.cleanup.label.tooltip":"Manually clean up change records and captures whenever you want.","uiStudio.cleanup.keep7.tooltip":"Delete change records and captures older than 7 days.","uiStudio.cleanup.keep30.tooltip":"Delete change records and captures older than 30 days.","uiStudio.cleanup.deleteAll.tooltip":"Delete every change record and capture for this project. The actual UI in Roblox Studio is not affected.","uiStudio.cleanup.policy.title.tooltip":"Rules that automatically remove old or large captures.","uiStudio.cleanup.policy.modeOff.tooltip":"Turn off auto-cleanup. Data stays until you remove it manually.","uiStudio.cleanup.policy.modeAge.tooltip":"Automatically delete data older than the configured number of days.","uiStudio.cleanup.policy.modeSize.tooltip":"When total usage exceeds the limit, the oldest data is removed first.","uiStudio.cleanup.policy.agePreset.tooltip":"Delete data older than this many days.","uiStudio.cleanup.policy.ageInput.tooltip":"Enter any value between 1 and 365 days.","uiStudio.cleanup.policy.sizePreset.tooltip":"Keep total usage under this size.","uiStudio.cleanup.policy.sizeInput.tooltip":"Enter any value between 50 MB and 10000 MB (10 GB).","uiStudio.cleanup.policy.cascade.tooltip":"Also delete the capture images linked to those records. If off, the images stay.","uiStudio.cleanup.policy.save.tooltip":"Save the current cleanup rule. It runs in the background from then on.","uiStudio.cleanup.policy.runNow.tooltip":"Run the current rule once now, without waiting for the next scheduled run.","settings.license.refresh.tooltip":"Re-fetch the current state from the license server. Useful when a billing change hasn't appeared yet.","settings.license.reset.tooltip":"Remove the currently registered license key. Use this before activating with a different key.","settings.license.activate.tooltip":"Activate Pro features with the entered license key.","tier.upgrade.tooltip":"Upgrade to Pro to unlock every feature.","settings.language.auto.tooltip":"Follow the operating system's language. Falls back to English when not supported.","settings.dataHistory.open.tooltip":"Open the page that shows this item in detail.","settings.dataHistory.clear.tooltip":"Delete only the records saved for this item. Roblox Studio data is not changed.","settings.dataHistory.toggle.tooltip":"Collapse or expand this section.","settings.dataHistory.toolsActivity.metric.tooltip":"Number of saved tool runs and the disk space they use.","settings.dataHistory.toolStats.metric.tooltip":"Aggregated total runs and session counts.","settings.dataHistory.syncLog.metric.tooltip":"Number of saved sync events and the disk space they use.","settings.dataHistory.playtestReports.metric.tooltip":"Number of saved playtest reports and the disk space they use.","settings.dataHistory.projectChanges.metric.tooltip":"Number of saved project change summaries and the disk space they use.","settings.dataHistory.connectionLog.metric.tooltip":"Number of saved connection events and the disk space they use.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio change record and capture counts, plus total disk usage.","uiStudio.designCheckResultsTitle":"Saran Design Check","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.actions.designCheckAgain":"Periksa lagi","uiStudio.actions.designCheckRunning":"Memeriksa saran...","uiStudio.actions.designCheckRunningDetail":"Jumlah item tinjau dahulu, disarankan, dan opsional akan ditampilkan setelah selesai.","uiStudio.actions.designCheckComplete":"Pemeriksaan saran selesai","uiStudio.actions.designCheckNoSnapshotSaved":"Tindakan ini tidak menyimpan file tangkapan layar baru.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.gallery.priorityHighBadge.tooltip":"Jumlah saran yang perlu ditinjau dahulu. Klik untuk detail.","uiStudio.gallery.priorityMediumBadge.tooltip":"Jumlah saran yang direkomendasikan.","uiStudio.priorityMedium":"Disarankan ditinjau","uiStudio.mediumPrioritySection":"Disarankan ditinjau","uiStudio.gallery.priorityLowBadge.tooltip":"Jumlah peningkatan opsional."},Bf={"sidebar.overview":"Übersicht","sidebar.changelog":"Änderungsprotokoll","sidebar.connection":"Verbindung","sidebar.sync":"Sync","sidebar.playtest":"Playtest","sidebar.tools":"Tools","sidebar.settings":"Einstellungen","sidebar.ui_studio":"UI Studio","sidebar.gate.l1":"MCP-Server-Verbindung erforderlich","sidebar.gate.l2":"Roblox Studio Plugin-Verbindung erforderlich","header.currentProject":"Aktuelles Projekt","header.unknownProject":"Unbekanntes Projekt","header.projectRoot.label":"Projektstamm","header.currentProject.loading":"Lade Projektstamm...","header.currentProject.unavailable":"Projektstamm nicht verfügbar","header.placeNotConnected":"Place nicht verbunden","header.currentProject.tooltip":"Aktuell ausgewählter Projektordner","header.currentProject.loading.tooltip":"Projektstamm-Informationen werden noch geladen","header.currentProject.unavailable.tooltip":"Aktuelle Projektstamm-Informationen sind nicht verfügbar","header.currentProjectSyncRoot.label":"Sync-Stamm","header.currentProjectSyncRoot.loading":"Lade Sync-Stamm...","header.currentProjectSyncRoot.unavailable":"Sync-Stamm nicht verfügbar","header.currentProjectSyncRoot.tooltip":"Aktueller Sync-Stamm-Ordner für das ausgewählte Projekt","header.currentProjectSyncRoot.loading.tooltip":"Sync-Stamm-Informationen werden noch geladen","header.currentProjectSyncRoot.unavailable.tooltip":"Aktuelle Sync-Stamm-Informationen sind nicht verfügbar","header.testFiles.label":"Testdateien","header.testFiles.unavailable":"Testdateien nicht verfügbar","header.testFiles.tooltip":"Aktuelles Playtest-Dateiverzeichnis für den ausgewählten Place","header.places.title":"Places","header.places.active":"Aktiv","header.places.inactive":"Inaktiv","header.places.pluginRequired":"Plugin-Verbindung erforderlich","header.places.liveRequired":"Plugin-Verbindung für Live Active Place erforderlich","header.place.tooltip":"Verbundener Roblox Place","header.placeNotConnected.tooltip":"Place nicht verbunden","header.changeProjectRoot":"Projektstamm ändern","header.changeProjectRoot.ariaLabel":"Projektstamm ändern","header.changeProjectRoot.tooltip":"Den aktuellen Projektstamm ändern","header.changeProjectRoot.disabledTooltip.l0":"MCP-Server-Verbindung erforderlich, bevor der Projektstamm geändert werden kann","header.changeProjectRoot.disabledTooltip.loading":"Projektstamm-Informationen werden noch geladen","header.changeProjectRoot.disabledTooltip.unavailable":"Aktuelle Projektstamm-Informationen sind nicht verfügbar","header.projectRootModal.initial.title":"Projektstamm ändern","header.projectRootModal.initial.body.connected":"Nachdem Sie einen Projektordner ausgewählt haben, wechselt MCP zum neuen Projektstamm und der aktuelle Studio-Inhalt wird vollständig in das neue <ausgewählter Projektordner>/weppy-project-sync-Ziel resynced.","header.projectRootModal.initial.body.disconnected":"Nachdem Sie einen Projektordner ausgewählt haben, wechselt MCP zum neuen Projektstamm und verwendet <ausgewählter Projektordner>/weppy-project-sync als nächstes Sync-Ziel.","header.projectRootModal.initial.nextSyncRoot":"Neues Sync-Ziel nach Auswahl","header.projectRootModal.initial.nextSyncRoot.placeholder":"<ausgewählter Projektordner>/weppy-project-sync","header.projectRootModal.initial.warningStop":"Aktueller Sync wird sofort gestoppt.","header.projectRootModal.initial.warningFreshSync":"Der aktuelle Studio-Inhalt wird verwendet, um einen neuen Full-Sync im neuen Ziel zu erstellen.","header.projectRootModal.initial.warningNoMove":"Alte Sync-Ordner werden nicht automatisch verschoben.","header.projectRootModal.initial.warningDeferredSync":"Wenn Studio nicht verbunden ist, startet der Full Resync beim nächsten Verbinden des Plugins.","header.projectRootModal.confirm.title":"Neuen Projektstamm bestätigen","header.projectRootModal.confirm.body":"Überprüfen Sie den ausgewählten Projektordner, bevor Sie ihn anwenden.","header.projectRootModal.confirm.projectRoot":"Ausgewählter Projektordner","header.projectRootModal.confirm.syncRoot":"Neues Sync-Ziel","header.projectRootModal.confirm.warningNoMove":"Bestehende Sync-Ordner werden nicht automatisch verschoben.","header.projectRootModal.pick":"Ordner auswählen","header.projectRootModal.apply":"Änderung anwenden","header.projectRootModal.cancel":"Abbrechen","header.projectRootModal.error":"Projektstamm-Änderung fehlgeschlagen","status.online":"Online","status.offline":"Offline","status.idle":"Inaktiv","status.syncing":"Synchronisiere","status.error":"Fehler","status.initializing":"Initialisiere","level.l0.title":"Server getrennt","level.l0.message":"WEPPY Dashboard wurde geöffnet, aber der MCP-Server wurde gestoppt oder antwortet nicht.","level.l1.title":"Server verbunden","level.l1.hint":"Prüfen: Läuft Roblox Studio? Ist das Plugin installiert?","level.l2.ok":"Studio verbunden","tier.basic":"Basic","tier.basic.tooltip":"Basic-Tier mit dem Standard-Funktionsumfang des WEPPY Dashboards.","tier.pro":"Pro","tier.pro.tooltip":"Pro-Tier mit dem vollständigen Funktionsumfang des WEPPY Dashboards.","tier.mixed":"Gemischt","tier.upgrade":"Upgrade auf Pro","tier.compare":"Basic vs Pro","tier.banner.save":"Sparen Sie KI-Token mit Pro!","tier.comparison.comingSoon":"Basic vs Pro Vergleich — in Kürze verfügbar","tier.comparison.close":"Schließen","tier.comparison.detailTitle":"Detaillierter Tool-Katalog","tier.comparison.description":"Beschreibung","tier.comparison.basic.core":"Kern-MCP-Workflow","tier.comparison.basic.core.item1":"Skript erstellen/bearbeiten","tier.comparison.basic.core.item2":"Instanzverwaltung","tier.comparison.basic.core.item3":"Eigenschaftensteuerung","tier.comparison.basic.core.item4":"Auswahl und Suche","tier.comparison.basic.core.item5":"Tag-Verwaltung","tier.comparison.basic.core.item6":"Kamerasteuerung","tier.comparison.basic.core.item7":"Protokollüberwachung","tier.comparison.basic.sync":"Sync (Basic)","tier.comparison.basic.sync.item1":"Studio zu Lokal Einweg-Sync","tier.comparison.basic.sync.item2":"Manuelles Anwenden als Standard","tier.comparison.pro.all":"Alles aus Basic, plus","tier.comparison.pro.sync":"Erweiterter Sync-Workflow","tier.comparison.pro.sync.item1":"Sync-Richtung pro Typ","tier.comparison.pro.sync.item2":"Apply-Modus pro Typ","tier.comparison.pro.sync.item3":"Bidirektionaler und Reverse-Sync","tier.comparison.pro.sync.item4":"Full Sync, Resync und Push to Studio","tier.comparison.pro.sync.item5":"Multi-Place-Sync","tier.comparison.pro.playtest":"Playtest-Steuerung","tier.comparison.pro.playtest.item1":"Play, Stop, Pause und Resume","tier.comparison.pro.playtest.item2":"Playtest-Statusinspektion","tier.comparison.pro.playtest.item3":"Automatisierte Testausführung","tier.comparison.pro.creation":"Erweiterter Erstellungs-Workflow","tier.comparison.pro.creation.item1":"Massenoperationen","tier.comparison.pro.creation.item2":"Terrain-Generierung","tier.comparison.pro.creation.item3":"Asset-Suche und -Einfügen","tier.comparison.pro.creation.item4":"Raycast und räumliche Analyse","tier.comparison.pro.creation.item5":"Umgebungssteuerung","tier.comparison.pro.ui":"KI-UI-Design (UI Studio)","tier.comparison.pro.ui.item1":"UI aus deiner Anfrage und dem aktuellen Studio-Kontext planen","tier.comparison.pro.ui.item2":"Menüs, HUDs, Buttons und Panels erstellen, aktualisieren oder entfernen","tier.comparison.pro.ui.item3":"Aktuelle UI zur Prüfung aufnehmen","tier.comparison.pro.ui.item4":"Vorschläge zu Touch, Kontrast und Safe Areas prüfen","tier.comparison.discount.label":"🎁 Geben Sie diesen Code beim Gumroad-Checkout für einen Rabatt ein:","tier.comparison.discount.code":"WEPPY-MCP","tier.comparison.discount.expiry":"Gültig bis 30. April","tier.promo.discount.hint":"🎁 Code WEPPY-MCP bei Gumroad verwenden · Gültig bis 30. April","tier.promo.discount.context":"🎁 Beim Gumroad-Checkout eingeben:","tier.tool.query_instances.desc":"Inspizieren Sie Instanzen, durchsuchen Sie Children und Descendants und prüfen Sie Klasseninformationen. Pro fügt File Tree, Projektstruktur sowie Eigenschafts- oder Tag-Suche hinzu.","tier.tool.mutate_instances.desc":"Erstellen, löschen, klonen und verschieben Sie Instanzen. Pro fügt Tree-Erstellung und Massenerstellung, -löschung oder -klonierung hinzu.","tier.tool.manage_properties.desc":"Lesen und setzen Sie Eigenschaften, Attribute und Tags. Pro fügt berechnete Updates, relative Änderungen und Massen-Eigenschaftsoperationen hinzu.","tier.tool.manage_scripts.desc":"Lesen, schreiben, erstellen, löschen, bearbeiten und durchsuchen Sie Skript-Quelltext. Pro fügt Massenersetzung über mehrere Skripte hinzu.","tier.tool.manage_ui.desc":"Nur Pro. Spieltypische Menüs, HUDs, Buttons, Labels und Bildpanels erstellen oder verfeinern, dann Screenshots aufnehmen und Verbesserungsvorschläge prüfen.","tier.tool.manage_ui.action.design_brief":"UI-Richtung planen","tier.tool.manage_ui.action.create_tree":"Neue UI erstellen","tier.tool.manage_ui.action.update":"Bestehende UI aktualisieren","tier.tool.manage_ui.action.delete":"UI entfernen","tier.tool.manage_ui.action.preview":"UI-Bildschirm aufnehmen","tier.tool.manage_ui.action.check":"Verbesserungsvorschläge prüfen","tier.tool.manage_lighting.desc":"Nur Pro. Konfigurieren Sie Beleuchtung, Atmosphäre, Himmel, Terrain-Eigenschaften und Tageszeit-Einstellungen.","tier.tool.manage_selection.desc":"Lesen, setzen und löschen Sie die aktuelle Studio-Auswahl. Pro fügt Kontext, Details, Hinzufügen oder Entfernen sowie Auswahl-Watch-Unterstützung hinzu.","tier.tool.manage_camera.desc":"Inspizieren Sie Kamerastatus, fokussieren Sie nach Pfad oder Position und fordern Sie vorgeschlagene Ansichten an.","tier.tool.manage_tween.desc":"Nur Pro. Erstellen, abspielen, pausieren und abbrechen von Tweens für sanfte Animationen.","tier.tool.manage_audio.desc":"Nur Pro. Sounds abspielen, stoppen, pausieren und fortsetzen sowie den Audio-Listener konfigurieren.","tier.tool.manage_animation.desc":"Nur Pro. Animationen laden, abspielen und stoppen sowie aktive Animationstracks inspizieren.","tier.tool.manage_physics.desc":"Nur Pro. Kollisionsgruppen registrieren, Gruppenkollisionen konfigurieren und verfügbare Gruppen inspizieren.","tier.tool.manage_effects.desc":"Nur Pro. Partikel emittieren, Effekte löschen und Effektstatus umschalten.","tier.tool.manage_terrain.desc":"Nur Pro. Terrain-Formen füllen, Regionen löschen, Materialien ersetzen, Terrain-Farben verwalten, Voxel lesen oder schreiben, Terrain generieren und Terrain glätten.","tier.tool.spatial_query.desc":"Nur Pro. Raycasts ausführen, Boden finden, Platzierung validieren, Bereiche scannen, nach flachen oder Spawn-Positionen suchen, Begehbarkeit analysieren, Raum kartieren und Kollisionen inspizieren.","tier.tool.manage_assets.desc":"Nur Pro. Modelle einfügen, Asset-Informationen inspizieren, im Creator Store suchen, freie Assets oder Pakete einfügen und Assets exportieren.","tier.tool.manage_sync.desc":"Nur Pro. Sync-Status, -Konfiguration, -Verlauf, -Richtungen inspizieren und synchronisierte Dateien lesen oder schreiben.","tier.tool.workspace_state.desc":"Nur Pro. Full Sync ausführen, Screenshots erfassen, kürzliche Änderungen und Viewport-Status inspizieren und zugehörige Metadaten verwalten.","tier.tool.manage_logs.desc":"Inspizieren Sie Output-Logs mit Filterung, inkrementellem Polling, Buffer-Löschung und kürzlicher Fehlersuche.","tier.tool.system_info.desc":"Verbindungsstatus und aktuellen Tier inspizieren. Pro fügt Place-Info, Services, Studio-Einstellungen, Playtest-Steuerung und automatisierte Tests hinzu.","tier.tool.manage_studio.desc":"Nur Pro. Studio-Editor-Ansichtseinstellungen wie UI Preview für Screenshots und QA umschalten; es ändert Studio-Sitzungseinstellungen, nicht die UI-Objekte des Spiels.","tier.tool.batch_execute.desc":"Nur Pro. Mehrere Befehle in einem Batch ausführen, mit sequentieller Ausführung und optionalem Continue-on-Error-Verhalten.","tier.tool.execute_luau.desc":"Nur Pro. Beliebigen Luau-Code in der Roblox Studio Sandbox ausführen.","connection.server.title":"Serverstatus","connection.server.version":"Version","connection.server.version.tooltip":"Installierte MCP-Server-Version","connection.server.pid":"PID","connection.server.pid.tooltip":"Betriebssystem-Prozesskennung","connection.server.uptime":"Uptime","connection.server.uptime.tooltip":"Verstrichene Zeit seit dem Start des MCP-Servers","connection.server.session":"Session","connection.server.session.tooltip":"Aktuelle MCP-Session-Kennung","connection.server.exec":"Exec","connection.server.exec.tooltip":"Ausführungspfad zum Starten des MCP-Servers","connection.reconnect":"Erneut verbinden","connection.checkSettings":"Einstellungen prüfen","connection.agents.title":"KI-Agenten","connection.agents.name":"Agent","connection.agents.cwd":"Arbeitsverzeichnis","connection.agents.cwd.tooltip":"Aktuelles Arbeitsverzeichnis für den verbundenen KI-Agent","connection.agents.projectRoot":"Projektstamm","connection.agents.projectRoot.tooltip":"Maßgeblicher Projektstamm für die Sync-Eigentümerschaft","connection.agents.projectRoot.unresolved":"Nicht aufgelöst","connection.agents.connected":"Verbunden","connection.agents.unknown":"Unbekannt","connection.agents.none":"Keine Agenten verbunden","connection.plugins.title":"Plugins","connection.plugins.place":"Place","connection.plugins.clientId":"Client-ID","connection.plugins.clientId.tooltip":"Eindeutige Plugin-Client-Kennung für diese Studio-Verbindung","connection.plugins.lastSeen":"Zuletzt gesehen","connection.plugins.lastSeen.tooltip":"Zuletzt empfangener Heartbeat vom Plugin","connection.plugins.version":"Ver","connection.plugins.version.tooltip":"Vom Studio gemeldete installierte Plugin-Version","connection.plugins.none":"Keine Plugins verbunden","connection.log.title":"Verbindungsprotokoll","connection.log.empty":"Noch keine Ereignisse","connection.time.secondsAgo":"s","connection.time.minutesAgo":"min","connection.time.hoursAgo":"Std","common.loading":"Lade...","common.retry":"Wiederholen","common.reconnecting":"Verbinde erneut...","common.expand":"Ausklappen","common.collapse":"Einklappen","tools.tab.history":"Verlauf","tools.tab.statistics":"Statistik","tools.tab.failures":"Fehler","tools.col.time":"Zeit","tools.col.time.tooltip":"Wann der Tool-Lauf aufgezeichnet wurde.","tools.col.toolAction":"Tool.Action","tools.col.toolAction.tooltip":"Name des Tools und ausgeführte Action.","tools.col.duration":"Dauer","tools.col.duration.tooltip":"Wie lange das Tool zum Beenden brauchte.","tools.col.status":"Status","tools.col.status.tooltip":"Ergebnis des aufgezeichneten Tool-Laufs.","tools.col.tier":"Tier","tools.col.tier.tooltip":"Erforderlicher Lizenz-Tier für das Tool oder die Action.","tools.col.tierStats.tooltip":"Basic-, Pro- oder Mixed-Zusammenfassung für die Statistikzeile.","tools.col.tool":"Tool","tools.col.tool.tooltip":"Konsolidierter Tool-Name in der Statistiktabelle.","tools.col.calls":"Aufrufe","tools.col.calls.tooltip":"Gesamtzahl der aufgezeichneten Aufrufe für dieses Tool.","tools.col.ok":"OK","tools.col.ok.tooltip":"Anzahl direkt erfolgreicher Läufe.","tools.col.fallback":"FALLBACK","tools.col.fallback.tooltip":"Anzahl der Läufe, die durch Fallback-Ausführung erfolgreich waren.","tools.col.unsupported":"UNSUPPORTED","tools.col.unsupported.tooltip":"Anzahl blockierter Läufe ohne Fallback-Ausführung.","tools.col.err":"FAILED","tools.col.err.tooltip":"Anzahl fehlgeschlagener Läufe.","tools.col.okRate":"OK%","tools.col.okRate.tooltip":"Prozentsatz der erfolgreich abgeschlossenen Aufrufe.","tools.col.avgTime":"Durchschnittszeit","tools.col.avgTime.tooltip":"Durchschnittliche Ausführungszeit über alle aufgezeichneten Aufrufe.","tools.col.error":"Fehler","tools.filter.tool":"Tool","tools.filter.all":"Alle","tools.badge.pro":"PRO","tools.badge.pro.tooltip":"Dieser Eintrag verwendete ein Pro-exklusives Tool oder eine Action.","tools.badge.fallback":"FALLBACK","tools.badge.fallback.tooltip":"Die angeforderte Pro-Action wurde über einen Basic-Fallback erfolgreich ausgeführt.","tools.badge.unsupported":"UNSUPPORTED","tools.badge.unsupported.tooltip":"Die angeforderte Pro-Action wurde blockiert und kein Fallback wurde ausgeführt.","tools.badge.err":"FAILED","tools.badge.err.tooltip":"Der Tool-Lauf ist fehlgeschlagen.","tools.status.ok":"OK","tools.status.ok.tooltip":"Der Tool-Lauf wurde erfolgreich abgeschlossen.","tools.tier.mixed.tooltip":"Dieses Tool enthält sowohl Basic- als auch Pro-Actions.","tools.detail.params":"Parameter","tools.detail.params.tooltip":"Eingabeparameter, die an diesen Tool-Lauf übergeben wurden.","tools.detail.result":"Ergebnis","tools.detail.result.tooltip":"Zurückgegebenes Ergebnis-Payload für diesen Tool-Lauf.","tools.detail.requestedCommand":"Gesendeter Befehl","tools.detail.executedCommand":"Ausgeführter Befehl","tools.detail.alternatives":"Alternativen","tools.detail.blockedMessage":"Blockierungsgrund","tools.detail.noFallback":"Kein Fallback","tools.detail.noFallback.value":"Kein Fallback ausgeführt.","tools.detail.errorMessage":"Fehlermeldung","tools.clear.history.title":"Verlauf löschen?","tools.clear.history.message":"Dies entfernt den aktuellen Place-Tools-Verlauf dauerhaft.","tools.clear.statistics.title":"Statistik löschen?","tools.clear.statistics.message":"Dies setzt die aktuelle Place-Tool-Statistik dauerhaft zurück.","tools.detail.error":"Fehler","tools.page.prev":"Zurück","tools.page.prev.tooltip":"Zur vorherigen Seite der Tool-Verlaufsergebnisse.","tools.page.next":"Weiter","tools.page.next.tooltip":"Zur nächsten Seite der Tool-Verlaufsergebnisse.","tools.empty.history":"Keine Verlaufseinträge","tools.empty.stats":"Keine Tool-Statistik","tools.empty.failures":"Keine Fehler","tools.summary.total":"Gesamt","tools.summary.calls":"Aufrufe","tools.summary.sessions":"Sessions","settings.license.title":"Lizenz","settings.license.title.tooltip":"Aktueller Lizenzstatus und Abonnement-Tier.","settings.license.status":"Status","settings.license.status.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.tier":"Tier","settings.license.tier.tooltip":"Aktueller Abonnement-Tier für verfügbare WEPPY Dashboard-Funktionen.","settings.license.key":"Schlüssel","settings.license.key.tooltip":"Maskierter Lizenzschlüssel, der derzeit vom Server geladen ist.","settings.license.keyValue.tooltip":"Maskierter Lizenzschlüssel, der derzeit vom Server geladen ist.","settings.license.provider":"Anbieter","settings.license.provider.tooltip":"Lizenzanbieter zur Validierung dieses Schlüssels.","settings.license.providerValue.tooltip":"Lizenzanbieter zur Validierung dieses Schlüssels.","settings.license.active":"Aktiv","settings.license.active.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.status.activeCancelPending.tooltip":"Kündigung steht aus, aber Pro-Zugang bleibt bis zum Ende der aktuellen Abrechnungsperiode aktiv.","settings.license.inactive":"Inaktiv","settings.license.inactive.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.expired":"Abgelaufen","settings.license.expired.tooltip":"Aktueller Lizenz-Aktivierungsstatus.","settings.license.unavailable":"Lizenzinformationen nicht verfügbar","settings.license.detail.cancelPending":"Kündigung ist geplant. Pro-Zugang bleibt bis zum Ende der aktuellen Abrechnungsperiode aktiv.","settings.license.reset":"Lizenz zurücksetzen","settings.readOnly":"Schreibgeschützt","settings.readOnly.tooltip":"Dieser Abschnitt zeigt Werte, die nicht über das WEPPY Dashboard bearbeitet werden können.","settings.unavailable":"Einstellungen nicht verfügbar","settings.general.title":"Allgemeine Einstellungen","settings.general.title.tooltip":"Hot-Settings, die sofort beim Ändern angewendet werden.","settings.general.liveApply":"Live anwenden","settings.general.liveApply.tooltip":"Änderungen in diesem Abschnitt werden sofort ohne separate Speichern-Schaltfläche angewendet.","settings.general.applied":"Angewendet","settings.general.logLevel":"Log-Level","settings.general.logLevel.tooltip":"Legt fest, wie detailliert das WEPPY Dashboard in seine Logs schreibt.","settings.general.localHistory":"Tool-Verlaufsaufzeichnung","settings.general.localHistory.tooltip":"Speichert lokalen Tool-Ausführungsverlauf für die WEPPY Dashboard-Verlaufsansichten.","settings.general.localStatistics":"Tool-Statistiksammlung","settings.general.localStatistics.tooltip":"Aggregiert lokale Nutzungsstatistiken für WEPPY Dashboard-Berichte.","settings.general.contextCapture":"Kontext-Erfassung","settings.general.contextCapture.tooltip":"Wenn aktiviert, zeichnet das WEPPY Dashboard strukturierte Ausführungskontexte für Changelog- und Playtest-Ansichten auf.","settings.general.requestTimeout":"Aktions-Timeout","settings.general.requestTimeout.tooltip":"Maximale Wartezeit des WEPPY Dashboards auf eine Aktion, bevor sie fehlschlägt.","settings.general.requestTimeout.unit":"ms","settings.general.requestTimeout.unit.tooltip":"Aktions-Timeout wird in Millisekunden gemessen.","settings.cold.title":"Server-Umgebung","settings.cold.title.tooltip":"Schreibgeschützte Server-Umgebungswerte, die beim Start geladen werden.","settings.cold.httpPort.tooltip":"Portnummer, die vom MCP WEPPY Dashboard HTTP-Server verwendet wird.","settings.cold.httpHost.tooltip":"Host-Schnittstelle, an die sich der MCP WEPPY Dashboard HTTP-Server bindet.","settings.cold.dashboardAutoOpen.tooltip":"Steuert, ob das WEPPY Dashboard beim Start des Servers automatisch im Browser geöffnet wird.","settings.cold.dashboardAutoOpen.value.tooltip":"Aktuelles Startverhalten zum Öffnen des WEPPY Dashboards in einem Browser.","settings.cold.hint":"Über Umgebungsvariablen setzen, um diese Werte zu ändern.","settings.language.title":"Sprache","settings.language.title.tooltip":"Wählen Sie, wie der WEPPY Dashboard-Oberflächentext lokalisiert wird.","settings.language.dashboard":"WEPPY Dashboard-Sprache","settings.language.dashboard.tooltip":"Überschreibt die WEPPY Dashboard-Sprache oder folgt der Systemsprache, wenn auf Auto eingestellt.","settings.language.auto":"Auto","overview.l0.title":"MCP-Server getrennt","overview.l0.message":"Der MCP-Server antwortet nicht. Das WEPPY Dashboard versucht automatisch, die Verbindung wiederherzustellen.","overview.l0.step1":"Prüfen Sie, ob der MCP-Server-Prozess läuft","overview.l0.step2":"Starten Sie den MCP-Server-Befehl bei Bedarf neu","overview.l0.reconnecting":"Automatische Wiederverbindung alle 3s...","overview.l0.reconnectBtn":"Erneut verbinden","overview.l0.settingsBtn":"Einstellungen prüfen","overview.l1.pluginGuide":"Roblox Studio Plugin ist nicht verbunden","overview.l1.check1":"Läuft Roblox Studio?","overview.l1.check2":"Ist das WEPPY Plugin installiert?","overview.l1.feedHint":"Änderungen erscheinen hier, sobald das Plugin verbunden ist","overview.metric.server":"Server","overview.metric.server.tooltip":"MCP-Server-Laufzeit und Prozessstatus","overview.metric.plugin":"Plugin","overview.metric.plugin.tooltip":"Roblox Studio Plugin-Verbindungs- und Versionsstatus","overview.metric.agent":"Agent","overview.metric.agent.tooltip":"Verbundene KI-Coding-Agenten und ihr Laufzeitstatus","overview.metric.agent.instancesUnit":"Instanzen","overview.metric.sync":"Sync","overview.metric.sync.tooltip":"Aktuelle Studio-zu-Lokal-Sync-Aktivität","overview.metric.noAgent":"Kein Agent","overview.meta.version":"Version","overview.meta.version.tooltip":"Installierte MCP-Server-Version","overview.meta.session":"Session","overview.meta.session.tooltip":"Aktuelle MCP-Session-Kennung","overview.meta.pid":"PID","overview.meta.pid.tooltip":"Betriebssystem-Prozesskennung","overview.meta.uptime":"Uptime","overview.meta.uptime.tooltip":"Verstrichene Zeit seit dem Start des MCP-Servers","overview.feed.title":"Letzte Spieländerungen","overview.feed.empty":"Keine kürzlichen Änderungen","overview.changelog.title":"Session-Änderungszusammenfassung","overview.changelog.entries":"Gesamt","overview.changelog.scripts":"Skripte","overview.changelog.instances":"Instanzen","overview.changelog.properties":"Eigenschaften","overview.changelog.assets":"Assets","overview.tier.title":"Tier-Nutzung","changelog.subtitle":"Spieländerungsverlauf","changelog.filter.all":"Alle","changelog.filter.active":"Aktiv","changelog.filter.completed":"Abgeschlossen","changelog.empty":"Noch keine Changelog-Einträge","changelog.basic.limit.title":"Basic-Vorschau zeigt die letzten 3 Sessions","changelog.basic.limit.body":"Upgraden Sie auf Pro, um die vollständige Changelog-Timeline für diesen Place zu durchsuchen.","changelog.basic.metricLabel":"Sichtbares Changelog / Gesamt","changelog.basic.visible":"sichtbar","changelog.basic.total":"gesamt","changelog.card.active":"Aktiv","changelog.card.active.tooltip":"Diese Session empfängt noch neue Spieländerungen.","changelog.card.completed":"Abgeschlossen","changelog.card.completed.tooltip":"Diese Session ist beendet und es werden keine weiteren Änderungen erwartet.","changelog.card.bootstrapStatus":"Bootstrap","changelog.card.bootstrapStatus.tooltip":"Diese Session enthält nur den anfänglichen Sync-Bootstrap-Snapshot.","changelog.card.inProgress":"in Bearbeitung","changelog.card.noChanges":"Noch keine Änderungen","changelog.card.noChanges.tooltip":"Für diese Session wurden noch keine Spieländerungen extrahiert.","changelog.card.bootstrapSummary":"Anfänglicher Sync-Snapshot","changelog.card.bootstrapSummary.tooltip":"Anfängliche Datei-Sync-Schreibvorgänge werden zu einer einzigen Bootstrap-Snapshot-Zeile zusammengefasst.","changelog.card.sessionIntent":"Session-Absicht","changelog.card.scripts":"Skripte","changelog.card.scripts.tooltip":"In dieser Session vorgenommene Skript-Änderungen.","changelog.card.instances":"Instanzen","changelog.card.instances.tooltip":"Instanz-Erstellungs-, Lösch-, Verschiebe- oder Klonänderungen in dieser Session.","changelog.card.modified":"geändert","changelog.card.created":"erstellt","changelog.card.deleted":"gelöscht","changelog.card.moved":"verschoben","changelog.card.propertiesChanged":"Eigenschaften geändert","changelog.card.propertiesChanged.tooltip":"Für diese Session aufgezeichnete Eigenschaftswertänderungen.","changelog.card.lightingConfigured":"Beleuchtung konfiguriert","changelog.card.lightingConfigured.tooltip":"Beleuchtungs- oder Atmosphäreneinstellungen wurden in dieser Session geändert.","changelog.card.terrainConfigured":"Terrain konfiguriert","changelog.card.terrainConfigured.tooltip":"Terrain-Daten oder Terrain-Einstellungen wurden in dieser Session geändert.","changelog.card.assetsInserted":"Assets eingefügt","changelog.card.assetsInserted.tooltip":"In dieser Session in den Place eingefügte Assets.","changelog.category.script":"Skripte","changelog.category.instance":"Instanzen","changelog.category.property":"Eigenschaften","changelog.category.lighting":"Beleuchtung","changelog.category.terrain":"Terrain","changelog.category.asset":"Assets","changelog.detail.changeSummary":"Änderungszusammenfassung","changelog.detail.changeSummary.tooltip":"Anzahl der extrahierten Spieländerungen, gruppiert nach Kategorie für diese Session.","changelog.detail.changeTimeline":"Änderungs-Timeline","changelog.detail.changeTimeline.tooltip":"Chronologische Liste der extrahierten Spieländerungen für diese Session.","changelog.detail.context.title":"Kontextzusammenfassung","changelog.detail.context.tooltip":"Strukturierter Ausführungskontext, der für diese Changelog-Session erfasst wurde.","changelog.detail.verification.title":"Verifikation","changelog.detail.verification.tooltip":"Mit dieser Changelog-Session verknüpfte Verifikationssignale.","changelog.detail.verification.label":"Ergebnis","changelog.detail.verification.status":"Status","changelog.detail.verification.timestamp":"Aufgezeichnet am","changelog.detail.beforeAfter":"Vorher & Nachher","changelog.detail.filterCategory":"Kategorie","changelog.detail.filterCategory.tooltip":"Filtert die Timeline nach einer einzigen Änderungskategorie.","changelog.detail.confidence.exact":"Exakt","changelog.detail.confidence.exact.tooltip":"Sowohl der Vorher- als auch der Nachher-Zustand wurden für diese Änderung bestätigt.","changelog.detail.confidence.partial":"Teilweise","changelog.detail.confidence.partial.tooltip":"Nur ein Teil des Vorher- und Nachher-Zustands konnte für diese Änderung bestätigt werden.","changelog.detail.confidence.afterOnly":"Nur nachher","changelog.detail.confidence.afterOnly.tooltip":"Nur der resultierende Zustand nach der Änderung konnte bestätigt werden.","changelog.detail.confidence.intentOnly":"Nur Absicht","changelog.detail.confidence.intentOnly.tooltip":"Nur die angeforderte Aktion wurde aufgezeichnet, nicht der resultierende Zustand.","changelog.detail.confidence.unknown":"Unbekannt","changelog.detail.confidence.unknown.tooltip":"Diese Änderung konnte aus den verfügbaren Daten nicht zuverlässig klassifiziert werden.","changelog.detail.noChanges":"Keine Änderungen in dieser Kategorie","changelog.detail.backToList":"Zurück zur Liste","changelog.diff.empty":"Kein Diff verfügbar","changelog.diff.unified":"Vereinheitlicht","changelog.diff.sideBySide":"Nebeneinander","changelog.diff.before":"Vorher","changelog.diff.after":"Nachher","sync.overlay.title":"Roblox Studio Plugin erforderlich","sync.overlay.message":"Sync-Status ist verfügbar, sobald das Roblox Studio Plugin verbunden ist.","sync.overlay.check1":"Läuft Roblox Studio?","sync.overlay.check2":"Ist das WEPPY Plugin installiert?","sync.status.title":"Sync-Status","sync.status.title.tooltip":"Aktueller Studio- und lokaler Datei-Sync-Status für diesen Place.","sync.status.forwardOnly":"Nur vorwärts","sync.status.forwardOnly.tooltip":"Basic-Tier erlaubt nur Studio-zu-Lokal-Vorwärts-Sync.","sync.status.place":"Place","sync.status.place.tooltip":"Verbundener Roblox Place-Name und Place-ID.","sync.status.path":"Pfad","sync.status.path.tooltip":"Lokaler Dateisystem-Stamm, der derzeit für die Sync-Ausgabe verwendet wird.","sync.status.instances":"Instanzen","sync.status.instances.tooltip":"Gesamtzahl synchronisierter Roblox-Instanzen, die im lokalen Spiegel verfolgt werden.","sync.status.scripts":"Skripte","sync.status.scripts.tooltip":"Gesamtzahl synchronisierter Skript-Dateien, die derzeit für diesen Place indiziert sind.","sync.status.state":"Status","sync.status.state.tooltip":"Aktueller Laufzeit-Sync-Status, der vom Server gemeldet wird.","sync.directions.title":"Sync-Richtungen","sync.directions.title.tooltip":"Sync-Richtung pro Kategorie und Apply-Verhalten zwischen Lokal und Studio.","sync.directions.type":"Typ","sync.directions.type.tooltip":"Sync-Kategorie, die von dieser Regel betroffen ist.","sync.directions.direction":"Richtung","sync.directions.direction.tooltip":"Ob jede Kategorie von Studio, zu Studio oder in beide Richtungen synchronisiert.","sync.directions.applyMode":"Apply-Modus","sync.directions.applyMode.tooltip":"Wie eingehende Sync-Änderungen für diese Kategorie angewendet werden.","sync.directions.cat.scripts":"Skripte","sync.directions.cat.values":"Werte","sync.directions.cat.containers":"Container","sync.directions.cat.data":"Daten","sync.directions.cat.services":"Services","sync.directions.endpoint.local":"Lokal","sync.directions.endpoint.local.tooltip":"Lokale Dateien auf der Festplatte werden immer auf der linken Seite der Richtungsschiene angezeigt.","sync.directions.endpoint.studio":"Studio","sync.directions.endpoint.studio.tooltip":"Roblox Studio wird immer auf der rechten Seite der Richtungsschiene angezeigt.","sync.directions.mode.manual":"Manuell","sync.directions.mode.manual.tooltip":"Wendet Sync-Änderungen nur an, wenn Sie sie manuell auslösen.","sync.directions.mode.auto":"Auto","sync.directions.mode.auto.tooltip":"Wendet Sync-Änderungen automatisch an, wenn Updates eintreffen.","sync.directions.tooltip.forward.body":"Studio-Änderungen werden nur in lokale Dateien synchronisiert","sync.directions.tooltip.bidirectional.body":"Zwei-Wege-Sync zwischen Lokal und Studio","sync.directions.tooltip.reverse.body":"Lokale Dateiänderungen zu Studio pushen","sync.directions.tooltip.proRequired":"Pro im Basic-Tier erforderlich","sync.directions.dir.forward":"vorwärts","sync.directions.dir.bidirectional":"bidirektional","sync.directions.dir.reverse":"reverse","sync.log.title":"Sync-Protokoll","sync.log.empty":"Noch keine Sync-Ereignisse","sync.log.type.write":"WRITE","sync.log.type.write.tooltip":"Eine neue Sync-Ausgabe wurde auf die Festplatte geschrieben.","sync.log.type.update":"UPDATE","sync.log.type.update.tooltip":"Eine bestehende synchronisierte Datei oder Instanz wurde aktualisiert.","sync.log.type.delete":"DELETE","sync.log.type.delete.tooltip":"Eine synchronisierte Datei oder Instanz wurde entfernt.","sync.log.type.idle":"IDLE","sync.log.type.idle.tooltip":"Ein Sync-Ereignis wurde ohne Dateimutation aufgezeichnet.","sync.upgrade.title":"Vollständigen Sync mit Pro freischalten","sync.upgrade.benefit1":"Bidirektionaler Sync — Dateien bearbeiten, automatisch auf Studio anwenden","sync.upgrade.benefit2":"Reverse-Sync — Dateiänderungen zurück zu Studio pushen","sync.upgrade.benefit3":"Vollständiger Sync-Verlauf und detailliertes Änderungsprotokoll","sync.upgrade.buy":"Upgrade auf Pro","playtest.status.title":"Playtest-Status","playtest.status.title.tooltip":"Aktueller Roblox Playtest-Sessionstatus, der von Studio gemeldet wird.","playtest.status.mode":"Modus","playtest.status.mode.tooltip":"Studio-Playtest-Startmodus für die aktuelle Session.","playtest.status.mode.value.tooltip":"Spezifischer Roblox Studio Playtest-Modus, der derzeit verwendet wird.","playtest.status.mode.play":"Play","playtest.status.mode.run":"Run","playtest.status.mode.server":"Server","playtest.status.mode.edit":"Edit","playtest.status.place.tooltip":"Roblox Place, der derzeit mit dieser Playtest-Session verknüpft ist.","playtest.status.state.running":"Läuft","playtest.status.state.running.tooltip":"Eine Roblox Playtest-Session läuft derzeit.","playtest.status.state.paused":"Pausiert","playtest.status.state.paused.tooltip":"Die aktuelle Roblox Playtest-Session ist pausiert.","playtest.status.state.notRunning":"Läuft nicht","playtest.status.state.notRunning.tooltip":"Es läuft derzeit keine Roblox Playtest-Session.","playtest.control.play":"Play","playtest.control.pause":"Pause","playtest.control.resume":"Resume","playtest.control.stop":"Stop","playtest.history.title":"Testverlauf","playtest.history.title.tooltip":"Aufgezeichnete automatisierte Playtest-Läufe für dieses Projekt.","playtest.history.empty":"Noch keine Testergebnisse","playtest.history.mode":"Modus","playtest.history.mode.tooltip":"Playtest-Modus, der für diesen aufgezeichneten Testlauf verwendet wurde.","playtest.history.status.passed":"Bestanden","playtest.history.status.failed":"Fehlgeschlagen","playtest.history.status.running":"Läuft","playtest.history.status.unknown":"Unbekannt","playtest.history.status.tooltip":"Aufgezeichneter Ergebnisstatus für diesen automatisierten Playtest-Lauf.","playtest.empty.title":"Noch keine Playtest-Ergebnisse","playtest.empty.message":"Testergebnisse erscheinen hier, wenn der KI-Agent automatisierte Tests über system_info.run_test ausführt.","playtest.empty.message.before":"Testergebnisse erscheinen hier, wenn der KI-Agent automatisierte Tests ausführt über","playtest.empty.message.after":".","playtest.empty.runTest.tooltip":"WEPPY Dashboard Automatisierungs-Einstiegspunkt, der Roblox-Playtest-Prüfungen über das system_info-Tool ausführt.","playtest.report.title":"Ausgewählter Bericht","playtest.report.title.tooltip":"Detaillierte Ausgabe für den derzeit ausgewählten automatisierten Playtest-Lauf.","playtest.report.content":"Bericht","playtest.report.content.tooltip":"Markdown-Zusammenfassung für den ausgewählten automatisierten Playtest-Lauf.","playtest.report.logs":"Logs","playtest.report.logs.tooltip":"Ausführungs-Logs, die für den ausgewählten automatisierten Playtest-Lauf erfasst wurden.","playtest.context.contextId":"Kontext-ID","playtest.context.why":"Warum dieser Test ausgeführt wurde","playtest.context.expected":"Erwartet","playtest.context.observed":"Beobachtet","playtest.report.empty":"Kein Berichtsinhalt verfügbar","playtest.basic.icon":"🎮","playtest.basic.title":"Playtest ist eine Pro-exklusive Funktion","playtest.basic.desc":"Steuern Sie Playtesting vom WEPPY Dashboard aus, führen Sie automatisierte Tests aus und sehen Sie detaillierte Testberichte.","playtest.basic.benefit1":"Ein-Klick-Play/Pause/Stop-Steuerung","playtest.basic.benefit2":"Automatisierte Testausführung über KI-Agent","playtest.basic.benefit3":"Testverlauf mit Bestanden/Fehlgeschlagen-Verfolgung","playtest.basic.benefit4":"Detaillierte Markdown-Testberichte","playtest.sample.badge":"Vorschau der Pro-Playtest-Ansicht","playtest.sample.title":"Sie sehen eine Vorschau des Playtest-Bildschirms, der nach dem Upgrade auf Pro verfügbar wird.","playtest.sample.message":"Diese Vorschau verwendet Beispieldaten. Live-Playtest-Steuerung, Verlaufsverwaltung und echte Berichte werden mit Pro freigeschaltet.","playtest.sample.clearDisabled":"Upgraden Sie auf Pro, um den Live-Playtest-Verlauf zu löschen.","playtest.sample.place":"Arena-Vorschau","playtest.sample.history.name":"Beispiel-Arena-Smoke-Test","playtest.sample.context.why":"In die Arena spawnen, den Eröffnungsangriff überleben und prüfen, ob das HUD sofort reagiert.","playtest.sample.context.expected":"Der Spieler spawnt sicher, die Countdown-UI erscheint innerhalb einer Sekunde und die erste Welle startet ohne Fehler.","playtest.sample.context.observed":"Spawn-Schutz hielt, das HUD wurde rechtzeitig aktualisiert und Welle eins wurde ohne Gameplay-Regressionen abgeschlossen.","playtest.sample.report.markdown":`# Beispiel-Arena-Smoke-Test
130
130
 
131
131
  - Spawn-Ablauf: BESTANDEN
132
132
  - HUD-Countdown: BESTANDEN
@@ -136,7 +136,7 @@ Dies ist eine Beispielvorschau. Upgraden Sie auf Pro, um Live-Playtests auszufü
136
136
  [sample] spawn protection active
137
137
  [sample] hud countdown rendered
138
138
  [sample] wave one completed
139
- [sample] preview report finished`,"sidebar.whatsNew":"Neuigkeiten","sidebar.help.group":"Hilfe & Feedback","sidebar.help.bug":"Fehler melden","sidebar.help.bug.tooltip":"Fehlerbericht mit vorausgefüllten Umgebungsdaten auf GitHub öffnen","sidebar.help.feature":"Feature vorschlagen","sidebar.help.feature.tooltip":"Neues Feature oder Verbesserung auf GitHub vorschlagen","sidebar.help.discussions":"Community","sidebar.help.discussions.tooltip":"Fragen stellen und Ideen in GitHub Discussions teilen","sidebar.help.troubleshooting":"Fehlerbehebung","sidebar.help.troubleshooting.tooltip":"Offiziellen Troubleshooting-Leitfaden auf weppyai.com öffnen","header.whatsNew":"Neuigkeiten","header.whatsNew.tooltip":"Neuigkeiten","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Neuigkeiten","whatsNew.pageSubtitle":"Bleiben Sie über MCP-Änderungen auf dem Laufenden","whatsNew.unreadSection":"Ungelesen","whatsNew.allSection":"Alle Ankündigungen","whatsNew.empty":"Noch keine Ankündigungen","whatsNew.newBadge":"NEU","whatsNew.category.release":"Release","whatsNew.category.notice":"Hinweis","whatsNew.category.deprecation":"Veraltet","whatsNew.category.tip":"Tipp","uiStudio.title":"UI Studio","uiStudio.empty":"Noch keine Screenshots gespeichert. Sie werden automatisch erstellt, wenn ein KI-Agent den aktuellen UI-Zustand erfasst.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio Plugin ist nicht verbunden","uiStudio.pluginGuide.message":"UI Studio zeigt Screenshots und Änderungsverlauf aus dem verbundenen Studio-Place. Es wird automatisch aktualisiert, sobald Studio und das WEPPY Plugin verbunden sind.","uiStudio.pluginGuide.check1":"Läuft Roblox Studio?","uiStudio.pluginGuide.check2":"Ist das WEPPY Plugin installiert und aktiv?","uiStudio.pluginGuide.waiting":"Warten auf Plugin-Verbindung...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Zuerst prüfen","uiStudio.priorityLow":"Optionale Verbesserung","uiStudio.highPrioritySection":"Zuerst prüfen","uiStudio.lowPrioritySection":"Optionale Verbesserungen","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Verlauf","uiStudio.analysis.reportsTitle":"Neueste Analyse nach UI-Ziel","uiStudio.analysis.recentCapturesTitle":"Letzte Aufnahmen","uiStudio.analysis.detailDialog":"Analysedetails","uiStudio.analysis.targetCountLabel":"Analysierte Ziele","uiStudio.analysis.captureLabel":"Aufnahmen","uiStudio.analysis.verdict.hasSuggestions":"Verbesserungsvorschläge","uiStudio.analysis.verdict.needsFix":"Verbesserungsvorschläge","uiStudio.analysis.verdict.review":"Verbesserungsvorschläge","uiStudio.analysis.verdict.passed":"Keine aktuellen Vorschläge","uiStudio.analysis.verdictLabel":"Verbesserungsübersicht","uiStudio.analysis.thresholds":"Prüfgrundlage","uiStudio.analysis.issueSummary.passed":"Auf der aktuellen Prüfgrundlage gibt es keine weiteren Verbesserungsvorschläge.","uiStudio.history.title":"Änderungsverlauf","uiStudio.history.empty":"Noch kein Verlauf vorhanden. Wenn ein KI-Agent die UI mit manage_ui ändert, wird es automatisch aufgezeichnet.","uiStudio.history.loading":"Wird geladen...","uiStudio.history.error":"Fehler","uiStudio.history.clear":"Alles löschen","uiStudio.history.filter.actions":"Aktionstyp","uiStudio.history.filter.actionAll":"Alle","uiStudio.history.filter.actionCreate":"Erstellen","uiStudio.history.filter.actionUpdate":"Aktualisieren","uiStudio.history.filter.actionDelete":"Löschen","uiStudio.history.filter.period":"Zeitraum","uiStudio.history.filter.dateAll":"Alle","uiStudio.history.filter.today":"Heute","uiStudio.history.filter.yesterday":"Gestern","uiStudio.history.filter.last7Days":"Letzte 7 Tage","uiStudio.history.filter.last30Days":"Letzte 30 Tage","uiStudio.history.filter.customRange":"Eigener Zeitraum","uiStudio.history.filter.reset":"Zurücksetzen","uiStudio.history.filter.from":"Von","uiStudio.history.filter.to":"Bis","uiStudio.history.row.affectedPaths":"Pfade","uiStudio.history.row.mutations":"Änderungsdetails","uiStudio.history.row.expand":"▾ Erweitern","uiStudio.history.row.collapse":"▲ Einklappen","uiStudio.history.row.expandDetails":"{n} Änderungen anzeigen","uiStudio.history.row.collapseDetails":"Änderungen ausblenden","uiStudio.history.row.toggleDetails":"Änderungsdetails umschalten","uiStudio.history.row.mutationsEmpty":"Keine Änderungsdetails","uiStudio.history.row.toolLabel":"UI-Änderungen ({n})","uiStudio.history.row.compare":"Vorher / Nachher","uiStudio.history.row.noBeforeState":"Kein Vorher-Zustand","uiStudio.history.row.noAfterState":"Kein Nachher-Zustand","uiStudio.history.row.qualityPlan":"Designrichtung","uiStudio.history.row.designCheck":"Vorschläge","uiStudio.history.row.designCheckUnavailable":"Vorschläge: nicht verfügbar","uiStudio.history.row.designCheckNone":"Vorschläge: keine","uiStudio.history.selection.deleteSelected":"Ausgewählte löschen","uiStudio.history.selection.selectAll":"Alle auswählen","uiStudio.history.selection.clearSelection":"Auswahl aufheben","uiStudio.history.confirm.deleteRequestsTitle":"Änderungsprotokolle löschen","uiStudio.history.confirm.deleteRequestsMessage":"Die ausgewählten Änderungsprotokolle werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.history.confirm.clearRequestsTitle":"Änderungsverlauf löschen","uiStudio.history.confirm.clearRequestsMessage":"Der Änderungsverlauf des aktuellen Place wird gelöscht. Studio-Instanzen sind nicht betroffen.","uiStudio.history.confirm.cascadeOption":"Verknüpfte Screenshots ebenfalls löschen","uiStudio.history.drawer.close":"Schließen","uiStudio.actions.previewAgain":"Erneut vorschau","uiStudio.actions.deleteSnapshot":"Diesen Screenshot löschen","uiStudio.actions.proRequired":"Nach Pro-Upgrade verfügbar","uiStudio.actions.captureCurrentState":"Aktuellen Zustand erfassen","uiStudio.actions.checkSuggestionsAgain":"Vorschläge erneut prüfen","uiStudio.actions.previewRunning":"Wird erfasst…","uiStudio.actions.previewRunningDetail":"Nach Abschluss wird die neue Screenshot-Datei-ID angezeigt.","uiStudio.actions.previewNeedsSaveCheck":"Erfassung abgeschlossen, Speicherung prüfen","uiStudio.actions.previewSaved":"Neuer Screenshot gespeichert","uiStudio.actions.previewComplete":"Erfassung abgeschlossen","uiStudio.actions.previewSavedDetail":"Vorhandene Screenshots bleiben erhalten; dies wurde als neue Datei gespeichert.","uiStudio.actions.previewSavedPathMissing":"Eine neue Screenshot-ID wurde zurückgegeben, aber der Speicherpfad konnte nicht bestätigt werden.","uiStudio.actions.previewSnapshotIdMissing":"Die neue Screenshot-ID konnte nicht bestätigt werden. Aktualisiere die Liste, um zu prüfen, ob sie gespeichert wurde.","uiStudio.actions.more":"Mehr","uiStudio.gallery.selection.selectedCount":" ausgewählt","uiStudio.confirm.deleteSnapshotTitle":"Screenshot löschen","uiStudio.confirm.deleteSnapshotMessage":"Nur diese Screenshot-Datei wird gelöscht (Studio-Instanz bleibt erhalten).","uiStudio.confirm.deleteBatchTitle":"Ausgewählte Screenshots löschen","uiStudio.confirm.deleteBatchMessage":"Die ausgewählten Screenshots werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.gallery.selectMode":"Auswählen","uiStudio.gallery.exitSelectMode":"Abbrechen","uiStudio.gallery.selectAll":"Alle auswählen","uiStudio.gallery.clearSelection":"Auswahl aufheben","uiStudio.gallery.deleteSelected":"Auswahl löschen","common.cancel":"Abbrechen","common.delete":"Löschen","uiStudio.storage.title":"Gespeicherte UI Studio-Daten","uiStudio.storage.usageLabel":"In Verwendung","uiStudio.storage.historyBytes":"Verlauf","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Änderungsprotokolle","uiStudio.storage.mutationCount":"Änderungsdetails","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Letzte automatische Bereinigung","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freigegeben","uiStudio.storage.lastRunErrors":"Fehler","uiStudio.storage.loading":"Lädt...","uiStudio.cleanup.policy.title":"Richtlinie zur automatischen Löschung","uiStudio.cleanup.policy.modeOff":"Deaktiviert","uiStudio.cleanup.policy.modeAge":"Altersbasiert","uiStudio.cleanup.policy.modeSize":"Größenbasiert","uiStudio.cleanup.policy.cascade":"Auch verknüpfte Screenshots löschen","uiStudio.cleanup.policy.save":"Richtlinie speichern","uiStudio.cleanup.policy.runNow":"Jetzt ausführen","uiStudio.cleanup.policy.proRequired":"Nach dem Upgrade auf Pro verfügbar","uiStudio.cleanup.policy.daysUnit":"T","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Richtlinie bestätigen","uiStudio.cleanup.policy.confirm.messageStrict":"Diese Richtlinie wird sofort löschen","uiStudio.cleanup.policy.confirm.requests":" Änderungsprotokolle","uiStudio.cleanup.policy.confirm.snapshots":" Screenshots","uiStudio.cleanup.policy.confirm.freed":"freigegeben — Anwenden?","uiStudio.cleanup.keepLastNDays":"Nur letzte {n} Tage behalten","uiStudio.cleanup.selectedDelete":"Auswahl löschen…","uiStudio.cleanup.deleteAll":"Alles löschen…","uiStudio.cleanup.cleanupConfirmTitle":"Bereinigung bestätigen","uiStudio.cleanup.cleanupConfirmMessage":"Die ausgewählten Elemente werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manuelle Bereinigung","uiStudio.cleanup.studioPreservedNote":"Diese Aktion löscht nur Verlaufs- und Screenshot-Dateien auf dem Datenträger; Roblox Studio-Instanzen sind nicht betroffen.","uiStudio.history.sample.bannerBadge":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerTitle":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerMessage":"Diese Vorschau verwendet Beispieldaten. Echter Anfrageverlauf, Vorher/Nachher-Vergleich und Massenlöschung sind in Pro verfügbar.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Auf Pro upgraden, um den vollständigen Verlauf freizuschalten","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP-Server verbunden","toast.serverDisconnected":"MCP-Server getrennt","toast.pluginConnected":"Plugin verbunden","toast.pluginDisconnected":"Plugin getrennt","toast.clearSuccess":"Erfolgreich geleert","toast.clearFailed":"Daten konnten nicht geleert werden","common.clear":"Leeren","settings.license.activate":"Lizenz aktivieren","settings.license.refresh":"Lizenz aktualisieren","settings.license.keyInput":"Lizenzschlüssel","settings.license.disconnected":"Getrennt","settings.license.disconnected.tooltip":"Verbinden Sie sich erneut mit dem MCP-Server, um Lizenzaktionen über das WEPPY Dashboard zu verwalten.","settings.license.live.tooltip":"Lizenzaktionen werden sofort an den MCP-Server gesendet.","settings.license.status.activationRequired":"Aktivierung erforderlich","settings.license.status.activationRequired.tooltip":"Eine manuelle Lizenzaktivierung ist erforderlich, bevor das WEPPY Dashboard diesen Status aktualisieren kann.","settings.license.status.grace":"Karenzzeit","settings.license.status.grace.tooltip":"Die Anbieterprüfung ist vorübergehend nicht verfügbar, der Pro-Zugriff bleibt während der Karenzzeit aktiv.","settings.license.status.graceBilling.tooltip":"Während einer abrechnungsbedingten Karenzzeit bleibt der Pro-Zugriff verfügbar.","settings.license.detail.graceBilling":"Der Pro-Zugriff bleibt während einer Abrechnungs-Karenzzeit verfügbar.","settings.license.detail.graceProviderUnavailable":"Anbieter nicht verfügbar. Der Pro-Zugriff bleibt im Karenzmodus aktiv.","settings.license.detail.manualActivation":"Manuelle Aktivierung erforderlich, um den Pro-Zugriff wiederherzustellen.","settings.license.detail.missingSessionToken":"Die Aktualisierung ist blockiert, da das aktuelle Session-Token fehlt.","settings.license.detail.refreshRecommended":"Die Lizenzprüfung sollte bald aktualisiert werden.","connection.agents.kill":"Beenden","connection.agents.kill.title":"Agent beenden?","connection.agents.killed":"Agent beendet","connection.agents.killFailed":"Agent konnte nicht beendet werden","connection.agents.lastCommand":"Letzter Befehl","connection.agents.lastCommand.tooltip":"Der zuletzt von diesem Agenten ausgeführte Tool-Aufruf","connection.agents.lastSeen":"Zuletzt aktiv","connection.agents.lastSeen.tooltip":"Der letzte Heartbeat oder die letzte Aktivität dieses Agenten","connection.clear.title":"Verbindungsprotokoll leeren?","connection.clear.message":"Dadurch wird das gespeicherte Verbindungsprotokoll des aktuellen Projekts dauerhaft entfernt.","sync.clear.title":"Synchronisierungsprotokoll leeren?","sync.clear.message":"Dadurch wird das gespeicherte Synchronisierungsprotokoll des aktuellen Place dauerhaft entfernt.","playtest.clear.title":"Testverlauf leeren?","playtest.clear.message":"Dadurch werden die gespeicherten Playtest-Berichte des aktuellen Place dauerhaft entfernt.","changelog.clear.title":"Änderungsprotokoll leeren?","changelog.clear.message":"Dadurch wird das gespeicherte Änderungsprotokoll des aktuellen Place dauerhaft entfernt.","sync.status.placePath":"Place-Pfad","sync.status.placePath.tooltip":"Aktives Place-Verzeichnis, in das Explorer-Dateien synchronisiert werden.","tier.progress.label":"Pro / Gesamt","changelog.card.representativeArea":"Repräsentativer Bereich","changelog.card.verification":"Überprüfung","uiStudio.designCheckResultsTitle":"Design-Check-Vorschläge","uiStudio.actions.designCheckAgain":"Erneut prüfen","uiStudio.actions.designCheckRunning":"Vorschläge werden geprüft...","uiStudio.actions.designCheckRunningDetail":"Nach Abschluss werden zuerst zu prüfende, empfohlene und optionale Elemente angezeigt.","uiStudio.actions.designCheckComplete":"Vorschlagsprüfung abgeschlossen","uiStudio.actions.designCheckNoSnapshotSaved":"Diese Aktion speichert keine neue Screenshot-Datei.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.priorityMedium":"Prüfung empfohlen","uiStudio.mediumPrioritySection":"Prüfung empfohlen","uiStudio.history.row.qualityPlan.tooltip":"Für diese Änderung verwendete Brief-Designrichtung.","uiStudio.history.row.designCheck.tooltip":"Zusammenfassung der Design-Check-Vorschläge nach der Änderung.","uiStudio.gallery.priorityHighBadge.tooltip":"Anzahl der zuerst zu prüfenden Vorschläge. Für Details klicken.","uiStudio.gallery.priorityMediumBadge.tooltip":"Anzahl der empfohlenen Vorschläge.","uiStudio.gallery.priorityLowBadge.tooltip":"Anzahl der optionalen Verbesserungen."},Of=["en","ko","es","pt-br","ja","id","de"],Ei="auto",kl={en:Mf,ko:_f,es:Lf,"pt-br":Nf,ja:Uf,id:Hf,de:Bf},Pr="dashboard-locale";function Ml(a){return Of.includes(a)}function Ff(){const r=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return r==="ko"||r.startsWith("ko-")?"ko":r==="pt-br"?"pt-br":r==="ja"||r.startsWith("ja-")?"ja":r==="es"||r.startsWith("es-")?"es":r==="id"||r.startsWith("id-")?"id":r==="de"||r.startsWith("de-")?"de":"en"}function $d(){if(typeof localStorage<"u"){const a=localStorage.getItem(Pr);if(a===Ei)return Ei;if(a&&Ml(a))return a}return Ei}function Qd(a){return a===Ei?Ff():a}const Ap=R.createContext(null);function qf({children:a}){const[r,s]=R.useState($d),[u,d]=R.useState(()=>Qd($d())),p=R.useCallback((m,f)=>{const y=kl[u]??kl.en??{};if(m in y)return y[m];const P=kl.en;return P&&m in P?P[m]:f!==void 0?f:m},[u]),g=R.useCallback(m=>{typeof localStorage<"u"&&(m===Ei?localStorage.removeItem(Pr):Ml(m)?localStorage.setItem(Pr,m):localStorage.setItem(Pr,"en"));const f=m===Ei?Ei:Ml(m)?m:"en";s(f),d(Qd(f))},[]);return R.createElement(Ap.Provider,{value:{locale:u,selectedLocale:r,t:p,setLocale:g}},a)}function si(){const a=R.useContext(Ap);if(!a)throw new Error("useLocale must be used within a LocaleProvider");return a}const Wf="_container_6jg7e_2",Vf="_toast_6jg7e_14",Yf="_slideIn_6jg7e_1",Kf="_success_6jg7e_39",Gf="_info_6jg7e_44",$f="_warning_6jg7e_49",Qf="_error_6jg7e_54",Pl={container:Wf,toast:Vf,slideIn:Yf,success:Kf,info:Gf,warning:$f,error:Qf},Ip=R.createContext(null),Zf=3e3;function Jf({children:a}){const[r,s]=R.useState([]),u=R.useRef(0),d=R.useCallback((p,g="info")=>{const m=u.current++;s(f=>[...f,{id:m,message:p,type:g}]),setTimeout(()=>{s(f=>f.filter(y=>y.id!==m))},Zf)},[]);return z.jsxs(Ip.Provider,{value:{show:d},children:[a,z.jsx("div",{className:Pl.container,children:r.map(p=>z.jsx("div",{className:`${Pl.toast} ${Pl[p.type]}`,children:p.message},p.id))})]})}function Ep(){const a=R.useContext(Ip);return a||{show:()=>{}}}function Xf(){const{level:a}=Er(),{show:r}=Ep(),{t:s}=si(),u=R.useRef(null);return R.useEffect(()=>{const d=u.current;u.current=a,d!==null&&d!==a&&(d==="disconnected"&&a==="serverOnly"?r(s("toast.serverConnected","MCP 서버 연결됨"),"success"):d==="serverOnly"&&a==="studioConnected"?r(s("toast.pluginConnected","플러그인 연결됨"),"success"):(d==="serverOnly"||d==="studioConnected")&&a==="disconnected"?r(s("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):d==="studioConnected"&&a==="serverOnly"&&r(s("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[a,r,s]),null}const ey="_wrapper_x0nim_2",ty="_tooltip_x0nim_11",oy="_tooltipVisible_x0nim_30",Cl={wrapper:ey,tooltip:ty,tooltipVisible:oy},ra=8,br=6;function Ii({text:a,children:r}){const s=R.useRef(null),u=R.useRef(null),[d,p]=R.useState(!1),[g,m]=R.useState("top"),[f,y]=R.useState("center"),[P,C]=R.useState(null),j=a.trim(),_=R.useCallback(()=>{const re=s.current,W=u.current;if(!re||!W)return;const J=re.getBoundingClientRect(),te=W.getBoundingClientRect(),Se=window.innerWidth,Ae=window.innerHeight;let A="top";J.top-te.height-br<ra&&J.bottom+te.height+br<=Ae-ra&&(A="bottom");let K="center";const be=J.left+J.width/2,le=te.width/2;be-le<ra?K="left":be+le>Se-ra&&(K="right");const ke=A==="top"?J.top-te.height-br:J.bottom+br;let we;K==="left"?we=J.left:K==="right"?we=J.right-te.width:we=be-le,we=Math.max(ra,Math.min(we,Se-te.width-ra)),m(A),y(K),C({top:ke,left:we})},[]);if(R.useLayoutEffect(()=>{d&&_()},[d,_]),R.useEffect(()=>{if(!d)return;const re=()=>_();return window.addEventListener("scroll",re,!0),window.addEventListener("resize",re),()=>{window.removeEventListener("scroll",re,!0),window.removeEventListener("resize",re)}},[d,_]),!j)return z.jsx(z.Fragment,{children:r});const F=()=>p(!0),N=()=>p(!1),H=z.jsx("span",{ref:u,className:[Cl.tooltip,d?Cl.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":f,"data-vertical":g,style:P?{top:P.top,left:P.left}:{top:-9999,left:-9999,visibility:"hidden"},children:j});return z.jsxs(z.Fragment,{children:[z.jsx("span",{ref:s,className:Cl.wrapper,title:j,onMouseEnter:F,onMouseLeave:N,onFocus:F,onBlur:N,children:r}),typeof document<"u"?Nl.createPortal(H,document.body):null]})}function iy(a){return a==="gumroad"?"gumroad":void 0}function ay(a){if(!a||typeof a!="object")return!1;const r=a.status;return(a.tier==="basic"||a.tier==="pro")&&(r==="active"||r==="grace"||r==="invalid"||r==="revoked"||r==="unlicensed"||r==="unknown")}function jp(a){return a&&typeof a=="object"&&"data"in a&&a.data?a.data:a}function zp(a){if(!a||typeof a!="object")return null;if(ay(a))return a;const r=a;if(typeof r.canUsePro!="boolean"||typeof r.status!="string"||r.status!=="active"&&r.status!=="grace"&&r.status!=="invalid"&&r.status!=="revoked"&&r.status!=="unlicensed"&&r.status!=="unknown")return null;const s=iy(r.provider);return{tier:r.canUsePro?"pro":"basic",status:r.status,...typeof r.statusDetail=="string"?{statusDetail:r.statusDetail}:{},...typeof r.maskedKey=="string"?{maskedKey:r.maskedKey}:{},...s?{provider:s}:{},refreshRequired:r.refreshRequired===!0,...typeof r.refreshBlockedReason=="string"?{refreshBlockedReason:r.refreshBlockedReason}:{}}}async function Dp(a="gumroad"){const r=await eo.get("/api/dashboard/license/status",{provider:a});return zp(jp(r))}function Yl(a){const r=jp(a),s=r,u=zp(r),d=typeof(s==null?void 0:s.reasonCode)=="string"?s.reasonCode:void 0;return{ok:(s==null?void 0:s.ok)===!0,license:u?{...u,refreshRequired:u.refreshRequired||d==="missing_session_token",refreshBlockedReason:u.refreshBlockedReason??(d==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(s==null?void 0:s.message)=="string"?s.message:null,reasonCode:d,recoverable:(s==null?void 0:s.recoverable)===!0}}async function Nv(a){const r=a.provider??"gumroad",s=await eo.post("/api/dashboard/license/activate",{provider:r,licenseKey:a.licenseKey,clientType:"dashboard"});return Yl(s)}async function Uv(a={}){const r=a.provider??"gumroad",s=await eo.post("/api/dashboard/license/refresh",{provider:r,clientType:"dashboard"});return Yl(s)}async function Hv(a={}){const r=a.provider??"gumroad",s=await eo.post("/api/dashboard/license/reset",{provider:r,clientType:"dashboard"});return Yl(s)}class Mp{constructor(r){xo(this,"source",null);xo(this,"handlers",new Map);xo(this,"reconnectTimer",null);xo(this,"url");this.url=r??`${Ir}/api/dashboard/events`}connect(){this.disconnect(),this.source=new EventSource(this.url),this.source.onopen=()=>{this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)},this.source.onerror=()=>{var s;(s=this.source)==null||s.close(),this.source=null,this.scheduleReconnect()};const r=["connection","sync","command","game_change","mcp_status","license"];for(const s of r)this.source.addEventListener(s,u=>{var p;const d=JSON.parse(u.data);(p=this.handlers.get(s))==null||p.forEach(g=>g(d))})}on(r,s){return this.handlers.has(r)||this.handlers.set(r,new Set),this.handlers.get(r).add(s),()=>{var u;return(u=this.handlers.get(r))==null?void 0:u.delete(s)}}disconnect(){var r;(r=this.source)==null||r.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var r;return((r=this.source)==null?void 0:r.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},Rf))}}/**
139
+ [sample] preview report finished`,"sidebar.whatsNew":"Neuigkeiten","sidebar.help.group":"Hilfe & Feedback","sidebar.help.bug":"Fehler melden","sidebar.help.bug.tooltip":"Fehlerbericht mit vorausgefüllten Umgebungsdaten auf GitHub öffnen","sidebar.help.feature":"Feature vorschlagen","sidebar.help.feature.tooltip":"Neues Feature oder Verbesserung auf GitHub vorschlagen","sidebar.help.discussions":"Community","sidebar.help.discussions.tooltip":"Fragen stellen und Ideen in GitHub Discussions teilen","sidebar.help.troubleshooting":"Fehlerbehebung","sidebar.help.troubleshooting.tooltip":"Offiziellen Troubleshooting-Leitfaden auf weppyai.com öffnen","header.whatsNew":"Neuigkeiten","header.whatsNew.tooltip":"Neuigkeiten","upgrade.title":"Upgrade to Pro","upgrade.tagline":"Go Pro for more power","upgrade.cta":"Upgrade to Pro","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"Neuigkeiten","whatsNew.pageSubtitle":"Bleiben Sie über MCP-Änderungen auf dem Laufenden","whatsNew.unreadSection":"Ungelesen","whatsNew.allSection":"Alle Ankündigungen","whatsNew.empty":"Noch keine Ankündigungen","whatsNew.newBadge":"NEU","whatsNew.category.release":"Release","whatsNew.category.notice":"Hinweis","whatsNew.category.deprecation":"Veraltet","whatsNew.category.tip":"Tipp","uiStudio.title":"UI Studio","uiStudio.empty":"Noch keine Screenshots gespeichert. Sie werden automatisch erstellt, wenn ein KI-Agent den aktuellen UI-Zustand erfasst.","uiStudio.loading":"Loading…","uiStudio.pluginGuide.title":"Roblox Studio Plugin ist nicht verbunden","uiStudio.pluginGuide.message":"UI Studio zeigt Screenshots und Änderungsverlauf aus dem verbundenen Studio-Place. Es wird automatisch aktualisiert, sobald Studio und das WEPPY Plugin verbunden sind.","uiStudio.pluginGuide.check1":"Läuft Roblox Studio?","uiStudio.pluginGuide.check2":"Ist das WEPPY Plugin installiert und aktiv?","uiStudio.pluginGuide.waiting":"Warten auf Plugin-Verbindung...","uiStudio.capturedAt":"Captured at","uiStudio.scope":"Scope","uiStudio.target":"Target","uiStudio.briefId":"Brief ID","uiStudio.detailClose":"Close","uiStudio.colCheck":"Check","uiStudio.colPriority":"Priority","uiStudio.colCurrent":"Current","uiStudio.colRecommended":"Recommended","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Zuerst prüfen","uiStudio.priorityLow":"Optionale Verbesserung","uiStudio.highPrioritySection":"Zuerst prüfen","uiStudio.lowPrioritySection":"Optionale Verbesserungen","uiStudio.groupSummary":"items","uiStudio.fixLabel":"Fix","uiStudio.copyFixCommand":"Copy AI instruction","uiStudio.copiedToClipboard":"Copied","uiStudio.fullPath":"Full path","uiStudio.falsePositiveWarning":"This group may contain false positives","uiStudio.noSuggestions":"No current improvement suggestions","uiStudio.sample.badge":"Preview of the Pro UI Studio","uiStudio.sample.title":"You are previewing the UI Studio that unlocks after upgrading to Pro.","uiStudio.sample.message":"This preview uses sample data from a demo inventory UI. Real screenshots, review history, and AI-driven fixes unlock with Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Verlauf","uiStudio.analysis.reportsTitle":"Neueste Analyse nach UI-Ziel","uiStudio.analysis.recentCapturesTitle":"Letzte Aufnahmen","uiStudio.analysis.detailDialog":"Analysedetails","uiStudio.analysis.targetCountLabel":"Analysierte Ziele","uiStudio.analysis.captureLabel":"Aufnahmen","uiStudio.analysis.verdict.hasSuggestions":"Verbesserungsvorschläge","uiStudio.analysis.verdict.needsFix":"Verbesserungsvorschläge","uiStudio.analysis.verdict.review":"Verbesserungsvorschläge","uiStudio.analysis.verdict.passed":"Keine aktuellen Vorschläge","uiStudio.analysis.verdictLabel":"Verbesserungsübersicht","uiStudio.analysis.thresholds":"Prüfgrundlage","uiStudio.analysis.issueSummary.passed":"Auf der aktuellen Prüfgrundlage gibt es keine weiteren Verbesserungsvorschläge.","uiStudio.history.title":"Änderungsverlauf","uiStudio.history.empty":"Noch kein Verlauf vorhanden. Wenn ein KI-Agent die UI mit manage_ui ändert, wird es automatisch aufgezeichnet.","uiStudio.history.loading":"Wird geladen...","uiStudio.history.error":"Fehler","uiStudio.history.clear":"Alles löschen","uiStudio.history.filter.actions":"Aktionstyp","uiStudio.history.filter.actionAll":"Alle","uiStudio.history.filter.actionCreate":"Erstellen","uiStudio.history.filter.actionUpdate":"Aktualisieren","uiStudio.history.filter.actionDelete":"Löschen","uiStudio.history.filter.period":"Zeitraum","uiStudio.history.filter.dateAll":"Alle","uiStudio.history.filter.today":"Heute","uiStudio.history.filter.yesterday":"Gestern","uiStudio.history.filter.last7Days":"Letzte 7 Tage","uiStudio.history.filter.last30Days":"Letzte 30 Tage","uiStudio.history.filter.customRange":"Eigener Zeitraum","uiStudio.history.filter.reset":"Zurücksetzen","uiStudio.history.filter.from":"Von","uiStudio.history.filter.to":"Bis","uiStudio.history.row.affectedPaths":"Pfade","uiStudio.history.row.mutations":"Änderungsdetails","uiStudio.history.row.expand":"▾ Erweitern","uiStudio.history.row.collapse":"▲ Einklappen","uiStudio.history.row.expandDetails":"{n} Änderungen anzeigen","uiStudio.history.row.collapseDetails":"Änderungen ausblenden","uiStudio.history.row.toggleDetails":"Änderungsdetails umschalten","uiStudio.history.row.mutationsEmpty":"Keine Änderungsdetails","uiStudio.history.row.toolLabel":"UI-Änderungen ({n})","uiStudio.history.row.compare":"Vorher / Nachher","uiStudio.history.row.noBeforeState":"Kein Vorher-Zustand","uiStudio.history.row.noAfterState":"Kein Nachher-Zustand","uiStudio.history.row.qualityPlan":"Designrichtung","uiStudio.history.row.designCheck":"Vorschläge","uiStudio.history.row.designCheckUnavailable":"Vorschläge: nicht verfügbar","uiStudio.history.row.designCheckNone":"Vorschläge: keine","uiStudio.history.selection.deleteSelected":"Ausgewählte löschen","uiStudio.history.selection.selectAll":"Alle auswählen","uiStudio.history.selection.clearSelection":"Auswahl aufheben","uiStudio.history.confirm.deleteRequestsTitle":"Änderungsprotokolle löschen","uiStudio.history.confirm.deleteRequestsMessage":"Die ausgewählten Änderungsprotokolle werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.history.confirm.clearRequestsTitle":"Änderungsverlauf löschen","uiStudio.history.confirm.clearRequestsMessage":"Der Änderungsverlauf des aktuellen Place wird gelöscht. Studio-Instanzen sind nicht betroffen.","uiStudio.history.confirm.cascadeOption":"Verknüpfte Screenshots ebenfalls löschen","uiStudio.history.drawer.close":"Schließen","uiStudio.actions.previewAgain":"Erneut vorschau","uiStudio.actions.deleteSnapshot":"Diesen Screenshot löschen","uiStudio.actions.proRequired":"Nach Pro-Upgrade verfügbar","uiStudio.actions.captureCurrentState":"Aktuellen Zustand erfassen","uiStudio.actions.checkSuggestionsAgain":"Vorschläge erneut prüfen","uiStudio.actions.previewRunning":"Wird erfasst…","uiStudio.actions.previewRunningDetail":"Nach Abschluss wird die neue Screenshot-Datei-ID angezeigt.","uiStudio.actions.previewNeedsSaveCheck":"Erfassung abgeschlossen, Speicherung prüfen","uiStudio.actions.previewSaved":"Neuer Screenshot gespeichert","uiStudio.actions.previewComplete":"Erfassung abgeschlossen","uiStudio.actions.previewSavedDetail":"Vorhandene Screenshots bleiben erhalten; dies wurde als neue Datei gespeichert.","uiStudio.actions.previewSavedPathMissing":"Eine neue Screenshot-ID wurde zurückgegeben, aber der Speicherpfad konnte nicht bestätigt werden.","uiStudio.actions.previewSnapshotIdMissing":"Die neue Screenshot-ID konnte nicht bestätigt werden. Aktualisiere die Liste, um zu prüfen, ob sie gespeichert wurde.","uiStudio.actions.more":"Mehr","uiStudio.gallery.selection.selectedCount":" ausgewählt","uiStudio.confirm.deleteSnapshotTitle":"Screenshot löschen","uiStudio.confirm.deleteSnapshotMessage":"Nur diese Screenshot-Datei wird gelöscht (Studio-Instanz bleibt erhalten).","uiStudio.confirm.deleteBatchTitle":"Ausgewählte Screenshots löschen","uiStudio.confirm.deleteBatchMessage":"Die ausgewählten Screenshots werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.gallery.selectMode":"Auswählen","uiStudio.gallery.exitSelectMode":"Abbrechen","uiStudio.gallery.selectAll":"Alle auswählen","uiStudio.gallery.clearSelection":"Auswahl aufheben","uiStudio.gallery.deleteSelected":"Auswahl löschen","common.cancel":"Abbrechen","common.delete":"Löschen","uiStudio.storage.title":"Gespeicherte UI Studio-Daten","uiStudio.storage.usageLabel":"In Verwendung","uiStudio.storage.historyBytes":"Verlauf","uiStudio.storage.snapshotBytes":"Screenshots","uiStudio.storage.requestCount":"Änderungsprotokolle","uiStudio.storage.mutationCount":"Änderungsdetails","uiStudio.storage.snapshotCount":"Screenshots","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Letzte automatische Bereinigung","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"freigegeben","uiStudio.storage.lastRunErrors":"Fehler","uiStudio.storage.loading":"Lädt...","uiStudio.cleanup.policy.title":"Richtlinie zur automatischen Löschung","uiStudio.cleanup.policy.modeOff":"Deaktiviert","uiStudio.cleanup.policy.modeAge":"Altersbasiert","uiStudio.cleanup.policy.modeSize":"Größenbasiert","uiStudio.cleanup.policy.cascade":"Auch verknüpfte Screenshots löschen","uiStudio.cleanup.policy.save":"Richtlinie speichern","uiStudio.cleanup.policy.runNow":"Jetzt ausführen","uiStudio.cleanup.policy.proRequired":"Nach dem Upgrade auf Pro verfügbar","uiStudio.cleanup.policy.daysUnit":"T","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Richtlinie bestätigen","uiStudio.cleanup.policy.confirm.messageStrict":"Diese Richtlinie wird sofort löschen","uiStudio.cleanup.policy.confirm.requests":" Änderungsprotokolle","uiStudio.cleanup.policy.confirm.snapshots":" Screenshots","uiStudio.cleanup.policy.confirm.freed":"freigegeben — Anwenden?","uiStudio.cleanup.keepLastNDays":"Nur letzte {n} Tage behalten","uiStudio.cleanup.selectedDelete":"Auswahl löschen…","uiStudio.cleanup.deleteAll":"Alles löschen…","uiStudio.cleanup.cleanupConfirmTitle":"Bereinigung bestätigen","uiStudio.cleanup.cleanupConfirmMessage":"Die ausgewählten Elemente werden gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Change records and screenshots older than 7 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Change records and screenshots older than 30 days will be deleted. This action cannot be undone.","uiStudio.cleanup.cleanupConfirmMessage.all":" saved change records and screenshots will be deleted. This action cannot be undone.","uiStudio.cleanup.label":"Manuelle Bereinigung","uiStudio.cleanup.studioPreservedNote":"Diese Aktion löscht nur Verlaufs- und Screenshot-Dateien auf dem Datenträger; Roblox Studio-Instanzen sind nicht betroffen.","uiStudio.history.sample.bannerBadge":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerTitle":"Vorschau des Pro-Änderungsverlaufs","uiStudio.history.sample.bannerMessage":"Diese Vorschau verwendet Beispieldaten. Echter Anfrageverlauf, Vorher/Nachher-Vergleich und Massenlöschung sind in Pro verfügbar.","uiStudio.fix.touchTarget.label":"Touch target size","uiStudio.fix.touchTarget.description":"Checks whether controls are large enough to tap comfortably on mobile.","uiStudio.fix.touchTarget.howToFix":"Increase button Size to at least 44x44 px or expand the touch area with UIPadding.","uiStudio.fix.contrast.label":"Text contrast","uiStudio.fix.contrast.description":"Checks whether text and background contrast meet accessibility guidance.","uiStudio.fix.contrast.howToFix":"Use a brighter TextColor3 or darken the BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Emoji icons may be false positives when their color is fixed.","uiStudio.fix.textScaled.label":"TextScaled usage","uiStudio.fix.textScaled.description":"TextScaled without UITextSizeConstraint can break layouts when text expands.","uiStudio.fix.textScaled.howToFix":"Add a UITextSizeConstraint child to the TextLabel and set MaxTextSize.","uiStudio.fix.safezone.label":"Safe-zone placement","uiStudio.fix.safezone.description":"Checks whether controls stay inside platform safe zones.","uiStudio.fix.safezone.howToFix":"Move Position inside the safe zone or reduce the parent Frame.","uiStudio.fix.minTextSize.label":"Minimum font size","uiStudio.fix.minTextSize.description":"Checks whether text is too small to read comfortably.","uiStudio.fix.minTextSize.howToFix":"Increase TextSize to at least 14 for body text.","uiStudio.sample.history.request1.label":"Initial HUD layout creation","uiStudio.sample.history.request2.label":"Inventory modal design update","uiStudio.sample.history.request3.label":"HUD HealthBar color update","uiStudio.sample.history.request4.label":"Expand Inventory tab button touch targets","uiStudio.sample.history.request5.label":"Remove Settings popup","uiStudio.sample.history.request6.label":"Add HUD minimap component","uiStudio.sample.history.request1.mutation1.diff":"Created Frame + HealthBar + StaminaBar","uiStudio.sample.history.request1.mutation2.diff":"BackgroundColor3 -> Color3.new(0.2,0.8,0.2)","uiStudio.sample.history.request1.mutation3.diff":"BackgroundColor3 -> Color3.new(0.1,0.6,1.0)","uiStudio.sample.history.request1.mutation4.diff":"Set AnchorPoint, Position, and Size","uiStudio.sample.history.request1.mutation5.diff":"Screenshot saved","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 for better contrast","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, set BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Screenshot saved","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (red tone)","uiStudio.sample.history.request3.mutation2.diff":"Screenshot saved","uiStudio.sample.history.request4.mutation1.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Size {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Screenshot saved","uiStudio.sample.history.request5.mutation1.diff":"Removed ScreenGui (Settings-only UI)","uiStudio.sample.history.request6.mutation1.diff":"Attempted to create Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Set Size, Position, and BackgroundTransparency","uiStudio.sample.history.request6.mutation3.diff":"Interrupted by server restart while setting ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Partial screenshot saved","uiStudio.sample.history.request6.mutation3.error":"server_restart: connection lost","uiStudio.sample.history.request6.mutation4.error":"partial screenshot: missing layers","uiStudio.sample.history.detail.backgroundColor":"Background color","uiStudio.sample.history.detail.anchorPoint":"Anchor","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Size","uiStudio.sample.history.detail.textColor":"Text color","uiStudio.sample.history.detail.textSize":"Text size","uiStudio.sample.history.detail.borderSize":"Border size","uiStudio.sample.history.detail.borderColor":"Border color","uiStudio.history.sample.tooltip":"Auf Pro upgraden, um den vollständigen Verlauf freizuschalten","settings.dataHistory.title":"Data & History","settings.dataHistory.title.tooltip":"Manage saved dashboard data in one place.","settings.dataHistory.collapse":"Collapse {title}","settings.dataHistory.expand":"Expand {title}","settings.dataHistory.scope":"Current project","settings.dataHistory.scope.tooltip":"Clear actions apply to the current project and active place where applicable.","settings.dataHistory.intro":"Review saved dashboard data, open the related page, or clear stored records from one place.","settings.dataHistory.toolsActivity.title":"Tool activity","settings.dataHistory.toolsActivity.description":"Saved tool runs shown on the Tools page.","settings.dataHistory.toolStats.title":"Tool usage statistics","settings.dataHistory.toolStats.description":"Aggregated tool counts and status totals.","settings.dataHistory.syncLog.title":"Sync log","settings.dataHistory.syncLog.description":"Saved file sync events for the active place.","settings.dataHistory.playtest.title":"Playtest reports","settings.dataHistory.playtest.description":"Saved automated playtest reports and logs.","settings.dataHistory.projectChanges.title":"Project change summary","settings.dataHistory.projectChanges.description":"Saved summaries of project changes.","settings.dataHistory.connectionLog.title":"Connection log","settings.dataHistory.connectionLog.description":"Saved MCP and Studio connection events.","settings.dataHistory.uiStudio.title":"UI Studio history and screenshots","settings.dataHistory.uiStudio.tooltip":"Manage saved UI Studio change records, screenshots, and auto-delete policy.","settings.dataHistory.uiStudio.description":"Saved UI Studio change records, screenshots, and cleanup policy.","settings.dataHistory.uiStudio.clear.title":"Clear UI Studio saved data?","settings.dataHistory.uiStudio.clear.message":"This deletes saved UI Studio change records and screenshots only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.uiStudio.clear.success":"UI Studio saved data cleared.","settings.dataHistory.uiStudio.clear.failed":"Failed to clear UI Studio saved data.","settings.dataHistory.metric.unavailable":"Unavailable","settings.dataHistory.metric.sizeUnavailable":"size unavailable","settings.dataHistory.metric.records":"records","settings.dataHistory.metric.runs":"runs","settings.dataHistory.metric.sessions":"sessions","settings.dataHistory.metric.reports":"reports","settings.dataHistory.open":"Open","settings.dataHistory.clear.title":"Clear saved data?","settings.dataHistory.clear.message":"This deletes saved dashboard records only. Roblox Studio instances and project objects are not changed.","settings.dataHistory.clear.success":"Saved data cleared.","settings.dataHistory.clear.failed":"Failed to clear saved data.","toast.serverConnected":"MCP-Server verbunden","toast.serverDisconnected":"MCP-Server getrennt","toast.pluginConnected":"Plugin verbunden","toast.pluginDisconnected":"Plugin getrennt","toast.clearSuccess":"Erfolgreich geleert","toast.clearFailed":"Daten konnten nicht geleert werden","common.clear":"Leeren","settings.license.activate":"Lizenz aktivieren","settings.license.refresh":"Lizenz aktualisieren","settings.license.keyInput":"Lizenzschlüssel","settings.license.disconnected":"Getrennt","settings.license.disconnected.tooltip":"Verbinden Sie sich erneut mit dem MCP-Server, um Lizenzaktionen über das WEPPY Dashboard zu verwalten.","settings.license.live.tooltip":"Lizenzaktionen werden sofort an den MCP-Server gesendet.","settings.license.status.activationRequired":"Aktivierung erforderlich","settings.license.status.activationRequired.tooltip":"Eine manuelle Lizenzaktivierung ist erforderlich, bevor das WEPPY Dashboard diesen Status aktualisieren kann.","settings.license.status.grace":"Karenzzeit","settings.license.status.grace.tooltip":"Die Anbieterprüfung ist vorübergehend nicht verfügbar, der Pro-Zugriff bleibt während der Karenzzeit aktiv.","settings.license.status.graceBilling.tooltip":"Während einer abrechnungsbedingten Karenzzeit bleibt der Pro-Zugriff verfügbar.","settings.license.detail.graceBilling":"Der Pro-Zugriff bleibt während einer Abrechnungs-Karenzzeit verfügbar.","settings.license.detail.graceProviderUnavailable":"Anbieter nicht verfügbar. Der Pro-Zugriff bleibt im Karenzmodus aktiv.","settings.license.detail.manualActivation":"Manuelle Aktivierung erforderlich, um den Pro-Zugriff wiederherzustellen.","settings.license.detail.missingSessionToken":"Die Aktualisierung ist blockiert, da das aktuelle Session-Token fehlt.","settings.license.detail.refreshRecommended":"Die Lizenzprüfung sollte bald aktualisiert werden.","connection.agents.kill":"Beenden","connection.agents.kill.title":"Agent beenden?","connection.agents.killed":"Agent beendet","connection.agents.killFailed":"Agent konnte nicht beendet werden","connection.agents.lastCommand":"Letzter Befehl","connection.agents.lastCommand.tooltip":"Der zuletzt von diesem Agenten ausgeführte Tool-Aufruf","connection.agents.lastSeen":"Zuletzt aktiv","connection.agents.lastSeen.tooltip":"Der letzte Heartbeat oder die letzte Aktivität dieses Agenten","connection.clear.title":"Verbindungsprotokoll leeren?","connection.clear.message":"Dadurch wird das gespeicherte Verbindungsprotokoll des aktuellen Projekts dauerhaft entfernt.","sync.clear.title":"Synchronisierungsprotokoll leeren?","sync.clear.message":"Dadurch wird das gespeicherte Synchronisierungsprotokoll des aktuellen Place dauerhaft entfernt.","playtest.clear.title":"Testverlauf leeren?","playtest.clear.message":"Dadurch werden die gespeicherten Playtest-Berichte des aktuellen Place dauerhaft entfernt.","changelog.clear.title":"Änderungsprotokoll leeren?","changelog.clear.message":"Dadurch wird das gespeicherte Änderungsprotokoll des aktuellen Place dauerhaft entfernt.","sync.status.placePath":"Place-Pfad","sync.status.placePath.tooltip":"Aktives Place-Verzeichnis, in das Explorer-Dateien synchronisiert werden.","tier.progress.label":"Pro / Gesamt","changelog.card.representativeArea":"Repräsentativer Bereich","changelog.card.verification":"Überprüfung","uiStudio.designCheckResultsTitle":"Design-Check-Vorschläge","uiStudio.actions.designCheckAgain":"Erneut prüfen","uiStudio.actions.designCheckRunning":"Vorschläge werden geprüft...","uiStudio.actions.designCheckRunningDetail":"Nach Abschluss werden zuerst zu prüfende, empfohlene und optionale Elemente angezeigt.","uiStudio.actions.designCheckComplete":"Vorschlagsprüfung abgeschlossen","uiStudio.actions.designCheckNoSnapshotSaved":"Diese Aktion speichert keine neue Screenshot-Datei.","uiStudio.sample.designCheck.contrast":"Text contrast is below {expected} (current {actual}). Adjust TextColor3 or BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"Touch target is below {expected} (current {actual}). Increase Size or padding.","uiStudio.sample.designCheck.minTextSize":"TextSize is below {expected} (current {actual}). Increase it for readability.","uiStudio.designCheckResultsTitle.tooltip":"All improvement suggestions found in this capture.","uiStudio.priorityMedium":"Prüfung empfohlen","uiStudio.mediumPrioritySection":"Prüfung empfohlen","uiStudio.history.row.qualityPlan.tooltip":"Für diese Änderung verwendete Brief-Designrichtung.","uiStudio.history.row.designCheck.tooltip":"Zusammenfassung der Design-Check-Vorschläge nach der Änderung.","uiStudio.gallery.priorityHighBadge.tooltip":"Anzahl der zuerst zu prüfenden Vorschläge. Für Details klicken.","uiStudio.gallery.priorityMediumBadge.tooltip":"Anzahl der empfohlenen Vorschläge.","uiStudio.gallery.priorityLowBadge.tooltip":"Anzahl der optionalen Verbesserungen."},Of=["en","ko","es","pt-br","ja","id","de"],zi="auto",Pl={en:Mf,ko:_f,es:Uf,"pt-br":Lf,ja:Nf,id:Hf,de:Bf},xr="dashboard-locale";function _l(a){return Of.includes(a)}function Ff(){const r=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return r==="ko"||r.startsWith("ko-")?"ko":r==="pt-br"?"pt-br":r==="ja"||r.startsWith("ja-")?"ja":r==="es"||r.startsWith("es-")?"es":r==="id"||r.startsWith("id-")?"id":r==="de"||r.startsWith("de-")?"de":"en"}function $d(){if(typeof localStorage<"u"){const a=localStorage.getItem(xr);if(a===zi)return zi;if(a&&_l(a))return a}return zi}function Qd(a){return a===zi?Ff():a}const Ap=R.createContext(null);function qf({children:a}){const[r,s]=R.useState($d),[u,c]=R.useState(()=>Qd($d())),p=R.useCallback((f,m)=>{const v=Pl[u]??Pl.en??{};if(f in v)return v[f];const k=Pl.en;return k&&f in k?k[f]:m!==void 0?m:f},[u]),g=R.useCallback(f=>{typeof localStorage<"u"&&(f===zi?localStorage.removeItem(xr):_l(f)?localStorage.setItem(xr,f):localStorage.setItem(xr,"en"));const m=f===zi?zi:_l(f)?f:"en";s(m),c(Qd(m))},[]);return R.createElement(Ap.Provider,{value:{locale:u,selectedLocale:r,t:p,setLocale:g}},a)}function li(){const a=R.useContext(Ap);if(!a)throw new Error("useLocale must be used within a LocaleProvider");return a}const Wf="_container_6jg7e_2",Vf="_toast_6jg7e_14",Yf="_slideIn_6jg7e_1",Kf="_success_6jg7e_39",Gf="_info_6jg7e_44",$f="_warning_6jg7e_49",Qf="_error_6jg7e_54",Cl={container:Wf,toast:Vf,slideIn:Yf,success:Kf,info:Gf,warning:$f,error:Qf},Ip=R.createContext(null),Jf=3e3;function Zf({children:a}){const[r,s]=R.useState([]),u=R.useRef(0),c=R.useCallback((p,g="info")=>{const f=u.current++;s(m=>[...m,{id:f,message:p,type:g}]),setTimeout(()=>{s(m=>m.filter(v=>v.id!==f))},Jf)},[]);return z.jsxs(Ip.Provider,{value:{show:c},children:[a,z.jsx("div",{className:Cl.container,children:r.map(p=>z.jsx("div",{className:`${Cl.toast} ${Cl[p.type]}`,children:p.message},p.id))})]})}function Ep(){const a=R.useContext(Ip);return a||{show:()=>{}}}function Xf(){const{level:a}=zr(),{show:r}=Ep(),{t:s}=li(),u=R.useRef(null);return R.useEffect(()=>{const c=u.current;u.current=a,c!==null&&c!==a&&(c==="disconnected"&&a==="serverOnly"?r(s("toast.serverConnected","MCP 서버 연결됨"),"success"):c==="serverOnly"&&a==="studioConnected"?r(s("toast.pluginConnected","플러그인 연결됨"),"success"):(c==="serverOnly"||c==="studioConnected")&&a==="disconnected"?r(s("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):c==="studioConnected"&&a==="serverOnly"&&r(s("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[a,r,s]),null}const ey="_wrapper_x0nim_2",ty="_tooltip_x0nim_11",oy="_tooltipVisible_x0nim_30",xl={wrapper:ey,tooltip:ty,tooltipVisible:oy},la=8,kr=6;function ji({text:a,children:r}){const s=R.useRef(null),u=R.useRef(null),[c,p]=R.useState(!1),[g,f]=R.useState("top"),[m,v]=R.useState("center"),[k,w]=R.useState(null),j=a.trim(),_=R.useCallback(()=>{const re=s.current,W=u.current;if(!re||!W)return;const Z=re.getBoundingClientRect(),te=W.getBoundingClientRect(),ye=window.innerWidth,je=window.innerHeight;let I="top";Z.top-te.height-kr<la&&Z.bottom+te.height+kr<=je-la&&(I="bottom");let K="center";const ve=Z.left+Z.width/2,se=te.width/2;ve-se<la?K="left":ve+se>ye-la&&(K="right");const _e=I==="top"?Z.top-te.height-kr:Z.bottom+kr;let we;K==="left"?we=Z.left:K==="right"?we=Z.right-te.width:we=ve-se,we=Math.max(la,Math.min(we,ye-te.width-la)),f(I),v(K),w({top:_e,left:we})},[]);if(R.useLayoutEffect(()=>{c&&_()},[c,_]),R.useEffect(()=>{if(!c)return;const re=()=>_();return window.addEventListener("scroll",re,!0),window.addEventListener("resize",re),()=>{window.removeEventListener("scroll",re,!0),window.removeEventListener("resize",re)}},[c,_]),!j)return z.jsx(z.Fragment,{children:r});const F=()=>p(!0),L=()=>p(!1),H=z.jsx("span",{ref:u,className:[xl.tooltip,c?xl.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":m,"data-vertical":g,style:k?{top:k.top,left:k.left}:{top:-9999,left:-9999,visibility:"hidden"},children:j});return z.jsxs(z.Fragment,{children:[z.jsx("span",{ref:s,className:xl.wrapper,title:j,onMouseEnter:F,onMouseLeave:L,onFocus:F,onBlur:L,children:r}),typeof document<"u"?Nl.createPortal(H,document.body):null]})}function iy(a){return a==="gumroad"?"gumroad":void 0}function ay(a){if(!a||typeof a!="object")return!1;const r=a.status;return(a.tier==="basic"||a.tier==="pro")&&(r==="active"||r==="grace"||r==="invalid"||r==="revoked"||r==="unlicensed"||r==="unknown")}function jp(a){return a&&typeof a=="object"&&"data"in a&&a.data?a.data:a}function zp(a){if(!a||typeof a!="object")return null;if(ay(a))return a;const r=a;if(typeof r.canUsePro!="boolean"||typeof r.status!="string"||r.status!=="active"&&r.status!=="grace"&&r.status!=="invalid"&&r.status!=="revoked"&&r.status!=="unlicensed"&&r.status!=="unknown")return null;const s=iy(r.provider);return{tier:r.canUsePro?"pro":"basic",status:r.status,...typeof r.statusDetail=="string"?{statusDetail:r.statusDetail}:{},...typeof r.maskedKey=="string"?{maskedKey:r.maskedKey}:{},...s?{provider:s}:{},refreshRequired:r.refreshRequired===!0,...typeof r.refreshBlockedReason=="string"?{refreshBlockedReason:r.refreshBlockedReason}:{}}}async function Dp(a="gumroad"){const r=await io.get("/api/dashboard/license/status",{provider:a});return zp(jp(r))}function Kl(a){const r=jp(a),s=r,u=zp(r),c=typeof(s==null?void 0:s.reasonCode)=="string"?s.reasonCode:void 0;return{ok:(s==null?void 0:s.ok)===!0,license:u?{...u,refreshRequired:u.refreshRequired||c==="missing_session_token",refreshBlockedReason:u.refreshBlockedReason??(c==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(s==null?void 0:s.message)=="string"?s.message:null,reasonCode:c,recoverable:(s==null?void 0:s.recoverable)===!0}}async function Vv(a){const r=a.provider??"gumroad",s=await io.post("/api/dashboard/license/activate",{provider:r,licenseKey:a.licenseKey,clientType:"dashboard"});return Kl(s)}async function Yv(a={}){const r=a.provider??"gumroad",s=await io.post("/api/dashboard/license/refresh",{provider:r,clientType:"dashboard"});return Kl(s)}async function Kv(a={}){const r=a.provider??"gumroad",s=await io.post("/api/dashboard/license/reset",{provider:r,clientType:"dashboard"});return Kl(s)}class Mp{constructor(r){To(this,"source",null);To(this,"handlers",new Map);To(this,"reconnectTimer",null);To(this,"url");this.url=r??`${jr}/api/dashboard/events`}connect(){this.disconnect(),this.source=new EventSource(this.url),this.source.onopen=()=>{this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)},this.source.onerror=()=>{var s;(s=this.source)==null||s.close(),this.source=null,this.scheduleReconnect()};const r=["connection","sync","command","game_change","mcp_status","license"];for(const s of r)this.source.addEventListener(s,u=>{var p;const c=JSON.parse(u.data);(p=this.handlers.get(s))==null||p.forEach(g=>g(c))})}on(r,s){return this.handlers.has(r)||this.handlers.set(r,new Set),this.handlers.get(r).add(s),()=>{var u;return(u=this.handlers.get(r))==null?void 0:u.delete(s)}}disconnect(){var r;(r=this.source)==null||r.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var r;return((r=this.source)==null?void 0:r.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},Rf))}}/**
140
140
  * @license lucide-react v1.8.0 - ISC
141
141
  *
142
142
  * This source code is licensed under the ISC license.
@@ -156,107 +156,107 @@ Dies ist eine Beispielvorschau. Upgraden Sie auf Pro, um Live-Playtests auszufü
156
156
  *
157
157
  * This source code is licensed under the ISC license.
158
158
  * See the LICENSE file in the root directory of this source tree.
159
- */const Zd=a=>{const r=ry(a);return r.charAt(0).toUpperCase()+r.slice(1)};/**
159
+ */const Jd=a=>{const r=ry(a);return r.charAt(0).toUpperCase()+r.slice(1)};/**
160
160
  * @license lucide-react v1.8.0 - ISC
161
161
  *
162
162
  * This source code is licensed under the ISC license.
163
163
  * See the LICENSE file in the root directory of this source tree.
164
- */var xl={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
164
+ */var Rl={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
165
165
  * @license lucide-react v1.8.0 - ISC
166
166
  *
167
167
  * This source code is licensed under the ISC license.
168
168
  * See the LICENSE file in the root directory of this source tree.
169
- */const sy=a=>{for(const r in a)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1},ly=R.createContext({}),uy=()=>R.useContext(ly),cy=R.forwardRef(({color:a,size:r,strokeWidth:s,absoluteStrokeWidth:u,className:d="",children:p,iconNode:g,...m},f)=>{const{size:y=24,strokeWidth:P=2,absoluteStrokeWidth:C=!1,color:j="currentColor",className:_=""}=uy()??{},F=u??C?Number(s??P)*24/Number(r??y):s??P;return R.createElement("svg",{ref:f,...xl,width:r??y??xl.width,height:r??y??xl.height,stroke:a??j,strokeWidth:F,className:_p("lucide",_,d),...!p&&!sy(m)&&{"aria-hidden":"true"},...m},[...g.map(([N,H])=>R.createElement(N,H)),...Array.isArray(p)?p:[p]])});/**
169
+ */const sy=a=>{for(const r in a)if(r.startsWith("aria-")||r==="role"||r==="title")return!0;return!1},ly=R.createContext({}),uy=()=>R.useContext(ly),cy=R.forwardRef(({color:a,size:r,strokeWidth:s,absoluteStrokeWidth:u,className:c="",children:p,iconNode:g,...f},m)=>{const{size:v=24,strokeWidth:k=2,absoluteStrokeWidth:w=!1,color:j="currentColor",className:_=""}=uy()??{},F=u??w?Number(s??k)*24/Number(r??v):s??k;return R.createElement("svg",{ref:m,...Rl,width:r??v??Rl.width,height:r??v??Rl.height,stroke:a??j,strokeWidth:F,className:_p("lucide",_,c),...!p&&!sy(f)&&{"aria-hidden":"true"},...f},[...g.map(([L,H])=>R.createElement(L,H)),...Array.isArray(p)?p:[p]])});/**
170
170
  * @license lucide-react v1.8.0 - ISC
171
171
  *
172
172
  * This source code is licensed under the ISC license.
173
173
  * See the LICENSE file in the root directory of this source tree.
174
- */const ft=(a,r)=>{const s=R.forwardRef(({className:u,...d},p)=>R.createElement(cy,{ref:p,iconNode:r,className:_p(`lucide-${ny(Zd(a))}`,`lucide-${a}`,u),...d}));return s.displayName=Zd(a),s};/**
174
+ */const St=(a,r)=>{const s=R.forwardRef(({className:u,...c},p)=>R.createElement(cy,{ref:p,iconNode:r,className:_p(`lucide-${ny(Jd(a))}`,`lucide-${a}`,u),...c}));return s.displayName=Jd(a),s};/**
175
175
  * @license lucide-react v1.8.0 - ISC
176
176
  *
177
177
  * This source code is licensed under the ISC license.
178
178
  * See the LICENSE file in the root directory of this source tree.
179
- */const dy=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],py=ft("bell",dy);/**
179
+ */const dy=[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]],py=St("bell",dy);/**
180
180
  * @license lucide-react v1.8.0 - ISC
181
181
  *
182
182
  * This source code is licensed under the ISC license.
183
183
  * See the LICENSE file in the root directory of this source tree.
184
- */const gy=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],hy=ft("book-open",gy);/**
184
+ */const gy=[["path",{d:"M12 7v14",key:"1akyts"}],["path",{d:"M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z",key:"ruj8y"}]],hy=St("book-open",gy);/**
185
185
  * @license lucide-react v1.8.0 - ISC
186
186
  *
187
187
  * This source code is licensed under the ISC license.
188
188
  * See the LICENSE file in the root directory of this source tree.
189
- */const my=[["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z",key:"uouzyp"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4",key:"1b0z45"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97",key:"5cxbf6"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4",key:"1fjd4g"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97",key:"1d7oge"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13",key:"1vgav8"}]],fy=ft("bug",my);/**
189
+ */const my=[["path",{d:"M12 20v-9",key:"1qisl0"}],["path",{d:"M14 7a4 4 0 0 1 4 4v3a6 6 0 0 1-12 0v-3a4 4 0 0 1 4-4z",key:"uouzyp"}],["path",{d:"M14.12 3.88 16 2",key:"qol33r"}],["path",{d:"M21 21a4 4 0 0 0-3.81-4",key:"1b0z45"}],["path",{d:"M21 5a4 4 0 0 1-3.55 3.97",key:"5cxbf6"}],["path",{d:"M22 13h-4",key:"1jl80f"}],["path",{d:"M3 21a4 4 0 0 1 3.81-4",key:"1fjd4g"}],["path",{d:"M3 5a4 4 0 0 0 3.55 3.97",key:"1d7oge"}],["path",{d:"M6 13H2",key:"82j7cp"}],["path",{d:"m8 2 1.88 1.88",key:"fmnt4t"}],["path",{d:"M9 7.13V6a3 3 0 1 1 6 0v1.13",key:"1vgav8"}]],fy=St("bug",my);/**
190
190
  * @license lucide-react v1.8.0 - ISC
191
191
  *
192
192
  * This source code is licensed under the ISC license.
193
193
  * See the LICENSE file in the root directory of this source tree.
194
- */const yy=[["path",{d:"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41l-7.59-7.59a2.41 2.41 0 0 0-3.41 0Z",key:"1f1r0c"}]],Sy=ft("diamond",yy);/**
194
+ */const yy=[["path",{d:"M2.7 10.3a2.41 2.41 0 0 0 0 3.41l7.59 7.59a2.41 2.41 0 0 0 3.41 0l7.59-7.59a2.41 2.41 0 0 0 0-3.41l-7.59-7.59a2.41 2.41 0 0 0-3.41 0Z",key:"1f1r0c"}]],Sy=St("diamond",yy);/**
195
195
  * @license lucide-react v1.8.0 - ISC
196
196
  *
197
197
  * This source code is licensed under the ISC license.
198
198
  * See the LICENSE file in the root directory of this source tree.
199
- */const vy=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],by=ft("external-link",vy);/**
199
+ */const vy=[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"M10 14 21 3",key:"gplh6r"}],["path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6",key:"a6xqqp"}]],by=St("external-link",vy);/**
200
200
  * @license lucide-react v1.8.0 - ISC
201
201
  *
202
202
  * This source code is licensed under the ISC license.
203
203
  * See the LICENSE file in the root directory of this source tree.
204
- */const wy=[["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"}]],ky=ft("folder",wy);/**
204
+ */const wy=[["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"}]],ky=St("folder",wy);/**
205
205
  * @license lucide-react v1.8.0 - ISC
206
206
  *
207
207
  * This source code is licensed under the ISC license.
208
208
  * See the LICENSE file in the root directory of this source tree.
209
- */const Py=[["line",{x1:"6",x2:"10",y1:"11",y2:"11",key:"1gktln"}],["line",{x1:"8",x2:"8",y1:"9",y2:"13",key:"qnk9ow"}],["line",{x1:"15",x2:"15.01",y1:"12",y2:"12",key:"krot7o"}],["line",{x1:"18",x2:"18.01",y1:"10",y2:"10",key:"1lcuu1"}],["path",{d:"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",key:"mfqc10"}]],Cy=ft("gamepad-2",Py);/**
209
+ */const Py=[["line",{x1:"6",x2:"10",y1:"11",y2:"11",key:"1gktln"}],["line",{x1:"8",x2:"8",y1:"9",y2:"13",key:"qnk9ow"}],["line",{x1:"15",x2:"15.01",y1:"12",y2:"12",key:"krot7o"}],["line",{x1:"18",x2:"18.01",y1:"10",y2:"10",key:"1lcuu1"}],["path",{d:"M17.32 5H6.68a4 4 0 0 0-3.978 3.59c-.006.052-.01.101-.017.152C2.604 9.416 2 14.456 2 16a3 3 0 0 0 3 3c1 0 1.5-.5 2-1l1.414-1.414A2 2 0 0 1 9.828 16h4.344a2 2 0 0 1 1.414.586L17 18c.5.5 1 1 2 1a3 3 0 0 0 3-3c0-1.545-.604-6.584-.685-7.258-.007-.05-.011-.1-.017-.151A4 4 0 0 0 17.32 5z",key:"mfqc10"}]],Cy=St("gamepad-2",Py);/**
210
210
  * @license lucide-react v1.8.0 - ISC
211
211
  *
212
212
  * This source code is licensed under the ISC license.
213
213
  * See the LICENSE file in the root directory of this source tree.
214
- */const xy=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],Ry=ft("history",xy);/**
214
+ */const xy=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],Ry=St("history",xy);/**
215
215
  * @license lucide-react v1.8.0 - ISC
216
216
  *
217
217
  * This source code is licensed under the ISC license.
218
218
  * See the LICENSE file in the root directory of this source tree.
219
- */const Ty=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],Ay=ft("image",Ty);/**
219
+ */const Ty=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]],Ay=St("image",Ty);/**
220
220
  * @license lucide-react v1.8.0 - ISC
221
221
  *
222
222
  * This source code is licensed under the ISC license.
223
223
  * See the LICENSE file in the root directory of this source tree.
224
- */const Iy=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],Ey=ft("layout-dashboard",Iy);/**
224
+ */const Iy=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],Ey=St("layout-dashboard",Iy);/**
225
225
  * @license lucide-react v1.8.0 - ISC
226
226
  *
227
227
  * This source code is licensed under the ISC license.
228
228
  * See the LICENSE file in the root directory of this source tree.
229
- */const jy=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]],zy=ft("lightbulb",jy);/**
229
+ */const jy=[["path",{d:"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5",key:"1gvzjb"}],["path",{d:"M9 18h6",key:"x1upvd"}],["path",{d:"M10 22h4",key:"ceow96"}]],zy=St("lightbulb",jy);/**
230
230
  * @license lucide-react v1.8.0 - ISC
231
231
  *
232
232
  * This source code is licensed under the ISC license.
233
233
  * See the LICENSE file in the root directory of this source tree.
234
- */const Dy=[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]],My=ft("messages-square",Dy);/**
234
+ */const Dy=[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]],My=St("messages-square",Dy);/**
235
235
  * @license lucide-react v1.8.0 - ISC
236
236
  *
237
237
  * This source code is licensed under the ISC license.
238
238
  * See the LICENSE file in the root directory of this source tree.
239
- */const _y=[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]],Ly=ft("plug",_y);/**
239
+ */const _y=[["path",{d:"M12 22v-5",key:"1ega77"}],["path",{d:"M15 8V2",key:"18g5xt"}],["path",{d:"M17 8a1 1 0 0 1 1 1v4a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V9a1 1 0 0 1 1-1z",key:"1xoxul"}],["path",{d:"M9 8V2",key:"14iosj"}]],Uy=St("plug",_y);/**
240
240
  * @license lucide-react v1.8.0 - ISC
241
241
  *
242
242
  * This source code is licensed under the ISC license.
243
243
  * See the LICENSE file in the root directory of this source tree.
244
- */const Ny=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Uy=ft("refresh-cw",Ny);/**
244
+ */const Ly=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Ny=St("refresh-cw",Ly);/**
245
245
  * @license lucide-react v1.8.0 - ISC
246
246
  *
247
247
  * This source code is licensed under the ISC license.
248
248
  * See the LICENSE file in the root directory of this source tree.
249
- */const Hy=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],By=ft("settings",Hy);/**
249
+ */const Hy=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],By=St("settings",Hy);/**
250
250
  * @license lucide-react v1.8.0 - ISC
251
251
  *
252
252
  * This source code is licensed under the ISC license.
253
253
  * See the LICENSE file in the root directory of this source tree.
254
- */const Oy=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],Jd=ft("sparkles",Oy);/**
254
+ */const Oy=[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]],Zd=St("sparkles",Oy);/**
255
255
  * @license lucide-react v1.8.0 - ISC
256
256
  *
257
257
  * This source code is licensed under the ISC license.
258
258
  * See the LICENSE file in the root directory of this source tree.
259
- */const Fy=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],qy=ft("wrench",Fy),Lp=[{labelKey:"sidebar.overview",route:"/",icon:Ey,minLevel:"disconnected",lazy:()=>go(()=>import("./OverviewPage-Di0p7YY2.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]))},{labelKey:"sidebar.connection",route:"/connection",icon:Ly,minLevel:"disconnected",lazy:()=>go(()=>import("./ConnectionPage-CWDwVCKg.js"),__vite__mapDeps([9,1,2,3,4,10,7,11]))},{labelKey:"sidebar.sync",route:"/sync",icon:Uy,minLevel:"serverOnly",lazy:()=>go(()=>import("./SyncPage-IICMnq8v.js"),__vite__mapDeps([12,1,4,10,2,3,13,14,15]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:Ry,minLevel:"serverOnly",lazy:()=>go(()=>import("./ChangelogPage-C1uCKyqh.js"),__vite__mapDeps([16,10,4,17,18,19]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Cy,minLevel:"serverOnly",lazy:()=>go(()=>import("./PlaytestPage-Dxgz0SKW.js"),__vite__mapDeps([20,13,14,1,4,10,21]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Ay,minLevel:"serverOnly",lazy:()=>go(()=>import("./UiStudioPage-BHhd3zUv.js"),__vite__mapDeps([22,13,14,1,4,23,24,17,18,25]))},{labelKey:"sidebar.tools",route:"/tools",icon:qy,minLevel:"serverOnly",lazy:()=>go(()=>import("./ToolsPage-DEhsoa36.js"),__vite__mapDeps([26,4,10,17,18,27]))}],Np=[{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:py,minLevel:"disconnected",lazy:()=>go(()=>import("./WhatsNewPage-ErpENbsZ.js"),__vite__mapDeps([28,29]))}],Rl="https://github.com/hope1026/weppy-roblox-mcp",Wy="https://weppyai.com";function Vy(a){return a?/Mac OS X|Macintosh/i.test(a)?"macOS":/Windows NT/i.test(a)?"Windows":/Linux/i.test(a)?"Linux":"":""}function Yy(a){var f,y,P;const r=Vy(typeof navigator<"u"?navigator.userAgent:""),s=a.status,u=(s==null?void 0:s.version)??"",d=((y=(f=s==null?void 0:s.pluginClients)==null?void 0:f[0])==null?void 0:y.pluginVersion)??"",p=u||d?[u?`MCP ${u}`:"",d?`Plugin ${d}`:""].filter(Boolean).join(" / "):"",g=((P=s==null?void 0:s.aiClientNames)==null?void 0:P[0])??"",m=new URLSearchParams;return m.set("template","bug_report.yml"),r&&m.set("os",r),g&&m.set("ai-client",g),p&&m.set("plugin-version",p),m.toString()}const Ky=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:fy,buildUrl:a=>`${Rl}/issues/new?${Yy(a)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:zy,buildUrl:()=>`${Rl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:My,buildUrl:()=>`${Rl}/discussions`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:hy,buildUrl:a=>`${Wy}/${a.locale}/docs/troubleshooting/`}];function Gy(){const[a,r]=R.useState("basic"),[s,u]=R.useState(0),[d,p]=R.useState(0),[g,m]=R.useState(0),[f,y]=R.useState(!0);R.useEffect(()=>{let C=!1;async function j(){try{return await Dp("gumroad")}catch{return null}}async function _(){var H,re;try{const[W,J]=await Promise.all([j(),eo.get("/api/dashboard/tool-stats").catch(()=>null)]);if(C)return;if(W!=null&&W.tier&&r(W.tier),J!=null&&J.tierSummary){const te=((H=J.tierSummary.basic)==null?void 0:H.totalCalls)??0,Se=((re=J.tierSummary.pro)==null?void 0:re.totalCalls)??0;m(te),p(Se),u(te+Se)}}catch{}finally{C||y(!1)}}_();const F=new Mp;F.connect();const N=F.on("license",()=>{j().then(H=>{!C&&(H!=null&&H.tier)&&r(H.tier)})});return()=>{C=!0,N(),F.disconnect()}},[]);const P=s>0?d/s*100:0;return{tier:a,proUsagePercent:P,totalCalls:s,proCalls:d,basicCalls:g,loading:f}}const $y=new Date("2026-04-30T23:59:59"),Qy="WEPPY-MCP";function Zy(){return Date.now()<=$y.getTime()}const Jy={overview:"https://gum.co/u/2nc0fhky",sync:"https://gum.co/u/p0barnlb",playtest:"https://gum.co/u/kchczjry",uiStudio:"https://gum.co/u/orytecgp"},Xy=5e3,eS=5;function Kl(a){return a.replace(/^\//,"").split("/")[0]||"overview"}let ua=[],Xd=null;function Up(){if(ua.length===0)return;const a=ua.splice(0),r=`${Ir}/api/dashboard/analytics`,s=JSON.stringify({events:a});fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:s}).catch(()=>{})}function tS(){Xd||(Xd=setInterval(Up,Xy))}function ep(a){ua.push(a),tS(),ua.length>=eS&&Up()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ua.length===0)return;const a=`${Ir}/api/dashboard/analytics`,r=JSON.stringify({events:ua.splice(0)});navigator.sendBeacon(a,new Blob([r],{type:"application/json"}))});function jr(){const a=R.useCallback((s,u)=>{ep({name:s,params:u})},[]),r=R.useCallback(s=>{ep({name:"dashboard_page_view",params:{page:s}})},[]);return{trackEvent:a,trackPageView:r}}const oS="_widget_c7n2n_1",iS="_header_c7n2n_12",aS="_sparkle_c7n2n_18",nS="_title_c7n2n_23",rS="_cta_c7n2n_31",sS="_coupon_c7n2n_52",lS="_couponCode_c7n2n_58",uS="_couponMeta_c7n2n_65",cS="_collapsed_c7n2n_71",Ro={widget:oS,header:iS,sparkle:aS,title:nS,cta:rS,coupon:sS,couponCode:lS,couponMeta:uS,collapsed:cS},dS="Apr 30";function pS({collapsed:a=!1}){const{tier:r}=Gy(),{t:s}=si(),{trackEvent:u}=jr(),{pathname:d}=Xt();if(r==="pro")return null;const p=Jy.overview,g=Kl(d),m=()=>{u("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",page:g})};if(a)return z.jsx("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:Ro.collapsed,title:s("upgrade.title","Upgrade to Pro"),"aria-label":s("upgrade.title","Upgrade to Pro"),onClick:m,children:z.jsx(Jd,{size:18,strokeWidth:1.75})});const y=s("upgrade.validUntil","Until {{date}}").replace("{{date}}",dS),P=Zy();return z.jsxs("div",{className:Ro.widget,children:[z.jsxs("div",{className:Ro.header,children:[z.jsx(Jd,{size:16,strokeWidth:1.75,className:Ro.sparkle}),z.jsx("span",{className:Ro.title,children:s("upgrade.tagline","Go Pro for more power")})]}),z.jsxs("a",{href:p,target:"_blank",rel:"noopener noreferrer",className:Ro.cta,onClick:m,children:[s("upgrade.cta","Upgrade to Pro")," →"]}),P&&z.jsxs("div",{className:Ro.coupon,children:[z.jsx("span",{className:Ro.couponCode,children:Qy}),z.jsx("span",{className:Ro.couponMeta,children:y})]})]})}const gS="_sidebar_1ei54_2",hS="_brand_1ei54_17",mS="_brandIcon_1ei54_28",fS="_brandText_1ei54_33",yS="_brandTextPro_1ei54_44",SS="_nav_1ei54_50",vS="_spacer_1ei54_57",bS="_navLink_1ei54_63",wS="_active_1ei54_84",kS="_disabled_1ei54_91",PS="_icon_1ei54_102",CS="_label_1ei54_113",xS="_secondaryDivider_1ei54_120",RS="_secondaryNav_1ei54_127",TS="_helpDivider_1ei54_134",AS="_helpGroupTitle_1ei54_141",IS="_helpNav_1ei54_152",ES="_externalIcon_1ei54_159",at={sidebar:gS,brand:hS,brandIcon:mS,brandText:fS,brandTextPro:yS,nav:SS,spacer:vS,navLink:bS,active:wS,disabled:kS,icon:PS,label:CS,secondaryDivider:xS,secondaryNav:RS,helpDivider:TS,helpGroupTitle:AS,helpNav:IS,externalIcon:ES},jS={bug:"help_bug",feature:"help_feature",discussions:"help_community",troubleshooting:"help_troubleshooting"};function zS(){const[a,r]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const s=window.matchMedia("(max-width: 768px)"),u=()=>r(s.matches);return u(),s.addEventListener("change",u),()=>s.removeEventListener("change",u)},[]),a}const tp={disconnected:0,serverOnly:1,studioConnected:2};function DS(a,r){return tp[a]>=tp[r]}function MS(a,r){return a==="serverOnly"?r("sidebar.gate.l1","MCP server connection required"):a==="studioConnected"?r("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function op({item:a}){const{level:r}=Er(),{t:s}=si(),u=DS(r,a.minLevel),d=a.icon,p=z.jsxs(bf,{to:a.route,end:a.route==="/",className:({isActive:g})=>[at.navLink,g?at.active:"",u?"":at.disabled].filter(Boolean).join(" "),onClick:g=>{u||g.preventDefault()},children:[z.jsx("span",{className:at.icon,children:z.jsx(d,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),z.jsx("span",{className:at.label,children:s(a.labelKey)})]});return u?p:z.jsx(Ii,{text:MS(a.minLevel,s),children:p})}function _S({item:a,ctx:r}){const{t:s}=si(),{trackEvent:u}=jr(),{pathname:d}=Xt(),p=a.icon,g=a.buildUrl(r),m=s(a.tooltipKey,""),f=Kl(d),y=z.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:at.navLink,"data-testid":`sidebar-help-${a.id}`,onClick:()=>u("dashboard_click_event",{click_target:jS[a.id],placement:"sidebar_help",page:f}),children:[z.jsx("span",{className:at.icon,children:z.jsx(p,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),z.jsx("span",{className:at.label,children:s(a.labelKey)}),z.jsx("span",{className:at.externalIcon,"aria-hidden":"true",children:z.jsx(by,{size:12,strokeWidth:1.75})})]});return m?z.jsx(Ii,{text:m,children:y}):y}function LS(){const[a,r]=R.useState("basic"),s=zS(),{status:u}=Er(),{locale:d,t:p}=si(),g={locale:d,status:u};return R.useEffect(()=>{let m=!1;async function f(){try{const C=await Dp("gumroad");!m&&(C!=null&&C.tier)&&r(C.tier)}catch{m||r("basic")}}f();const y=new Mp;y.connect();const P=y.on("license",()=>{f()});return()=>{m=!0,P(),y.disconnect()}},[]),z.jsxs("aside",{className:at.sidebar,children:[z.jsxs("div",{className:at.brand,children:[z.jsx("span",{className:at.brandIcon,children:z.jsx(Sy,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),z.jsx("span",{"data-testid":"sidebar-brand-text",className:[at.brandText,a==="pro"?at.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),z.jsx("nav",{className:at.nav,children:Lp.map(m=>z.jsx(op,{item:m},m.route))}),z.jsx("div",{className:at.secondaryDivider}),z.jsx("nav",{className:at.secondaryNav,children:Np.map(m=>z.jsx(op,{item:m},m.route))}),z.jsx("div",{className:at.helpDivider,"aria-hidden":"true"}),z.jsx("div",{className:at.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),z.jsx("nav",{className:at.helpNav,"aria-label":p("sidebar.help.group"),children:Ky.map(m=>z.jsx(_S,{item:m,ctx:g},m.id))}),z.jsx("div",{className:at.spacer}),z.jsx(pS,{collapsed:s})]})}async function NS(){return eo.get("/api/dashboard/place-summary")}async function US(){return eo.get("/api/dashboard/sync-root")}async function HS(){return eo.post("/api/dashboard/sync-root/pick")}async function BS(a){return eo.patch("/api/dashboard/sync-root",{projectRoot:a})}const OS=[{id:"2026-05-04-ui-studio",date:"2026-05-04",title:{en:"UI Studio — helping AI build polished in-game UI",ko:"UI Studio — AI가 완성도 있는 인게임 UI를 만들 수 있도록 지원합니다",es:"UI Studio — apoyo para que la IA cree una UI en el juego con buen acabado","pt-br":"UI Studio — apoio para a IA criar UI no jogo com bom acabamento",ja:"UI Studio — AIが完成度の高いゲーム内UIを作れるようサポート",id:"UI Studio — mendukung AI membangun UI dalam game yang rapi"},body:{en:`WEPPY now ships UI Studio — AI agents can build and edit Roblox in-game UI (screen elements like ScreenGui, Frame, TextLabel) directly.
259
+ */const Fy=[["path",{d:"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z",key:"1ngwbx"}]],qy=St("wrench",Fy),Up=[{labelKey:"sidebar.overview",route:"/",icon:Ey,minLevel:"disconnected",lazy:()=>ho(()=>import("./OverviewPage-CTH7jUzQ.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8]))},{labelKey:"sidebar.connection",route:"/connection",icon:Uy,minLevel:"disconnected",lazy:()=>ho(()=>import("./ConnectionPage-Cds2YIvI.js"),__vite__mapDeps([9,1,2,3,4,10,7,11]))},{labelKey:"sidebar.sync",route:"/sync",icon:Ny,minLevel:"serverOnly",lazy:()=>ho(()=>import("./SyncPage-IZEcPmIw.js"),__vite__mapDeps([12,1,4,10,2,3,13,14,15]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:Ry,minLevel:"serverOnly",lazy:()=>ho(()=>import("./ChangelogPage-DOXmMWDc.js"),__vite__mapDeps([16,10,4,17,18,19]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Cy,minLevel:"serverOnly",lazy:()=>ho(()=>import("./PlaytestPage-BHQoeC4V.js"),__vite__mapDeps([20,13,14,1,4,10,21]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Ay,minLevel:"serverOnly",lazy:()=>ho(()=>import("./UiStudioPage-DVFz_q9v.js"),__vite__mapDeps([22,13,14,1,4,23,24,17,18,25]))},{labelKey:"sidebar.tools",route:"/tools",icon:qy,minLevel:"serverOnly",lazy:()=>ho(()=>import("./ToolsPage-ByA_a1TP.js"),__vite__mapDeps([26,4,10,17,18,27]))}],Lp=[{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:py,minLevel:"disconnected",lazy:()=>ho(()=>import("./WhatsNewPage-CcELayE3.js"),__vite__mapDeps([28,29]))}],Tl="https://github.com/hope1026/weppy-roblox-mcp",Wy="https://weppyai.com";function Vy(a){return a?/Mac OS X|Macintosh/i.test(a)?"macOS":/Windows NT/i.test(a)?"Windows":/Linux/i.test(a)?"Linux":"":""}function Yy(a){var m,v,k;const r=Vy(typeof navigator<"u"?navigator.userAgent:""),s=a.status,u=(s==null?void 0:s.version)??"",c=((v=(m=s==null?void 0:s.pluginClients)==null?void 0:m[0])==null?void 0:v.pluginVersion)??"",p=u||c?[u?`MCP ${u}`:"",c?`Plugin ${c}`:""].filter(Boolean).join(" / "):"",g=((k=s==null?void 0:s.aiClientNames)==null?void 0:k[0])??"",f=new URLSearchParams;return f.set("template","bug_report.yml"),r&&f.set("os",r),g&&f.set("ai-client",g),p&&f.set("plugin-version",p),f.toString()}const Ky=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:fy,buildUrl:a=>`${Tl}/issues/new?${Yy(a)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:zy,buildUrl:()=>`${Tl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:My,buildUrl:()=>`${Tl}/discussions`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:hy,buildUrl:a=>`${Wy}/${a.locale}/docs/troubleshooting/`}];function Gy(){const[a,r]=R.useState("basic"),[s,u]=R.useState(0),[c,p]=R.useState(0),[g,f]=R.useState(0),[m,v]=R.useState(!0);R.useEffect(()=>{let w=!1;async function j(){try{return await Dp("gumroad")}catch{return null}}async function _(){var H,re;try{const[W,Z]=await Promise.all([j(),io.get("/api/dashboard/tool-stats").catch(()=>null)]);if(w)return;if(W!=null&&W.tier&&r(W.tier),Z!=null&&Z.tierSummary){const te=((H=Z.tierSummary.basic)==null?void 0:H.totalCalls)??0,ye=((re=Z.tierSummary.pro)==null?void 0:re.totalCalls)??0;f(te),p(ye),u(te+ye)}}catch{}finally{w||v(!1)}}_();const F=new Mp;F.connect();const L=F.on("license",()=>{j().then(H=>{!w&&(H!=null&&H.tier)&&r(H.tier)})});return()=>{w=!0,L(),F.disconnect()}},[]);const k=s>0?c/s*100:0;return{tier:a,proUsagePercent:k,totalCalls:s,proCalls:c,basicCalls:g,loading:m}}const $y=new Date("2026-04-30T23:59:59"),Qy="WEPPY-MCP";function Jy(){return Date.now()<=$y.getTime()}const Zy={overview:"https://gum.co/u/2nc0fhky",sync:"https://gum.co/u/p0barnlb",playtest:"https://gum.co/u/kchczjry",uiStudio:"https://gum.co/u/orytecgp"},Xy=5e3,eS=5;function tS(a){return a.replace(/^\//,"").split("/")[0]||"overview"}function oS(a,r){const s=new URLSearchParams(r);if(a==="ui-studio")return s.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(a==="tools")return"tools_history";if(a==="changelog")return"changelog_all"}function ln(a,r){const s=tS(a);if(r===void 0)return s;const u=oS(s,r);return u?{page:s,tab:u}:{page:s}}let da=[],Xd=null;function Np(){if(da.length===0)return;const a=da.splice(0),r=`${jr}/api/dashboard/analytics`,s=JSON.stringify({events:a});fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},body:s}).catch(()=>{})}function iS(){Xd||(Xd=setInterval(Np,Xy))}function ep(a){da.push(a),iS(),da.length>=eS&&Np()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(da.length===0)return;const a=`${jr}/api/dashboard/analytics`,r=JSON.stringify({events:da.splice(0)});navigator.sendBeacon(a,new Blob([r],{type:"application/json"}))});function un(){const a=R.useCallback((s,u)=>{ep({name:s,params:u})},[]),r=R.useCallback(s=>{ep({name:"dashboard_page_view",params:{...typeof s=="string"?{page:s}:s}})},[]);return{trackEvent:a,trackPageView:r}}const aS="_widget_1jikb_1",nS="_header_1jikb_12",rS="_sparkle_1jikb_18",sS="_title_1jikb_23",lS="_cta_1jikb_31",uS="_coupon_1jikb_52",cS="_couponCode_1jikb_58",dS="_couponMeta_1jikb_65",pS="_collapsed_1jikb_71",Ao={widget:aS,header:nS,sparkle:rS,title:sS,cta:lS,coupon:uS,couponCode:cS,couponMeta:dS,collapsed:pS},gS="Apr 30";function hS({collapsed:a=!1}){const{tier:r}=Gy(),{t:s}=li(),{trackEvent:u}=un(),{pathname:c,search:p}=oo();if(r==="pro")return null;const g=Zy.overview,f=ln(c,p),m=()=>{u("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...f})};if(a)return z.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:Ao.collapsed,title:s("upgrade.title","Upgrade to Pro"),"aria-label":s("upgrade.title","Upgrade to Pro"),onClick:m,children:z.jsx(Zd,{size:18,strokeWidth:1.75})});const k=s("upgrade.validUntil","Until {{date}}").replace("{{date}}",gS),w=Jy();return z.jsxs("div",{className:Ao.widget,children:[z.jsxs("div",{className:Ao.header,children:[z.jsx(Zd,{size:16,strokeWidth:1.75,className:Ao.sparkle}),z.jsx("span",{className:Ao.title,children:s("upgrade.tagline","Go Pro for more power")})]}),z.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:Ao.cta,onClick:m,children:[s("upgrade.cta","Upgrade to Pro")," →"]}),w&&z.jsxs("div",{className:Ao.coupon,children:[z.jsx("span",{className:Ao.couponCode,children:Qy}),z.jsx("span",{className:Ao.couponMeta,children:k})]})]})}const mS="_sidebar_1ei54_2",fS="_brand_1ei54_17",yS="_brandIcon_1ei54_28",SS="_brandText_1ei54_33",vS="_brandTextPro_1ei54_44",bS="_nav_1ei54_50",wS="_spacer_1ei54_57",kS="_navLink_1ei54_63",PS="_active_1ei54_84",CS="_disabled_1ei54_91",xS="_icon_1ei54_102",RS="_label_1ei54_113",TS="_secondaryDivider_1ei54_120",AS="_secondaryNav_1ei54_127",IS="_helpDivider_1ei54_134",ES="_helpGroupTitle_1ei54_141",jS="_helpNav_1ei54_152",zS="_externalIcon_1ei54_159",at={sidebar:mS,brand:fS,brandIcon:yS,brandText:SS,brandTextPro:vS,nav:bS,spacer:wS,navLink:kS,active:PS,disabled:CS,icon:xS,label:RS,secondaryDivider:TS,secondaryNav:AS,helpDivider:IS,helpGroupTitle:ES,helpNav:jS,externalIcon:zS},DS={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function MS(){const[a,r]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const s=window.matchMedia("(max-width: 768px)"),u=()=>r(s.matches);return u(),s.addEventListener("change",u),()=>s.removeEventListener("change",u)},[]),a}const tp={disconnected:0,serverOnly:1,studioConnected:2};function _S(a,r){return tp[a]>=tp[r]}function US(a,r){return a==="serverOnly"?r("sidebar.gate.l1","MCP server connection required"):a==="studioConnected"?r("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function op({item:a}){const{level:r}=zr(),{t:s}=li(),u=_S(r,a.minLevel),c=a.icon,p=z.jsxs(bf,{to:a.route,end:a.route==="/",className:({isActive:g})=>[at.navLink,g?at.active:"",u?"":at.disabled].filter(Boolean).join(" "),onClick:g=>{u||g.preventDefault()},children:[z.jsx("span",{className:at.icon,children:z.jsx(c,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),z.jsx("span",{className:at.label,children:s(a.labelKey)})]});return u?p:z.jsx(ji,{text:US(a.minLevel,s),children:p})}function LS({item:a,ctx:r}){const{t:s}=li(),{trackEvent:u}=un(),{pathname:c,search:p}=oo(),g=a.icon,f=a.buildUrl(r),m=s(a.tooltipKey,""),v=ln(c,p),k=z.jsxs("a",{href:f,target:"_blank",rel:"noopener noreferrer",className:at.navLink,"data-testid":`sidebar-help-${a.id}`,onClick:()=>u("dashboard_click_event",{click_target:DS[a.id],placement:"sidebar_help",...v}),children:[z.jsx("span",{className:at.icon,children:z.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),z.jsx("span",{className:at.label,children:s(a.labelKey)}),z.jsx("span",{className:at.externalIcon,"aria-hidden":"true",children:z.jsx(by,{size:12,strokeWidth:1.75})})]});return m?z.jsx(ji,{text:m,children:k}):k}function NS(){const[a,r]=R.useState("basic"),s=MS(),{status:u}=zr(),{locale:c,t:p}=li(),g={locale:c,status:u};return R.useEffect(()=>{let f=!1;async function m(){try{const w=await Dp("gumroad");!f&&(w!=null&&w.tier)&&r(w.tier)}catch{f||r("basic")}}m();const v=new Mp;v.connect();const k=v.on("license",()=>{m()});return()=>{f=!0,k(),v.disconnect()}},[]),z.jsxs("aside",{className:at.sidebar,children:[z.jsxs("div",{className:at.brand,children:[z.jsx("span",{className:at.brandIcon,children:z.jsx(Sy,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),z.jsx("span",{"data-testid":"sidebar-brand-text",className:[at.brandText,a==="pro"?at.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),z.jsx("nav",{className:at.nav,children:Up.map(f=>z.jsx(op,{item:f},f.route))}),z.jsx("div",{className:at.secondaryDivider}),z.jsx("nav",{className:at.secondaryNav,children:Lp.map(f=>z.jsx(op,{item:f},f.route))}),z.jsx("div",{className:at.helpDivider,"aria-hidden":"true"}),z.jsx("div",{className:at.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),z.jsx("nav",{className:at.helpNav,"aria-label":p("sidebar.help.group"),children:Ky.map(f=>z.jsx(LS,{item:f,ctx:g},f.id))}),z.jsx("div",{className:at.spacer}),z.jsx(hS,{collapsed:s})]})}async function HS(){return io.get("/api/dashboard/place-summary")}async function BS(){return io.get("/api/dashboard/sync-root")}async function OS(){return io.post("/api/dashboard/sync-root/pick")}async function FS(a){return io.patch("/api/dashboard/sync-root",{projectRoot:a})}const qS=[{id:"2026-05-04-ui-studio",date:"2026-05-04",title:{en:"UI Studio — helping AI build polished in-game UI",ko:"UI Studio — AI가 완성도 있는 인게임 UI를 만들 수 있도록 지원합니다",es:"UI Studio — apoyo para que la IA cree una UI en el juego con buen acabado","pt-br":"UI Studio — apoio para a IA criar UI no jogo com bom acabamento",ja:"UI Studio — AIが完成度の高いゲーム内UIを作れるようサポート",id:"UI Studio — mendukung AI membangun UI dalam game yang rapi"},body:{en:`WEPPY now ships UI Studio — AI agents can build and edit Roblox in-game UI (screen elements like ScreenGui, Frame, TextLabel) directly.
260
260
 
261
261
  When the AI starts a new UI, it first asks guided questions to capture the purpose, the screen, and the target devices, then composes the UI tree. As work progresses, the AI can capture the current screen to verify the result, and it inspects items such as touch target size, text contrast, and safe zones to surface improvement suggestions — so the polish of the output naturally improves.
262
262
 
@@ -340,4 +340,4 @@ Studio 設定の 'Allow Mesh / Image APIs'(Game Settings > Security)が有
340
340
 
341
341
  Anda dapat mengatur ukuran screenshot dari tab Settings di bagian Capture yang baru. Ukuran lebih kecil menghemat biaya token AI tetapi mungkin menyembunyikan detail halus. Fitur ini hanya berfungsi di mode Edit — screenshot saat playtest aktif tidak didukung karena keterbatasan platform Roblox.
342
342
 
343
- Anda perlu mengaktifkan 'Allow Mesh / Image APIs' di Studio (Game Settings > Security), dan screenshot adalah fitur Pro. Terima kasih telah menggunakan WEPPY!`},severity:"info",category:"release"}],Gl="weppy-dashboard.whatsNew.readIds";function Hp(){try{const a=localStorage.getItem(Gl);if(!a)return new Set;const r=JSON.parse(a);return Array.isArray(r)?new Set(r.filter(s=>typeof s=="string")):new Set}catch{return new Set}}function FS(a){try{localStorage.setItem(Gl,JSON.stringify([...a]))}catch{}}let sa=Hp(),Bp=sa;const _l=new Set;function Op(){Bp=new Set(sa);for(const a of _l)a()}const Tl={subscribe(a){return _l.add(a),()=>{_l.delete(a)}},getSnapshot(){return Bp},markRead(a){let r=!1;for(const s of a)sa.has(s)||(sa.add(s),r=!0);r&&(FS(sa),Op())}};typeof window<"u"&&window.addEventListener("storage",a=>{a.key===Gl&&(sa=Hp(),Op())});function qS(){const a=R.useSyncExternalStore(Tl.subscribe,Tl.getSnapshot),r=OS.filter(s=>!a.has(s.id)).length;return{readSet:a,unreadCount:r,markRead:Tl.markRead}}const WS="_header_4psrj_2",VS="_row1_4psrj_17",YS="_projectIdentity_4psrj_25",KS="_folderIcon_4psrj_34",GS="_projectName_4psrj_39",$S="_placeChips_4psrj_51",QS="_metaActions_4psrj_58",ZS="_placeChip_4psrj_51",JS="_placeChipStatic_4psrj_81",XS="_placeChipMuted_4psrj_82",ev="_placeChipActive_4psrj_86",tv="_placeChipInactive_4psrj_93",ov="_placeChipId_4psrj_104",iv="_placeDot_4psrj_119",av="_placeChipName_4psrj_127",nv="_row2_4psrj_135",rv="_pathGroup_4psrj_142",sv="_projectPath_4psrj_150",lv="_changeButton_4psrj_160",uv="_iconButton_4psrj_193",Xe={header:WS,row1:VS,projectIdentity:YS,folderIcon:KS,projectName:GS,placeChips:$S,metaActions:QS,placeChip:ZS,placeChipStatic:JS,placeChipMuted:XS,placeChipActive:ev,placeChipInactive:tv,placeChipId:ov,placeDot:iv,placeChipName:av,row2:nv,pathGroup:rv,projectPath:sv,changeButton:lv,iconButton:uv},cv="_bellWrapper_tae21_2",dv="_unreadDot_tae21_8",ip={bellWrapper:cv,unreadDot:dv};function pv(){const{t:a}=si(),{unreadCount:r}=qS(),{trackEvent:s}=jr(),{pathname:u}=Xt(),d=u.replace(/^\//,"").split("/")[0]||"overview",p=r>0?`${a("header.whatsNew","What's New")} (${r})`:a("header.whatsNew","What's New");return z.jsx(Ii,{text:a("header.whatsNew.tooltip","What's New"),children:z.jsxs("span",{className:ip.bellWrapper,children:[z.jsx(Vl,{to:"/whats-new","aria-label":p,className:Xe.iconButton,onClick:()=>s("dashboard_click_event",{click_target:"notification_bell",placement:"top_header",page:d}),children:"🔔"}),r>0&&z.jsx("span",{className:ip.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}const gv="_backdrop_1ez3d_1",hv="_modal_1ez3d_12",mv="_title_1ez3d_23",fv="_message_1ez3d_30",yv="_actions_1ez3d_37",Sv="_cancelButton_1ez3d_44",vv="_confirmButton_1ez3d_45",po={backdrop:gv,modal:hv,title:mv,message:fv,actions:yv,cancelButton:Sv,confirmButton:vv};function Al(a,r){return z.jsxs("div",{style:{display:"grid",gap:6},children:[z.jsx("span",{style:{fontSize:12,fontWeight:700,color:"#9fb0cb"},children:a}),z.jsx("code",{style:{display:"block",overflowWrap:"anywhere",padding:"10px 12px",borderRadius:12,border:"1px solid rgba(162, 179, 207, 0.2)",background:"rgba(10, 15, 25, 0.72)",color:"#f4f7fb",fontSize:12,lineHeight:1.5},children:r})]})}function bv(a){const s=/^[A-Z]:\\/i.test(a)||a.includes("\\")?"\\":"/";return`${a.replace(/[\\/]+$/,"")}${s}weppy-project-sync`}function wv({open:a,step:r,selectedProjectRoot:s,studioConnected:u,loading:d=!1,errorMessage:p=null,onClose:g,onPick:m,onApply:f}){const{t:y}=si();if(!a)return null;const P=s?bv(s):"";return z.jsx("div",{className:po.backdrop,onClick:d?void 0:g,role:"presentation",children:z.jsxs("div",{className:po.modal,onClick:C=>C.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"project-root-change-modal-title",children:[z.jsx("h2",{id:"project-root-change-modal-title",className:po.title,children:r==="initial"?y("header.projectRootModal.initial.title","Change project root"):y("header.projectRootModal.confirm.title","Confirm new project root")}),z.jsx("p",{className:po.message,children:r==="initial"?u?y("header.projectRootModal.initial.body.connected","MCP will switch to the new project root and resync current Studio contents into the new target."):y("header.projectRootModal.initial.body.disconnected","MCP will switch to the new project root and use the new folder as the next sync target."):y("header.projectRootModal.confirm.body","Review the selected project folder before applying.")}),z.jsxs("div",{style:{display:"grid",gap:14,marginTop:18},children:[r==="initial"?z.jsxs(z.Fragment,{children:[Al(y("header.projectRootModal.initial.nextSyncRoot","New sync target after selection"),y("header.projectRootModal.initial.nextSyncRoot.placeholder","<selected project folder>/weppy-project-sync")),z.jsxs("ul",{style:{margin:0,paddingLeft:18,color:"#c8d2e3",lineHeight:1.6},children:[u?z.jsxs(z.Fragment,{children:[z.jsx("li",{children:y("header.projectRootModal.initial.warningStop","Current sync stops immediately.")}),z.jsx("li",{children:y("header.projectRootModal.initial.warningFreshSync","The current Studio contents will be used to build a fresh full sync in the new target.")})]}):z.jsx("li",{children:y("header.projectRootModal.initial.warningDeferredSync","If Studio is not connected, full resync starts the next time the plugin connects.")}),z.jsx("li",{children:y("header.projectRootModal.initial.warningNoMove","Old sync folders are not moved automatically.")})]})]}):z.jsxs(z.Fragment,{children:[Al(y("header.projectRootModal.confirm.projectRoot","Selected project folder"),s??""),Al(y("header.projectRootModal.confirm.syncRoot","New sync target"),P),z.jsx("p",{className:po.message,children:y("header.projectRootModal.confirm.warningNoMove","Existing sync folders are not moved automatically.")})]}),p?z.jsx("p",{className:po.message,style:{marginTop:0,color:"#ffb3b3"},children:p}):null]}),z.jsxs("div",{className:po.actions,children:[z.jsx("button",{className:po.cancelButton,onClick:g,disabled:d,children:y("header.projectRootModal.cancel","Cancel")}),r==="initial"?z.jsx("button",{className:po.confirmButton,onClick:m,disabled:d,children:d?"...":y("header.projectRootModal.pick","Choose folder")}):z.jsx("button",{className:po.confirmButton,onClick:f,disabled:d||!s,children:d?"...":y("header.projectRootModal.apply","Apply change")})]})]})})}function ap(a){if(!a)return"";const r=a.split(/[\\/]/).filter(Boolean);return r[r.length-1]??""}function kv(a){var u,d;const r=((u=a==null?void 0:a.mcpInstances)==null?void 0:u.filter(p=>!p.isServer&&p.aiClientName))??[];if(r.length===0){const p=((d=a==null?void 0:a.mcpInstances)==null?void 0:d.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}r.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const s=r[0];return s.projectRoot??s.cwd??null}function Pv(a,r,s){return a??r??s}function Cv(a){const r=a.replace(/^\//,"").split("/")[0];return r===""||r==="overview"}function xv(a){return a.replace(/^\//,"").split("/")[0]==="whats-new"}function np(a,r){if(a&&typeof a=="object"&&"message"in a&&typeof a.message=="string"){const s=a.message.trim();if(s.length>0)return s}return r}function Rv(){var ve,xe,Re,Ue;const{pathname:a}=Xt(),{level:r,status:s}=Er(),{t:u}=si(),{show:d}=Ep(),[p,g]=R.useState(null),[m,f]=R.useState(null),[y,P]=R.useState(null),[C,j]=R.useState(!1),[_,F]=R.useState(null),[N,H]=R.useState(null),[re,W]=R.useState(!1),[J,te]=R.useState(!1),[Se,Ae]=R.useState(null),A=u("header.placeNotConnected","Place not connected"),K=Cv(a),be=xv(a);R.useEffect(()=>{let ue=!1;async function et(){if(r==="disconnected"){g(null);return}try{const Ne=await eo.get("/connection-info");ue||g(Ne)}catch{ue||g(null)}}return et(),()=>{ue=!0}},[r,s==null?void 0:s.sessionId,s==null?void 0:s.connectedClients]),R.useEffect(()=>{let ue=!1;async function et(){if(r==="disconnected"){f(null),j(!1);return}f(null),j(!1);try{const Ne=await US();ue||(f(Ne),j(!1))}catch{ue||(f(null),j(!0))}}return et(),()=>{ue=!0}},[K,r,s==null?void 0:s.sessionId,s==null?void 0:s.connectedClients]),R.useEffect(()=>{let ue=!1;async function et(){if(r==="disconnected"){P(null);return}try{const Ne=await NS();ue||P(Ne)}catch{ue||P(null)}}return et(),()=>{ue=!0}},[r,s==null?void 0:s.sessionId,s==null?void 0:s.connectedClients]);const le=kv(p)??"",ke=r==="disconnected"?"blocked":m?"ready":C?"error":"loading",we=ke==="ready"?(m==null?void 0:m.projectRoot)??"":ke==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),_e=ke==="ready"?(m==null?void 0:m.projectRoot)??"":K?"":le,Fe=K||ke==="ready"?ke==="ready"?ap(_e)||u("header.unknownProject","Unknown project"):ke==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):ap(_e)||u("header.unknownProject","Unknown project"),Qe=Pv((xe=(ve=s==null?void 0:s.pluginClients)==null?void 0:ve[0])==null?void 0:xe.placeName,(Ue=(Re=s==null?void 0:s.pluginClients)==null?void 0:Re[0])==null?void 0:Ue.projectName,A),ot=Qe===A?u("header.placeNotConnected.tooltip","Place not connected"):u("header.place.tooltip","Connected Roblox place"),Le=y!=null&&y.pluginConnected?y.activePlaceId:(y==null?void 0:y.lastActivePlaceId)??null,O=[...(y==null?void 0:y.places)??[]].sort((ue,et)=>{const Ne=ue.placeId===Le,wt=et.placeId===Le;return Ne!==wt?Ne?-1:1:ue.isConnected!==et.isConnected?ue.isConnected?-1:1:ue.placeName.localeCompare(et.placeName)}),se=K?ke==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):ke==="error"?u("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):u("header.currentProject.tooltip","Currently selected project folder"):u("header.currentProject.tooltip","Currently selected project folder"),Y=r==="disconnected"||ke!=="ready",w=r==="disconnected"?u("header.changeProjectRoot.disabledTooltip.l0","MCP server connection required before project root can be changed"):ke==="loading"?u("header.changeProjectRoot.disabledTooltip.loading","Project root information is still loading"):ke==="error"?u("header.changeProjectRoot.disabledTooltip.unavailable","Current project root information is unavailable"):u("header.changeProjectRoot.tooltip","Change the current project root"),D=(ue=!1)=>{!ue&&(re||J)||(F(null),H(null),Ae(null))},ge=()=>{Y||(Ae(null),H(null),F("initial"))},fe=async()=>{W(!0),Ae(null);try{const ue=await HS();if(ue.cancelled||!ue.projectRoot){D(!0);return}H(ue.projectRoot),F("confirm")}catch(ue){Ae(np(ue,u("header.projectRootModal.error","Failed to change project root")))}finally{W(!1)}},me=async()=>{if(N){te(!0),Ae(null);try{const ue=await BS(N);f(ue),j(!1),D(!0)}catch(ue){const et=np(ue,u("header.projectRootModal.error","Failed to change project root"));Ae(et),d(et,"error")}finally{te(!1)}}};return be?null:z.jsxs(z.Fragment,{children:[z.jsxs("header",{className:Xe.header,children:[z.jsxs("div",{className:Xe.row1,children:[z.jsxs("div",{className:Xe.projectIdentity,children:[z.jsx(ky,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:Xe.folderIcon}),z.jsx(Ii,{text:se,children:z.jsx("h1",{className:Xe.projectName,children:Fe})}),z.jsx("div",{className:Xe.placeChips,children:O.length===0?z.jsx(Ii,{text:ot,children:z.jsx("span",{className:`${Xe.placeChip} ${Xe.placeChipMuted}`,children:z.jsx("span",{className:Xe.placeChipName,children:Qe})})}):O.map(ue=>{const et=ue.placeId===Le,Ne=!!(y!=null&&y.pluginConnected)&&ue.isConnected,wt=Ne?u("header.places.active","Active"):u("header.places.inactive","Inactive"),jo=[Xe.placeChip,Xe.placeChipStatic,et&&Ne?Xe.placeChipActive:Xe.placeChipInactive].filter(Boolean).join(" ");return z.jsxs("span",{className:jo,title:`${ue.placeName} · ${ue.placeId} (${wt})`,children:[et&&Ne?z.jsx("span",{className:Xe.placeDot,"aria-hidden":"true"}):null,z.jsx("span",{className:Xe.placeChipName,children:ue.placeName}),z.jsx("span",{className:Xe.placeChipId,children:ue.placeId})]},`${ue.placeId}:${ue.placeDirName}`)})})]}),z.jsxs("div",{className:Xe.metaActions,children:[z.jsx(pv,{}),z.jsx(Ii,{text:u("sidebar.settings","Settings"),children:z.jsx(Vl,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:Xe.iconButton,children:z.jsx(By,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),z.jsx("div",{className:Xe.row2,children:z.jsxs("div",{className:Xe.pathGroup,children:[z.jsx("span",{className:Xe.projectPath,title:we,children:we}),z.jsx(Ii,{text:w,children:z.jsx("span",{children:z.jsx("button",{type:"button",className:Xe.changeButton,onClick:ge,disabled:Y,children:u("header.changeProjectRoot","Change Project Root")})})})]})})]}),z.jsx(wv,{open:_!==null,step:_??"initial",selectedProjectRoot:N,studioConnected:r==="studioConnected",loading:re||J,errorMessage:Se,onClose:D,onPick:fe,onApply:me})]})}const Tv="_layout_ya8ln_2",Av="_mainShell_ya8ln_8",Iv="_content_ya8ln_17",Ev="_loading_ya8ln_25",wr={layout:Tv,mainShell:Av,content:Iv,loading:Ev};function jv(){const{pathname:a}=Xt(),{trackPageView:r}=jr();return R.useEffect(()=>{r(Kl(a))},[a,r]),null}function zv(){return z.jsx(qf,{children:z.jsx(Jf,{children:z.jsxs(Df,{children:[z.jsx(Xf,{}),z.jsx(jv,{}),z.jsxs("div",{className:wr.layout,children:[z.jsx(LS,{}),z.jsxs("div",{className:wr.mainShell,children:[z.jsx(Rv,{}),z.jsx("main",{className:wr.content,children:z.jsx(R.Suspense,{fallback:z.jsx("div",{className:wr.loading,children:"Loading..."}),children:z.jsx(Zm,{})})})]})]})]})})})}function rp(a){return a.route==="/"?{index:!0,lazy:a.lazy}:{path:a.route.slice(1),lazy:a.lazy}}const Dv=sf([{path:"/",element:z.jsx(zv,{}),children:[...Lp.map(rp),...Np.map(rp),{path:"changelog/:id",lazy:()=>go(()=>import("./ChangelogDetailPage-CIarzJIx.js"),__vite__mapDeps([30,1,5,6,4,31]))},{path:"settings",lazy:()=>go(()=>import("./SettingsPage-DVgxRsfC.js"),__vite__mapDeps([32,1,4,10,23,24,33]))}]}]);zh.createRoot(document.getElementById("root")).render(z.jsx(mf,{router:Dv}));export{Ei as A,Mp as D,Vl as L,Uy as R,Of as S,Ii as T,eo as a,_v as b,wp as c,Er as d,Nv as e,Dp as f,Uv as g,Hv as h,NS as i,z as j,jr as k,Gy as l,Ep as m,Xt as n,Jy as o,ft as p,Ir as q,R as r,Af as s,Lv as t,si as u,Zy as v,po as w,qS as x,OS as y};
343
+ Anda perlu mengaktifkan 'Allow Mesh / Image APIs' di Studio (Game Settings > Security), dan screenshot adalah fitur Pro. Terima kasih telah menggunakan WEPPY!`},severity:"info",category:"release"}],Gl="weppy-dashboard.whatsNew.readIds";function Hp(){try{const a=localStorage.getItem(Gl);if(!a)return new Set;const r=JSON.parse(a);return Array.isArray(r)?new Set(r.filter(s=>typeof s=="string")):new Set}catch{return new Set}}function WS(a){try{localStorage.setItem(Gl,JSON.stringify([...a]))}catch{}}let ua=Hp(),Bp=ua;const Ul=new Set;function Op(){Bp=new Set(ua);for(const a of Ul)a()}const Al={subscribe(a){return Ul.add(a),()=>{Ul.delete(a)}},getSnapshot(){return Bp},markRead(a){let r=!1;for(const s of a)ua.has(s)||(ua.add(s),r=!0);r&&(WS(ua),Op())}};typeof window<"u"&&window.addEventListener("storage",a=>{a.key===Gl&&(ua=Hp(),Op())});function VS(){const a=R.useSyncExternalStore(Al.subscribe,Al.getSnapshot),r=qS.filter(s=>!a.has(s.id)).length;return{readSet:a,unreadCount:r,markRead:Al.markRead}}const YS="_header_4psrj_2",KS="_row1_4psrj_17",GS="_projectIdentity_4psrj_25",$S="_folderIcon_4psrj_34",QS="_projectName_4psrj_39",JS="_placeChips_4psrj_51",ZS="_metaActions_4psrj_58",XS="_placeChip_4psrj_51",ev="_placeChipStatic_4psrj_81",tv="_placeChipMuted_4psrj_82",ov="_placeChipActive_4psrj_86",iv="_placeChipInactive_4psrj_93",av="_placeChipId_4psrj_104",nv="_placeDot_4psrj_119",rv="_placeChipName_4psrj_127",sv="_row2_4psrj_135",lv="_pathGroup_4psrj_142",uv="_projectPath_4psrj_150",cv="_changeButton_4psrj_160",dv="_iconButton_4psrj_193",Ze={header:YS,row1:KS,projectIdentity:GS,folderIcon:$S,projectName:QS,placeChips:JS,metaActions:ZS,placeChip:XS,placeChipStatic:ev,placeChipMuted:tv,placeChipActive:ov,placeChipInactive:iv,placeChipId:av,placeDot:nv,placeChipName:rv,row2:sv,pathGroup:lv,projectPath:uv,changeButton:cv,iconButton:dv},pv="_bellWrapper_tae21_2",gv="_unreadDot_tae21_8",ip={bellWrapper:pv,unreadDot:gv};function hv(){const{t:a}=li(),{unreadCount:r}=VS(),{trackEvent:s}=un(),{pathname:u,search:c}=oo(),p=ln(u,c),g=r>0?`${a("header.whatsNew","What's New")} (${r})`:a("header.whatsNew","What's New");return z.jsx(ji,{text:a("header.whatsNew.tooltip","What's New"),children:z.jsxs("span",{className:ip.bellWrapper,children:[z.jsx(Yl,{to:"/whats-new","aria-label":g,className:Ze.iconButton,onClick:()=>s("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),r>0&&z.jsx("span",{className:ip.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}const mv="_backdrop_1ozbv_1",fv="_modal_1ozbv_12",yv="_title_1ozbv_23",Sv="_message_1ozbv_30",vv="_actions_1ozbv_37",bv="_cancelButton_1ozbv_44",wv="_confirmButton_1ozbv_45",kv="_pathBlock_1ozbv_75",Pv="_pathLabel_1ozbv_80",Cv="_pathCode_1ozbv_86",xv="_bodyGrid_1ozbv_98",Rv="_warningList_1ozbv_104",Tv="_errorMessage_1ozbv_111",Pt={backdrop:mv,modal:fv,title:yv,message:Sv,actions:vv,cancelButton:bv,confirmButton:wv,pathBlock:kv,pathLabel:Pv,pathCode:Cv,bodyGrid:xv,warningList:Rv,errorMessage:Tv};function Il(a,r){return z.jsxs("div",{className:Pt.pathBlock,children:[z.jsx("span",{className:Pt.pathLabel,children:a}),z.jsx("code",{className:Pt.pathCode,children:r})]})}function Av(a){const s=/^[A-Z]:\\/i.test(a)||a.includes("\\")?"\\":"/";return`${a.replace(/[\\/]+$/,"")}${s}weppy-project-sync`}function Iv({open:a,step:r,selectedProjectRoot:s,studioConnected:u,loading:c=!1,errorMessage:p=null,onClose:g,onPick:f,onApply:m}){const{t:v}=li();if(!a)return null;const k=s?Av(s):"";return z.jsx("div",{className:Pt.backdrop,onClick:c?void 0:g,role:"presentation",children:z.jsxs("div",{className:Pt.modal,onClick:w=>w.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"project-root-change-modal-title",children:[z.jsx("h2",{id:"project-root-change-modal-title",className:Pt.title,children:r==="initial"?v("header.projectRootModal.initial.title","Change project root"):v("header.projectRootModal.confirm.title","Confirm new project root")}),z.jsx("p",{className:Pt.message,children:r==="initial"?u?v("header.projectRootModal.initial.body.connected","MCP will switch to the new project root and resync current Studio contents into the new target."):v("header.projectRootModal.initial.body.disconnected","MCP will switch to the new project root and use the new folder as the next sync target."):v("header.projectRootModal.confirm.body","Review the selected project folder before applying.")}),z.jsxs("div",{className:Pt.bodyGrid,children:[r==="initial"?z.jsxs(z.Fragment,{children:[Il(v("header.projectRootModal.initial.nextSyncRoot","New sync target after selection"),v("header.projectRootModal.initial.nextSyncRoot.placeholder","<selected project folder>/weppy-project-sync")),z.jsxs("ul",{className:Pt.warningList,children:[u?z.jsxs(z.Fragment,{children:[z.jsx("li",{children:v("header.projectRootModal.initial.warningStop","Current sync stops immediately.")}),z.jsx("li",{children:v("header.projectRootModal.initial.warningFreshSync","The current Studio contents will be used to build a fresh full sync in the new target.")})]}):z.jsx("li",{children:v("header.projectRootModal.initial.warningDeferredSync","If Studio is not connected, full resync starts the next time the plugin connects.")}),z.jsx("li",{children:v("header.projectRootModal.initial.warningNoMove","Old sync folders are not moved automatically.")})]})]}):z.jsxs(z.Fragment,{children:[Il(v("header.projectRootModal.confirm.projectRoot","Selected project folder"),s??""),Il(v("header.projectRootModal.confirm.syncRoot","New sync target"),k),z.jsx("p",{className:Pt.message,children:v("header.projectRootModal.confirm.warningNoMove","Existing sync folders are not moved automatically.")})]}),p?z.jsx("p",{className:`${Pt.message} ${Pt.errorMessage}`,children:p}):null]}),z.jsxs("div",{className:Pt.actions,children:[z.jsx("button",{className:Pt.cancelButton,onClick:g,disabled:c,children:v("header.projectRootModal.cancel","Cancel")}),r==="initial"?z.jsx("button",{className:Pt.confirmButton,onClick:f,disabled:c,children:c?"...":v("header.projectRootModal.pick","Choose folder")}):z.jsx("button",{className:Pt.confirmButton,onClick:m,disabled:c||!s,children:c?"...":v("header.projectRootModal.apply","Apply change")})]})]})})}function ap(a){if(!a)return"";const r=a.split(/[\\/]/).filter(Boolean);return r[r.length-1]??""}function Ev(a){var u,c;const r=((u=a==null?void 0:a.mcpInstances)==null?void 0:u.filter(p=>!p.isServer&&p.aiClientName))??[];if(r.length===0){const p=((c=a==null?void 0:a.mcpInstances)==null?void 0:c.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}r.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const s=r[0];return s.projectRoot??s.cwd??null}function jv(a,r,s){return a??r??s}function zv(a){const r=a.replace(/^\//,"").split("/")[0];return r===""||r==="overview"}function Dv(a){return a.replace(/^\//,"").split("/")[0]==="whats-new"}function np(a,r){if(a&&typeof a=="object"&&"message"in a&&typeof a.message=="string"){const s=a.message.trim();if(s.length>0)return s}return r}function Mv(){var Ne,ct,mo,ot;const{pathname:a,search:r}=oo(),{level:s,status:u}=zr(),{t:c}=li(),{trackEvent:p}=un(),{show:g}=Ep(),[f,m]=R.useState(null),[v,k]=R.useState(null),[w,j]=R.useState(null),[_,F]=R.useState(!1),[L,H]=R.useState(null),[re,W]=R.useState(null),[Z,te]=R.useState(!1),[ye,je]=R.useState(!1),[I,K]=R.useState(null),ve=c("header.placeNotConnected","Place not connected"),se=zv(a),_e=Dv(a),we=ln(a,r);R.useEffect(()=>{let ge=!1;async function et(){if(s==="disconnected"){m(null);return}try{const ht=await io.get("/connection-info");ge||m(ht)}catch{ge||m(null)}}return et(),()=>{ge=!0}},[s,u==null?void 0:u.sessionId,u==null?void 0:u.connectedClients]),R.useEffect(()=>{let ge=!1;async function et(){if(s==="disconnected"){k(null),F(!1);return}k(null),F(!1);try{const ht=await BS();ge||(k(ht),F(!1))}catch{ge||(k(null),F(!0))}}return et(),()=>{ge=!0}},[se,s,u==null?void 0:u.sessionId,u==null?void 0:u.connectedClients]),R.useEffect(()=>{let ge=!1;async function et(){if(s==="disconnected"){j(null);return}try{const ht=await HS();ge||j(ht)}catch{ge||j(null)}}return et(),()=>{ge=!0}},[s,u==null?void 0:u.sessionId,u==null?void 0:u.connectedClients]);const Ue=Ev(f)??"",ke=s==="disconnected"?"blocked":v?"ready":_?"error":"loading",$e=ke==="ready"?(v==null?void 0:v.projectRoot)??"":ke==="loading"?c("header.currentProject.loading","Loading project root..."):c("header.currentProject.unavailable","Project root unavailable"),Xe=ke==="ready"?(v==null?void 0:v.projectRoot)??"":se?"":Ue,Le=se||ke==="ready"?ke==="ready"?ap(Xe)||c("header.unknownProject","Unknown project"):ke==="loading"?c("header.currentProject.loading","Loading project root..."):c("header.currentProject.unavailable","Project root unavailable"):ap(Xe)||c("header.unknownProject","Unknown project"),O=jv((ct=(Ne=u==null?void 0:u.pluginClients)==null?void 0:Ne[0])==null?void 0:ct.placeName,(ot=(mo=u==null?void 0:u.pluginClients)==null?void 0:mo[0])==null?void 0:ot.projectName,ve),le=O===ve?c("header.placeNotConnected.tooltip","Place not connected"):c("header.place.tooltip","Connected Roblox place"),Y=w!=null&&w.pluginConnected?w.activePlaceId:(w==null?void 0:w.lastActivePlaceId)??null,P=[...(w==null?void 0:w.places)??[]].sort((ge,et)=>{const ht=ge.placeId===Y,Rt=et.placeId===Y;return ht!==Rt?ht?-1:1:ge.isConnected!==et.isConnected?ge.isConnected?-1:1:ge.placeName.localeCompare(et.placeName)}),D=se?ke==="loading"?c("header.currentProject.loading.tooltip","Project root information is still loading"):ke==="error"?c("header.currentProject.unavailable.tooltip","Current project root information is unavailable"):c("header.currentProject.tooltip","Currently selected project folder"):c("header.currentProject.tooltip","Currently selected project folder"),pe=s==="disconnected"||ke!=="ready",fe=s==="disconnected"?c("header.changeProjectRoot.disabledTooltip.l0","MCP server connection required before project root can be changed"):ke==="loading"?c("header.changeProjectRoot.disabledTooltip.loading","Project root information is still loading"):ke==="error"?c("header.changeProjectRoot.disabledTooltip.unavailable","Current project root information is unavailable"):c("header.changeProjectRoot.tooltip","Change the current project root"),he=(ge=!1)=>{!ge&&(Z||ye)||(H(null),W(null),K(null))},be=()=>{pe||(p("dashboard_click_event",{click_target:"project_root_change",placement:"top_header",...we}),K(null),W(null),H("initial"))},Re=async()=>{te(!0),K(null);try{const ge=await OS();if(ge.cancelled||!ge.projectRoot){he(!0);return}W(ge.projectRoot),H("confirm")}catch(ge){K(np(ge,c("header.projectRootModal.error","Failed to change project root")))}finally{te(!1)}},Te=async()=>{if(re){je(!0),K(null);try{const ge=await FS(re);k(ge),F(!1),he(!0)}catch(ge){const et=np(ge,c("header.projectRootModal.error","Failed to change project root"));K(et),g(et,"error")}finally{je(!1)}}};return _e?null:z.jsxs(z.Fragment,{children:[z.jsxs("header",{className:Ze.header,children:[z.jsxs("div",{className:Ze.row1,children:[z.jsxs("div",{className:Ze.projectIdentity,children:[z.jsx(ky,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:Ze.folderIcon}),z.jsx(ji,{text:D,children:z.jsx("h1",{className:Ze.projectName,children:Le})}),z.jsx("div",{className:Ze.placeChips,children:P.length===0?z.jsx(ji,{text:le,children:z.jsx("span",{className:`${Ze.placeChip} ${Ze.placeChipMuted}`,children:z.jsx("span",{className:Ze.placeChipName,children:O})})}):P.map(ge=>{const et=ge.placeId===Y,ht=!!(w!=null&&w.pluginConnected)&&ge.isConnected,Rt=ht?c("header.places.active","Active"):c("header.places.inactive","Inactive"),ui=[Ze.placeChip,Ze.placeChipStatic,et&&ht?Ze.placeChipActive:Ze.placeChipInactive].filter(Boolean).join(" ");return z.jsxs("span",{className:ui,title:`${ge.placeName} · ${ge.placeId} (${Rt})`,children:[et&&ht?z.jsx("span",{className:Ze.placeDot,"aria-hidden":"true"}):null,z.jsx("span",{className:Ze.placeChipName,children:ge.placeName}),z.jsx("span",{className:Ze.placeChipId,children:ge.placeId})]},`${ge.placeId}:${ge.placeDirName}`)})})]}),z.jsxs("div",{className:Ze.metaActions,children:[z.jsx(hv,{}),z.jsx(ji,{text:c("sidebar.settings","Settings"),children:z.jsx(Yl,{to:"/settings","aria-label":c("sidebar.settings","Settings"),className:Ze.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...we}),children:z.jsx(By,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),z.jsx("div",{className:Ze.row2,children:z.jsxs("div",{className:Ze.pathGroup,children:[z.jsx("span",{className:Ze.projectPath,title:$e,children:$e}),z.jsx(ji,{text:fe,children:z.jsx("span",{children:z.jsx("button",{type:"button",className:Ze.changeButton,onClick:be,disabled:pe,children:c("header.changeProjectRoot","Change Project Root")})})})]})})]}),z.jsx(Iv,{open:L!==null,step:L??"initial",selectedProjectRoot:re,studioConnected:s==="studioConnected",loading:Z||ye,errorMessage:I,onClose:he,onPick:Re,onApply:Te})]})}const _v="_layout_ya8ln_2",Uv="_mainShell_ya8ln_8",Lv="_content_ya8ln_17",Nv="_loading_ya8ln_25",Pr={layout:_v,mainShell:Uv,content:Lv,loading:Nv};function Hv(){const{pathname:a,search:r}=oo(),{trackPageView:s}=un();return R.useEffect(()=>{s(ln(a,r))},[a,r,s]),null}function Bv(){return z.jsx(qf,{children:z.jsx(Zf,{children:z.jsxs(Df,{children:[z.jsx(Xf,{}),z.jsx(Hv,{}),z.jsxs("div",{className:Pr.layout,children:[z.jsx(NS,{}),z.jsxs("div",{className:Pr.mainShell,children:[z.jsx(Mv,{}),z.jsx("main",{className:Pr.content,children:z.jsx(R.Suspense,{fallback:z.jsx("div",{className:Pr.loading,children:"Loading..."}),children:z.jsx(Jm,{})})})]})]})]})})})}function rp(a){return a.route==="/"?{index:!0,lazy:a.lazy}:{path:a.route.slice(1),lazy:a.lazy}}const Ov=sf([{path:"/",element:z.jsx(Bv,{}),children:[...Up.map(rp),...Lp.map(rp),{path:"changelog/:id",lazy:()=>ho(()=>import("./ChangelogDetailPage-BWM0bhGw.js"),__vite__mapDeps([30,1,5,6,4,31]))},{path:"settings",lazy:()=>ho(()=>import("./SettingsPage-BL3qgVfn.js"),__vite__mapDeps([32,1,4,10,23,24,33]))}]}]);zh.createRoot(document.getElementById("root")).render(z.jsx(mf,{router:Ov}));export{zi as A,Mp as D,Yl as L,Ny as R,Of as S,ji as T,io as a,qv as b,wp as c,zr as d,Vv as e,Dp as f,Yv as g,Kv as h,un as i,z as j,HS as k,Gy as l,Ep as m,oo as n,ln as o,Zy as p,St as q,R as r,jr as s,Af as t,li as u,Wv as v,Jy as w,Pt as x,VS as y,qS as z};