@weppy/roblox-mcp 2.11.0 → 2.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dashboard/dist/assets/{AssetsPage-kz1FKCck.js → AssetsPage-umP7b78C.js} +1 -1
- package/dashboard/dist/assets/{ChangelogDetailPage-DtMfQXpn.js → ChangelogDetailPage-CVWXUACL.js} +1 -1
- package/dashboard/dist/assets/{ChangelogPage-DBeldxYm.js → ChangelogPage-6jN6-VKm.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-Cxha5h-n.js → ConfirmModal-DgnfBKM7.js} +1 -1
- package/dashboard/dist/assets/{ConnectionPage-8_vdhL7O.js → ConnectionPage-Gzmb4mZX.js} +1 -1
- package/dashboard/dist/assets/{ControlsPage-CZBhWyyn.js → ControlsPage-ZEYij-3D.js} +1 -1
- package/dashboard/dist/assets/{CurrentPlaceScope-BKwvaN7Z.js → CurrentPlaceScope-CxavaiqR.js} +1 -1
- package/dashboard/dist/assets/{GameChangeDetail-raYOxmZc.js → GameChangeDetail-nDxqXuHA.js} +1 -1
- package/dashboard/dist/assets/{InfoLabel-dwgFWAxs.js → InfoLabel-Brek5Hqz.js} +1 -1
- package/dashboard/dist/assets/{OverviewPage-DI5xU7tr.js → OverviewPage-D97-QaK1.js} +1 -1
- package/dashboard/dist/assets/{PageHeader-BfTFbEOK.js → PageHeader-BWhyQP2p.js} +1 -1
- package/dashboard/dist/assets/{PlaytestPage-BXzNfelw.js → PlaytestPage-T_t7jgJo.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-BzmeWDML.js → SettingsPage-BosBDJck.js} +1 -1
- package/dashboard/dist/assets/{StatusBadge-Cbf0AbKE.js → StatusBadge-CYa6Ev5k.js} +1 -1
- package/dashboard/dist/assets/{SyncPage-ChaWvprV.js → SyncPage-DEdR5Ijn.js} +1 -1
- package/dashboard/dist/assets/{Tabs-9EkdOGoe.js → Tabs-Ckk0_ZwB.js} +1 -1
- package/dashboard/dist/assets/{ToolsPage-AYrVzepe.js → ToolsPage-C5s8W0Y6.js} +1 -1
- package/dashboard/dist/assets/{TooltipText-DLPk69aK.js → TooltipText-Bz0hdlAq.js} +1 -1
- package/dashboard/dist/assets/{UiPrimitive-jQZP77uI.js → UiPrimitive-BMz8v1ZX.js} +1 -1
- package/dashboard/dist/assets/{UiStudioPage-De2Q3D5I.js → UiStudioPage-B4VBb4-9.js} +1 -1
- package/dashboard/dist/assets/{WhatsNewPage-CK-MRVXv.js → WhatsNewPage-DXgOgUUb.js} +1 -1
- package/dashboard/dist/assets/{copy-mg-q_vEk.js → copy-DDuTRomT.js} +1 -1
- package/dashboard/dist/assets/{index-C8kXDvHv.js → index-CsgZh_v7.js} +81 -149
- package/dashboard/dist/assets/{sample-requests-7VK_Hj8C.js → sample-requests-DyCLZQc_.js} +1 -1
- package/dashboard/dist/assets/{useLiveUptime-BzjLApne.js → useLiveUptime-C6YOmq5b.js} +1 -1
- package/dashboard/dist/assets/{useSettings-C1r4pJQ4.js → useSettings-BzcJh3Pv.js} +1 -1
- package/dashboard/dist/index.html +1 -1
- package/dist/index.js +94 -94
- package/package.json +1 -1
- package/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/OverviewPage-D97-QaK1.js","assets/InfoLabel-Brek5Hqz.js","assets/PageHeader-BWhyQP2p.js","assets/UiPrimitive-BMz8v1ZX.js","assets/UiPrimitive-BMSNRGwI.css","assets/PageHeader-CV_rjuG8.css","assets/StatusBadge-CYa6Ev5k.js","assets/StatusBadge-C2zYt5iE.css","assets/TooltipText-Bz0hdlAq.js","assets/GameChangeDetail-nDxqXuHA.js","assets/GameChangeDetail-C1XtdYwk.css","assets/useLiveUptime-C6YOmq5b.js","assets/OverviewPage-Dsfl-NRT.css","assets/ConnectionPage-Gzmb4mZX.js","assets/ConfirmModal-DgnfBKM7.js","assets/ConfirmModal.module-D1aZY2bQ.js","assets/ConfirmModal-izJskKtO.css","assets/copy-DDuTRomT.js","assets/ConnectionPage-Ca5WLCm3.css","assets/SyncPage-DEdR5Ijn.js","assets/CurrentPlaceScope-CxavaiqR.js","assets/CurrentPlaceScope-D-0g0WrM.css","assets/SyncPage-BnVXEQel.css","assets/AssetsPage-umP7b78C.js","assets/AssetsPage-Czc93xoU.css","assets/ChangelogPage-6jN6-VKm.js","assets/Tabs-Ckk0_ZwB.js","assets/Tabs-CIszXeoU.css","assets/ChangelogPage-DsP0fTsc.css","assets/PlaytestPage-T_t7jgJo.js","assets/PlaytestPage-CVEtQ4dU.css","assets/UiStudioPage-B4VBb4-9.js","assets/sample-requests-DyCLZQc_.js","assets/sample-requests-DmUwqmFE.css","assets/UiStudioPage-LH2dcLkr.css","assets/ToolsPage-C5s8W0Y6.js","assets/ToolsPage-CAaH9fIQ.css","assets/ControlsPage-ZEYij-3D.js","assets/useSettings-BzcJh3Pv.js","assets/useSettings-KAiL5E_X.css","assets/WhatsNewPage-DXgOgUUb.js","assets/WhatsNewPage-wF04BABp.css","assets/ChangelogDetailPage-CVWXUACL.js","assets/ChangelogDetailPage-vGgnpq1q.css","assets/SettingsPage-BosBDJck.js","assets/SettingsPage-ByHSUA7b.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
var jh=Object.defineProperty;var Uh=(i,n,r)=>n in i?jh(i,n,{enumerable:!0,configurable:!0,writable:!0,value:r}):i[n]=r;var Io=(i,n,r)=>Uh(i,typeof n!="symbol"?n+"":n,r);function mp(i,n){for(var r=0;r<n.length;r++){const d=n[r];if(typeof d!="string"&&!Array.isArray(d)){for(const u in d)if(u!=="default"&&!(u in i)){const p=Object.getOwnPropertyDescriptor(d,u);p&&Object.defineProperty(i,u,p.get?p:{enumerable:!0,get:()=>d[u]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}(function(){const n=document.createElement("link").relList;if(n&&n.supports&&n.supports("modulepreload"))return;for(const u of document.querySelectorAll('link[rel="modulepreload"]'))d(u);new MutationObserver(u=>{for(const p of u)if(p.type==="childList")for(const g of p.addedNodes)g.tagName==="LINK"&&g.rel==="modulepreload"&&d(g)}).observe(document,{childList:!0,subtree:!0});function r(u){const p={};return u.integrity&&(p.integrity=u.integrity),u.referrerPolicy&&(p.referrerPolicy=u.referrerPolicy),u.crossOrigin==="use-credentials"?p.credentials="include":u.crossOrigin==="anonymous"?p.credentials="omit":p.credentials="same-origin",p}function d(u){if(u.ep)return;u.ep=!0;const p=r(u);fetch(u.href,p)}})();function yp(i){return i&&i.__esModule&&Object.prototype.hasOwnProperty.call(i,"default")?i.default:i}var bl={exports:{}},es={},Pl={exports:{}},xe={};/**
|
|
3
3
|
* @license React
|
|
4
4
|
* react.production.min.js
|
|
@@ -7,7 +7,7 @@ var jh=Object.defineProperty;var Uh=(i,n,r)=>n in i?jh(i,n,{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 Cc;function Mh(){if(Cc)return xe;Cc=1;var i=Symbol.for("react.element"),n=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),P=Symbol.for("react.lazy"),w=Symbol.iterator;function D(C){return C===null||typeof C!="object"?null:(C=w&&C[w]||C["@@iterator"],typeof C=="function"?C:null)}var U={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B=Object.assign,z={};function N(C,M,ye){this.props=C,this.context=M,this.refs=z,this.updater=ye||U}N.prototype.isReactComponent={},N.prototype.setState=function(C,M){if(typeof C!="object"&&typeof C!="function"&&C!=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,C,M,"setState")},N.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function te(){}te.prototype=N.prototype;function K(C,M,ye){this.props=C,this.context=M,this.refs=z,this.updater=ye||U}var $=K.prototype=new te;$.constructor=K,B($,N.prototype),$.isPureReactComponent=!0;var
|
|
10
|
+
*/var Cc;function Mh(){if(Cc)return xe;Cc=1;var i=Symbol.for("react.element"),n=Symbol.for("react.portal"),r=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),u=Symbol.for("react.profiler"),p=Symbol.for("react.provider"),g=Symbol.for("react.context"),y=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),v=Symbol.for("react.memo"),P=Symbol.for("react.lazy"),w=Symbol.iterator;function D(C){return C===null||typeof C!="object"?null:(C=w&&C[w]||C["@@iterator"],typeof C=="function"?C:null)}var U={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},B=Object.assign,z={};function N(C,M,ye){this.props=C,this.context=M,this.refs=z,this.updater=ye||U}N.prototype.isReactComponent={},N.prototype.setState=function(C,M){if(typeof C!="object"&&typeof C!="function"&&C!=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,C,M,"setState")},N.prototype.forceUpdate=function(C){this.updater.enqueueForceUpdate(this,C,"forceUpdate")};function te(){}te.prototype=N.prototype;function K(C,M,ye){this.props=C,this.context=M,this.refs=z,this.updater=ye||U}var $=K.prototype=new te;$.constructor=K,B($,N.prototype),$.isPureReactComponent=!0;var V=Array.isArray,he=Object.prototype.hasOwnProperty,De={current:null},E={key:!0,ref:!0,__self:!0,__source:!0};function Q(C,M,ye){var F,ie={},ue=null,we=null;if(M!=null)for(F in M.ref!==void 0&&(we=M.ref),M.key!==void 0&&(ue=""+M.key),M)he.call(M,F)&&!E.hasOwnProperty(F)&&(ie[F]=M[F]);var ke=arguments.length-2;if(ke===1)ie.children=ye;else if(1<ke){for(var je=Array(ke),gt=0;gt<ke;gt++)je[gt]=arguments[gt+2];ie.children=je}if(C&&C.defaultProps)for(F in ke=C.defaultProps,ke)ie[F]===void 0&&(ie[F]=ke[F]);return{$$typeof:i,type:C,key:ue,ref:we,props:ie,_owner:De.current}}function Pe(C,M){return{$$typeof:i,type:C.type,key:M,ref:C.ref,props:C.props,_owner:C._owner}}function ce(C){return typeof C=="object"&&C!==null&&C.$$typeof===i}function He(C){var M={"=":"=0",":":"=2"};return"$"+C.replace(/[=:]/g,function(ye){return M[ye]})}var ve=/\/+/g;function Te(C,M){return typeof C=="object"&&C!==null&&C.key!=null?He(""+C.key):M.toString(36)}function Le(C,M,ye,F,ie){var ue=typeof C;(ue==="undefined"||ue==="boolean")&&(C=null);var we=!1;if(C===null)we=!0;else switch(ue){case"string":case"number":we=!0;break;case"object":switch(C.$$typeof){case i:case n:we=!0}}if(we)return we=C,ie=ie(we),C=F===""?"."+Te(we,0):F,V(ie)?(ye="",C!=null&&(ye=C.replace(ve,"$&/")+"/"),Le(ie,M,ye,"",function(gt){return gt})):ie!=null&&(ce(ie)&&(ie=Pe(ie,ye+(!ie.key||we&&we.key===ie.key?"":(""+ie.key).replace(ve,"$&/")+"/")+C)),M.push(ie)),1;if(we=0,F=F===""?".":F+":",V(C))for(var ke=0;ke<C.length;ke++){ue=C[ke];var je=F+Te(ue,ke);we+=Le(ue,M,ye,je,ie)}else if(je=D(C),typeof je=="function")for(C=je.call(C),ke=0;!(ue=C.next()).done;)ue=ue.value,je=F+Te(ue,ke++),we+=Le(ue,M,ye,je,ie);else if(ue==="object")throw M=String(C),Error("Objects are not valid as a React child (found: "+(M==="[object Object]"?"object with keys {"+Object.keys(C).join(", ")+"}":M)+"). If you meant to render a collection of children, use an array instead.");return we}function et(C,M,ye){if(C==null)return C;var F=[],ie=0;return Le(C,F,"","",function(ue){return M.call(ye,ue,ie++)}),F}function ot(C){if(C._status===-1){var M=C._result;M=M(),M.then(function(ye){(C._status===0||C._status===-1)&&(C._status=1,C._result=ye)},function(ye){(C._status===0||C._status===-1)&&(C._status=2,C._result=ye)}),C._status===-1&&(C._status=0,C._result=M)}if(C._status===1)return C._result.default;throw C._result}var _e={current:null},O={transition:null},de={ReactCurrentDispatcher:_e,ReactCurrentBatchConfig:O,ReactCurrentOwner:De};function G(){throw Error("act(...) is not supported in production builds of React.")}return xe.Children={map:et,forEach:function(C,M,ye){et(C,function(){M.apply(this,arguments)},ye)},count:function(C){var M=0;return et(C,function(){M++}),M},toArray:function(C){return et(C,function(M){return M})||[]},only:function(C){if(!ce(C))throw Error("React.Children.only expected to receive a single React element child.");return C}},xe.Component=N,xe.Fragment=r,xe.Profiler=u,xe.PureComponent=K,xe.StrictMode=d,xe.Suspense=h,xe.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=de,xe.act=G,xe.cloneElement=function(C,M,ye){if(C==null)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+C+".");var F=B({},C.props),ie=C.key,ue=C.ref,we=C._owner;if(M!=null){if(M.ref!==void 0&&(ue=M.ref,we=De.current),M.key!==void 0&&(ie=""+M.key),C.type&&C.type.defaultProps)var ke=C.type.defaultProps;for(je in M)he.call(M,je)&&!E.hasOwnProperty(je)&&(F[je]=M[je]===void 0&&ke!==void 0?ke[je]:M[je])}var je=arguments.length-2;if(je===1)F.children=ye;else if(1<je){ke=Array(je);for(var gt=0;gt<je;gt++)ke[gt]=arguments[gt+2];F.children=ke}return{$$typeof:i,type:C.type,key:ie,ref:ue,props:F,_owner:we}},xe.createContext=function(C){return C={$$typeof:g,_currentValue:C,_currentValue2:C,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},C.Provider={$$typeof:p,_context:C},C.Consumer=C},xe.createElement=Q,xe.createFactory=function(C){var M=Q.bind(null,C);return M.type=C,M},xe.createRef=function(){return{current:null}},xe.forwardRef=function(C){return{$$typeof:y,render:C}},xe.isValidElement=ce,xe.lazy=function(C){return{$$typeof:P,_payload:{_status:-1,_result:C},_init:ot}},xe.memo=function(C,M){return{$$typeof:v,type:C,compare:M===void 0?null:M}},xe.startTransition=function(C){var M=O.transition;O.transition={};try{C()}finally{O.transition=M}},xe.unstable_act=G,xe.useCallback=function(C,M){return _e.current.useCallback(C,M)},xe.useContext=function(C){return _e.current.useContext(C)},xe.useDebugValue=function(){},xe.useDeferredValue=function(C){return _e.current.useDeferredValue(C)},xe.useEffect=function(C,M){return _e.current.useEffect(C,M)},xe.useId=function(){return _e.current.useId()},xe.useImperativeHandle=function(C,M,ye){return _e.current.useImperativeHandle(C,M,ye)},xe.useInsertionEffect=function(C,M){return _e.current.useInsertionEffect(C,M)},xe.useLayoutEffect=function(C,M){return _e.current.useLayoutEffect(C,M)},xe.useMemo=function(C,M){return _e.current.useMemo(C,M)},xe.useReducer=function(C,M,ye){return _e.current.useReducer(C,M,ye)},xe.useRef=function(C){return _e.current.useRef(C)},xe.useState=function(C){return _e.current.useState(C)},xe.useSyncExternalStore=function(C,M,ye){return _e.current.useSyncExternalStore(C,M,ye)},xe.useTransition=function(){return _e.current.useTransition()},xe.version="18.3.1",xe}var kc;function Fl(){return kc||(kc=1,Pl.exports=Mh()),Pl.exports}/**
|
|
11
11
|
* @license React
|
|
12
12
|
* react-jsx-runtime.production.min.js
|
|
13
13
|
*
|
|
@@ -23,7 +23,7 @@ var jh=Object.defineProperty;var Uh=(i,n,r)=>n in i?jh(i,n,{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 Ac;function Lh(){return Ac||(Ac=1,(function(i){function n(O,de){var
|
|
26
|
+
*/var Ac;function Lh(){return Ac||(Ac=1,(function(i){function n(O,de){var G=O.length;O.push(de);e:for(;0<G;){var C=G-1>>>1,M=O[C];if(0<u(M,de))O[C]=de,O[G]=M,G=C;else break e}}function r(O){return O.length===0?null:O[0]}function d(O){if(O.length===0)return null;var de=O[0],G=O.pop();if(G!==de){O[0]=G;e:for(var C=0,M=O.length,ye=M>>>1;C<ye;){var F=2*(C+1)-1,ie=O[F],ue=F+1,we=O[ue];if(0>u(ie,G))ue<M&&0>u(we,ie)?(O[C]=we,O[ue]=G,C=ue):(O[C]=ie,O[F]=G,C=F);else if(ue<M&&0>u(we,G))O[C]=we,O[ue]=G,C=ue;else break e}}return de}function u(O,de){var G=O.sortIndex-de.sortIndex;return G!==0?G:O.id-de.id}if(typeof performance=="object"&&typeof performance.now=="function"){var p=performance;i.unstable_now=function(){return p.now()}}else{var g=Date,y=g.now();i.unstable_now=function(){return g.now()-y}}var h=[],v=[],P=1,w=null,D=3,U=!1,B=!1,z=!1,N=typeof setTimeout=="function"?setTimeout:null,te=typeof clearTimeout=="function"?clearTimeout:null,K=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function $(O){for(var de=r(v);de!==null;){if(de.callback===null)d(v);else if(de.startTime<=O)d(v),de.sortIndex=de.expirationTime,n(h,de);else break;de=r(v)}}function V(O){if(z=!1,$(O),!B)if(r(h)!==null)B=!0,ot(he);else{var de=r(v);de!==null&&_e(V,de.startTime-O)}}function he(O,de){B=!1,z&&(z=!1,te(Q),Q=-1),U=!0;var G=D;try{for($(de),w=r(h);w!==null&&(!(w.expirationTime>de)||O&&!He());){var C=w.callback;if(typeof C=="function"){w.callback=null,D=w.priorityLevel;var M=C(w.expirationTime<=de);de=i.unstable_now(),typeof M=="function"?w.callback=M:w===r(h)&&d(h),$(de)}else d(h);w=r(h)}if(w!==null)var ye=!0;else{var F=r(v);F!==null&&_e(V,F.startTime-de),ye=!1}return ye}finally{w=null,D=G,U=!1}}var De=!1,E=null,Q=-1,Pe=5,ce=-1;function He(){return!(i.unstable_now()-ce<Pe)}function ve(){if(E!==null){var O=i.unstable_now();ce=O;var de=!0;try{de=E(!0,O)}finally{de?Te():(De=!1,E=null)}}else De=!1}var Te;if(typeof K=="function")Te=function(){K(ve)};else if(typeof MessageChannel<"u"){var Le=new MessageChannel,et=Le.port2;Le.port1.onmessage=ve,Te=function(){et.postMessage(null)}}else Te=function(){N(ve,0)};function ot(O){E=O,De||(De=!0,Te())}function _e(O,de){Q=N(function(){O(i.unstable_now())},de)}i.unstable_IdlePriority=5,i.unstable_ImmediatePriority=1,i.unstable_LowPriority=4,i.unstable_NormalPriority=3,i.unstable_Profiling=null,i.unstable_UserBlockingPriority=2,i.unstable_cancelCallback=function(O){O.callback=null},i.unstable_continueExecution=function(){B||U||(B=!0,ot(he))},i.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"):Pe=0<O?Math.floor(1e3/O):5},i.unstable_getCurrentPriorityLevel=function(){return D},i.unstable_getFirstCallbackNode=function(){return r(h)},i.unstable_next=function(O){switch(D){case 1:case 2:case 3:var de=3;break;default:de=D}var G=D;D=de;try{return O()}finally{D=G}},i.unstable_pauseExecution=function(){},i.unstable_requestPaint=function(){},i.unstable_runWithPriority=function(O,de){switch(O){case 1:case 2:case 3:case 4:case 5:break;default:O=3}var G=D;D=O;try{return de()}finally{D=G}},i.unstable_scheduleCallback=function(O,de,G){var C=i.unstable_now();switch(typeof G=="object"&&G!==null?(G=G.delay,G=typeof G=="number"&&0<G?C+G:C):G=C,O){case 1:var M=-1;break;case 2:M=250;break;case 5:M=1073741823;break;case 4:M=1e4;break;default:M=5e3}return M=G+M,O={id:P++,callback:de,priorityLevel:O,startTime:G,expirationTime:M,sortIndex:-1},G>C?(O.sortIndex=G,n(v,O),r(h)===null&&O===r(v)&&(z?(te(Q),Q=-1):z=!0,_e(V,G-C))):(O.sortIndex=M,n(h,O),B||U||(B=!0,ot(he))),O},i.unstable_shouldYield=He,i.unstable_wrapCallback=function(O){var de=D;return function(){var G=D;D=de;try{return O.apply(this,arguments)}finally{D=G}}}})(kl)),kl}var Ic;function _h(){return Ic||(Ic=1,Cl.exports=Lh()),Cl.exports}/**
|
|
27
27
|
* @license React
|
|
28
28
|
* react-dom.production.min.js
|
|
29
29
|
*
|
|
@@ -31,14 +31,14 @@ var jh=Object.defineProperty;var Uh=(i,n,r)=>n in i?jh(i,n,{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 Dc;function Nh(){if(Dc)return It;Dc=1;var i=Fl(),n=_h();function r(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 d=new Set,u={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(u[e]=t,e=0;e<t.length;e++)d.add(t[e])}var y=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),h=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]*$/,P={},w={};function D(e){return h.call(w,e)?!0:h.call(P,e)?!1:v.test(e)?w[e]=!0:(P[e]=!0,!1)}function U(e,t,o,a){if(o!==null&&o.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return a?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function B(e,t,o,a){if(t===null||typeof t>"u"||U(e,t,o,a))return!0;if(a)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 z(e,t,o,a,s,l,c){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=s,this.mustUseProperty=o,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=c}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new z(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];N[t]=new z(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new z(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new z(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){N[e]=new z(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new z(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new z(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new z(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new z(e,5,!1,e.toLowerCase(),null,!1,!1)});var te=/[\-:]([a-z])/g;function K(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(te,K);N[t]=new z(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(te,K);N[t]=new z(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(te,K);N[t]=new z(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new z(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new z("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new z(e,1,!1,e.toLowerCase(),null,!0,!0)});function $(e,t,o,a){var s=N.hasOwnProperty(t)?N[t]:null;(s!==null?s.type!==0:a||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(B(t,o,s,a)&&(o=null),a||s===null?D(t)&&(o===null?e.removeAttribute(t):e.setAttribute(t,""+o)):s.mustUseProperty?e[s.propertyName]=o===null?s.type===3?!1:"":o:(t=s.attributeName,a=s.attributeNamespace,o===null?e.removeAttribute(t):(s=s.type,o=s===3||s===4&&o===!0?"":""+o,a?e.setAttributeNS(a,t,o):e.setAttribute(t,o))))}var
|
|
34
|
+
*/var Dc;function Nh(){if(Dc)return It;Dc=1;var i=Fl(),n=_h();function r(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 d=new Set,u={};function p(e,t){g(e,t),g(e+"Capture",t)}function g(e,t){for(u[e]=t,e=0;e<t.length;e++)d.add(t[e])}var y=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),h=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]*$/,P={},w={};function D(e){return h.call(w,e)?!0:h.call(P,e)?!1:v.test(e)?w[e]=!0:(P[e]=!0,!1)}function U(e,t,o,a){if(o!==null&&o.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return a?!1:o!==null?!o.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function B(e,t,o,a){if(t===null||typeof t>"u"||U(e,t,o,a))return!0;if(a)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 z(e,t,o,a,s,l,c){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=a,this.attributeNamespace=s,this.mustUseProperty=o,this.propertyName=e,this.type=t,this.sanitizeURL=l,this.removeEmptyString=c}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new z(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];N[t]=new z(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new z(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new z(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){N[e]=new z(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new z(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new z(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new z(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new z(e,5,!1,e.toLowerCase(),null,!1,!1)});var te=/[\-:]([a-z])/g;function K(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(te,K);N[t]=new z(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(te,K);N[t]=new z(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(te,K);N[t]=new z(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new z(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new z("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new z(e,1,!1,e.toLowerCase(),null,!0,!0)});function $(e,t,o,a){var s=N.hasOwnProperty(t)?N[t]:null;(s!==null?s.type!==0:a||!(2<t.length)||t[0]!=="o"&&t[0]!=="O"||t[1]!=="n"&&t[1]!=="N")&&(B(t,o,s,a)&&(o=null),a||s===null?D(t)&&(o===null?e.removeAttribute(t):e.setAttribute(t,""+o)):s.mustUseProperty?e[s.propertyName]=o===null?s.type===3?!1:"":o:(t=s.attributeName,a=s.attributeNamespace,o===null?e.removeAttribute(t):(s=s.type,o=s===3||s===4&&o===!0?"":""+o,a?e.setAttributeNS(a,t,o):e.setAttribute(t,o))))}var V=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,he=Symbol.for("react.element"),De=Symbol.for("react.portal"),E=Symbol.for("react.fragment"),Q=Symbol.for("react.strict_mode"),Pe=Symbol.for("react.profiler"),ce=Symbol.for("react.provider"),He=Symbol.for("react.context"),ve=Symbol.for("react.forward_ref"),Te=Symbol.for("react.suspense"),Le=Symbol.for("react.suspense_list"),et=Symbol.for("react.memo"),ot=Symbol.for("react.lazy"),_e=Symbol.for("react.offscreen"),O=Symbol.iterator;function de(e){return e===null||typeof e!="object"?null:(e=O&&e[O]||e["@@iterator"],typeof e=="function"?e:null)}var G=Object.assign,C;function M(e){if(C===void 0)try{throw Error()}catch(o){var t=o.stack.trim().match(/\n( *(at )?)/);C=t&&t[1]||""}return`
|
|
35
35
|
`+C+e}var ye=!1;function F(e,t){if(!e||ye)return"";ye=!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(T){var a=T}Reflect.construct(e,[],t)}else{try{t.call()}catch(T){a=T}e.call(t.prototype)}else{try{throw Error()}catch(T){a=T}e()}}catch(T){if(T&&a&&typeof T.stack=="string"){for(var s=T.stack.split(`
|
|
36
36
|
`),l=a.stack.split(`
|
|
37
37
|
`),c=s.length-1,m=l.length-1;1<=c&&0<=m&&s[c]!==l[m];)m--;for(;1<=c&&0<=m;c--,m--)if(s[c]!==l[m]){if(c!==1||m!==1)do if(c--,m--,0>m||s[c]!==l[m]){var S=`
|
|
38
|
-
`+s[c].replace(" at new "," at ");return e.displayName&&S.includes("<anonymous>")&&(S=S.replace("<anonymous>",e.displayName)),S}while(1<=c&&0<=m);break}}}finally{ye=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?M(e):""}function ie(e){switch(e.tag){case 5:return M(e.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return e=F(e.type,!1),e;case 11:return e=F(e.type.render,!1),e;case 1:return e=F(e.type,!0),e;default:return""}}function ue(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 E:return"Fragment";case De:return"Portal";case Pe:return"Profiler";case Q:return"StrictMode";case Te:return"Suspense";case Le:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case He:return(e.displayName||"Context")+".Consumer";case ce:return(e._context.displayName||"Context")+".Provider";case ve:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case et:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case ot:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function we(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 ue(t);case 8:return t===Q?"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 ke(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function je(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gt(e){var t=je(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var s=o.get,l=o.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(c){a=""+c,l.call(this,c)}}),Object.defineProperty(e,t,{enumerable:o.enumerable}),{getValue:function(){return a},setValue:function(c){a=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function yo(e){e._valueTracker||(e._valueTracker=gt(e))}function dt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var o=t.getValue(),a="";return e&&(a=je(e)?e.checked?"true":"false":e.value),e=a,e!==o?(t.setValue(e),!0):!1}function Gt(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 Ua(e,t){var o=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function cs(e,t){var o=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;o=ke(t.value!=null?t.value:o),e._wrapperState={initialChecked:a,initialValue:o,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function io(e,t){t=t.checked,t!=null&&$(e,"checked",t,!1)}function gi(e,t){io(e,t);var o=ke(t.value),a=t.type;if(o!=null)a==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ma(e,t.type,o):t.hasOwnProperty("defaultValue")&&Ma(e,t.type,ke(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ps(e,t,o){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="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 Ma(e,t,o){(t!=="number"||Gt(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var la=Array.isArray;function Mo(e,t,o,a){if(e=e.options,t){t={};for(var s=0;s<o.length;s++)t["$"+o[s]]=!0;for(o=0;o<e.length;o++)s=t.hasOwnProperty("$"+e[o].value),e[o].selected!==s&&(e[o].selected=s),s&&a&&(e[o].defaultSelected=!0)}else{for(o=""+ke(o),t=null,s=0;s<e.length;s++){if(e[s].value===o){e[s].selected=!0,a&&(e[s].defaultSelected=!0);return}t!==null||e[s].disabled||(t=e[s])}t!==null&&(t.selected=!0)}}function hi(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(r(91));return V({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function gs(e,t){var o=t.value;if(o==null){if(o=t.children,t=t.defaultValue,o!=null){if(t!=null)throw Error(r(92));if(la(o)){if(1<o.length)throw Error(r(93));o=o[0]}t=o}t==null&&(t=""),o=t}e._wrapperState={initialValue:ke(o)}}function so(e,t){var o=ke(t.value),a=ke(t.defaultValue);o!=null&&(o=""+o,o!==e.value&&(e.value=o),t.defaultValue==null&&e.defaultValue!==o&&(e.defaultValue=o)),a!=null&&(e.defaultValue=""+a)}function zo(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function mi(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 da(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?mi(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Tt,Lt=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,o,a,s){MSApp.execUnsafeLocalFunction(function(){return e(t,o,a,s)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Tt=Tt||document.createElement("div"),Tt.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Tt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ho(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},Nn=["Webkit","ms","Moz","O"];Object.keys(no).forEach(function(e){Nn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),no[t]=no[e]})});function Vt(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 yi(e,t){e=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=o.indexOf("--")===0,s=Vt(o,t[o],a);o==="float"&&(o="cssFloat"),a?e.setProperty(o,s):e[o]=s}}var hs=V({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 za(e,t){if(t){if(hs[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!="object")throw Error(r(62))}}function fi(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 Ha=null;function Lo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var La=null,ro=null,lo=null;function ms(e){if(e=Ni(e)){if(typeof La!="function")throw Error(r(280));var t=e.stateNode;t&&(t=Ls(t),La(e.stateNode,e.type,t))}}function Si(e){ro?lo?lo.push(e):lo=[e]:ro=e}function ys(){if(ro){var e=ro,t=lo;if(lo=ro=null,ms(e),t)for(e=0;e<t.length;e++)ms(t[e])}}function vi(e,t){return e(t)}function ua(){}var _o=!1;function fs(e,t,o){if(_o)return e(t,o);_o=!0;try{return vi(e,t,o)}finally{_o=!1,(ro!==null||lo!==null)&&(ua(),ys())}}function ca(e,t){var o=e.stateNode;if(o===null)return null;var a=Ls(o);if(a===null)return null;o=a[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":(a=!a.disabled)||(e=e.type,a=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!a;break e;default:e=!1}if(e)return null;if(o&&typeof o!="function")throw Error(r(231,t,typeof o));return o}var f=!1;if(y)try{var k={};Object.defineProperty(k,"passive",{get:function(){f=!0}}),window.addEventListener("test",k,k),window.removeEventListener("test",k,k)}catch{f=!1}function j(e,t,o,a,s,l,c,m,S){var T=Array.prototype.slice.call(arguments,3);try{t.apply(o,T)}catch(_){this.onError(_)}}var H=!1,Y=null,le=!1,me=null,oe={onError:function(e){H=!0,Y=e}};function se(e,t,o,a,s,l,c,m,S){H=!1,Y=null,j.apply(oe,arguments)}function Z(e,t,o,a,s,l,c,m,S){if(se.apply(this,arguments),H){if(H){var T=Y;H=!1,Y=null}else throw Error(r(198));le||(le=!0,me=T)}}function ee(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 Re(e){if(ee(e)!==e)throw Error(r(188))}function nt(e){var t=e.alternate;if(!t){if(t=ee(e),t===null)throw Error(r(188));return t!==e?null:e}for(var o=e,a=t;;){var s=o.return;if(s===null)break;var l=s.alternate;if(l===null){if(a=s.return,a!==null){o=a;continue}break}if(s.child===l.child){for(l=s.child;l;){if(l===o)return Re(s),e;if(l===a)return Re(s),t;l=l.sibling}throw Error(r(188))}if(o.return!==a.return)o=s,a=l;else{for(var c=!1,m=s.child;m;){if(m===o){c=!0,o=s,a=l;break}if(m===a){c=!0,a=s,o=l;break}m=m.sibling}if(!c){for(m=l.child;m;){if(m===o){c=!0,o=l,a=s;break}if(m===a){c=!0,a=l,o=s;break}m=m.sibling}if(!c)throw Error(r(189))}}if(o.alternate!==a)throw Error(r(190))}if(o.tag!==3)throw Error(r(188));return o.stateNode.current===o?e:t}function Ne(e){return e=nt(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 Ye=n.unstable_scheduleCallback,fo=n.unstable_cancelCallback,pa=n.unstable_shouldYield,Xt=n.unstable_requestPaint,Ue=n.unstable_now,bi=n.unstable_getCurrentPriorityLevel,So=n.unstable_ImmediatePriority,uo=n.unstable_UserBlockingPriority,vo=n.unstable_NormalPriority,_a=n.unstable_LowPriority,Ae=n.unstable_IdlePriority,Be=null,ht=null;function ga(e){if(ht&&typeof ht.onCommitFiberRoot=="function")try{ht.onCommitFiberRoot(Be,e,void 0,(e.current.flags&128)===128)}catch{}}var Me=Math.clz32?Math.clz32:On,No=Math.log,Ss=Math.LN2;function On(e){return e>>>=0,e===0?32:31-(No(e)/Ss|0)|0}var vs=64,bs=4194304;function Pi(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 Ps(e,t){var o=e.pendingLanes;if(o===0)return 0;var a=0,s=e.suspendedLanes,l=e.pingedLanes,c=o&268435455;if(c!==0){var m=c&~s;m!==0?a=Pi(m):(l&=c,l!==0&&(a=Pi(l)))}else c=o&~s,c!==0?a=Pi(c):l!==0&&(a=Pi(l));if(a===0)return 0;if(t!==0&&t!==a&&(t&s)===0&&(s=a&-a,l=t&-t,s>=l||s===16&&(l&4194240)!==0))return t;if((a&4)!==0&&(a|=o&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0<t;)o=31-Me(t),s=1<<o,a|=e[o],t&=~s;return a}function Qp(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 Zp(e,t){for(var o=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,l=e.pendingLanes;0<l;){var c=31-Me(l),m=1<<c,S=s[c];S===-1?((m&o)===0||(m&a)!==0)&&(s[c]=Qp(m,t)):S<=t&&(e.expiredLanes|=m),l&=~m}}function qn(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ed(){var e=vs;return vs<<=1,(vs&4194240)===0&&(vs=64),e}function Bn(e){for(var t=[],o=0;31>o;o++)t.push(e);return t}function wi(e,t,o){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Me(t),e[t]=o}function Jp(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 a=e.eventTimes;for(e=e.expirationTimes;0<o;){var s=31-Me(o),l=1<<s;t[s]=0,a[s]=-1,e[s]=-1,o&=~l}}function Wn(e,t){var o=e.entangledLanes|=t;for(e=e.entanglements;o;){var a=31-Me(o),s=1<<a;s&t|e[a]&t&&(e[a]|=t),o&=~s}}var Oe=0;function td(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var od,Fn,ad,id,sd,Kn=!1,ws=[],Oo=null,qo=null,Bo=null,Ci=new Map,ki=new Map,Wo=[],eg="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 nd(e,t){switch(e){case"focusin":case"focusout":Oo=null;break;case"dragenter":case"dragleave":qo=null;break;case"mouseover":case"mouseout":Bo=null;break;case"pointerover":case"pointerout":Ci.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ki.delete(t.pointerId)}}function xi(e,t,o,a,s,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:o,eventSystemFlags:a,nativeEvent:l,targetContainers:[s]},t!==null&&(t=Ni(t),t!==null&&Fn(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,s!==null&&t.indexOf(s)===-1&&t.push(s),e)}function tg(e,t,o,a,s){switch(t){case"focusin":return Oo=xi(Oo,e,t,o,a,s),!0;case"dragenter":return qo=xi(qo,e,t,o,a,s),!0;case"mouseover":return Bo=xi(Bo,e,t,o,a,s),!0;case"pointerover":var l=s.pointerId;return Ci.set(l,xi(Ci.get(l)||null,e,t,o,a,s)),!0;case"gotpointercapture":return l=s.pointerId,ki.set(l,xi(ki.get(l)||null,e,t,o,a,s)),!0}return!1}function rd(e){var t=ha(e.target);if(t!==null){var o=ee(t);if(o!==null){if(t=o.tag,t===13){if(t=Se(o),t!==null){e.blockedOn=t,sd(e.priority,function(){ad(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 Cs(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var o=Gn(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(o===null){o=e.nativeEvent;var a=new o.constructor(o.type,o);Ha=a,o.target.dispatchEvent(a),Ha=null}else return t=Ni(o),t!==null&&Fn(t),e.blockedOn=o,!1;t.shift()}return!0}function ld(e,t,o){Cs(e)&&o.delete(t)}function og(){Kn=!1,Oo!==null&&Cs(Oo)&&(Oo=null),qo!==null&&Cs(qo)&&(qo=null),Bo!==null&&Cs(Bo)&&(Bo=null),Ci.forEach(ld),ki.forEach(ld)}function Ri(e,t){e.blockedOn===t&&(e.blockedOn=null,Kn||(Kn=!0,n.unstable_scheduleCallback(n.unstable_NormalPriority,og)))}function Ai(e){function t(s){return Ri(s,e)}if(0<ws.length){Ri(ws[0],e);for(var o=1;o<ws.length;o++){var a=ws[o];a.blockedOn===e&&(a.blockedOn=null)}}for(Oo!==null&&Ri(Oo,e),qo!==null&&Ri(qo,e),Bo!==null&&Ri(Bo,e),Ci.forEach(t),ki.forEach(t),o=0;o<Wo.length;o++)a=Wo[o],a.blockedOn===e&&(a.blockedOn=null);for(;0<Wo.length&&(o=Wo[0],o.blockedOn===null);)rd(o),o.blockedOn===null&&Wo.shift()}var Na=G.ReactCurrentBatchConfig,ks=!0;function ag(e,t,o,a){var s=Oe,l=Na.transition;Na.transition=null;try{Oe=1,Yn(e,t,o,a)}finally{Oe=s,Na.transition=l}}function ig(e,t,o,a){var s=Oe,l=Na.transition;Na.transition=null;try{Oe=4,Yn(e,t,o,a)}finally{Oe=s,Na.transition=l}}function Yn(e,t,o,a){if(ks){var s=Gn(e,t,o,a);if(s===null)ur(e,t,a,xs,o),nd(e,a);else if(tg(s,e,t,o,a))a.stopPropagation();else if(nd(e,a),t&4&&-1<eg.indexOf(e)){for(;s!==null;){var l=Ni(s);if(l!==null&&od(l),l=Gn(e,t,o,a),l===null&&ur(e,t,a,xs,o),l===s)break;s=l}s!==null&&a.stopPropagation()}else ur(e,t,a,null,o)}}var xs=null;function Gn(e,t,o,a){if(xs=null,e=Lo(a),e=ha(e),e!==null)if(t=ee(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 xs=e,null}function dd(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(bi()){case So:return 1;case uo:return 4;case vo:case _a:return 16;case Ae:return 536870912;default:return 16}default:return 16}}var Fo=null,Vn=null,Rs=null;function ud(){if(Rs)return Rs;var e,t=Vn,o=t.length,a,s="value"in Fo?Fo.value:Fo.textContent,l=s.length;for(e=0;e<o&&t[e]===s[e];e++);var c=o-e;for(a=1;a<=c&&t[o-a]===s[l-a];a++);return Rs=s.slice(e,1<a?1-a:void 0)}function As(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 Is(){return!0}function cd(){return!1}function jt(e){function t(o,a,s,l,c){this._reactName=o,this._targetInst=s,this.type=a,this.nativeEvent=l,this.target=c,this.currentTarget=null;for(var m in e)e.hasOwnProperty(m)&&(o=e[m],this[m]=o?o(l):l[m]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Is:cd,this.isPropagationStopped=cd,this}return V(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=Is)},stopPropagation:function(){var o=this.nativeEvent;o&&(o.stopPropagation?o.stopPropagation():typeof o.cancelBubble!="unknown"&&(o.cancelBubble=!0),this.isPropagationStopped=Is)},persist:function(){},isPersistent:Is}),t}var Oa={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Xn=jt(Oa),Ii=V({},Oa,{view:0,detail:0}),sg=jt(Ii),$n,Qn,Di,Ds=V({},Ii,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Jn,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!==Di&&(Di&&e.type==="mousemove"?($n=e.screenX-Di.screenX,Qn=e.screenY-Di.screenY):Qn=$n=0,Di=e),$n)},movementY:function(e){return"movementY"in e?e.movementY:Qn}}),pd=jt(Ds),ng=V({},Ds,{dataTransfer:0}),rg=jt(ng),lg=V({},Ii,{relatedTarget:0}),Zn=jt(lg),dg=V({},Oa,{animationName:0,elapsedTime:0,pseudoElement:0}),ug=jt(dg),cg=V({},Oa,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),pg=jt(cg),gg=V({},Oa,{data:0}),gd=jt(gg),hg={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},mg={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"},yg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function fg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=yg[e])?!!t[e]:!1}function Jn(){return fg}var Sg=V({},Ii,{key:function(e){if(e.key){var t=hg[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=As(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?mg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Jn,charCode:function(e){return e.type==="keypress"?As(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?As(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),vg=jt(Sg),bg=V({},Ds,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),hd=jt(bg),Pg=V({},Ii,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Jn}),wg=jt(Pg),Cg=V({},Oa,{propertyName:0,elapsedTime:0,pseudoElement:0}),kg=jt(Cg),xg=V({},Ds,{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}),Rg=jt(xg),Ag=[9,13,27,32],er=y&&"CompositionEvent"in window,Ei=null;y&&"documentMode"in document&&(Ei=document.documentMode);var Ig=y&&"TextEvent"in window&&!Ei,md=y&&(!er||Ei&&8<Ei&&11>=Ei),yd=" ",fd=!1;function Sd(e,t){switch(e){case"keyup":return Ag.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function vd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qa=!1;function Dg(e,t){switch(e){case"compositionend":return vd(t);case"keypress":return t.which!==32?null:(fd=!0,yd);case"textInput":return e=t.data,e===yd&&fd?null:e;default:return null}}function Eg(e,t){if(qa)return e==="compositionend"||!er&&Sd(e,t)?(e=ud(),Rs=Vn=Fo=null,qa=!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 md&&t.locale!=="ko"?null:t.data;default:return null}}var Tg={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 bd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!Tg[e.type]:t==="textarea"}function Pd(e,t,o,a){Si(a),t=Ms(t,"onChange"),0<t.length&&(o=new Xn("onChange","change",null,o,a),e.push({event:o,listeners:t}))}var Ti=null,ji=null;function jg(e){Nd(e,0)}function Es(e){var t=Ya(e);if(dt(t))return e}function Ug(e,t){if(e==="change")return t}var wd=!1;if(y){var tr;if(y){var or="oninput"in document;if(!or){var Cd=document.createElement("div");Cd.setAttribute("oninput","return;"),or=typeof Cd.oninput=="function"}tr=or}else tr=!1;wd=tr&&(!document.documentMode||9<document.documentMode)}function kd(){Ti&&(Ti.detachEvent("onpropertychange",xd),ji=Ti=null)}function xd(e){if(e.propertyName==="value"&&Es(ji)){var t=[];Pd(t,ji,e,Lo(e)),fs(jg,t)}}function Mg(e,t,o){e==="focusin"?(kd(),Ti=t,ji=o,Ti.attachEvent("onpropertychange",xd)):e==="focusout"&&kd()}function zg(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Es(ji)}function Hg(e,t){if(e==="click")return Es(t)}function Lg(e,t){if(e==="input"||e==="change")return Es(t)}function _g(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var $t=typeof Object.is=="function"?Object.is:_g;function Ui(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),a=Object.keys(t);if(o.length!==a.length)return!1;for(a=0;a<o.length;a++){var s=o[a];if(!h.call(t,s)||!$t(e[s],t[s]))return!1}return!0}function Rd(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ad(e,t){var o=Rd(e);e=0;for(var a;o;){if(o.nodeType===3){if(a=e+o.textContent.length,e<=t&&a>=t)return{node:o,offset:t-e};e=a}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=Rd(o)}}function Id(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Id(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dd(){for(var e=window,t=Gt();t instanceof e.HTMLIFrameElement;){try{var o=typeof t.contentWindow.location.href=="string"}catch{o=!1}if(o)e=t.contentWindow;else break;t=Gt(e.document)}return t}function ar(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 Ng(e){var t=Dd(),o=e.focusedElem,a=e.selectionRange;if(t!==o&&o&&o.ownerDocument&&Id(o.ownerDocument.documentElement,o)){if(a!==null&&ar(o)){if(t=a.start,e=a.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 s=o.textContent.length,l=Math.min(a.start,s);a=a.end===void 0?l:Math.min(a.end,s),!e.extend&&l>a&&(s=a,a=l,l=s),s=Ad(o,l);var c=Ad(o,a);s&&c&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==c.node||e.focusOffset!==c.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),l>a?(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 Og=y&&"documentMode"in document&&11>=document.documentMode,Ba=null,ir=null,Mi=null,sr=!1;function Ed(e,t,o){var a=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;sr||Ba==null||Ba!==Gt(a)||(a=Ba,"selectionStart"in a&&ar(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Mi&&Ui(Mi,a)||(Mi=a,a=Ms(ir,"onSelect"),0<a.length&&(t=new Xn("onSelect","select",null,t,o),e.push({event:t,listeners:a}),t.target=Ba)))}function Ts(e,t){var o={};return o[e.toLowerCase()]=t.toLowerCase(),o["Webkit"+e]="webkit"+t,o["Moz"+e]="moz"+t,o}var Wa={animationend:Ts("Animation","AnimationEnd"),animationiteration:Ts("Animation","AnimationIteration"),animationstart:Ts("Animation","AnimationStart"),transitionend:Ts("Transition","TransitionEnd")},nr={},Td={};y&&(Td=document.createElement("div").style,"AnimationEvent"in window||(delete Wa.animationend.animation,delete Wa.animationiteration.animation,delete Wa.animationstart.animation),"TransitionEvent"in window||delete Wa.transitionend.transition);function js(e){if(nr[e])return nr[e];if(!Wa[e])return e;var t=Wa[e],o;for(o in t)if(t.hasOwnProperty(o)&&o in Td)return nr[e]=t[o];return e}var jd=js("animationend"),Ud=js("animationiteration"),Md=js("animationstart"),zd=js("transitionend"),Hd=new Map,Ld="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 Ko(e,t){Hd.set(e,t),p(t,[e])}for(var rr=0;rr<Ld.length;rr++){var lr=Ld[rr],qg=lr.toLowerCase(),Bg=lr[0].toUpperCase()+lr.slice(1);Ko(qg,"on"+Bg)}Ko(jd,"onAnimationEnd"),Ko(Ud,"onAnimationIteration"),Ko(Md,"onAnimationStart"),Ko("dblclick","onDoubleClick"),Ko("focusin","onFocus"),Ko("focusout","onBlur"),Ko(zd,"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 zi="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(" "),Wg=new Set("cancel close invalid load scroll toggle".split(" ").concat(zi));function _d(e,t,o){var a=e.type||"unknown-event";e.currentTarget=o,Z(a,t,void 0,e),e.currentTarget=null}function Nd(e,t){t=(t&4)!==0;for(var o=0;o<e.length;o++){var a=e[o],s=a.event;a=a.listeners;e:{var l=void 0;if(t)for(var c=a.length-1;0<=c;c--){var m=a[c],S=m.instance,T=m.currentTarget;if(m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,T),l=S}else for(c=0;c<a.length;c++){if(m=a[c],S=m.instance,T=m.currentTarget,m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,T),l=S}}}if(le)throw e=me,le=!1,me=null,e}function Ge(e,t){var o=t[yr];o===void 0&&(o=t[yr]=new Set);var a=e+"__bubble";o.has(a)||(Od(t,e,2,!1),o.add(a))}function dr(e,t,o){var a=0;t&&(a|=4),Od(o,e,a,t)}var Us="_reactListening"+Math.random().toString(36).slice(2);function Hi(e){if(!e[Us]){e[Us]=!0,d.forEach(function(o){o!=="selectionchange"&&(Wg.has(o)||dr(o,!1,e),dr(o,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Us]||(t[Us]=!0,dr("selectionchange",!1,t))}}function Od(e,t,o,a){switch(dd(t)){case 1:var s=ag;break;case 4:s=ig;break;default:s=Yn}o=s.bind(null,t,o,e),s=void 0,!f||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(s=!0),a?s!==void 0?e.addEventListener(t,o,{capture:!0,passive:s}):e.addEventListener(t,o,!0):s!==void 0?e.addEventListener(t,o,{passive:s}):e.addEventListener(t,o,!1)}function ur(e,t,o,a,s){var l=a;if((t&1)===0&&(t&2)===0&&a!==null)e:for(;;){if(a===null)return;var c=a.tag;if(c===3||c===4){var m=a.stateNode.containerInfo;if(m===s||m.nodeType===8&&m.parentNode===s)break;if(c===4)for(c=a.return;c!==null;){var S=c.tag;if((S===3||S===4)&&(S=c.stateNode.containerInfo,S===s||S.nodeType===8&&S.parentNode===s))return;c=c.return}for(;m!==null;){if(c=ha(m),c===null)return;if(S=c.tag,S===5||S===6){a=l=c;continue e}m=m.parentNode}}a=a.return}fs(function(){var T=l,_=Lo(o),q=[];e:{var L=Hd.get(e);if(L!==void 0){var X=Xn,ae=e;switch(e){case"keypress":if(As(o)===0)break e;case"keydown":case"keyup":X=vg;break;case"focusin":ae="focus",X=Zn;break;case"focusout":ae="blur",X=Zn;break;case"beforeblur":case"afterblur":X=Zn;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":X=pd;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":X=rg;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":X=wg;break;case jd:case Ud:case Md:X=ug;break;case zd:X=kg;break;case"scroll":X=sg;break;case"wheel":X=Rg;break;case"copy":case"cut":case"paste":X=pg;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":X=hd}var ne=(t&4)!==0,at=!ne&&e==="scroll",A=ne?L!==null?L+"Capture":null:L;ne=[];for(var b=T,I;b!==null;){I=b;var W=I.stateNode;if(I.tag===5&&W!==null&&(I=W,A!==null&&(W=ca(b,A),W!=null&&ne.push(Li(b,W,I)))),at)break;b=b.return}0<ne.length&&(L=new X(L,ae,null,o,_),q.push({event:L,listeners:ne}))}}if((t&7)===0){e:{if(L=e==="mouseover"||e==="pointerover",X=e==="mouseout"||e==="pointerout",L&&o!==Ha&&(ae=o.relatedTarget||o.fromElement)&&(ha(ae)||ae[bo]))break e;if((X||L)&&(L=_.window===_?_:(L=_.ownerDocument)?L.defaultView||L.parentWindow:window,X?(ae=o.relatedTarget||o.toElement,X=T,ae=ae?ha(ae):null,ae!==null&&(at=ee(ae),ae!==at||ae.tag!==5&&ae.tag!==6)&&(ae=null)):(X=null,ae=T),X!==ae)){if(ne=pd,W="onMouseLeave",A="onMouseEnter",b="mouse",(e==="pointerout"||e==="pointerover")&&(ne=hd,W="onPointerLeave",A="onPointerEnter",b="pointer"),at=X==null?L:Ya(X),I=ae==null?L:Ya(ae),L=new ne(W,b+"leave",X,o,_),L.target=at,L.relatedTarget=I,W=null,ha(_)===T&&(ne=new ne(A,b+"enter",ae,o,_),ne.target=I,ne.relatedTarget=at,W=ne),at=W,X&&ae)t:{for(ne=X,A=ae,b=0,I=ne;I;I=Fa(I))b++;for(I=0,W=A;W;W=Fa(W))I++;for(;0<b-I;)ne=Fa(ne),b--;for(;0<I-b;)A=Fa(A),I--;for(;b--;){if(ne===A||A!==null&&ne===A.alternate)break t;ne=Fa(ne),A=Fa(A)}ne=null}else ne=null;X!==null&&qd(q,L,X,ne,!1),ae!==null&&at!==null&&qd(q,at,ae,ne,!0)}}e:{if(L=T?Ya(T):window,X=L.nodeName&&L.nodeName.toLowerCase(),X==="select"||X==="input"&&L.type==="file")var re=Ug;else if(bd(L))if(wd)re=Lg;else{re=zg;var pe=Mg}else(X=L.nodeName)&&X.toLowerCase()==="input"&&(L.type==="checkbox"||L.type==="radio")&&(re=Hg);if(re&&(re=re(e,T))){Pd(q,re,o,_);break e}pe&&pe(e,L,T),e==="focusout"&&(pe=L._wrapperState)&&pe.controlled&&L.type==="number"&&Ma(L,"number",L.value)}switch(pe=T?Ya(T):window,e){case"focusin":(bd(pe)||pe.contentEditable==="true")&&(Ba=pe,ir=T,Mi=null);break;case"focusout":Mi=ir=Ba=null;break;case"mousedown":sr=!0;break;case"contextmenu":case"mouseup":case"dragend":sr=!1,Ed(q,o,_);break;case"selectionchange":if(Og)break;case"keydown":case"keyup":Ed(q,o,_)}var ge;if(er)e:{switch(e){case"compositionstart":var fe="onCompositionStart";break e;case"compositionend":fe="onCompositionEnd";break e;case"compositionupdate":fe="onCompositionUpdate";break e}fe=void 0}else qa?Sd(e,o)&&(fe="onCompositionEnd"):e==="keydown"&&o.keyCode===229&&(fe="onCompositionStart");fe&&(md&&o.locale!=="ko"&&(qa||fe!=="onCompositionStart"?fe==="onCompositionEnd"&&qa&&(ge=ud()):(Fo=_,Vn="value"in Fo?Fo.value:Fo.textContent,qa=!0)),pe=Ms(T,fe),0<pe.length&&(fe=new gd(fe,e,null,o,_),q.push({event:fe,listeners:pe}),ge?fe.data=ge:(ge=vd(o),ge!==null&&(fe.data=ge)))),(ge=Ig?Dg(e,o):Eg(e,o))&&(T=Ms(T,"onBeforeInput"),0<T.length&&(_=new gd("onBeforeInput","beforeinput",null,o,_),q.push({event:_,listeners:T}),_.data=ge))}Nd(q,t)})}function Li(e,t,o){return{instance:e,listener:t,currentTarget:o}}function Ms(e,t){for(var o=t+"Capture",a=[];e!==null;){var s=e,l=s.stateNode;s.tag===5&&l!==null&&(s=l,l=ca(e,o),l!=null&&a.unshift(Li(e,l,s)),l=ca(e,t),l!=null&&a.push(Li(e,l,s))),e=e.return}return a}function Fa(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function qd(e,t,o,a,s){for(var l=t._reactName,c=[];o!==null&&o!==a;){var m=o,S=m.alternate,T=m.stateNode;if(S!==null&&S===a)break;m.tag===5&&T!==null&&(m=T,s?(S=ca(o,l),S!=null&&c.unshift(Li(o,S,m))):s||(S=ca(o,l),S!=null&&c.push(Li(o,S,m)))),o=o.return}c.length!==0&&e.push({event:t,listeners:c})}var Fg=/\r\n?/g,Kg=/\u0000|\uFFFD/g;function Bd(e){return(typeof e=="string"?e:""+e).replace(Fg,`
|
|
39
|
-
`).replace(Kg,"")}function zs(e,t,o){if(t=Bd(t),Bd(e)!==t&&o)throw Error(r(425))}function Hs(){}var cr=null,pr=null;function gr(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 hr=typeof setTimeout=="function"?setTimeout:void 0,Yg=typeof clearTimeout=="function"?clearTimeout:void 0,Wd=typeof Promise=="function"?Promise:void 0,Gg=typeof queueMicrotask=="function"?queueMicrotask:typeof Wd<"u"?function(e){return Wd.resolve(null).then(e).catch(Vg)}:hr;function Vg(e){setTimeout(function(){throw e})}function mr(e,t){var o=t,a=0;do{var s=o.nextSibling;if(e.removeChild(o),s&&s.nodeType===8)if(o=s.data,o==="/$"){if(a===0){e.removeChild(s),Ai(t);return}a--}else o!=="$"&&o!=="$?"&&o!=="$!"||a++;o=s}while(o);Ai(t)}function Yo(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 Fd(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 Ka=Math.random().toString(36).slice(2),co="__reactFiber$"+Ka,_i="__reactProps$"+Ka,bo="__reactContainer$"+Ka,yr="__reactEvents$"+Ka,Xg="__reactListeners$"+Ka,$g="__reactHandles$"+Ka;function ha(e){var t=e[co];if(t)return t;for(var o=e.parentNode;o;){if(t=o[bo]||o[co]){if(o=t.alternate,t.child!==null||o!==null&&o.child!==null)for(e=Fd(e);e!==null;){if(o=e[co])return o;e=Fd(e)}return t}e=o,o=e.parentNode}return null}function Ni(e){return e=e[co]||e[bo],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Ya(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(r(33))}function Ls(e){return e[_i]||null}var fr=[],Ga=-1;function Go(e){return{current:e}}function Ve(e){0>Ga||(e.current=fr[Ga],fr[Ga]=null,Ga--)}function Fe(e,t){Ga++,fr[Ga]=e.current,e.current=t}var Vo={},ft=Go(Vo),Ct=Go(!1),ma=Vo;function Va(e,t){var o=e.type.contextTypes;if(!o)return Vo;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var s={},l;for(l in o)s[l]=t[l];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function kt(e){return e=e.childContextTypes,e!=null}function _s(){Ve(Ct),Ve(ft)}function Kd(e,t,o){if(ft.current!==Vo)throw Error(r(168));Fe(ft,t),Fe(Ct,o)}function Yd(e,t,o){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return o;a=a.getChildContext();for(var s in a)if(!(s in t))throw Error(r(108,we(e)||"Unknown",s));return V({},o,a)}function Ns(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Vo,ma=ft.current,Fe(ft,e),Fe(Ct,Ct.current),!0}function Gd(e,t,o){var a=e.stateNode;if(!a)throw Error(r(169));o?(e=Yd(e,t,ma),a.__reactInternalMemoizedMergedChildContext=e,Ve(Ct),Ve(ft),Fe(ft,e)):Ve(Ct),Fe(Ct,o)}var Po=null,Os=!1,Sr=!1;function Vd(e){Po===null?Po=[e]:Po.push(e)}function Qg(e){Os=!0,Vd(e)}function Xo(){if(!Sr&&Po!==null){Sr=!0;var e=0,t=Oe;try{var o=Po;for(Oe=1;e<o.length;e++){var a=o[e];do a=a(!0);while(a!==null)}Po=null,Os=!1}catch(s){throw Po!==null&&(Po=Po.slice(e+1)),Ye(So,Xo),s}finally{Oe=t,Sr=!1}}return null}var Xa=[],$a=0,qs=null,Bs=0,_t=[],Nt=0,ya=null,wo=1,Co="";function fa(e,t){Xa[$a++]=Bs,Xa[$a++]=qs,qs=e,Bs=t}function Xd(e,t,o){_t[Nt++]=wo,_t[Nt++]=Co,_t[Nt++]=ya,ya=e;var a=wo;e=Co;var s=32-Me(a)-1;a&=~(1<<s),o+=1;var l=32-Me(t)+s;if(30<l){var c=s-s%5;l=(a&(1<<c)-1).toString(32),a>>=c,s-=c,wo=1<<32-Me(t)+s|o<<s|a,Co=l+e}else wo=1<<l|o<<s|a,Co=e}function vr(e){e.return!==null&&(fa(e,1),Xd(e,1,0))}function br(e){for(;e===qs;)qs=Xa[--$a],Xa[$a]=null,Bs=Xa[--$a],Xa[$a]=null;for(;e===ya;)ya=_t[--Nt],_t[Nt]=null,Co=_t[--Nt],_t[Nt]=null,wo=_t[--Nt],_t[Nt]=null}var Ut=null,Mt=null,Xe=!1,Qt=null;function $d(e,t){var o=Wt(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 Qd(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,Mt=Yo(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Ut=e,Mt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(o=ya!==null?{id:wo,overflow:Co}:null,e.memoizedState={dehydrated:t,treeContext:o,retryLane:1073741824},o=Wt(18,null,null,0),o.stateNode=t,o.return=e,e.child=o,Ut=e,Mt=null,!0):!1;default:return!1}}function Pr(e){return(e.mode&1)!==0&&(e.flags&128)===0}function wr(e){if(Xe){var t=Mt;if(t){var o=t;if(!Qd(e,t)){if(Pr(e))throw Error(r(418));t=Yo(o.nextSibling);var a=Ut;t&&Qd(e,t)?$d(a,o):(e.flags=e.flags&-4097|2,Xe=!1,Ut=e)}}else{if(Pr(e))throw Error(r(418));e.flags=e.flags&-4097|2,Xe=!1,Ut=e}}}function Zd(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Ut=e}function Ws(e){if(e!==Ut)return!1;if(!Xe)return Zd(e),Xe=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!gr(e.type,e.memoizedProps)),t&&(t=Mt)){if(Pr(e))throw Jd(),Error(r(418));for(;t;)$d(e,t),t=Yo(t.nextSibling)}if(Zd(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="/$"){if(t===0){Mt=Yo(e.nextSibling);break e}t--}else o!=="$"&&o!=="$!"&&o!=="$?"||t++}e=e.nextSibling}Mt=null}}else Mt=Ut?Yo(e.stateNode.nextSibling):null;return!0}function Jd(){for(var e=Mt;e;)e=Yo(e.nextSibling)}function Qa(){Mt=Ut=null,Xe=!1}function Cr(e){Qt===null?Qt=[e]:Qt.push(e)}var Zg=G.ReactCurrentBatchConfig;function Oi(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(r(309));var a=o.stateNode}if(!a)throw Error(r(147,e));var s=a,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(c){var m=s.refs;c===null?delete m[l]:m[l]=c},t._stringRef=l,t)}if(typeof e!="string")throw Error(r(284));if(!o._owner)throw Error(r(290,e))}return e}function Fs(e,t){throw e=Object.prototype.toString.call(t),Error(r(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function eu(e){var t=e._init;return t(e._payload)}function tu(e){function t(A,b){if(e){var I=A.deletions;I===null?(A.deletions=[b],A.flags|=16):I.push(b)}}function o(A,b){if(!e)return null;for(;b!==null;)t(A,b),b=b.sibling;return null}function a(A,b){for(A=new Map;b!==null;)b.key!==null?A.set(b.key,b):A.set(b.index,b),b=b.sibling;return A}function s(A,b){return A=aa(A,b),A.index=0,A.sibling=null,A}function l(A,b,I){return A.index=I,e?(I=A.alternate,I!==null?(I=I.index,I<b?(A.flags|=2,b):I):(A.flags|=2,b)):(A.flags|=1048576,b)}function c(A){return e&&A.alternate===null&&(A.flags|=2),A}function m(A,b,I,W){return b===null||b.tag!==6?(b=hl(I,A.mode,W),b.return=A,b):(b=s(b,I),b.return=A,b)}function S(A,b,I,W){var re=I.type;return re===E?_(A,b,I.props.children,W,I.key):b!==null&&(b.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===ot&&eu(re)===b.type)?(W=s(b,I.props),W.ref=Oi(A,b,I),W.return=A,W):(W=mn(I.type,I.key,I.props,null,A.mode,W),W.ref=Oi(A,b,I),W.return=A,W)}function T(A,b,I,W){return b===null||b.tag!==4||b.stateNode.containerInfo!==I.containerInfo||b.stateNode.implementation!==I.implementation?(b=ml(I,A.mode,W),b.return=A,b):(b=s(b,I.children||[]),b.return=A,b)}function _(A,b,I,W,re){return b===null||b.tag!==7?(b=xa(I,A.mode,W,re),b.return=A,b):(b=s(b,I),b.return=A,b)}function q(A,b,I){if(typeof b=="string"&&b!==""||typeof b=="number")return b=hl(""+b,A.mode,I),b.return=A,b;if(typeof b=="object"&&b!==null){switch(b.$$typeof){case he:return I=mn(b.type,b.key,b.props,null,A.mode,I),I.ref=Oi(A,null,b),I.return=A,I;case De:return b=ml(b,A.mode,I),b.return=A,b;case ot:var W=b._init;return q(A,W(b._payload),I)}if(la(b)||de(b))return b=xa(b,A.mode,I,null),b.return=A,b;Fs(A,b)}return null}function L(A,b,I,W){var re=b!==null?b.key:null;if(typeof I=="string"&&I!==""||typeof I=="number")return re!==null?null:m(A,b,""+I,W);if(typeof I=="object"&&I!==null){switch(I.$$typeof){case he:return I.key===re?S(A,b,I,W):null;case De:return I.key===re?T(A,b,I,W):null;case ot:return re=I._init,L(A,b,re(I._payload),W)}if(la(I)||de(I))return re!==null?null:_(A,b,I,W,null);Fs(A,I)}return null}function X(A,b,I,W,re){if(typeof W=="string"&&W!==""||typeof W=="number")return A=A.get(I)||null,m(b,A,""+W,re);if(typeof W=="object"&&W!==null){switch(W.$$typeof){case he:return A=A.get(W.key===null?I:W.key)||null,S(b,A,W,re);case De:return A=A.get(W.key===null?I:W.key)||null,T(b,A,W,re);case ot:var pe=W._init;return X(A,b,I,pe(W._payload),re)}if(la(W)||de(W))return A=A.get(I)||null,_(b,A,W,re,null);Fs(b,W)}return null}function ae(A,b,I,W){for(var re=null,pe=null,ge=b,fe=b=0,pt=null;ge!==null&&fe<I.length;fe++){ge.index>fe?(pt=ge,ge=null):pt=ge.sibling;var ze=L(A,ge,I[fe],W);if(ze===null){ge===null&&(ge=pt);break}e&&ge&&ze.alternate===null&&t(A,ge),b=l(ze,b,fe),pe===null?re=ze:pe.sibling=ze,pe=ze,ge=pt}if(fe===I.length)return o(A,ge),Xe&&fa(A,fe),re;if(ge===null){for(;fe<I.length;fe++)ge=q(A,I[fe],W),ge!==null&&(b=l(ge,b,fe),pe===null?re=ge:pe.sibling=ge,pe=ge);return Xe&&fa(A,fe),re}for(ge=a(A,ge);fe<I.length;fe++)pt=X(ge,A,fe,I[fe],W),pt!==null&&(e&&pt.alternate!==null&&ge.delete(pt.key===null?fe:pt.key),b=l(pt,b,fe),pe===null?re=pt:pe.sibling=pt,pe=pt);return e&&ge.forEach(function(ia){return t(A,ia)}),Xe&&fa(A,fe),re}function ne(A,b,I,W){var re=de(I);if(typeof re!="function")throw Error(r(150));if(I=re.call(I),I==null)throw Error(r(151));for(var pe=re=null,ge=b,fe=b=0,pt=null,ze=I.next();ge!==null&&!ze.done;fe++,ze=I.next()){ge.index>fe?(pt=ge,ge=null):pt=ge.sibling;var ia=L(A,ge,ze.value,W);if(ia===null){ge===null&&(ge=pt);break}e&&ge&&ia.alternate===null&&t(A,ge),b=l(ia,b,fe),pe===null?re=ia:pe.sibling=ia,pe=ia,ge=pt}if(ze.done)return o(A,ge),Xe&&fa(A,fe),re;if(ge===null){for(;!ze.done;fe++,ze=I.next())ze=q(A,ze.value,W),ze!==null&&(b=l(ze,b,fe),pe===null?re=ze:pe.sibling=ze,pe=ze);return Xe&&fa(A,fe),re}for(ge=a(A,ge);!ze.done;fe++,ze=I.next())ze=X(ge,A,fe,ze.value,W),ze!==null&&(e&&ze.alternate!==null&&ge.delete(ze.key===null?fe:ze.key),b=l(ze,b,fe),pe===null?re=ze:pe.sibling=ze,pe=ze);return e&&ge.forEach(function(Th){return t(A,Th)}),Xe&&fa(A,fe),re}function at(A,b,I,W){if(typeof I=="object"&&I!==null&&I.type===E&&I.key===null&&(I=I.props.children),typeof I=="object"&&I!==null){switch(I.$$typeof){case he:e:{for(var re=I.key,pe=b;pe!==null;){if(pe.key===re){if(re=I.type,re===E){if(pe.tag===7){o(A,pe.sibling),b=s(pe,I.props.children),b.return=A,A=b;break e}}else if(pe.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===ot&&eu(re)===pe.type){o(A,pe.sibling),b=s(pe,I.props),b.ref=Oi(A,pe,I),b.return=A,A=b;break e}o(A,pe);break}else t(A,pe);pe=pe.sibling}I.type===E?(b=xa(I.props.children,A.mode,W,I.key),b.return=A,A=b):(W=mn(I.type,I.key,I.props,null,A.mode,W),W.ref=Oi(A,b,I),W.return=A,A=W)}return c(A);case De:e:{for(pe=I.key;b!==null;){if(b.key===pe)if(b.tag===4&&b.stateNode.containerInfo===I.containerInfo&&b.stateNode.implementation===I.implementation){o(A,b.sibling),b=s(b,I.children||[]),b.return=A,A=b;break e}else{o(A,b);break}else t(A,b);b=b.sibling}b=ml(I,A.mode,W),b.return=A,A=b}return c(A);case ot:return pe=I._init,at(A,b,pe(I._payload),W)}if(la(I))return ae(A,b,I,W);if(de(I))return ne(A,b,I,W);Fs(A,I)}return typeof I=="string"&&I!==""||typeof I=="number"?(I=""+I,b!==null&&b.tag===6?(o(A,b.sibling),b=s(b,I),b.return=A,A=b):(o(A,b),b=hl(I,A.mode,W),b.return=A,A=b),c(A)):o(A,b)}return at}var Za=tu(!0),ou=tu(!1),Ks=Go(null),Ys=null,Ja=null,kr=null;function xr(){kr=Ja=Ys=null}function Rr(e){var t=Ks.current;Ve(Ks),e._currentValue=t}function Ar(e,t,o){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===o)break;e=e.return}}function ei(e,t){Ys=e,kr=Ja=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(xt=!0),e.firstContext=null)}function Ot(e){var t=e._currentValue;if(kr!==e)if(e={context:e,memoizedValue:t,next:null},Ja===null){if(Ys===null)throw Error(r(308));Ja=e,Ys.dependencies={lanes:0,firstContext:e}}else Ja=Ja.next=e;return t}var Sa=null;function Ir(e){Sa===null?Sa=[e]:Sa.push(e)}function au(e,t,o,a){var s=t.interleaved;return s===null?(o.next=o,Ir(t)):(o.next=s.next,s.next=o),t.interleaved=o,ko(e,a)}function ko(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 Dr(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function iu(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 xo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Qo(e,t,o){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Ee&2)!==0){var s=a.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),a.pending=t,ko(e,o)}return s=a.interleaved,s===null?(t.next=t,Ir(a)):(t.next=s.next,s.next=t),a.interleaved=t,ko(e,o)}function Gs(e,t,o){if(t=t.updateQueue,t!==null&&(t=t.shared,(o&4194240)!==0)){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}function su(e,t){var o=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,o===a)){var s=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?s=l=c:l=l.next=c,o=o.next}while(o!==null);l===null?s=l=t:l=l.next=t}else s=l=t;o={baseState:a.baseState,firstBaseUpdate:s,lastBaseUpdate:l,shared:a.shared,effects:a.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=t:e.next=t,o.lastBaseUpdate=t}function Vs(e,t,o,a){var s=e.updateQueue;$o=!1;var l=s.firstBaseUpdate,c=s.lastBaseUpdate,m=s.shared.pending;if(m!==null){s.shared.pending=null;var S=m,T=S.next;S.next=null,c===null?l=T:c.next=T,c=S;var _=e.alternate;_!==null&&(_=_.updateQueue,m=_.lastBaseUpdate,m!==c&&(m===null?_.firstBaseUpdate=T:m.next=T,_.lastBaseUpdate=S))}if(l!==null){var q=s.baseState;c=0,_=T=S=null,m=l;do{var L=m.lane,X=m.eventTime;if((a&L)===L){_!==null&&(_=_.next={eventTime:X,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var ae=e,ne=m;switch(L=t,X=o,ne.tag){case 1:if(ae=ne.payload,typeof ae=="function"){q=ae.call(X,q,L);break e}q=ae;break e;case 3:ae.flags=ae.flags&-65537|128;case 0:if(ae=ne.payload,L=typeof ae=="function"?ae.call(X,q,L):ae,L==null)break e;q=V({},q,L);break e;case 2:$o=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,L=s.effects,L===null?s.effects=[m]:L.push(m))}else X={eventTime:X,lane:L,tag:m.tag,payload:m.payload,callback:m.callback,next:null},_===null?(T=_=X,S=q):_=_.next=X,c|=L;if(m=m.next,m===null){if(m=s.shared.pending,m===null)break;L=m,m=L.next,L.next=null,s.lastBaseUpdate=L,s.shared.pending=null}}while(!0);if(_===null&&(S=q),s.baseState=S,s.firstBaseUpdate=T,s.lastBaseUpdate=_,t=s.shared.interleaved,t!==null){s=t;do c|=s.lane,s=s.next;while(s!==t)}else l===null&&(s.shared.lanes=0);Pa|=c,e.lanes=c,e.memoizedState=q}}function nu(e,t,o){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var a=e[t],s=a.callback;if(s!==null){if(a.callback=null,a=o,typeof s!="function")throw Error(r(191,s));s.call(a)}}}var qi={},po=Go(qi),Bi=Go(qi),Wi=Go(qi);function va(e){if(e===qi)throw Error(r(174));return e}function Er(e,t){switch(Fe(Wi,t),Fe(Bi,e),Fe(po,qi),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:da(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=da(t,e)}Ve(po),Fe(po,t)}function ti(){Ve(po),Ve(Bi),Ve(Wi)}function ru(e){va(Wi.current);var t=va(po.current),o=da(t,e.type);t!==o&&(Fe(Bi,e),Fe(po,o))}function Tr(e){Bi.current===e&&(Ve(po),Ve(Bi))}var Qe=Go(0);function Xs(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 jr=[];function Ur(){for(var e=0;e<jr.length;e++)jr[e]._workInProgressVersionPrimary=null;jr.length=0}var $s=G.ReactCurrentDispatcher,Mr=G.ReactCurrentBatchConfig,ba=0,Ze=null,rt=null,ut=null,Qs=!1,Fi=!1,Ki=0,Jg=0;function St(){throw Error(r(321))}function zr(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 Hr(e,t,o,a,s,l){if(ba=l,Ze=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,$s.current=e===null||e.memoizedState===null?ah:ih,e=o(a,s),Fi){l=0;do{if(Fi=!1,Ki=0,25<=l)throw Error(r(301));l+=1,ut=rt=null,t.updateQueue=null,$s.current=sh,e=o(a,s)}while(Fi)}if($s.current=en,t=rt!==null&&rt.next!==null,ba=0,ut=rt=Ze=null,Qs=!1,t)throw Error(r(300));return e}function Lr(){var e=Ki!==0;return Ki=0,e}function go(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ut===null?Ze.memoizedState=ut=e:ut=ut.next=e,ut}function qt(){if(rt===null){var e=Ze.alternate;e=e!==null?e.memoizedState:null}else e=rt.next;var t=ut===null?Ze.memoizedState:ut.next;if(t!==null)ut=t,rt=e;else{if(e===null)throw Error(r(310));rt=e,e={memoizedState:rt.memoizedState,baseState:rt.baseState,baseQueue:rt.baseQueue,queue:rt.queue,next:null},ut===null?Ze.memoizedState=ut=e:ut=ut.next=e}return ut}function Yi(e,t){return typeof t=="function"?t(e):t}function _r(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=rt,s=a.baseQueue,l=o.pending;if(l!==null){if(s!==null){var c=s.next;s.next=l.next,l.next=c}a.baseQueue=s=l,o.pending=null}if(s!==null){l=s.next,a=a.baseState;var m=c=null,S=null,T=l;do{var _=T.lane;if((ba&_)===_)S!==null&&(S=S.next={lane:0,action:T.action,hasEagerState:T.hasEagerState,eagerState:T.eagerState,next:null}),a=T.hasEagerState?T.eagerState:e(a,T.action);else{var q={lane:_,action:T.action,hasEagerState:T.hasEagerState,eagerState:T.eagerState,next:null};S===null?(m=S=q,c=a):S=S.next=q,Ze.lanes|=_,Pa|=_}T=T.next}while(T!==null&&T!==l);S===null?c=a:S.next=m,$t(a,t.memoizedState)||(xt=!0),t.memoizedState=a,t.baseState=c,t.baseQueue=S,o.lastRenderedState=a}if(e=o.interleaved,e!==null){s=e;do l=s.lane,Ze.lanes|=l,Pa|=l,s=s.next;while(s!==e)}else s===null&&(o.lanes=0);return[t.memoizedState,o.dispatch]}function Nr(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=o.dispatch,s=o.pending,l=t.memoizedState;if(s!==null){o.pending=null;var c=s=s.next;do l=e(l,c.action),c=c.next;while(c!==s);$t(l,t.memoizedState)||(xt=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),o.lastRenderedState=l}return[l,a]}function lu(){}function du(e,t){var o=Ze,a=qt(),s=t(),l=!$t(a.memoizedState,s);if(l&&(a.memoizedState=s,xt=!0),a=a.queue,Or(pu.bind(null,o,a,e),[e]),a.getSnapshot!==t||l||ut!==null&&ut.memoizedState.tag&1){if(o.flags|=2048,Gi(9,cu.bind(null,o,a,s,t),void 0,null),ct===null)throw Error(r(349));(ba&30)!==0||uu(o,t,s)}return s}function uu(e,t,o){e.flags|=16384,e={getSnapshot:t,value:o},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.stores=[e]):(o=t.stores,o===null?t.stores=[e]:o.push(e))}function cu(e,t,o,a){t.value=o,t.getSnapshot=a,gu(t)&&hu(e)}function pu(e,t,o){return o(function(){gu(t)&&hu(e)})}function gu(e){var t=e.getSnapshot;e=e.value;try{var o=t();return!$t(e,o)}catch{return!0}}function hu(e){var t=ko(e,1);t!==null&&to(t,e,1,-1)}function mu(e){var t=go();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Yi,lastRenderedState:e},t.queue=e,e=e.dispatch=oh.bind(null,Ze,e),[t.memoizedState,e]}function Gi(e,t,o,a){return e={tag:e,create:t,destroy:o,deps:a,next:null},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.lastEffect=e.next=e):(o=t.lastEffect,o===null?t.lastEffect=e.next=e:(a=o.next,o.next=e,e.next=a,t.lastEffect=e)),e}function yu(){return qt().memoizedState}function Zs(e,t,o,a){var s=go();Ze.flags|=e,s.memoizedState=Gi(1|t,o,void 0,a===void 0?null:a)}function Js(e,t,o,a){var s=qt();a=a===void 0?null:a;var l=void 0;if(rt!==null){var c=rt.memoizedState;if(l=c.destroy,a!==null&&zr(a,c.deps)){s.memoizedState=Gi(t,o,l,a);return}}Ze.flags|=e,s.memoizedState=Gi(1|t,o,l,a)}function fu(e,t){return Zs(8390656,8,e,t)}function Or(e,t){return Js(2048,8,e,t)}function Su(e,t){return Js(4,2,e,t)}function vu(e,t){return Js(4,4,e,t)}function bu(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 Pu(e,t,o){return o=o!=null?o.concat([e]):null,Js(4,4,bu.bind(null,t,e),o)}function qr(){}function wu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&zr(t,a[1])?a[0]:(o.memoizedState=[e,t],e)}function Cu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&zr(t,a[1])?a[0]:(e=e(),o.memoizedState=[e,t],e)}function ku(e,t,o){return(ba&21)===0?(e.baseState&&(e.baseState=!1,xt=!0),e.memoizedState=o):($t(o,t)||(o=ed(),Ze.lanes|=o,Pa|=o,e.baseState=!0),t)}function eh(e,t){var o=Oe;Oe=o!==0&&4>o?o:4,e(!0);var a=Mr.transition;Mr.transition={};try{e(!1),t()}finally{Oe=o,Mr.transition=a}}function xu(){return qt().memoizedState}function th(e,t,o){var a=ta(e);if(o={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null},Ru(e))Au(t,o);else if(o=au(e,t,o,a),o!==null){var s=wt();to(o,e,a,s),Iu(o,t,a)}}function oh(e,t,o){var a=ta(e),s={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null};if(Ru(e))Au(t,s);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var c=t.lastRenderedState,m=l(c,o);if(s.hasEagerState=!0,s.eagerState=m,$t(m,c)){var S=t.interleaved;S===null?(s.next=s,Ir(t)):(s.next=S.next,S.next=s),t.interleaved=s;return}}catch{}finally{}o=au(e,t,s,a),o!==null&&(s=wt(),to(o,e,a,s),Iu(o,t,a))}}function Ru(e){var t=e.alternate;return e===Ze||t!==null&&t===Ze}function Au(e,t){Fi=Qs=!0;var o=e.pending;o===null?t.next=t:(t.next=o.next,o.next=t),e.pending=t}function Iu(e,t,o){if((o&4194240)!==0){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}var en={readContext:Ot,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},ah={readContext:Ot,useCallback:function(e,t){return go().memoizedState=[e,t===void 0?null:t],e},useContext:Ot,useEffect:fu,useImperativeHandle:function(e,t,o){return o=o!=null?o.concat([e]):null,Zs(4194308,4,bu.bind(null,t,e),o)},useLayoutEffect:function(e,t){return Zs(4194308,4,e,t)},useInsertionEffect:function(e,t){return Zs(4,2,e,t)},useMemo:function(e,t){var o=go();return t=t===void 0?null:t,e=e(),o.memoizedState=[e,t],e},useReducer:function(e,t,o){var a=go();return t=o!==void 0?o(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=th.bind(null,Ze,e),[a.memoizedState,e]},useRef:function(e){var t=go();return e={current:e},t.memoizedState=e},useState:mu,useDebugValue:qr,useDeferredValue:function(e){return go().memoizedState=e},useTransition:function(){var e=mu(!1),t=e[0];return e=eh.bind(null,e[1]),go().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,o){var a=Ze,s=go();if(Xe){if(o===void 0)throw Error(r(407));o=o()}else{if(o=t(),ct===null)throw Error(r(349));(ba&30)!==0||uu(a,t,o)}s.memoizedState=o;var l={value:o,getSnapshot:t};return s.queue=l,fu(pu.bind(null,a,l,e),[e]),a.flags|=2048,Gi(9,cu.bind(null,a,l,o,t),void 0,null),o},useId:function(){var e=go(),t=ct.identifierPrefix;if(Xe){var o=Co,a=wo;o=(a&~(1<<32-Me(a)-1)).toString(32)+o,t=":"+t+"R"+o,o=Ki++,0<o&&(t+="H"+o.toString(32)),t+=":"}else o=Jg++,t=":"+t+"r"+o.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ih={readContext:Ot,useCallback:wu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:Cu,useReducer:_r,useRef:yu,useState:function(){return _r(Yi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return ku(t,rt.memoizedState,e)},useTransition:function(){var e=_r(Yi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1},sh={readContext:Ot,useCallback:wu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:Cu,useReducer:Nr,useRef:yu,useState:function(){return Nr(Yi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return rt===null?t.memoizedState=e:ku(t,rt.memoizedState,e)},useTransition:function(){var e=Nr(Yi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1};function Zt(e,t){if(e&&e.defaultProps){t=V({},t),e=e.defaultProps;for(var o in e)t[o]===void 0&&(t[o]=e[o]);return t}return t}function Br(e,t,o,a){t=e.memoizedState,o=o(a,t),o=o==null?t:V({},t,o),e.memoizedState=o,e.lanes===0&&(e.updateQueue.baseState=o)}var tn={isMounted:function(e){return(e=e._reactInternals)?ee(e)===e:!1},enqueueSetState:function(e,t,o){e=e._reactInternals;var a=wt(),s=ta(e),l=xo(a,s);l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Gs(t,e,s))},enqueueReplaceState:function(e,t,o){e=e._reactInternals;var a=wt(),s=ta(e),l=xo(a,s);l.tag=1,l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Gs(t,e,s))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var o=wt(),a=ta(e),s=xo(o,a);s.tag=2,t!=null&&(s.callback=t),t=Qo(e,s,a),t!==null&&(to(t,e,a,o),Gs(t,e,a))}};function Du(e,t,o,a,s,l,c){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(a,l,c):t.prototype&&t.prototype.isPureReactComponent?!Ui(o,a)||!Ui(s,l):!0}function Eu(e,t,o){var a=!1,s=Vo,l=t.contextType;return typeof l=="object"&&l!==null?l=Ot(l):(s=kt(t)?ma:ft.current,a=t.contextTypes,l=(a=a!=null)?Va(e,s):Vo),t=new t(o,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=tn,e.stateNode=t,t._reactInternals=e,a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=s,e.__reactInternalMemoizedMaskedChildContext=l),t}function Tu(e,t,o,a){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(o,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(o,a),t.state!==e&&tn.enqueueReplaceState(t,t.state,null)}function Wr(e,t,o,a){var s=e.stateNode;s.props=o,s.state=e.memoizedState,s.refs={},Dr(e);var l=t.contextType;typeof l=="object"&&l!==null?s.context=Ot(l):(l=kt(t)?ma:ft.current,s.context=Va(e,l)),s.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(Br(e,t,l,o),s.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(t=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),t!==s.state&&tn.enqueueReplaceState(s,s.state,null),Vs(e,o,s,a),s.state=e.memoizedState),typeof s.componentDidMount=="function"&&(e.flags|=4194308)}function oi(e,t){try{var o="",a=t;do o+=ie(a),a=a.return;while(a);var s=o}catch(l){s=`
|
|
38
|
+
`+s[c].replace(" at new "," at ");return e.displayName&&S.includes("<anonymous>")&&(S=S.replace("<anonymous>",e.displayName)),S}while(1<=c&&0<=m);break}}}finally{ye=!1,Error.prepareStackTrace=o}return(e=e?e.displayName||e.name:"")?M(e):""}function ie(e){switch(e.tag){case 5:return M(e.type);case 16:return M("Lazy");case 13:return M("Suspense");case 19:return M("SuspenseList");case 0:case 2:case 15:return e=F(e.type,!1),e;case 11:return e=F(e.type.render,!1),e;case 1:return e=F(e.type,!0),e;default:return""}}function ue(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 E:return"Fragment";case De:return"Portal";case Pe:return"Profiler";case Q:return"StrictMode";case Te:return"Suspense";case Le:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case He:return(e.displayName||"Context")+".Consumer";case ce:return(e._context.displayName||"Context")+".Provider";case ve:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case et:return t=e.displayName||null,t!==null?t:ue(e.type)||"Memo";case ot:t=e._payload,e=e._init;try{return ue(e(t))}catch{}}return null}function we(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 ue(t);case 8:return t===Q?"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 ke(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function je(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function gt(e){var t=je(e)?"checked":"value",o=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),a=""+e[t];if(!e.hasOwnProperty(t)&&typeof o<"u"&&typeof o.get=="function"&&typeof o.set=="function"){var s=o.get,l=o.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(c){a=""+c,l.call(this,c)}}),Object.defineProperty(e,t,{enumerable:o.enumerable}),{getValue:function(){return a},setValue:function(c){a=""+c},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function yo(e){e._valueTracker||(e._valueTracker=gt(e))}function dt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var o=t.getValue(),a="";return e&&(a=je(e)?e.checked?"true":"false":e.value),e=a,e!==o?(t.setValue(e),!0):!1}function Vt(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 Ua(e,t){var o=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:o??e._wrapperState.initialChecked})}function cs(e,t){var o=t.defaultValue==null?"":t.defaultValue,a=t.checked!=null?t.checked:t.defaultChecked;o=ke(t.value!=null?t.value:o),e._wrapperState={initialChecked:a,initialValue:o,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function io(e,t){t=t.checked,t!=null&&$(e,"checked",t,!1)}function gi(e,t){io(e,t);var o=ke(t.value),a=t.type;if(o!=null)a==="number"?(o===0&&e.value===""||e.value!=o)&&(e.value=""+o):e.value!==""+o&&(e.value=""+o);else if(a==="submit"||a==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Ma(e,t.type,o):t.hasOwnProperty("defaultValue")&&Ma(e,t.type,ke(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function ps(e,t,o){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var a=t.type;if(!(a!=="submit"&&a!=="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 Ma(e,t,o){(t!=="number"||Vt(e.ownerDocument)!==e)&&(o==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+o&&(e.defaultValue=""+o))}var la=Array.isArray;function Mo(e,t,o,a){if(e=e.options,t){t={};for(var s=0;s<o.length;s++)t["$"+o[s]]=!0;for(o=0;o<e.length;o++)s=t.hasOwnProperty("$"+e[o].value),e[o].selected!==s&&(e[o].selected=s),s&&a&&(e[o].defaultSelected=!0)}else{for(o=""+ke(o),t=null,s=0;s<e.length;s++){if(e[s].value===o){e[s].selected=!0,a&&(e[s].defaultSelected=!0);return}t!==null||e[s].disabled||(t=e[s])}t!==null&&(t.selected=!0)}}function hi(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(r(91));return G({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function gs(e,t){var o=t.value;if(o==null){if(o=t.children,t=t.defaultValue,o!=null){if(t!=null)throw Error(r(92));if(la(o)){if(1<o.length)throw Error(r(93));o=o[0]}t=o}t==null&&(t=""),o=t}e._wrapperState={initialValue:ke(o)}}function so(e,t){var o=ke(t.value),a=ke(t.defaultValue);o!=null&&(o=""+o,o!==e.value&&(e.value=o),t.defaultValue==null&&e.defaultValue!==o&&(e.defaultValue=o)),a!=null&&(e.defaultValue=""+a)}function zo(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==""&&t!==null&&(e.value=t)}function mi(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 da(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?mi(t):e==="http://www.w3.org/2000/svg"&&t==="foreignObject"?"http://www.w3.org/1999/xhtml":e}var Tt,Lt=(function(e){return typeof MSApp<"u"&&MSApp.execUnsafeLocalFunction?function(t,o,a,s){MSApp.execUnsafeLocalFunction(function(){return e(t,o,a,s)})}:e})(function(e,t){if(e.namespaceURI!=="http://www.w3.org/2000/svg"||"innerHTML"in e)e.innerHTML=t;else{for(Tt=Tt||document.createElement("div"),Tt.innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Tt.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ho(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},Nn=["Webkit","ms","Moz","O"];Object.keys(no).forEach(function(e){Nn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),no[t]=no[e]})});function Gt(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 yi(e,t){e=e.style;for(var o in t)if(t.hasOwnProperty(o)){var a=o.indexOf("--")===0,s=Gt(o,t[o],a);o==="float"&&(o="cssFloat"),a?e.setProperty(o,s):e[o]=s}}var hs=G({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 za(e,t){if(t){if(hs[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(r(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(r(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(r(61))}if(t.style!=null&&typeof t.style!="object")throw Error(r(62))}}function fi(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 Ha=null;function Lo(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var La=null,ro=null,lo=null;function ms(e){if(e=Ni(e)){if(typeof La!="function")throw Error(r(280));var t=e.stateNode;t&&(t=Ls(t),La(e.stateNode,e.type,t))}}function Si(e){ro?lo?lo.push(e):lo=[e]:ro=e}function ys(){if(ro){var e=ro,t=lo;if(lo=ro=null,ms(e),t)for(e=0;e<t.length;e++)ms(t[e])}}function vi(e,t){return e(t)}function ua(){}var _o=!1;function fs(e,t,o){if(_o)return e(t,o);_o=!0;try{return vi(e,t,o)}finally{_o=!1,(ro!==null||lo!==null)&&(ua(),ys())}}function ca(e,t){var o=e.stateNode;if(o===null)return null;var a=Ls(o);if(a===null)return null;o=a[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":(a=!a.disabled)||(e=e.type,a=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!a;break e;default:e=!1}if(e)return null;if(o&&typeof o!="function")throw Error(r(231,t,typeof o));return o}var f=!1;if(y)try{var k={};Object.defineProperty(k,"passive",{get:function(){f=!0}}),window.addEventListener("test",k,k),window.removeEventListener("test",k,k)}catch{f=!1}function j(e,t,o,a,s,l,c,m,S){var T=Array.prototype.slice.call(arguments,3);try{t.apply(o,T)}catch(_){this.onError(_)}}var H=!1,Y=null,le=!1,me=null,oe={onError:function(e){H=!0,Y=e}};function se(e,t,o,a,s,l,c,m,S){H=!1,Y=null,j.apply(oe,arguments)}function Z(e,t,o,a,s,l,c,m,S){if(se.apply(this,arguments),H){if(H){var T=Y;H=!1,Y=null}else throw Error(r(198));le||(le=!0,me=T)}}function ee(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 Re(e){if(ee(e)!==e)throw Error(r(188))}function nt(e){var t=e.alternate;if(!t){if(t=ee(e),t===null)throw Error(r(188));return t!==e?null:e}for(var o=e,a=t;;){var s=o.return;if(s===null)break;var l=s.alternate;if(l===null){if(a=s.return,a!==null){o=a;continue}break}if(s.child===l.child){for(l=s.child;l;){if(l===o)return Re(s),e;if(l===a)return Re(s),t;l=l.sibling}throw Error(r(188))}if(o.return!==a.return)o=s,a=l;else{for(var c=!1,m=s.child;m;){if(m===o){c=!0,o=s,a=l;break}if(m===a){c=!0,a=s,o=l;break}m=m.sibling}if(!c){for(m=l.child;m;){if(m===o){c=!0,o=l,a=s;break}if(m===a){c=!0,a=l,o=s;break}m=m.sibling}if(!c)throw Error(r(189))}}if(o.alternate!==a)throw Error(r(190))}if(o.tag!==3)throw Error(r(188));return o.stateNode.current===o?e:t}function Ne(e){return e=nt(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 Ye=n.unstable_scheduleCallback,fo=n.unstable_cancelCallback,pa=n.unstable_shouldYield,Xt=n.unstable_requestPaint,Ue=n.unstable_now,bi=n.unstable_getCurrentPriorityLevel,So=n.unstable_ImmediatePriority,uo=n.unstable_UserBlockingPriority,vo=n.unstable_NormalPriority,_a=n.unstable_LowPriority,Ae=n.unstable_IdlePriority,Be=null,ht=null;function ga(e){if(ht&&typeof ht.onCommitFiberRoot=="function")try{ht.onCommitFiberRoot(Be,e,void 0,(e.current.flags&128)===128)}catch{}}var Me=Math.clz32?Math.clz32:On,No=Math.log,Ss=Math.LN2;function On(e){return e>>>=0,e===0?32:31-(No(e)/Ss|0)|0}var vs=64,bs=4194304;function Pi(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 Ps(e,t){var o=e.pendingLanes;if(o===0)return 0;var a=0,s=e.suspendedLanes,l=e.pingedLanes,c=o&268435455;if(c!==0){var m=c&~s;m!==0?a=Pi(m):(l&=c,l!==0&&(a=Pi(l)))}else c=o&~s,c!==0?a=Pi(c):l!==0&&(a=Pi(l));if(a===0)return 0;if(t!==0&&t!==a&&(t&s)===0&&(s=a&-a,l=t&-t,s>=l||s===16&&(l&4194240)!==0))return t;if((a&4)!==0&&(a|=o&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=a;0<t;)o=31-Me(t),s=1<<o,a|=e[o],t&=~s;return a}function Qp(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 Zp(e,t){for(var o=e.suspendedLanes,a=e.pingedLanes,s=e.expirationTimes,l=e.pendingLanes;0<l;){var c=31-Me(l),m=1<<c,S=s[c];S===-1?((m&o)===0||(m&a)!==0)&&(s[c]=Qp(m,t)):S<=t&&(e.expiredLanes|=m),l&=~m}}function qn(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ed(){var e=vs;return vs<<=1,(vs&4194240)===0&&(vs=64),e}function Bn(e){for(var t=[],o=0;31>o;o++)t.push(e);return t}function wi(e,t,o){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Me(t),e[t]=o}function Jp(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 a=e.eventTimes;for(e=e.expirationTimes;0<o;){var s=31-Me(o),l=1<<s;t[s]=0,a[s]=-1,e[s]=-1,o&=~l}}function Wn(e,t){var o=e.entangledLanes|=t;for(e=e.entanglements;o;){var a=31-Me(o),s=1<<a;s&t|e[a]&t&&(e[a]|=t),o&=~s}}var Oe=0;function td(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var od,Fn,ad,id,sd,Kn=!1,ws=[],Oo=null,qo=null,Bo=null,Ci=new Map,ki=new Map,Wo=[],eg="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 nd(e,t){switch(e){case"focusin":case"focusout":Oo=null;break;case"dragenter":case"dragleave":qo=null;break;case"mouseover":case"mouseout":Bo=null;break;case"pointerover":case"pointerout":Ci.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":ki.delete(t.pointerId)}}function xi(e,t,o,a,s,l){return e===null||e.nativeEvent!==l?(e={blockedOn:t,domEventName:o,eventSystemFlags:a,nativeEvent:l,targetContainers:[s]},t!==null&&(t=Ni(t),t!==null&&Fn(t)),e):(e.eventSystemFlags|=a,t=e.targetContainers,s!==null&&t.indexOf(s)===-1&&t.push(s),e)}function tg(e,t,o,a,s){switch(t){case"focusin":return Oo=xi(Oo,e,t,o,a,s),!0;case"dragenter":return qo=xi(qo,e,t,o,a,s),!0;case"mouseover":return Bo=xi(Bo,e,t,o,a,s),!0;case"pointerover":var l=s.pointerId;return Ci.set(l,xi(Ci.get(l)||null,e,t,o,a,s)),!0;case"gotpointercapture":return l=s.pointerId,ki.set(l,xi(ki.get(l)||null,e,t,o,a,s)),!0}return!1}function rd(e){var t=ha(e.target);if(t!==null){var o=ee(t);if(o!==null){if(t=o.tag,t===13){if(t=Se(o),t!==null){e.blockedOn=t,sd(e.priority,function(){ad(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 Cs(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var o=Vn(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(o===null){o=e.nativeEvent;var a=new o.constructor(o.type,o);Ha=a,o.target.dispatchEvent(a),Ha=null}else return t=Ni(o),t!==null&&Fn(t),e.blockedOn=o,!1;t.shift()}return!0}function ld(e,t,o){Cs(e)&&o.delete(t)}function og(){Kn=!1,Oo!==null&&Cs(Oo)&&(Oo=null),qo!==null&&Cs(qo)&&(qo=null),Bo!==null&&Cs(Bo)&&(Bo=null),Ci.forEach(ld),ki.forEach(ld)}function Ri(e,t){e.blockedOn===t&&(e.blockedOn=null,Kn||(Kn=!0,n.unstable_scheduleCallback(n.unstable_NormalPriority,og)))}function Ai(e){function t(s){return Ri(s,e)}if(0<ws.length){Ri(ws[0],e);for(var o=1;o<ws.length;o++){var a=ws[o];a.blockedOn===e&&(a.blockedOn=null)}}for(Oo!==null&&Ri(Oo,e),qo!==null&&Ri(qo,e),Bo!==null&&Ri(Bo,e),Ci.forEach(t),ki.forEach(t),o=0;o<Wo.length;o++)a=Wo[o],a.blockedOn===e&&(a.blockedOn=null);for(;0<Wo.length&&(o=Wo[0],o.blockedOn===null);)rd(o),o.blockedOn===null&&Wo.shift()}var Na=V.ReactCurrentBatchConfig,ks=!0;function ag(e,t,o,a){var s=Oe,l=Na.transition;Na.transition=null;try{Oe=1,Yn(e,t,o,a)}finally{Oe=s,Na.transition=l}}function ig(e,t,o,a){var s=Oe,l=Na.transition;Na.transition=null;try{Oe=4,Yn(e,t,o,a)}finally{Oe=s,Na.transition=l}}function Yn(e,t,o,a){if(ks){var s=Vn(e,t,o,a);if(s===null)ur(e,t,a,xs,o),nd(e,a);else if(tg(s,e,t,o,a))a.stopPropagation();else if(nd(e,a),t&4&&-1<eg.indexOf(e)){for(;s!==null;){var l=Ni(s);if(l!==null&&od(l),l=Vn(e,t,o,a),l===null&&ur(e,t,a,xs,o),l===s)break;s=l}s!==null&&a.stopPropagation()}else ur(e,t,a,null,o)}}var xs=null;function Vn(e,t,o,a){if(xs=null,e=Lo(a),e=ha(e),e!==null)if(t=ee(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 xs=e,null}function dd(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(bi()){case So:return 1;case uo:return 4;case vo:case _a:return 16;case Ae:return 536870912;default:return 16}default:return 16}}var Fo=null,Gn=null,Rs=null;function ud(){if(Rs)return Rs;var e,t=Gn,o=t.length,a,s="value"in Fo?Fo.value:Fo.textContent,l=s.length;for(e=0;e<o&&t[e]===s[e];e++);var c=o-e;for(a=1;a<=c&&t[o-a]===s[l-a];a++);return Rs=s.slice(e,1<a?1-a:void 0)}function As(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 Is(){return!0}function cd(){return!1}function jt(e){function t(o,a,s,l,c){this._reactName=o,this._targetInst=s,this.type=a,this.nativeEvent=l,this.target=c,this.currentTarget=null;for(var m in e)e.hasOwnProperty(m)&&(o=e[m],this[m]=o?o(l):l[m]);return this.isDefaultPrevented=(l.defaultPrevented!=null?l.defaultPrevented:l.returnValue===!1)?Is:cd,this.isPropagationStopped=cd,this}return G(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=Is)},stopPropagation:function(){var o=this.nativeEvent;o&&(o.stopPropagation?o.stopPropagation():typeof o.cancelBubble!="unknown"&&(o.cancelBubble=!0),this.isPropagationStopped=Is)},persist:function(){},isPersistent:Is}),t}var Oa={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Xn=jt(Oa),Ii=G({},Oa,{view:0,detail:0}),sg=jt(Ii),$n,Qn,Di,Ds=G({},Ii,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Jn,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!==Di&&(Di&&e.type==="mousemove"?($n=e.screenX-Di.screenX,Qn=e.screenY-Di.screenY):Qn=$n=0,Di=e),$n)},movementY:function(e){return"movementY"in e?e.movementY:Qn}}),pd=jt(Ds),ng=G({},Ds,{dataTransfer:0}),rg=jt(ng),lg=G({},Ii,{relatedTarget:0}),Zn=jt(lg),dg=G({},Oa,{animationName:0,elapsedTime:0,pseudoElement:0}),ug=jt(dg),cg=G({},Oa,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),pg=jt(cg),gg=G({},Oa,{data:0}),gd=jt(gg),hg={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},mg={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"},yg={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function fg(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=yg[e])?!!t[e]:!1}function Jn(){return fg}var Sg=G({},Ii,{key:function(e){if(e.key){var t=hg[e.key]||e.key;if(t!=="Unidentified")return t}return e.type==="keypress"?(e=As(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?mg[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:Jn,charCode:function(e){return e.type==="keypress"?As(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?As(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),vg=jt(Sg),bg=G({},Ds,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),hd=jt(bg),Pg=G({},Ii,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:Jn}),wg=jt(Pg),Cg=G({},Oa,{propertyName:0,elapsedTime:0,pseudoElement:0}),kg=jt(Cg),xg=G({},Ds,{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}),Rg=jt(xg),Ag=[9,13,27,32],er=y&&"CompositionEvent"in window,Ei=null;y&&"documentMode"in document&&(Ei=document.documentMode);var Ig=y&&"TextEvent"in window&&!Ei,md=y&&(!er||Ei&&8<Ei&&11>=Ei),yd=" ",fd=!1;function Sd(e,t){switch(e){case"keyup":return Ag.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function vd(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var qa=!1;function Dg(e,t){switch(e){case"compositionend":return vd(t);case"keypress":return t.which!==32?null:(fd=!0,yd);case"textInput":return e=t.data,e===yd&&fd?null:e;default:return null}}function Eg(e,t){if(qa)return e==="compositionend"||!er&&Sd(e,t)?(e=ud(),Rs=Gn=Fo=null,qa=!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 md&&t.locale!=="ko"?null:t.data;default:return null}}var Tg={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 bd(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!Tg[e.type]:t==="textarea"}function Pd(e,t,o,a){Si(a),t=Ms(t,"onChange"),0<t.length&&(o=new Xn("onChange","change",null,o,a),e.push({event:o,listeners:t}))}var Ti=null,ji=null;function jg(e){Nd(e,0)}function Es(e){var t=Ya(e);if(dt(t))return e}function Ug(e,t){if(e==="change")return t}var wd=!1;if(y){var tr;if(y){var or="oninput"in document;if(!or){var Cd=document.createElement("div");Cd.setAttribute("oninput","return;"),or=typeof Cd.oninput=="function"}tr=or}else tr=!1;wd=tr&&(!document.documentMode||9<document.documentMode)}function kd(){Ti&&(Ti.detachEvent("onpropertychange",xd),ji=Ti=null)}function xd(e){if(e.propertyName==="value"&&Es(ji)){var t=[];Pd(t,ji,e,Lo(e)),fs(jg,t)}}function Mg(e,t,o){e==="focusin"?(kd(),Ti=t,ji=o,Ti.attachEvent("onpropertychange",xd)):e==="focusout"&&kd()}function zg(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Es(ji)}function Hg(e,t){if(e==="click")return Es(t)}function Lg(e,t){if(e==="input"||e==="change")return Es(t)}function _g(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var $t=typeof Object.is=="function"?Object.is:_g;function Ui(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),a=Object.keys(t);if(o.length!==a.length)return!1;for(a=0;a<o.length;a++){var s=o[a];if(!h.call(t,s)||!$t(e[s],t[s]))return!1}return!0}function Rd(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Ad(e,t){var o=Rd(e);e=0;for(var a;o;){if(o.nodeType===3){if(a=e+o.textContent.length,e<=t&&a>=t)return{node:o,offset:t-e};e=a}e:{for(;o;){if(o.nextSibling){o=o.nextSibling;break e}o=o.parentNode}o=void 0}o=Rd(o)}}function Id(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Id(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dd(){for(var e=window,t=Vt();t instanceof e.HTMLIFrameElement;){try{var o=typeof t.contentWindow.location.href=="string"}catch{o=!1}if(o)e=t.contentWindow;else break;t=Vt(e.document)}return t}function ar(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 Ng(e){var t=Dd(),o=e.focusedElem,a=e.selectionRange;if(t!==o&&o&&o.ownerDocument&&Id(o.ownerDocument.documentElement,o)){if(a!==null&&ar(o)){if(t=a.start,e=a.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 s=o.textContent.length,l=Math.min(a.start,s);a=a.end===void 0?l:Math.min(a.end,s),!e.extend&&l>a&&(s=a,a=l,l=s),s=Ad(o,l);var c=Ad(o,a);s&&c&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==c.node||e.focusOffset!==c.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),l>a?(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 Og=y&&"documentMode"in document&&11>=document.documentMode,Ba=null,ir=null,Mi=null,sr=!1;function Ed(e,t,o){var a=o.window===o?o.document:o.nodeType===9?o:o.ownerDocument;sr||Ba==null||Ba!==Vt(a)||(a=Ba,"selectionStart"in a&&ar(a)?a={start:a.selectionStart,end:a.selectionEnd}:(a=(a.ownerDocument&&a.ownerDocument.defaultView||window).getSelection(),a={anchorNode:a.anchorNode,anchorOffset:a.anchorOffset,focusNode:a.focusNode,focusOffset:a.focusOffset}),Mi&&Ui(Mi,a)||(Mi=a,a=Ms(ir,"onSelect"),0<a.length&&(t=new Xn("onSelect","select",null,t,o),e.push({event:t,listeners:a}),t.target=Ba)))}function Ts(e,t){var o={};return o[e.toLowerCase()]=t.toLowerCase(),o["Webkit"+e]="webkit"+t,o["Moz"+e]="moz"+t,o}var Wa={animationend:Ts("Animation","AnimationEnd"),animationiteration:Ts("Animation","AnimationIteration"),animationstart:Ts("Animation","AnimationStart"),transitionend:Ts("Transition","TransitionEnd")},nr={},Td={};y&&(Td=document.createElement("div").style,"AnimationEvent"in window||(delete Wa.animationend.animation,delete Wa.animationiteration.animation,delete Wa.animationstart.animation),"TransitionEvent"in window||delete Wa.transitionend.transition);function js(e){if(nr[e])return nr[e];if(!Wa[e])return e;var t=Wa[e],o;for(o in t)if(t.hasOwnProperty(o)&&o in Td)return nr[e]=t[o];return e}var jd=js("animationend"),Ud=js("animationiteration"),Md=js("animationstart"),zd=js("transitionend"),Hd=new Map,Ld="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 Ko(e,t){Hd.set(e,t),p(t,[e])}for(var rr=0;rr<Ld.length;rr++){var lr=Ld[rr],qg=lr.toLowerCase(),Bg=lr[0].toUpperCase()+lr.slice(1);Ko(qg,"on"+Bg)}Ko(jd,"onAnimationEnd"),Ko(Ud,"onAnimationIteration"),Ko(Md,"onAnimationStart"),Ko("dblclick","onDoubleClick"),Ko("focusin","onFocus"),Ko("focusout","onBlur"),Ko(zd,"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 zi="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(" "),Wg=new Set("cancel close invalid load scroll toggle".split(" ").concat(zi));function _d(e,t,o){var a=e.type||"unknown-event";e.currentTarget=o,Z(a,t,void 0,e),e.currentTarget=null}function Nd(e,t){t=(t&4)!==0;for(var o=0;o<e.length;o++){var a=e[o],s=a.event;a=a.listeners;e:{var l=void 0;if(t)for(var c=a.length-1;0<=c;c--){var m=a[c],S=m.instance,T=m.currentTarget;if(m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,T),l=S}else for(c=0;c<a.length;c++){if(m=a[c],S=m.instance,T=m.currentTarget,m=m.listener,S!==l&&s.isPropagationStopped())break e;_d(s,m,T),l=S}}}if(le)throw e=me,le=!1,me=null,e}function Ve(e,t){var o=t[yr];o===void 0&&(o=t[yr]=new Set);var a=e+"__bubble";o.has(a)||(Od(t,e,2,!1),o.add(a))}function dr(e,t,o){var a=0;t&&(a|=4),Od(o,e,a,t)}var Us="_reactListening"+Math.random().toString(36).slice(2);function Hi(e){if(!e[Us]){e[Us]=!0,d.forEach(function(o){o!=="selectionchange"&&(Wg.has(o)||dr(o,!1,e),dr(o,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Us]||(t[Us]=!0,dr("selectionchange",!1,t))}}function Od(e,t,o,a){switch(dd(t)){case 1:var s=ag;break;case 4:s=ig;break;default:s=Yn}o=s.bind(null,t,o,e),s=void 0,!f||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(s=!0),a?s!==void 0?e.addEventListener(t,o,{capture:!0,passive:s}):e.addEventListener(t,o,!0):s!==void 0?e.addEventListener(t,o,{passive:s}):e.addEventListener(t,o,!1)}function ur(e,t,o,a,s){var l=a;if((t&1)===0&&(t&2)===0&&a!==null)e:for(;;){if(a===null)return;var c=a.tag;if(c===3||c===4){var m=a.stateNode.containerInfo;if(m===s||m.nodeType===8&&m.parentNode===s)break;if(c===4)for(c=a.return;c!==null;){var S=c.tag;if((S===3||S===4)&&(S=c.stateNode.containerInfo,S===s||S.nodeType===8&&S.parentNode===s))return;c=c.return}for(;m!==null;){if(c=ha(m),c===null)return;if(S=c.tag,S===5||S===6){a=l=c;continue e}m=m.parentNode}}a=a.return}fs(function(){var T=l,_=Lo(o),q=[];e:{var L=Hd.get(e);if(L!==void 0){var X=Xn,ae=e;switch(e){case"keypress":if(As(o)===0)break e;case"keydown":case"keyup":X=vg;break;case"focusin":ae="focus",X=Zn;break;case"focusout":ae="blur",X=Zn;break;case"beforeblur":case"afterblur":X=Zn;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":X=pd;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":X=rg;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":X=wg;break;case jd:case Ud:case Md:X=ug;break;case zd:X=kg;break;case"scroll":X=sg;break;case"wheel":X=Rg;break;case"copy":case"cut":case"paste":X=pg;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":X=hd}var ne=(t&4)!==0,at=!ne&&e==="scroll",A=ne?L!==null?L+"Capture":null:L;ne=[];for(var b=T,I;b!==null;){I=b;var W=I.stateNode;if(I.tag===5&&W!==null&&(I=W,A!==null&&(W=ca(b,A),W!=null&&ne.push(Li(b,W,I)))),at)break;b=b.return}0<ne.length&&(L=new X(L,ae,null,o,_),q.push({event:L,listeners:ne}))}}if((t&7)===0){e:{if(L=e==="mouseover"||e==="pointerover",X=e==="mouseout"||e==="pointerout",L&&o!==Ha&&(ae=o.relatedTarget||o.fromElement)&&(ha(ae)||ae[bo]))break e;if((X||L)&&(L=_.window===_?_:(L=_.ownerDocument)?L.defaultView||L.parentWindow:window,X?(ae=o.relatedTarget||o.toElement,X=T,ae=ae?ha(ae):null,ae!==null&&(at=ee(ae),ae!==at||ae.tag!==5&&ae.tag!==6)&&(ae=null)):(X=null,ae=T),X!==ae)){if(ne=pd,W="onMouseLeave",A="onMouseEnter",b="mouse",(e==="pointerout"||e==="pointerover")&&(ne=hd,W="onPointerLeave",A="onPointerEnter",b="pointer"),at=X==null?L:Ya(X),I=ae==null?L:Ya(ae),L=new ne(W,b+"leave",X,o,_),L.target=at,L.relatedTarget=I,W=null,ha(_)===T&&(ne=new ne(A,b+"enter",ae,o,_),ne.target=I,ne.relatedTarget=at,W=ne),at=W,X&&ae)t:{for(ne=X,A=ae,b=0,I=ne;I;I=Fa(I))b++;for(I=0,W=A;W;W=Fa(W))I++;for(;0<b-I;)ne=Fa(ne),b--;for(;0<I-b;)A=Fa(A),I--;for(;b--;){if(ne===A||A!==null&&ne===A.alternate)break t;ne=Fa(ne),A=Fa(A)}ne=null}else ne=null;X!==null&&qd(q,L,X,ne,!1),ae!==null&&at!==null&&qd(q,at,ae,ne,!0)}}e:{if(L=T?Ya(T):window,X=L.nodeName&&L.nodeName.toLowerCase(),X==="select"||X==="input"&&L.type==="file")var re=Ug;else if(bd(L))if(wd)re=Lg;else{re=zg;var pe=Mg}else(X=L.nodeName)&&X.toLowerCase()==="input"&&(L.type==="checkbox"||L.type==="radio")&&(re=Hg);if(re&&(re=re(e,T))){Pd(q,re,o,_);break e}pe&&pe(e,L,T),e==="focusout"&&(pe=L._wrapperState)&&pe.controlled&&L.type==="number"&&Ma(L,"number",L.value)}switch(pe=T?Ya(T):window,e){case"focusin":(bd(pe)||pe.contentEditable==="true")&&(Ba=pe,ir=T,Mi=null);break;case"focusout":Mi=ir=Ba=null;break;case"mousedown":sr=!0;break;case"contextmenu":case"mouseup":case"dragend":sr=!1,Ed(q,o,_);break;case"selectionchange":if(Og)break;case"keydown":case"keyup":Ed(q,o,_)}var ge;if(er)e:{switch(e){case"compositionstart":var fe="onCompositionStart";break e;case"compositionend":fe="onCompositionEnd";break e;case"compositionupdate":fe="onCompositionUpdate";break e}fe=void 0}else qa?Sd(e,o)&&(fe="onCompositionEnd"):e==="keydown"&&o.keyCode===229&&(fe="onCompositionStart");fe&&(md&&o.locale!=="ko"&&(qa||fe!=="onCompositionStart"?fe==="onCompositionEnd"&&qa&&(ge=ud()):(Fo=_,Gn="value"in Fo?Fo.value:Fo.textContent,qa=!0)),pe=Ms(T,fe),0<pe.length&&(fe=new gd(fe,e,null,o,_),q.push({event:fe,listeners:pe}),ge?fe.data=ge:(ge=vd(o),ge!==null&&(fe.data=ge)))),(ge=Ig?Dg(e,o):Eg(e,o))&&(T=Ms(T,"onBeforeInput"),0<T.length&&(_=new gd("onBeforeInput","beforeinput",null,o,_),q.push({event:_,listeners:T}),_.data=ge))}Nd(q,t)})}function Li(e,t,o){return{instance:e,listener:t,currentTarget:o}}function Ms(e,t){for(var o=t+"Capture",a=[];e!==null;){var s=e,l=s.stateNode;s.tag===5&&l!==null&&(s=l,l=ca(e,o),l!=null&&a.unshift(Li(e,l,s)),l=ca(e,t),l!=null&&a.push(Li(e,l,s))),e=e.return}return a}function Fa(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function qd(e,t,o,a,s){for(var l=t._reactName,c=[];o!==null&&o!==a;){var m=o,S=m.alternate,T=m.stateNode;if(S!==null&&S===a)break;m.tag===5&&T!==null&&(m=T,s?(S=ca(o,l),S!=null&&c.unshift(Li(o,S,m))):s||(S=ca(o,l),S!=null&&c.push(Li(o,S,m)))),o=o.return}c.length!==0&&e.push({event:t,listeners:c})}var Fg=/\r\n?/g,Kg=/\u0000|\uFFFD/g;function Bd(e){return(typeof e=="string"?e:""+e).replace(Fg,`
|
|
39
|
+
`).replace(Kg,"")}function zs(e,t,o){if(t=Bd(t),Bd(e)!==t&&o)throw Error(r(425))}function Hs(){}var cr=null,pr=null;function gr(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 hr=typeof setTimeout=="function"?setTimeout:void 0,Yg=typeof clearTimeout=="function"?clearTimeout:void 0,Wd=typeof Promise=="function"?Promise:void 0,Vg=typeof queueMicrotask=="function"?queueMicrotask:typeof Wd<"u"?function(e){return Wd.resolve(null).then(e).catch(Gg)}:hr;function Gg(e){setTimeout(function(){throw e})}function mr(e,t){var o=t,a=0;do{var s=o.nextSibling;if(e.removeChild(o),s&&s.nodeType===8)if(o=s.data,o==="/$"){if(a===0){e.removeChild(s),Ai(t);return}a--}else o!=="$"&&o!=="$?"&&o!=="$!"||a++;o=s}while(o);Ai(t)}function Yo(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 Fd(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 Ka=Math.random().toString(36).slice(2),co="__reactFiber$"+Ka,_i="__reactProps$"+Ka,bo="__reactContainer$"+Ka,yr="__reactEvents$"+Ka,Xg="__reactListeners$"+Ka,$g="__reactHandles$"+Ka;function ha(e){var t=e[co];if(t)return t;for(var o=e.parentNode;o;){if(t=o[bo]||o[co]){if(o=t.alternate,t.child!==null||o!==null&&o.child!==null)for(e=Fd(e);e!==null;){if(o=e[co])return o;e=Fd(e)}return t}e=o,o=e.parentNode}return null}function Ni(e){return e=e[co]||e[bo],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function Ya(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(r(33))}function Ls(e){return e[_i]||null}var fr=[],Va=-1;function Vo(e){return{current:e}}function Ge(e){0>Va||(e.current=fr[Va],fr[Va]=null,Va--)}function Fe(e,t){Va++,fr[Va]=e.current,e.current=t}var Go={},ft=Vo(Go),Ct=Vo(!1),ma=Go;function Ga(e,t){var o=e.type.contextTypes;if(!o)return Go;var a=e.stateNode;if(a&&a.__reactInternalMemoizedUnmaskedChildContext===t)return a.__reactInternalMemoizedMaskedChildContext;var s={},l;for(l in o)s[l]=t[l];return a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function kt(e){return e=e.childContextTypes,e!=null}function _s(){Ge(Ct),Ge(ft)}function Kd(e,t,o){if(ft.current!==Go)throw Error(r(168));Fe(ft,t),Fe(Ct,o)}function Yd(e,t,o){var a=e.stateNode;if(t=t.childContextTypes,typeof a.getChildContext!="function")return o;a=a.getChildContext();for(var s in a)if(!(s in t))throw Error(r(108,we(e)||"Unknown",s));return G({},o,a)}function Ns(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Go,ma=ft.current,Fe(ft,e),Fe(Ct,Ct.current),!0}function Vd(e,t,o){var a=e.stateNode;if(!a)throw Error(r(169));o?(e=Yd(e,t,ma),a.__reactInternalMemoizedMergedChildContext=e,Ge(Ct),Ge(ft),Fe(ft,e)):Ge(Ct),Fe(Ct,o)}var Po=null,Os=!1,Sr=!1;function Gd(e){Po===null?Po=[e]:Po.push(e)}function Qg(e){Os=!0,Gd(e)}function Xo(){if(!Sr&&Po!==null){Sr=!0;var e=0,t=Oe;try{var o=Po;for(Oe=1;e<o.length;e++){var a=o[e];do a=a(!0);while(a!==null)}Po=null,Os=!1}catch(s){throw Po!==null&&(Po=Po.slice(e+1)),Ye(So,Xo),s}finally{Oe=t,Sr=!1}}return null}var Xa=[],$a=0,qs=null,Bs=0,_t=[],Nt=0,ya=null,wo=1,Co="";function fa(e,t){Xa[$a++]=Bs,Xa[$a++]=qs,qs=e,Bs=t}function Xd(e,t,o){_t[Nt++]=wo,_t[Nt++]=Co,_t[Nt++]=ya,ya=e;var a=wo;e=Co;var s=32-Me(a)-1;a&=~(1<<s),o+=1;var l=32-Me(t)+s;if(30<l){var c=s-s%5;l=(a&(1<<c)-1).toString(32),a>>=c,s-=c,wo=1<<32-Me(t)+s|o<<s|a,Co=l+e}else wo=1<<l|o<<s|a,Co=e}function vr(e){e.return!==null&&(fa(e,1),Xd(e,1,0))}function br(e){for(;e===qs;)qs=Xa[--$a],Xa[$a]=null,Bs=Xa[--$a],Xa[$a]=null;for(;e===ya;)ya=_t[--Nt],_t[Nt]=null,Co=_t[--Nt],_t[Nt]=null,wo=_t[--Nt],_t[Nt]=null}var Ut=null,Mt=null,Xe=!1,Qt=null;function $d(e,t){var o=Wt(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 Qd(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,Mt=Yo(t.firstChild),!0):!1;case 6:return t=e.pendingProps===""||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,Ut=e,Mt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(o=ya!==null?{id:wo,overflow:Co}:null,e.memoizedState={dehydrated:t,treeContext:o,retryLane:1073741824},o=Wt(18,null,null,0),o.stateNode=t,o.return=e,e.child=o,Ut=e,Mt=null,!0):!1;default:return!1}}function Pr(e){return(e.mode&1)!==0&&(e.flags&128)===0}function wr(e){if(Xe){var t=Mt;if(t){var o=t;if(!Qd(e,t)){if(Pr(e))throw Error(r(418));t=Yo(o.nextSibling);var a=Ut;t&&Qd(e,t)?$d(a,o):(e.flags=e.flags&-4097|2,Xe=!1,Ut=e)}}else{if(Pr(e))throw Error(r(418));e.flags=e.flags&-4097|2,Xe=!1,Ut=e}}}function Zd(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;Ut=e}function Ws(e){if(e!==Ut)return!1;if(!Xe)return Zd(e),Xe=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!=="head"&&t!=="body"&&!gr(e.type,e.memoizedProps)),t&&(t=Mt)){if(Pr(e))throw Jd(),Error(r(418));for(;t;)$d(e,t),t=Yo(t.nextSibling)}if(Zd(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(r(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var o=e.data;if(o==="/$"){if(t===0){Mt=Yo(e.nextSibling);break e}t--}else o!=="$"&&o!=="$!"&&o!=="$?"||t++}e=e.nextSibling}Mt=null}}else Mt=Ut?Yo(e.stateNode.nextSibling):null;return!0}function Jd(){for(var e=Mt;e;)e=Yo(e.nextSibling)}function Qa(){Mt=Ut=null,Xe=!1}function Cr(e){Qt===null?Qt=[e]:Qt.push(e)}var Zg=V.ReactCurrentBatchConfig;function Oi(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(r(309));var a=o.stateNode}if(!a)throw Error(r(147,e));var s=a,l=""+e;return t!==null&&t.ref!==null&&typeof t.ref=="function"&&t.ref._stringRef===l?t.ref:(t=function(c){var m=s.refs;c===null?delete m[l]:m[l]=c},t._stringRef=l,t)}if(typeof e!="string")throw Error(r(284));if(!o._owner)throw Error(r(290,e))}return e}function Fs(e,t){throw e=Object.prototype.toString.call(t),Error(r(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function eu(e){var t=e._init;return t(e._payload)}function tu(e){function t(A,b){if(e){var I=A.deletions;I===null?(A.deletions=[b],A.flags|=16):I.push(b)}}function o(A,b){if(!e)return null;for(;b!==null;)t(A,b),b=b.sibling;return null}function a(A,b){for(A=new Map;b!==null;)b.key!==null?A.set(b.key,b):A.set(b.index,b),b=b.sibling;return A}function s(A,b){return A=aa(A,b),A.index=0,A.sibling=null,A}function l(A,b,I){return A.index=I,e?(I=A.alternate,I!==null?(I=I.index,I<b?(A.flags|=2,b):I):(A.flags|=2,b)):(A.flags|=1048576,b)}function c(A){return e&&A.alternate===null&&(A.flags|=2),A}function m(A,b,I,W){return b===null||b.tag!==6?(b=hl(I,A.mode,W),b.return=A,b):(b=s(b,I),b.return=A,b)}function S(A,b,I,W){var re=I.type;return re===E?_(A,b,I.props.children,W,I.key):b!==null&&(b.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===ot&&eu(re)===b.type)?(W=s(b,I.props),W.ref=Oi(A,b,I),W.return=A,W):(W=mn(I.type,I.key,I.props,null,A.mode,W),W.ref=Oi(A,b,I),W.return=A,W)}function T(A,b,I,W){return b===null||b.tag!==4||b.stateNode.containerInfo!==I.containerInfo||b.stateNode.implementation!==I.implementation?(b=ml(I,A.mode,W),b.return=A,b):(b=s(b,I.children||[]),b.return=A,b)}function _(A,b,I,W,re){return b===null||b.tag!==7?(b=xa(I,A.mode,W,re),b.return=A,b):(b=s(b,I),b.return=A,b)}function q(A,b,I){if(typeof b=="string"&&b!==""||typeof b=="number")return b=hl(""+b,A.mode,I),b.return=A,b;if(typeof b=="object"&&b!==null){switch(b.$$typeof){case he:return I=mn(b.type,b.key,b.props,null,A.mode,I),I.ref=Oi(A,null,b),I.return=A,I;case De:return b=ml(b,A.mode,I),b.return=A,b;case ot:var W=b._init;return q(A,W(b._payload),I)}if(la(b)||de(b))return b=xa(b,A.mode,I,null),b.return=A,b;Fs(A,b)}return null}function L(A,b,I,W){var re=b!==null?b.key:null;if(typeof I=="string"&&I!==""||typeof I=="number")return re!==null?null:m(A,b,""+I,W);if(typeof I=="object"&&I!==null){switch(I.$$typeof){case he:return I.key===re?S(A,b,I,W):null;case De:return I.key===re?T(A,b,I,W):null;case ot:return re=I._init,L(A,b,re(I._payload),W)}if(la(I)||de(I))return re!==null?null:_(A,b,I,W,null);Fs(A,I)}return null}function X(A,b,I,W,re){if(typeof W=="string"&&W!==""||typeof W=="number")return A=A.get(I)||null,m(b,A,""+W,re);if(typeof W=="object"&&W!==null){switch(W.$$typeof){case he:return A=A.get(W.key===null?I:W.key)||null,S(b,A,W,re);case De:return A=A.get(W.key===null?I:W.key)||null,T(b,A,W,re);case ot:var pe=W._init;return X(A,b,I,pe(W._payload),re)}if(la(W)||de(W))return A=A.get(I)||null,_(b,A,W,re,null);Fs(b,W)}return null}function ae(A,b,I,W){for(var re=null,pe=null,ge=b,fe=b=0,pt=null;ge!==null&&fe<I.length;fe++){ge.index>fe?(pt=ge,ge=null):pt=ge.sibling;var ze=L(A,ge,I[fe],W);if(ze===null){ge===null&&(ge=pt);break}e&&ge&&ze.alternate===null&&t(A,ge),b=l(ze,b,fe),pe===null?re=ze:pe.sibling=ze,pe=ze,ge=pt}if(fe===I.length)return o(A,ge),Xe&&fa(A,fe),re;if(ge===null){for(;fe<I.length;fe++)ge=q(A,I[fe],W),ge!==null&&(b=l(ge,b,fe),pe===null?re=ge:pe.sibling=ge,pe=ge);return Xe&&fa(A,fe),re}for(ge=a(A,ge);fe<I.length;fe++)pt=X(ge,A,fe,I[fe],W),pt!==null&&(e&&pt.alternate!==null&&ge.delete(pt.key===null?fe:pt.key),b=l(pt,b,fe),pe===null?re=pt:pe.sibling=pt,pe=pt);return e&&ge.forEach(function(ia){return t(A,ia)}),Xe&&fa(A,fe),re}function ne(A,b,I,W){var re=de(I);if(typeof re!="function")throw Error(r(150));if(I=re.call(I),I==null)throw Error(r(151));for(var pe=re=null,ge=b,fe=b=0,pt=null,ze=I.next();ge!==null&&!ze.done;fe++,ze=I.next()){ge.index>fe?(pt=ge,ge=null):pt=ge.sibling;var ia=L(A,ge,ze.value,W);if(ia===null){ge===null&&(ge=pt);break}e&&ge&&ia.alternate===null&&t(A,ge),b=l(ia,b,fe),pe===null?re=ia:pe.sibling=ia,pe=ia,ge=pt}if(ze.done)return o(A,ge),Xe&&fa(A,fe),re;if(ge===null){for(;!ze.done;fe++,ze=I.next())ze=q(A,ze.value,W),ze!==null&&(b=l(ze,b,fe),pe===null?re=ze:pe.sibling=ze,pe=ze);return Xe&&fa(A,fe),re}for(ge=a(A,ge);!ze.done;fe++,ze=I.next())ze=X(ge,A,fe,ze.value,W),ze!==null&&(e&&ze.alternate!==null&&ge.delete(ze.key===null?fe:ze.key),b=l(ze,b,fe),pe===null?re=ze:pe.sibling=ze,pe=ze);return e&&ge.forEach(function(Th){return t(A,Th)}),Xe&&fa(A,fe),re}function at(A,b,I,W){if(typeof I=="object"&&I!==null&&I.type===E&&I.key===null&&(I=I.props.children),typeof I=="object"&&I!==null){switch(I.$$typeof){case he:e:{for(var re=I.key,pe=b;pe!==null;){if(pe.key===re){if(re=I.type,re===E){if(pe.tag===7){o(A,pe.sibling),b=s(pe,I.props.children),b.return=A,A=b;break e}}else if(pe.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===ot&&eu(re)===pe.type){o(A,pe.sibling),b=s(pe,I.props),b.ref=Oi(A,pe,I),b.return=A,A=b;break e}o(A,pe);break}else t(A,pe);pe=pe.sibling}I.type===E?(b=xa(I.props.children,A.mode,W,I.key),b.return=A,A=b):(W=mn(I.type,I.key,I.props,null,A.mode,W),W.ref=Oi(A,b,I),W.return=A,A=W)}return c(A);case De:e:{for(pe=I.key;b!==null;){if(b.key===pe)if(b.tag===4&&b.stateNode.containerInfo===I.containerInfo&&b.stateNode.implementation===I.implementation){o(A,b.sibling),b=s(b,I.children||[]),b.return=A,A=b;break e}else{o(A,b);break}else t(A,b);b=b.sibling}b=ml(I,A.mode,W),b.return=A,A=b}return c(A);case ot:return pe=I._init,at(A,b,pe(I._payload),W)}if(la(I))return ae(A,b,I,W);if(de(I))return ne(A,b,I,W);Fs(A,I)}return typeof I=="string"&&I!==""||typeof I=="number"?(I=""+I,b!==null&&b.tag===6?(o(A,b.sibling),b=s(b,I),b.return=A,A=b):(o(A,b),b=hl(I,A.mode,W),b.return=A,A=b),c(A)):o(A,b)}return at}var Za=tu(!0),ou=tu(!1),Ks=Vo(null),Ys=null,Ja=null,kr=null;function xr(){kr=Ja=Ys=null}function Rr(e){var t=Ks.current;Ge(Ks),e._currentValue=t}function Ar(e,t,o){for(;e!==null;){var a=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,a!==null&&(a.childLanes|=t)):a!==null&&(a.childLanes&t)!==t&&(a.childLanes|=t),e===o)break;e=e.return}}function ei(e,t){Ys=e,kr=Ja=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(xt=!0),e.firstContext=null)}function Ot(e){var t=e._currentValue;if(kr!==e)if(e={context:e,memoizedValue:t,next:null},Ja===null){if(Ys===null)throw Error(r(308));Ja=e,Ys.dependencies={lanes:0,firstContext:e}}else Ja=Ja.next=e;return t}var Sa=null;function Ir(e){Sa===null?Sa=[e]:Sa.push(e)}function au(e,t,o,a){var s=t.interleaved;return s===null?(o.next=o,Ir(t)):(o.next=s.next,s.next=o),t.interleaved=o,ko(e,a)}function ko(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 Dr(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function iu(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 xo(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Qo(e,t,o){var a=e.updateQueue;if(a===null)return null;if(a=a.shared,(Ee&2)!==0){var s=a.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),a.pending=t,ko(e,o)}return s=a.interleaved,s===null?(t.next=t,Ir(a)):(t.next=s.next,s.next=t),a.interleaved=t,ko(e,o)}function Vs(e,t,o){if(t=t.updateQueue,t!==null&&(t=t.shared,(o&4194240)!==0)){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}function su(e,t){var o=e.updateQueue,a=e.alternate;if(a!==null&&(a=a.updateQueue,o===a)){var s=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?s=l=c:l=l.next=c,o=o.next}while(o!==null);l===null?s=l=t:l=l.next=t}else s=l=t;o={baseState:a.baseState,firstBaseUpdate:s,lastBaseUpdate:l,shared:a.shared,effects:a.effects},e.updateQueue=o;return}e=o.lastBaseUpdate,e===null?o.firstBaseUpdate=t:e.next=t,o.lastBaseUpdate=t}function Gs(e,t,o,a){var s=e.updateQueue;$o=!1;var l=s.firstBaseUpdate,c=s.lastBaseUpdate,m=s.shared.pending;if(m!==null){s.shared.pending=null;var S=m,T=S.next;S.next=null,c===null?l=T:c.next=T,c=S;var _=e.alternate;_!==null&&(_=_.updateQueue,m=_.lastBaseUpdate,m!==c&&(m===null?_.firstBaseUpdate=T:m.next=T,_.lastBaseUpdate=S))}if(l!==null){var q=s.baseState;c=0,_=T=S=null,m=l;do{var L=m.lane,X=m.eventTime;if((a&L)===L){_!==null&&(_=_.next={eventTime:X,lane:0,tag:m.tag,payload:m.payload,callback:m.callback,next:null});e:{var ae=e,ne=m;switch(L=t,X=o,ne.tag){case 1:if(ae=ne.payload,typeof ae=="function"){q=ae.call(X,q,L);break e}q=ae;break e;case 3:ae.flags=ae.flags&-65537|128;case 0:if(ae=ne.payload,L=typeof ae=="function"?ae.call(X,q,L):ae,L==null)break e;q=G({},q,L);break e;case 2:$o=!0}}m.callback!==null&&m.lane!==0&&(e.flags|=64,L=s.effects,L===null?s.effects=[m]:L.push(m))}else X={eventTime:X,lane:L,tag:m.tag,payload:m.payload,callback:m.callback,next:null},_===null?(T=_=X,S=q):_=_.next=X,c|=L;if(m=m.next,m===null){if(m=s.shared.pending,m===null)break;L=m,m=L.next,L.next=null,s.lastBaseUpdate=L,s.shared.pending=null}}while(!0);if(_===null&&(S=q),s.baseState=S,s.firstBaseUpdate=T,s.lastBaseUpdate=_,t=s.shared.interleaved,t!==null){s=t;do c|=s.lane,s=s.next;while(s!==t)}else l===null&&(s.shared.lanes=0);Pa|=c,e.lanes=c,e.memoizedState=q}}function nu(e,t,o){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var a=e[t],s=a.callback;if(s!==null){if(a.callback=null,a=o,typeof s!="function")throw Error(r(191,s));s.call(a)}}}var qi={},po=Vo(qi),Bi=Vo(qi),Wi=Vo(qi);function va(e){if(e===qi)throw Error(r(174));return e}function Er(e,t){switch(Fe(Wi,t),Fe(Bi,e),Fe(po,qi),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:da(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=da(t,e)}Ge(po),Fe(po,t)}function ti(){Ge(po),Ge(Bi),Ge(Wi)}function ru(e){va(Wi.current);var t=va(po.current),o=da(t,e.type);t!==o&&(Fe(Bi,e),Fe(po,o))}function Tr(e){Bi.current===e&&(Ge(po),Ge(Bi))}var Qe=Vo(0);function Xs(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 jr=[];function Ur(){for(var e=0;e<jr.length;e++)jr[e]._workInProgressVersionPrimary=null;jr.length=0}var $s=V.ReactCurrentDispatcher,Mr=V.ReactCurrentBatchConfig,ba=0,Ze=null,rt=null,ut=null,Qs=!1,Fi=!1,Ki=0,Jg=0;function St(){throw Error(r(321))}function zr(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 Hr(e,t,o,a,s,l){if(ba=l,Ze=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,$s.current=e===null||e.memoizedState===null?ah:ih,e=o(a,s),Fi){l=0;do{if(Fi=!1,Ki=0,25<=l)throw Error(r(301));l+=1,ut=rt=null,t.updateQueue=null,$s.current=sh,e=o(a,s)}while(Fi)}if($s.current=en,t=rt!==null&&rt.next!==null,ba=0,ut=rt=Ze=null,Qs=!1,t)throw Error(r(300));return e}function Lr(){var e=Ki!==0;return Ki=0,e}function go(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return ut===null?Ze.memoizedState=ut=e:ut=ut.next=e,ut}function qt(){if(rt===null){var e=Ze.alternate;e=e!==null?e.memoizedState:null}else e=rt.next;var t=ut===null?Ze.memoizedState:ut.next;if(t!==null)ut=t,rt=e;else{if(e===null)throw Error(r(310));rt=e,e={memoizedState:rt.memoizedState,baseState:rt.baseState,baseQueue:rt.baseQueue,queue:rt.queue,next:null},ut===null?Ze.memoizedState=ut=e:ut=ut.next=e}return ut}function Yi(e,t){return typeof t=="function"?t(e):t}function _r(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=rt,s=a.baseQueue,l=o.pending;if(l!==null){if(s!==null){var c=s.next;s.next=l.next,l.next=c}a.baseQueue=s=l,o.pending=null}if(s!==null){l=s.next,a=a.baseState;var m=c=null,S=null,T=l;do{var _=T.lane;if((ba&_)===_)S!==null&&(S=S.next={lane:0,action:T.action,hasEagerState:T.hasEagerState,eagerState:T.eagerState,next:null}),a=T.hasEagerState?T.eagerState:e(a,T.action);else{var q={lane:_,action:T.action,hasEagerState:T.hasEagerState,eagerState:T.eagerState,next:null};S===null?(m=S=q,c=a):S=S.next=q,Ze.lanes|=_,Pa|=_}T=T.next}while(T!==null&&T!==l);S===null?c=a:S.next=m,$t(a,t.memoizedState)||(xt=!0),t.memoizedState=a,t.baseState=c,t.baseQueue=S,o.lastRenderedState=a}if(e=o.interleaved,e!==null){s=e;do l=s.lane,Ze.lanes|=l,Pa|=l,s=s.next;while(s!==e)}else s===null&&(o.lanes=0);return[t.memoizedState,o.dispatch]}function Nr(e){var t=qt(),o=t.queue;if(o===null)throw Error(r(311));o.lastRenderedReducer=e;var a=o.dispatch,s=o.pending,l=t.memoizedState;if(s!==null){o.pending=null;var c=s=s.next;do l=e(l,c.action),c=c.next;while(c!==s);$t(l,t.memoizedState)||(xt=!0),t.memoizedState=l,t.baseQueue===null&&(t.baseState=l),o.lastRenderedState=l}return[l,a]}function lu(){}function du(e,t){var o=Ze,a=qt(),s=t(),l=!$t(a.memoizedState,s);if(l&&(a.memoizedState=s,xt=!0),a=a.queue,Or(pu.bind(null,o,a,e),[e]),a.getSnapshot!==t||l||ut!==null&&ut.memoizedState.tag&1){if(o.flags|=2048,Vi(9,cu.bind(null,o,a,s,t),void 0,null),ct===null)throw Error(r(349));(ba&30)!==0||uu(o,t,s)}return s}function uu(e,t,o){e.flags|=16384,e={getSnapshot:t,value:o},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.stores=[e]):(o=t.stores,o===null?t.stores=[e]:o.push(e))}function cu(e,t,o,a){t.value=o,t.getSnapshot=a,gu(t)&&hu(e)}function pu(e,t,o){return o(function(){gu(t)&&hu(e)})}function gu(e){var t=e.getSnapshot;e=e.value;try{var o=t();return!$t(e,o)}catch{return!0}}function hu(e){var t=ko(e,1);t!==null&&to(t,e,1,-1)}function mu(e){var t=go();return typeof e=="function"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Yi,lastRenderedState:e},t.queue=e,e=e.dispatch=oh.bind(null,Ze,e),[t.memoizedState,e]}function Vi(e,t,o,a){return e={tag:e,create:t,destroy:o,deps:a,next:null},t=Ze.updateQueue,t===null?(t={lastEffect:null,stores:null},Ze.updateQueue=t,t.lastEffect=e.next=e):(o=t.lastEffect,o===null?t.lastEffect=e.next=e:(a=o.next,o.next=e,e.next=a,t.lastEffect=e)),e}function yu(){return qt().memoizedState}function Zs(e,t,o,a){var s=go();Ze.flags|=e,s.memoizedState=Vi(1|t,o,void 0,a===void 0?null:a)}function Js(e,t,o,a){var s=qt();a=a===void 0?null:a;var l=void 0;if(rt!==null){var c=rt.memoizedState;if(l=c.destroy,a!==null&&zr(a,c.deps)){s.memoizedState=Vi(t,o,l,a);return}}Ze.flags|=e,s.memoizedState=Vi(1|t,o,l,a)}function fu(e,t){return Zs(8390656,8,e,t)}function Or(e,t){return Js(2048,8,e,t)}function Su(e,t){return Js(4,2,e,t)}function vu(e,t){return Js(4,4,e,t)}function bu(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 Pu(e,t,o){return o=o!=null?o.concat([e]):null,Js(4,4,bu.bind(null,t,e),o)}function qr(){}function wu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&zr(t,a[1])?a[0]:(o.memoizedState=[e,t],e)}function Cu(e,t){var o=qt();t=t===void 0?null:t;var a=o.memoizedState;return a!==null&&t!==null&&zr(t,a[1])?a[0]:(e=e(),o.memoizedState=[e,t],e)}function ku(e,t,o){return(ba&21)===0?(e.baseState&&(e.baseState=!1,xt=!0),e.memoizedState=o):($t(o,t)||(o=ed(),Ze.lanes|=o,Pa|=o,e.baseState=!0),t)}function eh(e,t){var o=Oe;Oe=o!==0&&4>o?o:4,e(!0);var a=Mr.transition;Mr.transition={};try{e(!1),t()}finally{Oe=o,Mr.transition=a}}function xu(){return qt().memoizedState}function th(e,t,o){var a=ta(e);if(o={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null},Ru(e))Au(t,o);else if(o=au(e,t,o,a),o!==null){var s=wt();to(o,e,a,s),Iu(o,t,a)}}function oh(e,t,o){var a=ta(e),s={lane:a,action:o,hasEagerState:!1,eagerState:null,next:null};if(Ru(e))Au(t,s);else{var l=e.alternate;if(e.lanes===0&&(l===null||l.lanes===0)&&(l=t.lastRenderedReducer,l!==null))try{var c=t.lastRenderedState,m=l(c,o);if(s.hasEagerState=!0,s.eagerState=m,$t(m,c)){var S=t.interleaved;S===null?(s.next=s,Ir(t)):(s.next=S.next,S.next=s),t.interleaved=s;return}}catch{}finally{}o=au(e,t,s,a),o!==null&&(s=wt(),to(o,e,a,s),Iu(o,t,a))}}function Ru(e){var t=e.alternate;return e===Ze||t!==null&&t===Ze}function Au(e,t){Fi=Qs=!0;var o=e.pending;o===null?t.next=t:(t.next=o.next,o.next=t),e.pending=t}function Iu(e,t,o){if((o&4194240)!==0){var a=t.lanes;a&=e.pendingLanes,o|=a,t.lanes=o,Wn(e,o)}}var en={readContext:Ot,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},ah={readContext:Ot,useCallback:function(e,t){return go().memoizedState=[e,t===void 0?null:t],e},useContext:Ot,useEffect:fu,useImperativeHandle:function(e,t,o){return o=o!=null?o.concat([e]):null,Zs(4194308,4,bu.bind(null,t,e),o)},useLayoutEffect:function(e,t){return Zs(4194308,4,e,t)},useInsertionEffect:function(e,t){return Zs(4,2,e,t)},useMemo:function(e,t){var o=go();return t=t===void 0?null:t,e=e(),o.memoizedState=[e,t],e},useReducer:function(e,t,o){var a=go();return t=o!==void 0?o(t):t,a.memoizedState=a.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},a.queue=e,e=e.dispatch=th.bind(null,Ze,e),[a.memoizedState,e]},useRef:function(e){var t=go();return e={current:e},t.memoizedState=e},useState:mu,useDebugValue:qr,useDeferredValue:function(e){return go().memoizedState=e},useTransition:function(){var e=mu(!1),t=e[0];return e=eh.bind(null,e[1]),go().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,o){var a=Ze,s=go();if(Xe){if(o===void 0)throw Error(r(407));o=o()}else{if(o=t(),ct===null)throw Error(r(349));(ba&30)!==0||uu(a,t,o)}s.memoizedState=o;var l={value:o,getSnapshot:t};return s.queue=l,fu(pu.bind(null,a,l,e),[e]),a.flags|=2048,Vi(9,cu.bind(null,a,l,o,t),void 0,null),o},useId:function(){var e=go(),t=ct.identifierPrefix;if(Xe){var o=Co,a=wo;o=(a&~(1<<32-Me(a)-1)).toString(32)+o,t=":"+t+"R"+o,o=Ki++,0<o&&(t+="H"+o.toString(32)),t+=":"}else o=Jg++,t=":"+t+"r"+o.toString(32)+":";return e.memoizedState=t},unstable_isNewReconciler:!1},ih={readContext:Ot,useCallback:wu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:Cu,useReducer:_r,useRef:yu,useState:function(){return _r(Yi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return ku(t,rt.memoizedState,e)},useTransition:function(){var e=_r(Yi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1},sh={readContext:Ot,useCallback:wu,useContext:Ot,useEffect:Or,useImperativeHandle:Pu,useInsertionEffect:Su,useLayoutEffect:vu,useMemo:Cu,useReducer:Nr,useRef:yu,useState:function(){return Nr(Yi)},useDebugValue:qr,useDeferredValue:function(e){var t=qt();return rt===null?t.memoizedState=e:ku(t,rt.memoizedState,e)},useTransition:function(){var e=Nr(Yi)[0],t=qt().memoizedState;return[e,t]},useMutableSource:lu,useSyncExternalStore:du,useId:xu,unstable_isNewReconciler:!1};function Zt(e,t){if(e&&e.defaultProps){t=G({},t),e=e.defaultProps;for(var o in e)t[o]===void 0&&(t[o]=e[o]);return t}return t}function Br(e,t,o,a){t=e.memoizedState,o=o(a,t),o=o==null?t:G({},t,o),e.memoizedState=o,e.lanes===0&&(e.updateQueue.baseState=o)}var tn={isMounted:function(e){return(e=e._reactInternals)?ee(e)===e:!1},enqueueSetState:function(e,t,o){e=e._reactInternals;var a=wt(),s=ta(e),l=xo(a,s);l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Vs(t,e,s))},enqueueReplaceState:function(e,t,o){e=e._reactInternals;var a=wt(),s=ta(e),l=xo(a,s);l.tag=1,l.payload=t,o!=null&&(l.callback=o),t=Qo(e,l,s),t!==null&&(to(t,e,s,a),Vs(t,e,s))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var o=wt(),a=ta(e),s=xo(o,a);s.tag=2,t!=null&&(s.callback=t),t=Qo(e,s,a),t!==null&&(to(t,e,a,o),Vs(t,e,a))}};function Du(e,t,o,a,s,l,c){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(a,l,c):t.prototype&&t.prototype.isPureReactComponent?!Ui(o,a)||!Ui(s,l):!0}function Eu(e,t,o){var a=!1,s=Go,l=t.contextType;return typeof l=="object"&&l!==null?l=Ot(l):(s=kt(t)?ma:ft.current,a=t.contextTypes,l=(a=a!=null)?Ga(e,s):Go),t=new t(o,l),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=tn,e.stateNode=t,t._reactInternals=e,a&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=s,e.__reactInternalMemoizedMaskedChildContext=l),t}function Tu(e,t,o,a){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(o,a),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(o,a),t.state!==e&&tn.enqueueReplaceState(t,t.state,null)}function Wr(e,t,o,a){var s=e.stateNode;s.props=o,s.state=e.memoizedState,s.refs={},Dr(e);var l=t.contextType;typeof l=="object"&&l!==null?s.context=Ot(l):(l=kt(t)?ma:ft.current,s.context=Ga(e,l)),s.state=e.memoizedState,l=t.getDerivedStateFromProps,typeof l=="function"&&(Br(e,t,l,o),s.state=e.memoizedState),typeof t.getDerivedStateFromProps=="function"||typeof s.getSnapshotBeforeUpdate=="function"||typeof s.UNSAFE_componentWillMount!="function"&&typeof s.componentWillMount!="function"||(t=s.state,typeof s.componentWillMount=="function"&&s.componentWillMount(),typeof s.UNSAFE_componentWillMount=="function"&&s.UNSAFE_componentWillMount(),t!==s.state&&tn.enqueueReplaceState(s,s.state,null),Gs(e,o,s,a),s.state=e.memoizedState),typeof s.componentDidMount=="function"&&(e.flags|=4194308)}function oi(e,t){try{var o="",a=t;do o+=ie(a),a=a.return;while(a);var s=o}catch(l){s=`
|
|
40
40
|
Error generating stack: `+l.message+`
|
|
41
|
-
`+l.stack}return{value:e,source:t,stack:s,digest:null}}function Fr(e,t,o){return{value:e,source:null,stack:o??null,digest:t??null}}function Kr(e,t){try{console.error(t.value)}catch(o){setTimeout(function(){throw o})}}var nh=typeof WeakMap=="function"?WeakMap:Map;function ju(e,t,o){o=xo(-1,o),o.tag=3,o.payload={element:null};var a=t.value;return o.callback=function(){dn||(dn=!0,nl=a),Kr(e,t)},o}function Uu(e,t,o){o=xo(-1,o),o.tag=3;var a=e.type.getDerivedStateFromError;if(typeof a=="function"){var s=t.value;o.payload=function(){return a(s)},o.callback=function(){Kr(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(o.callback=function(){Kr(e,t),typeof a!="function"&&(Jo===null?Jo=new Set([this]):Jo.add(this));var c=t.stack;this.componentDidCatch(t.value,{componentStack:c!==null?c:""})}),o}function Mu(e,t,o){var a=e.pingCache;if(a===null){a=e.pingCache=new nh;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(o)||(s.add(o),e=bh.bind(null,e,t,o),t.then(e,e))}function zu(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 Hu(e,t,o,a,s){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=xo(-1,1),t.tag=2,Qo(o,t,1))),o.lanes|=1),e):(e.flags|=65536,e.lanes=s,e)}var rh=G.ReactCurrentOwner,xt=!1;function Pt(e,t,o,a){t.child=e===null?ou(t,null,o,a):Za(t,e.child,o,a)}function Lu(e,t,o,a,s){o=o.render;var l=t.ref;return ei(t,s),a=Hr(e,t,o,a,l,s),o=Lr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):(Xe&&o&&vr(t),t.flags|=1,Pt(e,t,a,s),t.child)}function _u(e,t,o,a,s){if(e===null){var l=o.type;return typeof l=="function"&&!gl(l)&&l.defaultProps===void 0&&o.compare===null&&o.defaultProps===void 0?(t.tag=15,t.type=l,Nu(e,t,l,a,s)):(e=mn(o.type,null,a,t,t.mode,s),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&s)===0){var c=l.memoizedProps;if(o=o.compare,o=o!==null?o:Ui,o(c,a)&&e.ref===t.ref)return Ro(e,t,s)}return t.flags|=1,e=aa(l,a),e.ref=t.ref,e.return=t,t.child=e}function Nu(e,t,o,a,s){if(e!==null){var l=e.memoizedProps;if(Ui(l,a)&&e.ref===t.ref)if(xt=!1,t.pendingProps=a=l,(e.lanes&s)!==0)(e.flags&131072)!==0&&(xt=!0);else return t.lanes=e.lanes,Ro(e,t,s)}return Yr(e,t,o,a,s)}function Ou(e,t,o){var a=t.pendingProps,s=a.children,l=e!==null?e.memoizedState:null;if(a.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(ii,zt),zt|=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,Fe(ii,zt),zt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},a=l!==null?l.baseLanes:o,Fe(ii,zt),zt|=a}else l!==null?(a=l.baseLanes|o,t.memoizedState=null):a=o,Fe(ii,zt),zt|=a;return Pt(e,t,s,o),t.child}function qu(e,t){var o=t.ref;(e===null&&o!==null||e!==null&&e.ref!==o)&&(t.flags|=512,t.flags|=2097152)}function Yr(e,t,o,a,s){var l=kt(o)?ma:ft.current;return l=Va(t,l),ei(t,s),o=Hr(e,t,o,a,l,s),a=Lr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):(Xe&&a&&vr(t),t.flags|=1,Pt(e,t,o,s),t.child)}function Bu(e,t,o,a,s){if(kt(o)){var l=!0;Ns(t)}else l=!1;if(ei(t,s),t.stateNode===null)an(e,t),Eu(t,o,a),Wr(t,o,a,s),a=!0;else if(e===null){var c=t.stateNode,m=t.memoizedProps;c.props=m;var S=c.context,T=o.contextType;typeof T=="object"&&T!==null?T=Ot(T):(T=kt(o)?ma:ft.current,T=Va(t,T));var _=o.getDerivedStateFromProps,q=typeof _=="function"||typeof c.getSnapshotBeforeUpdate=="function";q||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==a||S!==T)&&Tu(t,c,a,T),$o=!1;var L=t.memoizedState;c.state=L,Vs(t,a,c,s),S=t.memoizedState,m!==a||L!==S||Ct.current||$o?(typeof _=="function"&&(Br(t,o,_,a),S=t.memoizedState),(m=$o||Du(t,o,m,a,L,S,T))?(q||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=a,t.memoizedState=S),c.props=a,c.state=S,c.context=T,a=m):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{c=t.stateNode,iu(e,t),m=t.memoizedProps,T=t.type===t.elementType?m:Zt(t.type,m),c.props=T,q=t.pendingProps,L=c.context,S=o.contextType,typeof S=="object"&&S!==null?S=Ot(S):(S=kt(o)?ma:ft.current,S=Va(t,S));var X=o.getDerivedStateFromProps;(_=typeof X=="function"||typeof c.getSnapshotBeforeUpdate=="function")||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==q||L!==S)&&Tu(t,c,a,S),$o=!1,L=t.memoizedState,c.state=L,Vs(t,a,c,s);var ae=t.memoizedState;m!==q||L!==ae||Ct.current||$o?(typeof X=="function"&&(Br(t,o,X,a),ae=t.memoizedState),(T=$o||Du(t,o,T,a,L,ae,S)||!1)?(_||typeof c.UNSAFE_componentWillUpdate!="function"&&typeof c.componentWillUpdate!="function"||(typeof c.componentWillUpdate=="function"&&c.componentWillUpdate(a,ae,S),typeof c.UNSAFE_componentWillUpdate=="function"&&c.UNSAFE_componentWillUpdate(a,ae,S)),typeof c.componentDidUpdate=="function"&&(t.flags|=4),typeof c.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=ae),c.props=a,c.state=ae,c.context=S,a=T):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=1024),a=!1)}return Gr(e,t,o,a,l,s)}function Gr(e,t,o,a,s,l){qu(e,t);var c=(t.flags&128)!==0;if(!a&&!c)return s&&Gd(t,o,!1),Ro(e,t,l);a=t.stateNode,rh.current=t;var m=c&&typeof o.getDerivedStateFromError!="function"?null:a.render();return t.flags|=1,e!==null&&c?(t.child=Za(t,e.child,null,l),t.child=Za(t,null,m,l)):Pt(e,t,m,l),t.memoizedState=a.state,s&&Gd(t,o,!0),t.child}function Wu(e){var t=e.stateNode;t.pendingContext?Kd(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Kd(e,t.context,!1),Er(e,t.containerInfo)}function Fu(e,t,o,a,s){return Qa(),Cr(s),t.flags|=256,Pt(e,t,o,a),t.child}var Vr={dehydrated:null,treeContext:null,retryLane:0};function Xr(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ku(e,t,o){var a=t.pendingProps,s=Qe.current,l=!1,c=(t.flags&128)!==0,m;if((m=c)||(m=e!==null&&e.memoizedState===null?!1:(s&2)!==0),m?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(s|=1),Fe(Qe,s&1),e===null)return wr(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=a.children,e=a.fallback,l?(a=t.mode,l=t.child,c={mode:"hidden",children:c},(a&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=c):l=yn(c,a,0,null),e=xa(e,a,o,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Xr(o),t.memoizedState=Vr,e):$r(t,c));if(s=e.memoizedState,s!==null&&(m=s.dehydrated,m!==null))return lh(e,t,c,a,m,s,o);if(l){l=a.fallback,c=t.mode,s=e.child,m=s.sibling;var S={mode:"hidden",children:a.children};return(c&1)===0&&t.child!==s?(a=t.child,a.childLanes=0,a.pendingProps=S,t.deletions=null):(a=aa(s,S),a.subtreeFlags=s.subtreeFlags&14680064),m!==null?l=aa(m,l):(l=xa(l,c,o,null),l.flags|=2),l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,c=e.child.memoizedState,c=c===null?Xr(o):{baseLanes:c.baseLanes|o,cachePool:null,transitions:c.transitions},l.memoizedState=c,l.childLanes=e.childLanes&~o,t.memoizedState=Vr,a}return l=e.child,e=l.sibling,a=aa(l,{mode:"visible",children:a.children}),(t.mode&1)===0&&(a.lanes=o),a.return=t,a.sibling=null,e!==null&&(o=t.deletions,o===null?(t.deletions=[e],t.flags|=16):o.push(e)),t.child=a,t.memoizedState=null,a}function $r(e,t){return t=yn({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function on(e,t,o,a){return a!==null&&Cr(a),Za(t,e.child,null,o),e=$r(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function lh(e,t,o,a,s,l,c){if(o)return t.flags&256?(t.flags&=-257,a=Fr(Error(r(422))),on(e,t,c,a)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=a.fallback,s=t.mode,a=yn({mode:"visible",children:a.children},s,0,null),l=xa(l,s,c,null),l.flags|=2,a.return=t,l.return=t,a.sibling=l,t.child=a,(t.mode&1)!==0&&Za(t,e.child,null,c),t.child.memoizedState=Xr(c),t.memoizedState=Vr,l);if((t.mode&1)===0)return on(e,t,c,null);if(s.data==="$!"){if(a=s.nextSibling&&s.nextSibling.dataset,a)var m=a.dgst;return a=m,l=Error(r(419)),a=Fr(l,a,void 0),on(e,t,c,a)}if(m=(c&e.childLanes)!==0,xt||m){if(a=ct,a!==null){switch(c&-c){case 4:s=2;break;case 16:s=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:s=32;break;case 536870912:s=268435456;break;default:s=0}s=(s&(a.suspendedLanes|c))!==0?0:s,s!==0&&s!==l.retryLane&&(l.retryLane=s,ko(e,s),to(a,e,s,-1))}return pl(),a=Fr(Error(r(421))),on(e,t,c,a)}return s.data==="$?"?(t.flags|=128,t.child=e.child,t=Ph.bind(null,e),s._reactRetry=t,null):(e=l.treeContext,Mt=Yo(s.nextSibling),Ut=t,Xe=!0,Qt=null,e!==null&&(_t[Nt++]=wo,_t[Nt++]=Co,_t[Nt++]=ya,wo=e.id,Co=e.overflow,ya=t),t=$r(t,a.children),t.flags|=4096,t)}function Yu(e,t,o){e.lanes|=t;var a=e.alternate;a!==null&&(a.lanes|=t),Ar(e.return,t,o)}function Qr(e,t,o,a,s){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:o,tailMode:s}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=a,l.tail=o,l.tailMode=s)}function Gu(e,t,o){var a=t.pendingProps,s=a.revealOrder,l=a.tail;if(Pt(e,t,a.children,o),a=Qe.current,(a&2)!==0)a=a&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&&Yu(e,o,t);else if(e.tag===19)Yu(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}a&=1}if(Fe(Qe,a),(t.mode&1)===0)t.memoizedState=null;else switch(s){case"forwards":for(o=t.child,s=null;o!==null;)e=o.alternate,e!==null&&Xs(e)===null&&(s=o),o=o.sibling;o=s,o===null?(s=t.child,t.child=null):(s=o.sibling,o.sibling=null),Qr(t,!1,s,o,l);break;case"backwards":for(o=null,s=t.child,t.child=null;s!==null;){if(e=s.alternate,e!==null&&Xs(e)===null){t.child=s;break}e=s.sibling,s.sibling=o,o=s,s=e}Qr(t,!0,o,null,l);break;case"together":Qr(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function an(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Ro(e,t,o){if(e!==null&&(t.dependencies=e.dependencies),Pa|=t.lanes,(o&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,o=aa(e,e.pendingProps),t.child=o,o.return=t;e.sibling!==null;)e=e.sibling,o=o.sibling=aa(e,e.pendingProps),o.return=t;o.sibling=null}return t.child}function dh(e,t,o){switch(t.tag){case 3:Wu(t),Qa();break;case 5:ru(t);break;case 1:kt(t.type)&&Ns(t);break;case 4:Er(t,t.stateNode.containerInfo);break;case 10:var a=t.type._context,s=t.memoizedProps.value;Fe(Ks,a._currentValue),a._currentValue=s;break;case 13:if(a=t.memoizedState,a!==null)return a.dehydrated!==null?(Fe(Qe,Qe.current&1),t.flags|=128,null):(o&t.child.childLanes)!==0?Ku(e,t,o):(Fe(Qe,Qe.current&1),e=Ro(e,t,o),e!==null?e.sibling:null);Fe(Qe,Qe.current&1);break;case 19:if(a=(o&t.childLanes)!==0,(e.flags&128)!==0){if(a)return Gu(e,t,o);t.flags|=128}if(s=t.memoizedState,s!==null&&(s.rendering=null,s.tail=null,s.lastEffect=null),Fe(Qe,Qe.current),a)break;return null;case 22:case 23:return t.lanes=0,Ou(e,t,o)}return Ro(e,t,o)}var Vu,Zr,Xu,$u;Vu=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}},Zr=function(){},Xu=function(e,t,o,a){var s=e.memoizedProps;if(s!==a){e=t.stateNode,va(po.current);var l=null;switch(o){case"input":s=Ua(e,s),a=Ua(e,a),l=[];break;case"select":s=V({},s,{value:void 0}),a=V({},a,{value:void 0}),l=[];break;case"textarea":s=hi(e,s),a=hi(e,a),l=[];break;default:typeof s.onClick!="function"&&typeof a.onClick=="function"&&(e.onclick=Hs)}za(o,a);var c;o=null;for(T in s)if(!a.hasOwnProperty(T)&&s.hasOwnProperty(T)&&s[T]!=null)if(T==="style"){var m=s[T];for(c in m)m.hasOwnProperty(c)&&(o||(o={}),o[c]="")}else T!=="dangerouslySetInnerHTML"&&T!=="children"&&T!=="suppressContentEditableWarning"&&T!=="suppressHydrationWarning"&&T!=="autoFocus"&&(u.hasOwnProperty(T)?l||(l=[]):(l=l||[]).push(T,null));for(T in a){var S=a[T];if(m=s!=null?s[T]:void 0,a.hasOwnProperty(T)&&S!==m&&(S!=null||m!=null))if(T==="style")if(m){for(c in m)!m.hasOwnProperty(c)||S&&S.hasOwnProperty(c)||(o||(o={}),o[c]="");for(c in S)S.hasOwnProperty(c)&&m[c]!==S[c]&&(o||(o={}),o[c]=S[c])}else o||(l||(l=[]),l.push(T,o)),o=S;else T==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,m=m?m.__html:void 0,S!=null&&m!==S&&(l=l||[]).push(T,S)):T==="children"?typeof S!="string"&&typeof S!="number"||(l=l||[]).push(T,""+S):T!=="suppressContentEditableWarning"&&T!=="suppressHydrationWarning"&&(u.hasOwnProperty(T)?(S!=null&&T==="onScroll"&&Ge("scroll",e),l||m===S||(l=[])):(l=l||[]).push(T,S))}o&&(l=l||[]).push("style",o);var T=l;(t.updateQueue=T)&&(t.flags|=4)}},$u=function(e,t,o,a){o!==a&&(t.flags|=4)};function Vi(e,t){if(!Xe)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 a=null;o!==null;)o.alternate!==null&&(a=o),o=o.sibling;a===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:a.sibling=null}}function vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,o=0,a=0;if(t)for(var s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags&14680064,a|=s.flags&14680064,s.return=e,s=s.sibling;else for(s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags,a|=s.flags,s.return=e,s=s.sibling;return e.subtreeFlags|=a,e.childLanes=o,t}function uh(e,t,o){var a=t.pendingProps;switch(br(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 kt(t.type)&&_s(),vt(t),null;case 3:return a=t.stateNode,ti(),Ve(Ct),Ve(ft),Ur(),a.pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),(e===null||e.child===null)&&(Ws(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Qt!==null&&(dl(Qt),Qt=null))),Zr(e,t),vt(t),null;case 5:Tr(t);var s=va(Wi.current);if(o=t.type,e!==null&&t.stateNode!=null)Xu(e,t,o,a,s),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!a){if(t.stateNode===null)throw Error(r(166));return vt(t),null}if(e=va(po.current),Ws(t)){a=t.stateNode,o=t.type;var l=t.memoizedProps;switch(a[co]=t,a[_i]=l,e=(t.mode&1)!==0,o){case"dialog":Ge("cancel",a),Ge("close",a);break;case"iframe":case"object":case"embed":Ge("load",a);break;case"video":case"audio":for(s=0;s<zi.length;s++)Ge(zi[s],a);break;case"source":Ge("error",a);break;case"img":case"image":case"link":Ge("error",a),Ge("load",a);break;case"details":Ge("toggle",a);break;case"input":cs(a,l),Ge("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!l.multiple},Ge("invalid",a);break;case"textarea":gs(a,l),Ge("invalid",a)}za(o,l),s=null;for(var c in l)if(l.hasOwnProperty(c)){var m=l[c];c==="children"?typeof m=="string"?a.textContent!==m&&(l.suppressHydrationWarning!==!0&&zs(a.textContent,m,e),s=["children",m]):typeof m=="number"&&a.textContent!==""+m&&(l.suppressHydrationWarning!==!0&&zs(a.textContent,m,e),s=["children",""+m]):u.hasOwnProperty(c)&&m!=null&&c==="onScroll"&&Ge("scroll",a)}switch(o){case"input":yo(a),ps(a,l,!0);break;case"textarea":yo(a),zo(a);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(a.onclick=Hs)}a=s,t.updateQueue=a,a!==null&&(t.flags|=4)}else{c=s.nodeType===9?s:s.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=mi(o)),e==="http://www.w3.org/1999/xhtml"?o==="script"?(e=c.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=c.createElement(o,{is:a.is}):(e=c.createElement(o),o==="select"&&(c=e,a.multiple?c.multiple=!0:a.size&&(c.size=a.size))):e=c.createElementNS(e,o),e[co]=t,e[_i]=a,Vu(e,t,!1,!1),t.stateNode=e;e:{switch(c=fi(o,a),o){case"dialog":Ge("cancel",e),Ge("close",e),s=a;break;case"iframe":case"object":case"embed":Ge("load",e),s=a;break;case"video":case"audio":for(s=0;s<zi.length;s++)Ge(zi[s],e);s=a;break;case"source":Ge("error",e),s=a;break;case"img":case"image":case"link":Ge("error",e),Ge("load",e),s=a;break;case"details":Ge("toggle",e),s=a;break;case"input":cs(e,a),s=Ua(e,a),Ge("invalid",e);break;case"option":s=a;break;case"select":e._wrapperState={wasMultiple:!!a.multiple},s=V({},a,{value:void 0}),Ge("invalid",e);break;case"textarea":gs(e,a),s=hi(e,a),Ge("invalid",e);break;default:s=a}za(o,s),m=s;for(l in m)if(m.hasOwnProperty(l)){var S=m[l];l==="style"?yi(e,S):l==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,S!=null&&Lt(e,S)):l==="children"?typeof S=="string"?(o!=="textarea"||S!=="")&&Ho(e,S):typeof S=="number"&&Ho(e,""+S):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(u.hasOwnProperty(l)?S!=null&&l==="onScroll"&&Ge("scroll",e):S!=null&&$(e,l,S,c))}switch(o){case"input":yo(e),ps(e,a,!1);break;case"textarea":yo(e),zo(e);break;case"option":a.value!=null&&e.setAttribute("value",""+ke(a.value));break;case"select":e.multiple=!!a.multiple,l=a.value,l!=null?Mo(e,!!a.multiple,l,!1):a.defaultValue!=null&&Mo(e,!!a.multiple,a.defaultValue,!0);break;default:typeof s.onClick=="function"&&(e.onclick=Hs)}switch(o){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}}a&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return vt(t),null;case 6:if(e&&t.stateNode!=null)$u(e,t,e.memoizedProps,a);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(o=va(Wi.current),va(po.current),Ws(t)){if(a=t.stateNode,o=t.memoizedProps,a[co]=t,(l=a.nodeValue!==o)&&(e=Ut,e!==null))switch(e.tag){case 3:zs(a.nodeValue,o,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&zs(a.nodeValue,o,(e.mode&1)!==0)}l&&(t.flags|=4)}else a=(o.nodeType===9?o:o.ownerDocument).createTextNode(a),a[co]=t,t.stateNode=a}return vt(t),null;case 13:if(Ve(Qe),a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Xe&&Mt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Jd(),Qa(),t.flags|=98560,l=!1;else if(l=Ws(t),a!==null&&a.dehydrated!==null){if(e===null){if(!l)throw Error(r(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(r(317));l[co]=t}else Qa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;vt(t),l=!1}else Qt!==null&&(dl(Qt),Qt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=o,t):(a=a!==null,a!==(e!==null&&e.memoizedState!==null)&&a&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Qe.current&1)!==0?lt===0&&(lt=3):pl())),t.updateQueue!==null&&(t.flags|=4),vt(t),null);case 4:return ti(),Zr(e,t),e===null&&Hi(t.stateNode.containerInfo),vt(t),null;case 10:return Rr(t.type._context),vt(t),null;case 17:return kt(t.type)&&_s(),vt(t),null;case 19:if(Ve(Qe),l=t.memoizedState,l===null)return vt(t),null;if(a=(t.flags&128)!==0,c=l.rendering,c===null)if(a)Vi(l,!1);else{if(lt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(c=Xs(e),c!==null){for(t.flags|=128,Vi(l,!1),a=c.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),t.subtreeFlags=0,a=o,o=t.child;o!==null;)l=o,e=a,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 Fe(Qe,Qe.current&1|2),t.child}e=e.sibling}l.tail!==null&&Ue()>si&&(t.flags|=128,a=!0,Vi(l,!1),t.lanes=4194304)}else{if(!a)if(e=Xs(c),e!==null){if(t.flags|=128,a=!0,o=e.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),Vi(l,!0),l.tail===null&&l.tailMode==="hidden"&&!c.alternate&&!Xe)return vt(t),null}else 2*Ue()-l.renderingStartTime>si&&o!==1073741824&&(t.flags|=128,a=!0,Vi(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=Ue(),t.sibling=null,o=Qe.current,Fe(Qe,a?o&1|2:o&1),t):(vt(t),null);case 22:case 23:return cl(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&(t.mode&1)!==0?(zt&1073741824)!==0&&(vt(t),t.subtreeFlags&6&&(t.flags|=8192)):vt(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function ch(e,t){switch(br(t),t.tag){case 1:return kt(t.type)&&_s(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ti(),Ve(Ct),Ve(ft),Ur(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Tr(t),null;case 13:if(Ve(Qe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Qa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ve(Qe),null;case 4:return ti(),null;case 10:return Rr(t.type._context),null;case 22:case 23:return cl(),null;case 24:return null;default:return null}}var sn=!1,bt=!1,ph=typeof WeakSet=="function"?WeakSet:Set,J=null;function ai(e,t){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(a){tt(e,t,a)}else o.current=null}function Jr(e,t,o){try{o()}catch(a){tt(e,t,a)}}var Qu=!1;function gh(e,t){if(cr=ks,e=Dd(),ar(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var a=o.getSelection&&o.getSelection();if(a&&a.rangeCount!==0){o=a.anchorNode;var s=a.anchorOffset,l=a.focusNode;a=a.focusOffset;try{o.nodeType,l.nodeType}catch{o=null;break e}var c=0,m=-1,S=-1,T=0,_=0,q=e,L=null;t:for(;;){for(var X;q!==o||s!==0&&q.nodeType!==3||(m=c+s),q!==l||a!==0&&q.nodeType!==3||(S=c+a),q.nodeType===3&&(c+=q.nodeValue.length),(X=q.firstChild)!==null;)L=q,q=X;for(;;){if(q===e)break t;if(L===o&&++T===s&&(m=c),L===l&&++_===a&&(S=c),(X=q.nextSibling)!==null)break;q=L,L=q.parentNode}q=X}o=m===-1||S===-1?null:{start:m,end:S}}else o=null}o=o||{start:0,end:0}}else o=null;for(pr={focusedElem:e,selectionRange:o},ks=!1,J=t;J!==null;)if(t=J,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,J=e;else for(;J!==null;){t=J;try{var ae=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(ae!==null){var ne=ae.memoizedProps,at=ae.memoizedState,A=t.stateNode,b=A.getSnapshotBeforeUpdate(t.elementType===t.type?ne:Zt(t.type,ne),at);A.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var I=t.stateNode.containerInfo;I.nodeType===1?I.textContent="":I.nodeType===9&&I.documentElement&&I.removeChild(I.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(W){tt(t,t.return,W)}if(e=t.sibling,e!==null){e.return=t.return,J=e;break}J=t.return}return ae=Qu,Qu=!1,ae}function Xi(e,t,o){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var s=a=a.next;do{if((s.tag&e)===e){var l=s.destroy;s.destroy=void 0,l!==void 0&&Jr(t,o,l)}s=s.next}while(s!==a)}}function nn(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 a=o.create;o.destroy=a()}o=o.next}while(o!==t)}}function el(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 Zu(e){var t=e.alternate;t!==null&&(e.alternate=null,Zu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[co],delete t[_i],delete t[yr],delete t[Xg],delete t[$g])),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 Ju(e){return e.tag===5||e.tag===3||e.tag===4}function ec(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ju(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 tl(e,t,o){var a=e.tag;if(a===5||a===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=Hs));else if(a!==4&&(e=e.child,e!==null))for(tl(e,t,o),e=e.sibling;e!==null;)tl(e,t,o),e=e.sibling}function ol(e,t,o){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?o.insertBefore(e,t):o.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(ol(e,t,o),e=e.sibling;e!==null;)ol(e,t,o),e=e.sibling}var mt=null,Jt=!1;function Zo(e,t,o){for(o=o.child;o!==null;)tc(e,t,o),o=o.sibling}function tc(e,t,o){if(ht&&typeof ht.onCommitFiberUnmount=="function")try{ht.onCommitFiberUnmount(Be,o)}catch{}switch(o.tag){case 5:bt||ai(o,t);case 6:var a=mt,s=Jt;mt=null,Zo(e,t,o),mt=a,Jt=s,mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):mt.removeChild(o.stateNode));break;case 18:mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?mr(e.parentNode,o):e.nodeType===1&&mr(e,o),Ai(e)):mr(mt,o.stateNode));break;case 4:a=mt,s=Jt,mt=o.stateNode.containerInfo,Jt=!0,Zo(e,t,o),mt=a,Jt=s;break;case 0:case 11:case 14:case 15:if(!bt&&(a=o.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){s=a=a.next;do{var l=s,c=l.destroy;l=l.tag,c!==void 0&&((l&2)!==0||(l&4)!==0)&&Jr(o,t,c),s=s.next}while(s!==a)}Zo(e,t,o);break;case 1:if(!bt&&(ai(o,t),a=o.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=o.memoizedProps,a.state=o.memoizedState,a.componentWillUnmount()}catch(m){tt(o,t,m)}Zo(e,t,o);break;case 21:Zo(e,t,o);break;case 22:o.mode&1?(bt=(a=bt)||o.memoizedState!==null,Zo(e,t,o),bt=a):Zo(e,t,o);break;default:Zo(e,t,o)}}function oc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new ph),t.forEach(function(a){var s=wh.bind(null,e,a);o.has(a)||(o.add(a),a.then(s,s))})}}function eo(e,t){var o=t.deletions;if(o!==null)for(var a=0;a<o.length;a++){var s=o[a];try{var l=e,c=t,m=c;e:for(;m!==null;){switch(m.tag){case 5:mt=m.stateNode,Jt=!1;break e;case 3:mt=m.stateNode.containerInfo,Jt=!0;break e;case 4:mt=m.stateNode.containerInfo,Jt=!0;break e}m=m.return}if(mt===null)throw Error(r(160));tc(l,c,s),mt=null,Jt=!1;var S=s.alternate;S!==null&&(S.return=null),s.return=null}catch(T){tt(s,t,T)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)ac(t,e),t=t.sibling}function ac(e,t){var o=e.alternate,a=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(eo(t,e),ho(e),a&4){try{Xi(3,e,e.return),nn(3,e)}catch(ne){tt(e,e.return,ne)}try{Xi(5,e,e.return)}catch(ne){tt(e,e.return,ne)}}break;case 1:eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return);break;case 5:if(eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return),e.flags&32){var s=e.stateNode;try{Ho(s,"")}catch(ne){tt(e,e.return,ne)}}if(a&4&&(s=e.stateNode,s!=null)){var l=e.memoizedProps,c=o!==null?o.memoizedProps:l,m=e.type,S=e.updateQueue;if(e.updateQueue=null,S!==null)try{m==="input"&&l.type==="radio"&&l.name!=null&&io(s,l),fi(m,c);var T=fi(m,l);for(c=0;c<S.length;c+=2){var _=S[c],q=S[c+1];_==="style"?yi(s,q):_==="dangerouslySetInnerHTML"?Lt(s,q):_==="children"?Ho(s,q):$(s,_,q,T)}switch(m){case"input":gi(s,l);break;case"textarea":so(s,l);break;case"select":var L=s._wrapperState.wasMultiple;s._wrapperState.wasMultiple=!!l.multiple;var X=l.value;X!=null?Mo(s,!!l.multiple,X,!1):L!==!!l.multiple&&(l.defaultValue!=null?Mo(s,!!l.multiple,l.defaultValue,!0):Mo(s,!!l.multiple,l.multiple?[]:"",!1))}s[_i]=l}catch(ne){tt(e,e.return,ne)}}break;case 6:if(eo(t,e),ho(e),a&4){if(e.stateNode===null)throw Error(r(162));s=e.stateNode,l=e.memoizedProps;try{s.nodeValue=l}catch(ne){tt(e,e.return,ne)}}break;case 3:if(eo(t,e),ho(e),a&4&&o!==null&&o.memoizedState.isDehydrated)try{Ai(t.containerInfo)}catch(ne){tt(e,e.return,ne)}break;case 4:eo(t,e),ho(e);break;case 13:eo(t,e),ho(e),s=e.child,s.flags&8192&&(l=s.memoizedState!==null,s.stateNode.isHidden=l,!l||s.alternate!==null&&s.alternate.memoizedState!==null||(sl=Ue())),a&4&&oc(e);break;case 22:if(_=o!==null&&o.memoizedState!==null,e.mode&1?(bt=(T=bt)||_,eo(t,e),bt=T):eo(t,e),ho(e),a&8192){if(T=e.memoizedState!==null,(e.stateNode.isHidden=T)&&!_&&(e.mode&1)!==0)for(J=e,_=e.child;_!==null;){for(q=J=_;J!==null;){switch(L=J,X=L.child,L.tag){case 0:case 11:case 14:case 15:Xi(4,L,L.return);break;case 1:ai(L,L.return);var ae=L.stateNode;if(typeof ae.componentWillUnmount=="function"){a=L,o=L.return;try{t=a,ae.props=t.memoizedProps,ae.state=t.memoizedState,ae.componentWillUnmount()}catch(ne){tt(a,o,ne)}}break;case 5:ai(L,L.return);break;case 22:if(L.memoizedState!==null){nc(q);continue}}X!==null?(X.return=L,J=X):nc(q)}_=_.sibling}e:for(_=null,q=e;;){if(q.tag===5){if(_===null){_=q;try{s=q.stateNode,T?(l=s.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(m=q.stateNode,S=q.memoizedProps.style,c=S!=null&&S.hasOwnProperty("display")?S.display:null,m.style.display=Vt("display",c))}catch(ne){tt(e,e.return,ne)}}}else if(q.tag===6){if(_===null)try{q.stateNode.nodeValue=T?"":q.memoizedProps}catch(ne){tt(e,e.return,ne)}}else if((q.tag!==22&&q.tag!==23||q.memoizedState===null||q===e)&&q.child!==null){q.child.return=q,q=q.child;continue}if(q===e)break e;for(;q.sibling===null;){if(q.return===null||q.return===e)break e;_===q&&(_=null),q=q.return}_===q&&(_=null),q.sibling.return=q.return,q=q.sibling}}break;case 19:eo(t,e),ho(e),a&4&&oc(e);break;case 21:break;default:eo(t,e),ho(e)}}function ho(e){var t=e.flags;if(t&2){try{e:{for(var o=e.return;o!==null;){if(Ju(o)){var a=o;break e}o=o.return}throw Error(r(160))}switch(a.tag){case 5:var s=a.stateNode;a.flags&32&&(Ho(s,""),a.flags&=-33);var l=ec(e);ol(e,l,s);break;case 3:case 4:var c=a.stateNode.containerInfo,m=ec(e);tl(e,m,c);break;default:throw Error(r(161))}}catch(S){tt(e,e.return,S)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function hh(e,t,o){J=e,ic(e)}function ic(e,t,o){for(var a=(e.mode&1)!==0;J!==null;){var s=J,l=s.child;if(s.tag===22&&a){var c=s.memoizedState!==null||sn;if(!c){var m=s.alternate,S=m!==null&&m.memoizedState!==null||bt;m=sn;var T=bt;if(sn=c,(bt=S)&&!T)for(J=s;J!==null;)c=J,S=c.child,c.tag===22&&c.memoizedState!==null?rc(s):S!==null?(S.return=c,J=S):rc(s);for(;l!==null;)J=l,ic(l),l=l.sibling;J=s,sn=m,bt=T}sc(e)}else(s.subtreeFlags&8772)!==0&&l!==null?(l.return=s,J=l):sc(e)}}function sc(e){for(;J!==null;){var t=J;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||nn(5,t);break;case 1:var a=t.stateNode;if(t.flags&4&&!bt)if(o===null)a.componentDidMount();else{var s=t.elementType===t.type?o.memoizedProps:Zt(t.type,o.memoizedProps);a.componentDidUpdate(s,o.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&nu(t,l,a);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}nu(t,c,o)}break;case 5:var m=t.stateNode;if(o===null&&t.flags&4){o=m;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 T=t.alternate;if(T!==null){var _=T.memoizedState;if(_!==null){var q=_.dehydrated;q!==null&&Ai(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(r(163))}bt||t.flags&512&&el(t)}catch(L){tt(t,t.return,L)}}if(t===e){J=null;break}if(o=t.sibling,o!==null){o.return=t.return,J=o;break}J=t.return}}function nc(e){for(;J!==null;){var t=J;if(t===e){J=null;break}var o=t.sibling;if(o!==null){o.return=t.return,J=o;break}J=t.return}}function rc(e){for(;J!==null;){var t=J;try{switch(t.tag){case 0:case 11:case 15:var o=t.return;try{nn(4,t)}catch(S){tt(t,o,S)}break;case 1:var a=t.stateNode;if(typeof a.componentDidMount=="function"){var s=t.return;try{a.componentDidMount()}catch(S){tt(t,s,S)}}var l=t.return;try{el(t)}catch(S){tt(t,l,S)}break;case 5:var c=t.return;try{el(t)}catch(S){tt(t,c,S)}}}catch(S){tt(t,t.return,S)}if(t===e){J=null;break}var m=t.sibling;if(m!==null){m.return=t.return,J=m;break}J=t.return}}var mh=Math.ceil,rn=G.ReactCurrentDispatcher,al=G.ReactCurrentOwner,Bt=G.ReactCurrentBatchConfig,Ee=0,ct=null,it=null,yt=0,zt=0,ii=Go(0),lt=0,$i=null,Pa=0,ln=0,il=0,Qi=null,Rt=null,sl=0,si=1/0,Ao=null,dn=!1,nl=null,Jo=null,un=!1,ea=null,cn=0,Zi=0,rl=null,pn=-1,gn=0;function wt(){return(Ee&6)!==0?Ue():pn!==-1?pn:pn=Ue()}function ta(e){return(e.mode&1)===0?1:(Ee&2)!==0&&yt!==0?yt&-yt:Zg.transition!==null?(gn===0&&(gn=ed()),gn):(e=Oe,e!==0||(e=window.event,e=e===void 0?16:dd(e.type)),e)}function to(e,t,o,a){if(50<Zi)throw Zi=0,rl=null,Error(r(185));wi(e,o,a),((Ee&2)===0||e!==ct)&&(e===ct&&((Ee&2)===0&&(ln|=o),lt===4&&oa(e,yt)),At(e,a),o===1&&Ee===0&&(t.mode&1)===0&&(si=Ue()+500,Os&&Xo()))}function At(e,t){var o=e.callbackNode;Zp(e,t);var a=Ps(e,e===ct?yt:0);if(a===0)o!==null&&fo(o),e.callbackNode=null,e.callbackPriority=0;else if(t=a&-a,e.callbackPriority!==t){if(o!=null&&fo(o),t===1)e.tag===0?Qg(dc.bind(null,e)):Vd(dc.bind(null,e)),Gg(function(){(Ee&6)===0&&Xo()}),o=null;else{switch(td(a)){case 1:o=So;break;case 4:o=uo;break;case 16:o=vo;break;case 536870912:o=Ae;break;default:o=vo}o=fc(o,lc.bind(null,e))}e.callbackPriority=t,e.callbackNode=o}}function lc(e,t){if(pn=-1,gn=0,(Ee&6)!==0)throw Error(r(327));var o=e.callbackNode;if(ni()&&e.callbackNode!==o)return null;var a=Ps(e,e===ct?yt:0);if(a===0)return null;if((a&30)!==0||(a&e.expiredLanes)!==0||t)t=hn(e,a);else{t=a;var s=Ee;Ee|=2;var l=cc();(ct!==e||yt!==t)&&(Ao=null,si=Ue()+500,Ca(e,t));do try{Sh();break}catch(m){uc(e,m)}while(!0);xr(),rn.current=l,Ee=s,it!==null?t=0:(ct=null,yt=0,t=lt)}if(t!==0){if(t===2&&(s=qn(e),s!==0&&(a=s,t=ll(e,s))),t===1)throw o=$i,Ca(e,0),oa(e,a),At(e,Ue()),o;if(t===6)oa(e,a);else{if(s=e.current.alternate,(a&30)===0&&!yh(s)&&(t=hn(e,a),t===2&&(l=qn(e),l!==0&&(a=l,t=ll(e,l))),t===1))throw o=$i,Ca(e,0),oa(e,a),At(e,Ue()),o;switch(e.finishedWork=s,e.finishedLanes=a,t){case 0:case 1:throw Error(r(345));case 2:ka(e,Rt,Ao);break;case 3:if(oa(e,a),(a&130023424)===a&&(t=sl+500-Ue(),10<t)){if(Ps(e,0)!==0)break;if(s=e.suspendedLanes,(s&a)!==a){wt(),e.pingedLanes|=e.suspendedLanes&s;break}e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),t);break}ka(e,Rt,Ao);break;case 4:if(oa(e,a),(a&4194240)===a)break;for(t=e.eventTimes,s=-1;0<a;){var c=31-Me(a);l=1<<c,c=t[c],c>s&&(s=c),a&=~l}if(a=s,a=Ue()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*mh(a/1960))-a,10<a){e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),a);break}ka(e,Rt,Ao);break;case 5:ka(e,Rt,Ao);break;default:throw Error(r(329))}}}return At(e,Ue()),e.callbackNode===o?lc.bind(null,e):null}function ll(e,t){var o=Qi;return e.current.memoizedState.isDehydrated&&(Ca(e,t).flags|=256),e=hn(e,t),e!==2&&(t=Rt,Rt=o,t!==null&&dl(t)),e}function dl(e){Rt===null?Rt=e:Rt.push.apply(Rt,e)}function yh(e){for(var t=e;;){if(t.flags&16384){var o=t.updateQueue;if(o!==null&&(o=o.stores,o!==null))for(var a=0;a<o.length;a++){var s=o[a],l=s.getSnapshot;s=s.value;try{if(!$t(l(),s))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 oa(e,t){for(t&=~il,t&=~ln,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var o=31-Me(t),a=1<<o;e[o]=-1,t&=~a}}function dc(e){if((Ee&6)!==0)throw Error(r(327));ni();var t=Ps(e,0);if((t&1)===0)return At(e,Ue()),null;var o=hn(e,t);if(e.tag!==0&&o===2){var a=qn(e);a!==0&&(t=a,o=ll(e,a))}if(o===1)throw o=$i,Ca(e,0),oa(e,t),At(e,Ue()),o;if(o===6)throw Error(r(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,ka(e,Rt,Ao),At(e,Ue()),null}function ul(e,t){var o=Ee;Ee|=1;try{return e(t)}finally{Ee=o,Ee===0&&(si=Ue()+500,Os&&Xo())}}function wa(e){ea!==null&&ea.tag===0&&(Ee&6)===0&&ni();var t=Ee;Ee|=1;var o=Bt.transition,a=Oe;try{if(Bt.transition=null,Oe=1,e)return e()}finally{Oe=a,Bt.transition=o,Ee=t,(Ee&6)===0&&Xo()}}function cl(){zt=ii.current,Ve(ii)}function Ca(e,t){e.finishedWork=null,e.finishedLanes=0;var o=e.timeoutHandle;if(o!==-1&&(e.timeoutHandle=-1,Yg(o)),it!==null)for(o=it.return;o!==null;){var a=o;switch(br(a),a.tag){case 1:a=a.type.childContextTypes,a!=null&&_s();break;case 3:ti(),Ve(Ct),Ve(ft),Ur();break;case 5:Tr(a);break;case 4:ti();break;case 13:Ve(Qe);break;case 19:Ve(Qe);break;case 10:Rr(a.type._context);break;case 22:case 23:cl()}o=o.return}if(ct=e,it=e=aa(e.current,null),yt=zt=t,lt=0,$i=null,il=ln=Pa=0,Rt=Qi=null,Sa!==null){for(t=0;t<Sa.length;t++)if(o=Sa[t],a=o.interleaved,a!==null){o.interleaved=null;var s=a.next,l=o.pending;if(l!==null){var c=l.next;l.next=s,a.next=c}o.pending=a}Sa=null}return e}function uc(e,t){do{var o=it;try{if(xr(),$s.current=en,Qs){for(var a=Ze.memoizedState;a!==null;){var s=a.queue;s!==null&&(s.pending=null),a=a.next}Qs=!1}if(ba=0,ut=rt=Ze=null,Fi=!1,Ki=0,al.current=null,o===null||o.return===null){lt=1,$i=t,it=null;break}e:{var l=e,c=o.return,m=o,S=t;if(t=yt,m.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){var T=S,_=m,q=_.tag;if((_.mode&1)===0&&(q===0||q===11||q===15)){var L=_.alternate;L?(_.updateQueue=L.updateQueue,_.memoizedState=L.memoizedState,_.lanes=L.lanes):(_.updateQueue=null,_.memoizedState=null)}var X=zu(c);if(X!==null){X.flags&=-257,Hu(X,c,m,l,t),X.mode&1&&Mu(l,T,t),t=X,S=T;var ae=t.updateQueue;if(ae===null){var ne=new Set;ne.add(S),t.updateQueue=ne}else ae.add(S);break e}else{if((t&1)===0){Mu(l,T,t),pl();break e}S=Error(r(426))}}else if(Xe&&m.mode&1){var at=zu(c);if(at!==null){(at.flags&65536)===0&&(at.flags|=256),Hu(at,c,m,l,t),Cr(oi(S,m));break e}}l=S=oi(S,m),lt!==4&&(lt=2),Qi===null?Qi=[l]:Qi.push(l),l=c;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var A=ju(l,S,t);su(l,A);break e;case 1:m=S;var b=l.type,I=l.stateNode;if((l.flags&128)===0&&(typeof b.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Jo===null||!Jo.has(I)))){l.flags|=65536,t&=-t,l.lanes|=t;var W=Uu(l,m,t);su(l,W);break e}}l=l.return}while(l!==null)}gc(o)}catch(re){t=re,it===o&&o!==null&&(it=o=o.return);continue}break}while(!0)}function cc(){var e=rn.current;return rn.current=en,e===null?en:e}function pl(){(lt===0||lt===3||lt===2)&&(lt=4),ct===null||(Pa&268435455)===0&&(ln&268435455)===0||oa(ct,yt)}function hn(e,t){var o=Ee;Ee|=2;var a=cc();(ct!==e||yt!==t)&&(Ao=null,Ca(e,t));do try{fh();break}catch(s){uc(e,s)}while(!0);if(xr(),Ee=o,rn.current=a,it!==null)throw Error(r(261));return ct=null,yt=0,lt}function fh(){for(;it!==null;)pc(it)}function Sh(){for(;it!==null&&!pa();)pc(it)}function pc(e){var t=yc(e.alternate,e,zt);e.memoizedProps=e.pendingProps,t===null?gc(e):it=t,al.current=null}function gc(e){var t=e;do{var o=t.alternate;if(e=t.return,(t.flags&32768)===0){if(o=uh(o,t,zt),o!==null){it=o;return}}else{if(o=ch(o,t),o!==null){o.flags&=32767,it=o;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{lt=6,it=null;return}}if(t=t.sibling,t!==null){it=t;return}it=t=e}while(t!==null);lt===0&&(lt=5)}function ka(e,t,o){var a=Oe,s=Bt.transition;try{Bt.transition=null,Oe=1,vh(e,t,o,a)}finally{Bt.transition=s,Oe=a}return null}function vh(e,t,o,a){do ni();while(ea!==null);if((Ee&6)!==0)throw Error(r(327));o=e.finishedWork;var s=e.finishedLanes;if(o===null)return null;if(e.finishedWork=null,e.finishedLanes=0,o===e.current)throw Error(r(177));e.callbackNode=null,e.callbackPriority=0;var l=o.lanes|o.childLanes;if(Jp(e,l),e===ct&&(it=ct=null,yt=0),(o.subtreeFlags&2064)===0&&(o.flags&2064)===0||un||(un=!0,fc(vo,function(){return ni(),null})),l=(o.flags&15990)!==0,(o.subtreeFlags&15990)!==0||l){l=Bt.transition,Bt.transition=null;var c=Oe;Oe=1;var m=Ee;Ee|=4,al.current=null,gh(e,o),ac(o,e),Ng(pr),ks=!!cr,pr=cr=null,e.current=o,hh(o),Xt(),Ee=m,Oe=c,Bt.transition=l}else e.current=o;if(un&&(un=!1,ea=e,cn=s),l=e.pendingLanes,l===0&&(Jo=null),ga(o.stateNode),At(e,Ue()),t!==null)for(a=e.onRecoverableError,o=0;o<t.length;o++)s=t[o],a(s.value,{componentStack:s.stack,digest:s.digest});if(dn)throw dn=!1,e=nl,nl=null,e;return(cn&1)!==0&&e.tag!==0&&ni(),l=e.pendingLanes,(l&1)!==0?e===rl?Zi++:(Zi=0,rl=e):Zi=0,Xo(),null}function ni(){if(ea!==null){var e=td(cn),t=Bt.transition,o=Oe;try{if(Bt.transition=null,Oe=16>e?16:e,ea===null)var a=!1;else{if(e=ea,ea=null,cn=0,(Ee&6)!==0)throw Error(r(331));var s=Ee;for(Ee|=4,J=e.current;J!==null;){var l=J,c=l.child;if((J.flags&16)!==0){var m=l.deletions;if(m!==null){for(var S=0;S<m.length;S++){var T=m[S];for(J=T;J!==null;){var _=J;switch(_.tag){case 0:case 11:case 15:Xi(8,_,l)}var q=_.child;if(q!==null)q.return=_,J=q;else for(;J!==null;){_=J;var L=_.sibling,X=_.return;if(Zu(_),_===T){J=null;break}if(L!==null){L.return=X,J=L;break}J=X}}}var ae=l.alternate;if(ae!==null){var ne=ae.child;if(ne!==null){ae.child=null;do{var at=ne.sibling;ne.sibling=null,ne=at}while(ne!==null)}}J=l}}if((l.subtreeFlags&2064)!==0&&c!==null)c.return=l,J=c;else e:for(;J!==null;){if(l=J,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:Xi(9,l,l.return)}var A=l.sibling;if(A!==null){A.return=l.return,J=A;break e}J=l.return}}var b=e.current;for(J=b;J!==null;){c=J;var I=c.child;if((c.subtreeFlags&2064)!==0&&I!==null)I.return=c,J=I;else e:for(c=b;J!==null;){if(m=J,(m.flags&2048)!==0)try{switch(m.tag){case 0:case 11:case 15:nn(9,m)}}catch(re){tt(m,m.return,re)}if(m===c){J=null;break e}var W=m.sibling;if(W!==null){W.return=m.return,J=W;break e}J=m.return}}if(Ee=s,Xo(),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(Be,e)}catch{}a=!0}return a}finally{Oe=o,Bt.transition=t}}return!1}function hc(e,t,o){t=oi(o,t),t=ju(e,t,1),e=Qo(e,t,1),t=wt(),e!==null&&(wi(e,1,t),At(e,t))}function tt(e,t,o){if(e.tag===3)hc(e,e,o);else for(;t!==null;){if(t.tag===3){hc(t,e,o);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Jo===null||!Jo.has(a))){e=oi(o,e),e=Uu(t,e,1),t=Qo(t,e,1),e=wt(),t!==null&&(wi(t,1,e),At(t,e));break}}t=t.return}}function bh(e,t,o){var a=e.pingCache;a!==null&&a.delete(t),t=wt(),e.pingedLanes|=e.suspendedLanes&o,ct===e&&(yt&o)===o&&(lt===4||lt===3&&(yt&130023424)===yt&&500>Ue()-sl?Ca(e,0):il|=o),At(e,t)}function mc(e,t){t===0&&((e.mode&1)===0?t=1:(t=bs,bs<<=1,(bs&130023424)===0&&(bs=4194304)));var o=wt();e=ko(e,t),e!==null&&(wi(e,t,o),At(e,o))}function Ph(e){var t=e.memoizedState,o=0;t!==null&&(o=t.retryLane),mc(e,o)}function wh(e,t){var o=0;switch(e.tag){case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(o=s.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(r(314))}a!==null&&a.delete(t),mc(e,o)}var yc;yc=function(e,t,o){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ct.current)xt=!0;else{if((e.lanes&o)===0&&(t.flags&128)===0)return xt=!1,dh(e,t,o);xt=(e.flags&131072)!==0}else xt=!1,Xe&&(t.flags&1048576)!==0&&Xd(t,Bs,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;an(e,t),e=t.pendingProps;var s=Va(t,ft.current);ei(t,o),s=Hr(null,t,a,e,s,o);var l=Lr();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,kt(a)?(l=!0,Ns(t)):l=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,Dr(t),s.updater=tn,t.stateNode=s,s._reactInternals=t,Wr(t,a,e,o),t=Gr(null,t,a,!0,l,o)):(t.tag=0,Xe&&l&&vr(t),Pt(null,t,s,o),t=t.child),t;case 16:a=t.elementType;e:{switch(an(e,t),e=t.pendingProps,s=a._init,a=s(a._payload),t.type=a,s=t.tag=kh(a),e=Zt(a,e),s){case 0:t=Yr(null,t,a,e,o);break e;case 1:t=Bu(null,t,a,e,o);break e;case 11:t=Lu(null,t,a,e,o);break e;case 14:t=_u(null,t,a,Zt(a.type,e),o);break e}throw Error(r(306,a,""))}return t;case 0:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Yr(e,t,a,s,o);case 1:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Bu(e,t,a,s,o);case 3:e:{if(Wu(t),e===null)throw Error(r(387));a=t.pendingProps,l=t.memoizedState,s=l.element,iu(e,t),Vs(t,a,null,o);var c=t.memoizedState;if(a=c.element,l.isDehydrated)if(l={element:a,isDehydrated:!1,cache:c.cache,pendingSuspenseBoundaries:c.pendingSuspenseBoundaries,transitions:c.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){s=oi(Error(r(423)),t),t=Fu(e,t,a,o,s);break e}else if(a!==s){s=oi(Error(r(424)),t),t=Fu(e,t,a,o,s);break e}else for(Mt=Yo(t.stateNode.containerInfo.firstChild),Ut=t,Xe=!0,Qt=null,o=ou(t,null,a,o),t.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(Qa(),a===s){t=Ro(e,t,o);break e}Pt(e,t,a,o)}t=t.child}return t;case 5:return ru(t),e===null&&wr(t),a=t.type,s=t.pendingProps,l=e!==null?e.memoizedProps:null,c=s.children,gr(a,s)?c=null:l!==null&&gr(a,l)&&(t.flags|=32),qu(e,t),Pt(e,t,c,o),t.child;case 6:return e===null&&wr(t),null;case 13:return Ku(e,t,o);case 4:return Er(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=Za(t,null,a,o):Pt(e,t,a,o),t.child;case 11:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Lu(e,t,a,s,o);case 7:return Pt(e,t,t.pendingProps,o),t.child;case 8:return Pt(e,t,t.pendingProps.children,o),t.child;case 12:return Pt(e,t,t.pendingProps.children,o),t.child;case 10:e:{if(a=t.type._context,s=t.pendingProps,l=t.memoizedProps,c=s.value,Fe(Ks,a._currentValue),a._currentValue=c,l!==null)if($t(l.value,c)){if(l.children===s.children&&!Ct.current){t=Ro(e,t,o);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var m=l.dependencies;if(m!==null){c=l.child;for(var S=m.firstContext;S!==null;){if(S.context===a){if(l.tag===1){S=xo(-1,o&-o),S.tag=2;var T=l.updateQueue;if(T!==null){T=T.shared;var _=T.pending;_===null?S.next=S:(S.next=_.next,_.next=S),T.pending=S}}l.lanes|=o,S=l.alternate,S!==null&&(S.lanes|=o),Ar(l.return,o,t),m.lanes|=o;break}S=S.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(r(341));c.lanes|=o,m=c.alternate,m!==null&&(m.lanes|=o),Ar(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}Pt(e,t,s.children,o),t=t.child}return t;case 9:return s=t.type,a=t.pendingProps.children,ei(t,o),s=Ot(s),a=a(s),t.flags|=1,Pt(e,t,a,o),t.child;case 14:return a=t.type,s=Zt(a,t.pendingProps),s=Zt(a.type,s),_u(e,t,a,s,o);case 15:return Nu(e,t,t.type,t.pendingProps,o);case 17:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),an(e,t),t.tag=1,kt(a)?(e=!0,Ns(t)):e=!1,ei(t,o),Eu(t,a,s),Wr(t,a,s,o),Gr(null,t,a,!0,e,o);case 19:return Gu(e,t,o);case 22:return Ou(e,t,o)}throw Error(r(156,t.tag))};function fc(e,t){return Ye(e,t)}function Ch(e,t,o,a){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=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Wt(e,t,o,a){return new Ch(e,t,o,a)}function gl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kh(e){if(typeof e=="function")return gl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ve)return 11;if(e===et)return 14}return 2}function aa(e,t){var o=e.alternate;return o===null?(o=Wt(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 mn(e,t,o,a,s,l){var c=2;if(a=e,typeof e=="function")gl(e)&&(c=1);else if(typeof e=="string")c=5;else e:switch(e){case E:return xa(o.children,s,l,t);case Q:c=8,s|=8;break;case Pe:return e=Wt(12,o,t,s|2),e.elementType=Pe,e.lanes=l,e;case Te:return e=Wt(13,o,t,s),e.elementType=Te,e.lanes=l,e;case Le:return e=Wt(19,o,t,s),e.elementType=Le,e.lanes=l,e;case _e:return yn(o,s,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ce:c=10;break e;case He:c=9;break e;case ve:c=11;break e;case et:c=14;break e;case ot:c=16,a=null;break e}throw Error(r(130,e==null?e:typeof e,""))}return t=Wt(c,o,t,s),t.elementType=e,t.type=a,t.lanes=l,t}function xa(e,t,o,a){return e=Wt(7,e,a,t),e.lanes=o,e}function yn(e,t,o,a){return e=Wt(22,e,a,t),e.elementType=_e,e.lanes=o,e.stateNode={isHidden:!1},e}function hl(e,t,o){return e=Wt(6,e,null,t),e.lanes=o,e}function ml(e,t,o){return t=Wt(4,e.children!==null?e.children:[],e.key,t),t.lanes=o,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function xh(e,t,o,a,s){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=Bn(0),this.expirationTimes=Bn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bn(0),this.identifierPrefix=a,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function yl(e,t,o,a,s,l,c,m,S){return e=new xh(e,t,o,m,S),t===1?(t=1,l===!0&&(t|=8)):t=0,l=Wt(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:a,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Dr(l),e}function Rh(e,t,o){var a=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:De,key:a==null?null:""+a,children:e,containerInfo:t,implementation:o}}function Sc(e){if(!e)return Vo;e=e._reactInternals;e:{if(ee(e)!==e||e.tag!==1)throw Error(r(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(kt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(r(171))}if(e.tag===1){var o=e.type;if(kt(o))return Yd(e,o,t)}return t}function vc(e,t,o,a,s,l,c,m,S){return e=yl(o,a,!0,e,s,l,c,m,S),e.context=Sc(null),o=e.current,a=wt(),s=ta(o),l=xo(a,s),l.callback=t??null,Qo(o,l,s),e.current.lanes=s,wi(e,s,a),At(e,a),e}function fn(e,t,o,a){var s=t.current,l=wt(),c=ta(s);return o=Sc(o),t.context===null?t.context=o:t.pendingContext=o,t=xo(l,c),t.payload={element:e},a=a===void 0?null:a,a!==null&&(t.callback=a),e=Qo(s,t,c),e!==null&&(to(e,s,c,l),Gs(e,s,c)),c}function Sn(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 bc(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var o=e.retryLane;e.retryLane=o!==0&&o<t?o:t}}function fl(e,t){bc(e,t),(e=e.alternate)&&bc(e,t)}function Ah(){return null}var Pc=typeof reportError=="function"?reportError:function(e){console.error(e)};function Sl(e){this._internalRoot=e}vn.prototype.render=Sl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(r(409));fn(e,t,null,null)},vn.prototype.unmount=Sl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;wa(function(){fn(null,e,null,null)}),t[bo]=null}};function vn(e){this._internalRoot=e}vn.prototype.unstable_scheduleHydration=function(e){if(e){var t=id();e={blockedOn:null,target:e,priority:t};for(var o=0;o<Wo.length&&t!==0&&t<Wo[o].priority;o++);Wo.splice(o,0,e),o===0&&rd(e)}};function vl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function bn(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function wc(){}function Ih(e,t,o,a,s){if(s){if(typeof a=="function"){var l=a;a=function(){var T=Sn(c);l.call(T)}}var c=vc(t,a,e,0,null,!1,!1,"",wc);return e._reactRootContainer=c,e[bo]=c.current,Hi(e.nodeType===8?e.parentNode:e),wa(),c}for(;s=e.lastChild;)e.removeChild(s);if(typeof a=="function"){var m=a;a=function(){var T=Sn(S);m.call(T)}}var S=yl(e,0,!1,null,null,!1,!1,"",wc);return e._reactRootContainer=S,e[bo]=S.current,Hi(e.nodeType===8?e.parentNode:e),wa(function(){fn(t,S,o,a)}),S}function Pn(e,t,o,a,s){var l=o._reactRootContainer;if(l){var c=l;if(typeof s=="function"){var m=s;s=function(){var S=Sn(c);m.call(S)}}fn(t,c,e,s)}else c=Ih(o,t,e,s,a);return Sn(c)}od=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var o=Pi(t.pendingLanes);o!==0&&(Wn(t,o|1),At(t,Ue()),(Ee&6)===0&&(si=Ue()+500,Xo()))}break;case 13:wa(function(){var a=ko(e,1);if(a!==null){var s=wt();to(a,e,1,s)}}),fl(e,1)}},Fn=function(e){if(e.tag===13){var t=ko(e,134217728);if(t!==null){var o=wt();to(t,e,134217728,o)}fl(e,134217728)}},ad=function(e){if(e.tag===13){var t=ta(e),o=ko(e,t);if(o!==null){var a=wt();to(o,e,t,a)}fl(e,t)}},id=function(){return Oe},sd=function(e,t){var o=Oe;try{return Oe=e,t()}finally{Oe=o}},La=function(e,t,o){switch(t){case"input":if(gi(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 a=o[t];if(a!==e&&a.form===e.form){var s=Ls(a);if(!s)throw Error(r(90));dt(a),gi(a,s)}}}break;case"textarea":so(e,o);break;case"select":t=o.value,t!=null&&Mo(e,!!o.multiple,t,!1)}},vi=ul,ua=wa;var Dh={usingClientEntryPoint:!1,Events:[Ni,Ya,Ls,Si,ys,ul]},Ji={findFiberByHostInstance:ha,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},Eh={bundleType:Ji.bundleType,version:Ji.version,rendererPackageName:Ji.rendererPackageName,rendererConfig:Ji.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:G.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Ne(e),e===null?null:e.stateNode},findFiberByHostInstance:Ji.findFiberByHostInstance||Ah,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 wn=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wn.isDisabled&&wn.supportsFiber)try{Be=wn.inject(Eh),ht=wn}catch{}}return It.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Dh,It.createPortal=function(e,t){var o=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!vl(t))throw Error(r(200));return Rh(e,t,null,o)},It.createRoot=function(e,t){if(!vl(e))throw Error(r(299));var o=!1,a="",s=Pc;return t!=null&&(t.unstable_strictMode===!0&&(o=!0),t.identifierPrefix!==void 0&&(a=t.identifierPrefix),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=yl(e,1,!1,null,null,o,!1,a,s),e[bo]=t.current,Hi(e.nodeType===8?e.parentNode:e),new Sl(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(r(188)):(e=Object.keys(e).join(","),Error(r(268,e)));return e=Ne(t),e=e===null?null:e.stateNode,e},It.flushSync=function(e){return wa(e)},It.hydrate=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!0,o)},It.hydrateRoot=function(e,t,o){if(!vl(e))throw Error(r(405));var a=o!=null&&o.hydratedSources||null,s=!1,l="",c=Pc;if(o!=null&&(o.unstable_strictMode===!0&&(s=!0),o.identifierPrefix!==void 0&&(l=o.identifierPrefix),o.onRecoverableError!==void 0&&(c=o.onRecoverableError)),t=vc(t,null,e,1,o??null,s,!1,l,c),e[bo]=t.current,Hi(e),a)for(e=0;e<a.length;e++)o=a[e],s=o._getVersion,s=s(o._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[o,s]:t.mutableSourceEagerHydrationData.push(o,s);return new vn(t)},It.render=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!1,o)},It.unmountComponentAtNode=function(e){if(!bn(e))throw Error(r(40));return e._reactRootContainer?(wa(function(){Pn(null,null,e,!1,function(){e._reactRootContainer=null,e[bo]=null})}),!0):!1},It.unstable_batchedUpdates=ul,It.unstable_renderSubtreeIntoContainer=function(e,t,o,a){if(!bn(o))throw Error(r(200));if(e==null||e._reactInternals===void 0)throw Error(r(38));return Pn(e,t,o,!1,a)},It.version="18.3.1-next-f1338f8080-20240426",It}var Ec;function fp(){if(Ec)return wl.exports;Ec=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(n){console.error(n)}}return i(),wl.exports=Nh(),wl.exports}var Tc;function Oh(){if(Tc)return Cn;Tc=1;var i=fp();return Cn.createRoot=i.createRoot,Cn.hydrateRoot=i.hydrateRoot,Cn}var qh=Oh(),R=Fl();const Bh=yp(R),Wh=mp({__proto__:null,default:Bh},[R]);var Un=fp();const Fh=yp(Un),Kh=mp({__proto__:null,default:Fh},[Un]);/**
|
|
41
|
+
`+l.stack}return{value:e,source:t,stack:s,digest:null}}function Fr(e,t,o){return{value:e,source:null,stack:o??null,digest:t??null}}function Kr(e,t){try{console.error(t.value)}catch(o){setTimeout(function(){throw o})}}var nh=typeof WeakMap=="function"?WeakMap:Map;function ju(e,t,o){o=xo(-1,o),o.tag=3,o.payload={element:null};var a=t.value;return o.callback=function(){dn||(dn=!0,nl=a),Kr(e,t)},o}function Uu(e,t,o){o=xo(-1,o),o.tag=3;var a=e.type.getDerivedStateFromError;if(typeof a=="function"){var s=t.value;o.payload=function(){return a(s)},o.callback=function(){Kr(e,t)}}var l=e.stateNode;return l!==null&&typeof l.componentDidCatch=="function"&&(o.callback=function(){Kr(e,t),typeof a!="function"&&(Jo===null?Jo=new Set([this]):Jo.add(this));var c=t.stack;this.componentDidCatch(t.value,{componentStack:c!==null?c:""})}),o}function Mu(e,t,o){var a=e.pingCache;if(a===null){a=e.pingCache=new nh;var s=new Set;a.set(t,s)}else s=a.get(t),s===void 0&&(s=new Set,a.set(t,s));s.has(o)||(s.add(o),e=bh.bind(null,e,t,o),t.then(e,e))}function zu(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 Hu(e,t,o,a,s){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=xo(-1,1),t.tag=2,Qo(o,t,1))),o.lanes|=1),e):(e.flags|=65536,e.lanes=s,e)}var rh=V.ReactCurrentOwner,xt=!1;function Pt(e,t,o,a){t.child=e===null?ou(t,null,o,a):Za(t,e.child,o,a)}function Lu(e,t,o,a,s){o=o.render;var l=t.ref;return ei(t,s),a=Hr(e,t,o,a,l,s),o=Lr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):(Xe&&o&&vr(t),t.flags|=1,Pt(e,t,a,s),t.child)}function _u(e,t,o,a,s){if(e===null){var l=o.type;return typeof l=="function"&&!gl(l)&&l.defaultProps===void 0&&o.compare===null&&o.defaultProps===void 0?(t.tag=15,t.type=l,Nu(e,t,l,a,s)):(e=mn(o.type,null,a,t,t.mode,s),e.ref=t.ref,e.return=t,t.child=e)}if(l=e.child,(e.lanes&s)===0){var c=l.memoizedProps;if(o=o.compare,o=o!==null?o:Ui,o(c,a)&&e.ref===t.ref)return Ro(e,t,s)}return t.flags|=1,e=aa(l,a),e.ref=t.ref,e.return=t,t.child=e}function Nu(e,t,o,a,s){if(e!==null){var l=e.memoizedProps;if(Ui(l,a)&&e.ref===t.ref)if(xt=!1,t.pendingProps=a=l,(e.lanes&s)!==0)(e.flags&131072)!==0&&(xt=!0);else return t.lanes=e.lanes,Ro(e,t,s)}return Yr(e,t,o,a,s)}function Ou(e,t,o){var a=t.pendingProps,s=a.children,l=e!==null?e.memoizedState:null;if(a.mode==="hidden")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Fe(ii,zt),zt|=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,Fe(ii,zt),zt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},a=l!==null?l.baseLanes:o,Fe(ii,zt),zt|=a}else l!==null?(a=l.baseLanes|o,t.memoizedState=null):a=o,Fe(ii,zt),zt|=a;return Pt(e,t,s,o),t.child}function qu(e,t){var o=t.ref;(e===null&&o!==null||e!==null&&e.ref!==o)&&(t.flags|=512,t.flags|=2097152)}function Yr(e,t,o,a,s){var l=kt(o)?ma:ft.current;return l=Ga(t,l),ei(t,s),o=Hr(e,t,o,a,l,s),a=Lr(),e!==null&&!xt?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~s,Ro(e,t,s)):(Xe&&a&&vr(t),t.flags|=1,Pt(e,t,o,s),t.child)}function Bu(e,t,o,a,s){if(kt(o)){var l=!0;Ns(t)}else l=!1;if(ei(t,s),t.stateNode===null)an(e,t),Eu(t,o,a),Wr(t,o,a,s),a=!0;else if(e===null){var c=t.stateNode,m=t.memoizedProps;c.props=m;var S=c.context,T=o.contextType;typeof T=="object"&&T!==null?T=Ot(T):(T=kt(o)?ma:ft.current,T=Ga(t,T));var _=o.getDerivedStateFromProps,q=typeof _=="function"||typeof c.getSnapshotBeforeUpdate=="function";q||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==a||S!==T)&&Tu(t,c,a,T),$o=!1;var L=t.memoizedState;c.state=L,Gs(t,a,c,s),S=t.memoizedState,m!==a||L!==S||Ct.current||$o?(typeof _=="function"&&(Br(t,o,_,a),S=t.memoizedState),(m=$o||Du(t,o,m,a,L,S,T))?(q||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=a,t.memoizedState=S),c.props=a,c.state=S,c.context=T,a=m):(typeof c.componentDidMount=="function"&&(t.flags|=4194308),a=!1)}else{c=t.stateNode,iu(e,t),m=t.memoizedProps,T=t.type===t.elementType?m:Zt(t.type,m),c.props=T,q=t.pendingProps,L=c.context,S=o.contextType,typeof S=="object"&&S!==null?S=Ot(S):(S=kt(o)?ma:ft.current,S=Ga(t,S));var X=o.getDerivedStateFromProps;(_=typeof X=="function"||typeof c.getSnapshotBeforeUpdate=="function")||typeof c.UNSAFE_componentWillReceiveProps!="function"&&typeof c.componentWillReceiveProps!="function"||(m!==q||L!==S)&&Tu(t,c,a,S),$o=!1,L=t.memoizedState,c.state=L,Gs(t,a,c,s);var ae=t.memoizedState;m!==q||L!==ae||Ct.current||$o?(typeof X=="function"&&(Br(t,o,X,a),ae=t.memoizedState),(T=$o||Du(t,o,T,a,L,ae,S)||!1)?(_||typeof c.UNSAFE_componentWillUpdate!="function"&&typeof c.componentWillUpdate!="function"||(typeof c.componentWillUpdate=="function"&&c.componentWillUpdate(a,ae,S),typeof c.UNSAFE_componentWillUpdate=="function"&&c.UNSAFE_componentWillUpdate(a,ae,S)),typeof c.componentDidUpdate=="function"&&(t.flags|=4),typeof c.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=1024),t.memoizedProps=a,t.memoizedState=ae),c.props=a,c.state=ae,c.context=S,a=T):(typeof c.componentDidUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=4),typeof c.getSnapshotBeforeUpdate!="function"||m===e.memoizedProps&&L===e.memoizedState||(t.flags|=1024),a=!1)}return Vr(e,t,o,a,l,s)}function Vr(e,t,o,a,s,l){qu(e,t);var c=(t.flags&128)!==0;if(!a&&!c)return s&&Vd(t,o,!1),Ro(e,t,l);a=t.stateNode,rh.current=t;var m=c&&typeof o.getDerivedStateFromError!="function"?null:a.render();return t.flags|=1,e!==null&&c?(t.child=Za(t,e.child,null,l),t.child=Za(t,null,m,l)):Pt(e,t,m,l),t.memoizedState=a.state,s&&Vd(t,o,!0),t.child}function Wu(e){var t=e.stateNode;t.pendingContext?Kd(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Kd(e,t.context,!1),Er(e,t.containerInfo)}function Fu(e,t,o,a,s){return Qa(),Cr(s),t.flags|=256,Pt(e,t,o,a),t.child}var Gr={dehydrated:null,treeContext:null,retryLane:0};function Xr(e){return{baseLanes:e,cachePool:null,transitions:null}}function Ku(e,t,o){var a=t.pendingProps,s=Qe.current,l=!1,c=(t.flags&128)!==0,m;if((m=c)||(m=e!==null&&e.memoizedState===null?!1:(s&2)!==0),m?(l=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(s|=1),Fe(Qe,s&1),e===null)return wr(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=a.children,e=a.fallback,l?(a=t.mode,l=t.child,c={mode:"hidden",children:c},(a&1)===0&&l!==null?(l.childLanes=0,l.pendingProps=c):l=yn(c,a,0,null),e=xa(e,a,o,null),l.return=t,e.return=t,l.sibling=e,t.child=l,t.child.memoizedState=Xr(o),t.memoizedState=Gr,e):$r(t,c));if(s=e.memoizedState,s!==null&&(m=s.dehydrated,m!==null))return lh(e,t,c,a,m,s,o);if(l){l=a.fallback,c=t.mode,s=e.child,m=s.sibling;var S={mode:"hidden",children:a.children};return(c&1)===0&&t.child!==s?(a=t.child,a.childLanes=0,a.pendingProps=S,t.deletions=null):(a=aa(s,S),a.subtreeFlags=s.subtreeFlags&14680064),m!==null?l=aa(m,l):(l=xa(l,c,o,null),l.flags|=2),l.return=t,a.return=t,a.sibling=l,t.child=a,a=l,l=t.child,c=e.child.memoizedState,c=c===null?Xr(o):{baseLanes:c.baseLanes|o,cachePool:null,transitions:c.transitions},l.memoizedState=c,l.childLanes=e.childLanes&~o,t.memoizedState=Gr,a}return l=e.child,e=l.sibling,a=aa(l,{mode:"visible",children:a.children}),(t.mode&1)===0&&(a.lanes=o),a.return=t,a.sibling=null,e!==null&&(o=t.deletions,o===null?(t.deletions=[e],t.flags|=16):o.push(e)),t.child=a,t.memoizedState=null,a}function $r(e,t){return t=yn({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function on(e,t,o,a){return a!==null&&Cr(a),Za(t,e.child,null,o),e=$r(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function lh(e,t,o,a,s,l,c){if(o)return t.flags&256?(t.flags&=-257,a=Fr(Error(r(422))),on(e,t,c,a)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(l=a.fallback,s=t.mode,a=yn({mode:"visible",children:a.children},s,0,null),l=xa(l,s,c,null),l.flags|=2,a.return=t,l.return=t,a.sibling=l,t.child=a,(t.mode&1)!==0&&Za(t,e.child,null,c),t.child.memoizedState=Xr(c),t.memoizedState=Gr,l);if((t.mode&1)===0)return on(e,t,c,null);if(s.data==="$!"){if(a=s.nextSibling&&s.nextSibling.dataset,a)var m=a.dgst;return a=m,l=Error(r(419)),a=Fr(l,a,void 0),on(e,t,c,a)}if(m=(c&e.childLanes)!==0,xt||m){if(a=ct,a!==null){switch(c&-c){case 4:s=2;break;case 16:s=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:s=32;break;case 536870912:s=268435456;break;default:s=0}s=(s&(a.suspendedLanes|c))!==0?0:s,s!==0&&s!==l.retryLane&&(l.retryLane=s,ko(e,s),to(a,e,s,-1))}return pl(),a=Fr(Error(r(421))),on(e,t,c,a)}return s.data==="$?"?(t.flags|=128,t.child=e.child,t=Ph.bind(null,e),s._reactRetry=t,null):(e=l.treeContext,Mt=Yo(s.nextSibling),Ut=t,Xe=!0,Qt=null,e!==null&&(_t[Nt++]=wo,_t[Nt++]=Co,_t[Nt++]=ya,wo=e.id,Co=e.overflow,ya=t),t=$r(t,a.children),t.flags|=4096,t)}function Yu(e,t,o){e.lanes|=t;var a=e.alternate;a!==null&&(a.lanes|=t),Ar(e.return,t,o)}function Qr(e,t,o,a,s){var l=e.memoizedState;l===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:a,tail:o,tailMode:s}:(l.isBackwards=t,l.rendering=null,l.renderingStartTime=0,l.last=a,l.tail=o,l.tailMode=s)}function Vu(e,t,o){var a=t.pendingProps,s=a.revealOrder,l=a.tail;if(Pt(e,t,a.children,o),a=Qe.current,(a&2)!==0)a=a&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&&Yu(e,o,t);else if(e.tag===19)Yu(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}a&=1}if(Fe(Qe,a),(t.mode&1)===0)t.memoizedState=null;else switch(s){case"forwards":for(o=t.child,s=null;o!==null;)e=o.alternate,e!==null&&Xs(e)===null&&(s=o),o=o.sibling;o=s,o===null?(s=t.child,t.child=null):(s=o.sibling,o.sibling=null),Qr(t,!1,s,o,l);break;case"backwards":for(o=null,s=t.child,t.child=null;s!==null;){if(e=s.alternate,e!==null&&Xs(e)===null){t.child=s;break}e=s.sibling,s.sibling=o,o=s,s=e}Qr(t,!0,o,null,l);break;case"together":Qr(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function an(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function Ro(e,t,o){if(e!==null&&(t.dependencies=e.dependencies),Pa|=t.lanes,(o&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(r(153));if(t.child!==null){for(e=t.child,o=aa(e,e.pendingProps),t.child=o,o.return=t;e.sibling!==null;)e=e.sibling,o=o.sibling=aa(e,e.pendingProps),o.return=t;o.sibling=null}return t.child}function dh(e,t,o){switch(t.tag){case 3:Wu(t),Qa();break;case 5:ru(t);break;case 1:kt(t.type)&&Ns(t);break;case 4:Er(t,t.stateNode.containerInfo);break;case 10:var a=t.type._context,s=t.memoizedProps.value;Fe(Ks,a._currentValue),a._currentValue=s;break;case 13:if(a=t.memoizedState,a!==null)return a.dehydrated!==null?(Fe(Qe,Qe.current&1),t.flags|=128,null):(o&t.child.childLanes)!==0?Ku(e,t,o):(Fe(Qe,Qe.current&1),e=Ro(e,t,o),e!==null?e.sibling:null);Fe(Qe,Qe.current&1);break;case 19:if(a=(o&t.childLanes)!==0,(e.flags&128)!==0){if(a)return Vu(e,t,o);t.flags|=128}if(s=t.memoizedState,s!==null&&(s.rendering=null,s.tail=null,s.lastEffect=null),Fe(Qe,Qe.current),a)break;return null;case 22:case 23:return t.lanes=0,Ou(e,t,o)}return Ro(e,t,o)}var Gu,Zr,Xu,$u;Gu=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}},Zr=function(){},Xu=function(e,t,o,a){var s=e.memoizedProps;if(s!==a){e=t.stateNode,va(po.current);var l=null;switch(o){case"input":s=Ua(e,s),a=Ua(e,a),l=[];break;case"select":s=G({},s,{value:void 0}),a=G({},a,{value:void 0}),l=[];break;case"textarea":s=hi(e,s),a=hi(e,a),l=[];break;default:typeof s.onClick!="function"&&typeof a.onClick=="function"&&(e.onclick=Hs)}za(o,a);var c;o=null;for(T in s)if(!a.hasOwnProperty(T)&&s.hasOwnProperty(T)&&s[T]!=null)if(T==="style"){var m=s[T];for(c in m)m.hasOwnProperty(c)&&(o||(o={}),o[c]="")}else T!=="dangerouslySetInnerHTML"&&T!=="children"&&T!=="suppressContentEditableWarning"&&T!=="suppressHydrationWarning"&&T!=="autoFocus"&&(u.hasOwnProperty(T)?l||(l=[]):(l=l||[]).push(T,null));for(T in a){var S=a[T];if(m=s!=null?s[T]:void 0,a.hasOwnProperty(T)&&S!==m&&(S!=null||m!=null))if(T==="style")if(m){for(c in m)!m.hasOwnProperty(c)||S&&S.hasOwnProperty(c)||(o||(o={}),o[c]="");for(c in S)S.hasOwnProperty(c)&&m[c]!==S[c]&&(o||(o={}),o[c]=S[c])}else o||(l||(l=[]),l.push(T,o)),o=S;else T==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,m=m?m.__html:void 0,S!=null&&m!==S&&(l=l||[]).push(T,S)):T==="children"?typeof S!="string"&&typeof S!="number"||(l=l||[]).push(T,""+S):T!=="suppressContentEditableWarning"&&T!=="suppressHydrationWarning"&&(u.hasOwnProperty(T)?(S!=null&&T==="onScroll"&&Ve("scroll",e),l||m===S||(l=[])):(l=l||[]).push(T,S))}o&&(l=l||[]).push("style",o);var T=l;(t.updateQueue=T)&&(t.flags|=4)}},$u=function(e,t,o,a){o!==a&&(t.flags|=4)};function Gi(e,t){if(!Xe)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 a=null;o!==null;)o.alternate!==null&&(a=o),o=o.sibling;a===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:a.sibling=null}}function vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,o=0,a=0;if(t)for(var s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags&14680064,a|=s.flags&14680064,s.return=e,s=s.sibling;else for(s=e.child;s!==null;)o|=s.lanes|s.childLanes,a|=s.subtreeFlags,a|=s.flags,s.return=e,s=s.sibling;return e.subtreeFlags|=a,e.childLanes=o,t}function uh(e,t,o){var a=t.pendingProps;switch(br(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 kt(t.type)&&_s(),vt(t),null;case 3:return a=t.stateNode,ti(),Ge(Ct),Ge(ft),Ur(),a.pendingContext&&(a.context=a.pendingContext,a.pendingContext=null),(e===null||e.child===null)&&(Ws(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Qt!==null&&(dl(Qt),Qt=null))),Zr(e,t),vt(t),null;case 5:Tr(t);var s=va(Wi.current);if(o=t.type,e!==null&&t.stateNode!=null)Xu(e,t,o,a,s),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!a){if(t.stateNode===null)throw Error(r(166));return vt(t),null}if(e=va(po.current),Ws(t)){a=t.stateNode,o=t.type;var l=t.memoizedProps;switch(a[co]=t,a[_i]=l,e=(t.mode&1)!==0,o){case"dialog":Ve("cancel",a),Ve("close",a);break;case"iframe":case"object":case"embed":Ve("load",a);break;case"video":case"audio":for(s=0;s<zi.length;s++)Ve(zi[s],a);break;case"source":Ve("error",a);break;case"img":case"image":case"link":Ve("error",a),Ve("load",a);break;case"details":Ve("toggle",a);break;case"input":cs(a,l),Ve("invalid",a);break;case"select":a._wrapperState={wasMultiple:!!l.multiple},Ve("invalid",a);break;case"textarea":gs(a,l),Ve("invalid",a)}za(o,l),s=null;for(var c in l)if(l.hasOwnProperty(c)){var m=l[c];c==="children"?typeof m=="string"?a.textContent!==m&&(l.suppressHydrationWarning!==!0&&zs(a.textContent,m,e),s=["children",m]):typeof m=="number"&&a.textContent!==""+m&&(l.suppressHydrationWarning!==!0&&zs(a.textContent,m,e),s=["children",""+m]):u.hasOwnProperty(c)&&m!=null&&c==="onScroll"&&Ve("scroll",a)}switch(o){case"input":yo(a),ps(a,l,!0);break;case"textarea":yo(a),zo(a);break;case"select":case"option":break;default:typeof l.onClick=="function"&&(a.onclick=Hs)}a=s,t.updateQueue=a,a!==null&&(t.flags|=4)}else{c=s.nodeType===9?s:s.ownerDocument,e==="http://www.w3.org/1999/xhtml"&&(e=mi(o)),e==="http://www.w3.org/1999/xhtml"?o==="script"?(e=c.createElement("div"),e.innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):typeof a.is=="string"?e=c.createElement(o,{is:a.is}):(e=c.createElement(o),o==="select"&&(c=e,a.multiple?c.multiple=!0:a.size&&(c.size=a.size))):e=c.createElementNS(e,o),e[co]=t,e[_i]=a,Gu(e,t,!1,!1),t.stateNode=e;e:{switch(c=fi(o,a),o){case"dialog":Ve("cancel",e),Ve("close",e),s=a;break;case"iframe":case"object":case"embed":Ve("load",e),s=a;break;case"video":case"audio":for(s=0;s<zi.length;s++)Ve(zi[s],e);s=a;break;case"source":Ve("error",e),s=a;break;case"img":case"image":case"link":Ve("error",e),Ve("load",e),s=a;break;case"details":Ve("toggle",e),s=a;break;case"input":cs(e,a),s=Ua(e,a),Ve("invalid",e);break;case"option":s=a;break;case"select":e._wrapperState={wasMultiple:!!a.multiple},s=G({},a,{value:void 0}),Ve("invalid",e);break;case"textarea":gs(e,a),s=hi(e,a),Ve("invalid",e);break;default:s=a}za(o,s),m=s;for(l in m)if(m.hasOwnProperty(l)){var S=m[l];l==="style"?yi(e,S):l==="dangerouslySetInnerHTML"?(S=S?S.__html:void 0,S!=null&&Lt(e,S)):l==="children"?typeof S=="string"?(o!=="textarea"||S!=="")&&Ho(e,S):typeof S=="number"&&Ho(e,""+S):l!=="suppressContentEditableWarning"&&l!=="suppressHydrationWarning"&&l!=="autoFocus"&&(u.hasOwnProperty(l)?S!=null&&l==="onScroll"&&Ve("scroll",e):S!=null&&$(e,l,S,c))}switch(o){case"input":yo(e),ps(e,a,!1);break;case"textarea":yo(e),zo(e);break;case"option":a.value!=null&&e.setAttribute("value",""+ke(a.value));break;case"select":e.multiple=!!a.multiple,l=a.value,l!=null?Mo(e,!!a.multiple,l,!1):a.defaultValue!=null&&Mo(e,!!a.multiple,a.defaultValue,!0);break;default:typeof s.onClick=="function"&&(e.onclick=Hs)}switch(o){case"button":case"input":case"select":case"textarea":a=!!a.autoFocus;break e;case"img":a=!0;break e;default:a=!1}}a&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return vt(t),null;case 6:if(e&&t.stateNode!=null)$u(e,t,e.memoizedProps,a);else{if(typeof a!="string"&&t.stateNode===null)throw Error(r(166));if(o=va(Wi.current),va(po.current),Ws(t)){if(a=t.stateNode,o=t.memoizedProps,a[co]=t,(l=a.nodeValue!==o)&&(e=Ut,e!==null))switch(e.tag){case 3:zs(a.nodeValue,o,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&zs(a.nodeValue,o,(e.mode&1)!==0)}l&&(t.flags|=4)}else a=(o.nodeType===9?o:o.ownerDocument).createTextNode(a),a[co]=t,t.stateNode=a}return vt(t),null;case 13:if(Ge(Qe),a=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(Xe&&Mt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)Jd(),Qa(),t.flags|=98560,l=!1;else if(l=Ws(t),a!==null&&a.dehydrated!==null){if(e===null){if(!l)throw Error(r(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(r(317));l[co]=t}else Qa(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;vt(t),l=!1}else Qt!==null&&(dl(Qt),Qt=null),l=!0;if(!l)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=o,t):(a=a!==null,a!==(e!==null&&e.memoizedState!==null)&&a&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(Qe.current&1)!==0?lt===0&&(lt=3):pl())),t.updateQueue!==null&&(t.flags|=4),vt(t),null);case 4:return ti(),Zr(e,t),e===null&&Hi(t.stateNode.containerInfo),vt(t),null;case 10:return Rr(t.type._context),vt(t),null;case 17:return kt(t.type)&&_s(),vt(t),null;case 19:if(Ge(Qe),l=t.memoizedState,l===null)return vt(t),null;if(a=(t.flags&128)!==0,c=l.rendering,c===null)if(a)Gi(l,!1);else{if(lt!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(c=Xs(e),c!==null){for(t.flags|=128,Gi(l,!1),a=c.updateQueue,a!==null&&(t.updateQueue=a,t.flags|=4),t.subtreeFlags=0,a=o,o=t.child;o!==null;)l=o,e=a,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 Fe(Qe,Qe.current&1|2),t.child}e=e.sibling}l.tail!==null&&Ue()>si&&(t.flags|=128,a=!0,Gi(l,!1),t.lanes=4194304)}else{if(!a)if(e=Xs(c),e!==null){if(t.flags|=128,a=!0,o=e.updateQueue,o!==null&&(t.updateQueue=o,t.flags|=4),Gi(l,!0),l.tail===null&&l.tailMode==="hidden"&&!c.alternate&&!Xe)return vt(t),null}else 2*Ue()-l.renderingStartTime>si&&o!==1073741824&&(t.flags|=128,a=!0,Gi(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=Ue(),t.sibling=null,o=Qe.current,Fe(Qe,a?o&1|2:o&1),t):(vt(t),null);case 22:case 23:return cl(),a=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==a&&(t.flags|=8192),a&&(t.mode&1)!==0?(zt&1073741824)!==0&&(vt(t),t.subtreeFlags&6&&(t.flags|=8192)):vt(t),null;case 24:return null;case 25:return null}throw Error(r(156,t.tag))}function ch(e,t){switch(br(t),t.tag){case 1:return kt(t.type)&&_s(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ti(),Ge(Ct),Ge(ft),Ur(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Tr(t),null;case 13:if(Ge(Qe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(r(340));Qa()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(Qe),null;case 4:return ti(),null;case 10:return Rr(t.type._context),null;case 22:case 23:return cl(),null;case 24:return null;default:return null}}var sn=!1,bt=!1,ph=typeof WeakSet=="function"?WeakSet:Set,J=null;function ai(e,t){var o=e.ref;if(o!==null)if(typeof o=="function")try{o(null)}catch(a){tt(e,t,a)}else o.current=null}function Jr(e,t,o){try{o()}catch(a){tt(e,t,a)}}var Qu=!1;function gh(e,t){if(cr=ks,e=Dd(),ar(e)){if("selectionStart"in e)var o={start:e.selectionStart,end:e.selectionEnd};else e:{o=(o=e.ownerDocument)&&o.defaultView||window;var a=o.getSelection&&o.getSelection();if(a&&a.rangeCount!==0){o=a.anchorNode;var s=a.anchorOffset,l=a.focusNode;a=a.focusOffset;try{o.nodeType,l.nodeType}catch{o=null;break e}var c=0,m=-1,S=-1,T=0,_=0,q=e,L=null;t:for(;;){for(var X;q!==o||s!==0&&q.nodeType!==3||(m=c+s),q!==l||a!==0&&q.nodeType!==3||(S=c+a),q.nodeType===3&&(c+=q.nodeValue.length),(X=q.firstChild)!==null;)L=q,q=X;for(;;){if(q===e)break t;if(L===o&&++T===s&&(m=c),L===l&&++_===a&&(S=c),(X=q.nextSibling)!==null)break;q=L,L=q.parentNode}q=X}o=m===-1||S===-1?null:{start:m,end:S}}else o=null}o=o||{start:0,end:0}}else o=null;for(pr={focusedElem:e,selectionRange:o},ks=!1,J=t;J!==null;)if(t=J,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,J=e;else for(;J!==null;){t=J;try{var ae=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(ae!==null){var ne=ae.memoizedProps,at=ae.memoizedState,A=t.stateNode,b=A.getSnapshotBeforeUpdate(t.elementType===t.type?ne:Zt(t.type,ne),at);A.__reactInternalSnapshotBeforeUpdate=b}break;case 3:var I=t.stateNode.containerInfo;I.nodeType===1?I.textContent="":I.nodeType===9&&I.documentElement&&I.removeChild(I.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(r(163))}}catch(W){tt(t,t.return,W)}if(e=t.sibling,e!==null){e.return=t.return,J=e;break}J=t.return}return ae=Qu,Qu=!1,ae}function Xi(e,t,o){var a=t.updateQueue;if(a=a!==null?a.lastEffect:null,a!==null){var s=a=a.next;do{if((s.tag&e)===e){var l=s.destroy;s.destroy=void 0,l!==void 0&&Jr(t,o,l)}s=s.next}while(s!==a)}}function nn(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 a=o.create;o.destroy=a()}o=o.next}while(o!==t)}}function el(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 Zu(e){var t=e.alternate;t!==null&&(e.alternate=null,Zu(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[co],delete t[_i],delete t[yr],delete t[Xg],delete t[$g])),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 Ju(e){return e.tag===5||e.tag===3||e.tag===4}function ec(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Ju(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 tl(e,t,o){var a=e.tag;if(a===5||a===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=Hs));else if(a!==4&&(e=e.child,e!==null))for(tl(e,t,o),e=e.sibling;e!==null;)tl(e,t,o),e=e.sibling}function ol(e,t,o){var a=e.tag;if(a===5||a===6)e=e.stateNode,t?o.insertBefore(e,t):o.appendChild(e);else if(a!==4&&(e=e.child,e!==null))for(ol(e,t,o),e=e.sibling;e!==null;)ol(e,t,o),e=e.sibling}var mt=null,Jt=!1;function Zo(e,t,o){for(o=o.child;o!==null;)tc(e,t,o),o=o.sibling}function tc(e,t,o){if(ht&&typeof ht.onCommitFiberUnmount=="function")try{ht.onCommitFiberUnmount(Be,o)}catch{}switch(o.tag){case 5:bt||ai(o,t);case 6:var a=mt,s=Jt;mt=null,Zo(e,t,o),mt=a,Jt=s,mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?e.parentNode.removeChild(o):e.removeChild(o)):mt.removeChild(o.stateNode));break;case 18:mt!==null&&(Jt?(e=mt,o=o.stateNode,e.nodeType===8?mr(e.parentNode,o):e.nodeType===1&&mr(e,o),Ai(e)):mr(mt,o.stateNode));break;case 4:a=mt,s=Jt,mt=o.stateNode.containerInfo,Jt=!0,Zo(e,t,o),mt=a,Jt=s;break;case 0:case 11:case 14:case 15:if(!bt&&(a=o.updateQueue,a!==null&&(a=a.lastEffect,a!==null))){s=a=a.next;do{var l=s,c=l.destroy;l=l.tag,c!==void 0&&((l&2)!==0||(l&4)!==0)&&Jr(o,t,c),s=s.next}while(s!==a)}Zo(e,t,o);break;case 1:if(!bt&&(ai(o,t),a=o.stateNode,typeof a.componentWillUnmount=="function"))try{a.props=o.memoizedProps,a.state=o.memoizedState,a.componentWillUnmount()}catch(m){tt(o,t,m)}Zo(e,t,o);break;case 21:Zo(e,t,o);break;case 22:o.mode&1?(bt=(a=bt)||o.memoizedState!==null,Zo(e,t,o),bt=a):Zo(e,t,o);break;default:Zo(e,t,o)}}function oc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var o=e.stateNode;o===null&&(o=e.stateNode=new ph),t.forEach(function(a){var s=wh.bind(null,e,a);o.has(a)||(o.add(a),a.then(s,s))})}}function eo(e,t){var o=t.deletions;if(o!==null)for(var a=0;a<o.length;a++){var s=o[a];try{var l=e,c=t,m=c;e:for(;m!==null;){switch(m.tag){case 5:mt=m.stateNode,Jt=!1;break e;case 3:mt=m.stateNode.containerInfo,Jt=!0;break e;case 4:mt=m.stateNode.containerInfo,Jt=!0;break e}m=m.return}if(mt===null)throw Error(r(160));tc(l,c,s),mt=null,Jt=!1;var S=s.alternate;S!==null&&(S.return=null),s.return=null}catch(T){tt(s,t,T)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)ac(t,e),t=t.sibling}function ac(e,t){var o=e.alternate,a=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(eo(t,e),ho(e),a&4){try{Xi(3,e,e.return),nn(3,e)}catch(ne){tt(e,e.return,ne)}try{Xi(5,e,e.return)}catch(ne){tt(e,e.return,ne)}}break;case 1:eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return);break;case 5:if(eo(t,e),ho(e),a&512&&o!==null&&ai(o,o.return),e.flags&32){var s=e.stateNode;try{Ho(s,"")}catch(ne){tt(e,e.return,ne)}}if(a&4&&(s=e.stateNode,s!=null)){var l=e.memoizedProps,c=o!==null?o.memoizedProps:l,m=e.type,S=e.updateQueue;if(e.updateQueue=null,S!==null)try{m==="input"&&l.type==="radio"&&l.name!=null&&io(s,l),fi(m,c);var T=fi(m,l);for(c=0;c<S.length;c+=2){var _=S[c],q=S[c+1];_==="style"?yi(s,q):_==="dangerouslySetInnerHTML"?Lt(s,q):_==="children"?Ho(s,q):$(s,_,q,T)}switch(m){case"input":gi(s,l);break;case"textarea":so(s,l);break;case"select":var L=s._wrapperState.wasMultiple;s._wrapperState.wasMultiple=!!l.multiple;var X=l.value;X!=null?Mo(s,!!l.multiple,X,!1):L!==!!l.multiple&&(l.defaultValue!=null?Mo(s,!!l.multiple,l.defaultValue,!0):Mo(s,!!l.multiple,l.multiple?[]:"",!1))}s[_i]=l}catch(ne){tt(e,e.return,ne)}}break;case 6:if(eo(t,e),ho(e),a&4){if(e.stateNode===null)throw Error(r(162));s=e.stateNode,l=e.memoizedProps;try{s.nodeValue=l}catch(ne){tt(e,e.return,ne)}}break;case 3:if(eo(t,e),ho(e),a&4&&o!==null&&o.memoizedState.isDehydrated)try{Ai(t.containerInfo)}catch(ne){tt(e,e.return,ne)}break;case 4:eo(t,e),ho(e);break;case 13:eo(t,e),ho(e),s=e.child,s.flags&8192&&(l=s.memoizedState!==null,s.stateNode.isHidden=l,!l||s.alternate!==null&&s.alternate.memoizedState!==null||(sl=Ue())),a&4&&oc(e);break;case 22:if(_=o!==null&&o.memoizedState!==null,e.mode&1?(bt=(T=bt)||_,eo(t,e),bt=T):eo(t,e),ho(e),a&8192){if(T=e.memoizedState!==null,(e.stateNode.isHidden=T)&&!_&&(e.mode&1)!==0)for(J=e,_=e.child;_!==null;){for(q=J=_;J!==null;){switch(L=J,X=L.child,L.tag){case 0:case 11:case 14:case 15:Xi(4,L,L.return);break;case 1:ai(L,L.return);var ae=L.stateNode;if(typeof ae.componentWillUnmount=="function"){a=L,o=L.return;try{t=a,ae.props=t.memoizedProps,ae.state=t.memoizedState,ae.componentWillUnmount()}catch(ne){tt(a,o,ne)}}break;case 5:ai(L,L.return);break;case 22:if(L.memoizedState!==null){nc(q);continue}}X!==null?(X.return=L,J=X):nc(q)}_=_.sibling}e:for(_=null,q=e;;){if(q.tag===5){if(_===null){_=q;try{s=q.stateNode,T?(l=s.style,typeof l.setProperty=="function"?l.setProperty("display","none","important"):l.display="none"):(m=q.stateNode,S=q.memoizedProps.style,c=S!=null&&S.hasOwnProperty("display")?S.display:null,m.style.display=Gt("display",c))}catch(ne){tt(e,e.return,ne)}}}else if(q.tag===6){if(_===null)try{q.stateNode.nodeValue=T?"":q.memoizedProps}catch(ne){tt(e,e.return,ne)}}else if((q.tag!==22&&q.tag!==23||q.memoizedState===null||q===e)&&q.child!==null){q.child.return=q,q=q.child;continue}if(q===e)break e;for(;q.sibling===null;){if(q.return===null||q.return===e)break e;_===q&&(_=null),q=q.return}_===q&&(_=null),q.sibling.return=q.return,q=q.sibling}}break;case 19:eo(t,e),ho(e),a&4&&oc(e);break;case 21:break;default:eo(t,e),ho(e)}}function ho(e){var t=e.flags;if(t&2){try{e:{for(var o=e.return;o!==null;){if(Ju(o)){var a=o;break e}o=o.return}throw Error(r(160))}switch(a.tag){case 5:var s=a.stateNode;a.flags&32&&(Ho(s,""),a.flags&=-33);var l=ec(e);ol(e,l,s);break;case 3:case 4:var c=a.stateNode.containerInfo,m=ec(e);tl(e,m,c);break;default:throw Error(r(161))}}catch(S){tt(e,e.return,S)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function hh(e,t,o){J=e,ic(e)}function ic(e,t,o){for(var a=(e.mode&1)!==0;J!==null;){var s=J,l=s.child;if(s.tag===22&&a){var c=s.memoizedState!==null||sn;if(!c){var m=s.alternate,S=m!==null&&m.memoizedState!==null||bt;m=sn;var T=bt;if(sn=c,(bt=S)&&!T)for(J=s;J!==null;)c=J,S=c.child,c.tag===22&&c.memoizedState!==null?rc(s):S!==null?(S.return=c,J=S):rc(s);for(;l!==null;)J=l,ic(l),l=l.sibling;J=s,sn=m,bt=T}sc(e)}else(s.subtreeFlags&8772)!==0&&l!==null?(l.return=s,J=l):sc(e)}}function sc(e){for(;J!==null;){var t=J;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||nn(5,t);break;case 1:var a=t.stateNode;if(t.flags&4&&!bt)if(o===null)a.componentDidMount();else{var s=t.elementType===t.type?o.memoizedProps:Zt(t.type,o.memoizedProps);a.componentDidUpdate(s,o.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}var l=t.updateQueue;l!==null&&nu(t,l,a);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}nu(t,c,o)}break;case 5:var m=t.stateNode;if(o===null&&t.flags&4){o=m;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 T=t.alternate;if(T!==null){var _=T.memoizedState;if(_!==null){var q=_.dehydrated;q!==null&&Ai(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(r(163))}bt||t.flags&512&&el(t)}catch(L){tt(t,t.return,L)}}if(t===e){J=null;break}if(o=t.sibling,o!==null){o.return=t.return,J=o;break}J=t.return}}function nc(e){for(;J!==null;){var t=J;if(t===e){J=null;break}var o=t.sibling;if(o!==null){o.return=t.return,J=o;break}J=t.return}}function rc(e){for(;J!==null;){var t=J;try{switch(t.tag){case 0:case 11:case 15:var o=t.return;try{nn(4,t)}catch(S){tt(t,o,S)}break;case 1:var a=t.stateNode;if(typeof a.componentDidMount=="function"){var s=t.return;try{a.componentDidMount()}catch(S){tt(t,s,S)}}var l=t.return;try{el(t)}catch(S){tt(t,l,S)}break;case 5:var c=t.return;try{el(t)}catch(S){tt(t,c,S)}}}catch(S){tt(t,t.return,S)}if(t===e){J=null;break}var m=t.sibling;if(m!==null){m.return=t.return,J=m;break}J=t.return}}var mh=Math.ceil,rn=V.ReactCurrentDispatcher,al=V.ReactCurrentOwner,Bt=V.ReactCurrentBatchConfig,Ee=0,ct=null,it=null,yt=0,zt=0,ii=Vo(0),lt=0,$i=null,Pa=0,ln=0,il=0,Qi=null,Rt=null,sl=0,si=1/0,Ao=null,dn=!1,nl=null,Jo=null,un=!1,ea=null,cn=0,Zi=0,rl=null,pn=-1,gn=0;function wt(){return(Ee&6)!==0?Ue():pn!==-1?pn:pn=Ue()}function ta(e){return(e.mode&1)===0?1:(Ee&2)!==0&&yt!==0?yt&-yt:Zg.transition!==null?(gn===0&&(gn=ed()),gn):(e=Oe,e!==0||(e=window.event,e=e===void 0?16:dd(e.type)),e)}function to(e,t,o,a){if(50<Zi)throw Zi=0,rl=null,Error(r(185));wi(e,o,a),((Ee&2)===0||e!==ct)&&(e===ct&&((Ee&2)===0&&(ln|=o),lt===4&&oa(e,yt)),At(e,a),o===1&&Ee===0&&(t.mode&1)===0&&(si=Ue()+500,Os&&Xo()))}function At(e,t){var o=e.callbackNode;Zp(e,t);var a=Ps(e,e===ct?yt:0);if(a===0)o!==null&&fo(o),e.callbackNode=null,e.callbackPriority=0;else if(t=a&-a,e.callbackPriority!==t){if(o!=null&&fo(o),t===1)e.tag===0?Qg(dc.bind(null,e)):Gd(dc.bind(null,e)),Vg(function(){(Ee&6)===0&&Xo()}),o=null;else{switch(td(a)){case 1:o=So;break;case 4:o=uo;break;case 16:o=vo;break;case 536870912:o=Ae;break;default:o=vo}o=fc(o,lc.bind(null,e))}e.callbackPriority=t,e.callbackNode=o}}function lc(e,t){if(pn=-1,gn=0,(Ee&6)!==0)throw Error(r(327));var o=e.callbackNode;if(ni()&&e.callbackNode!==o)return null;var a=Ps(e,e===ct?yt:0);if(a===0)return null;if((a&30)!==0||(a&e.expiredLanes)!==0||t)t=hn(e,a);else{t=a;var s=Ee;Ee|=2;var l=cc();(ct!==e||yt!==t)&&(Ao=null,si=Ue()+500,Ca(e,t));do try{Sh();break}catch(m){uc(e,m)}while(!0);xr(),rn.current=l,Ee=s,it!==null?t=0:(ct=null,yt=0,t=lt)}if(t!==0){if(t===2&&(s=qn(e),s!==0&&(a=s,t=ll(e,s))),t===1)throw o=$i,Ca(e,0),oa(e,a),At(e,Ue()),o;if(t===6)oa(e,a);else{if(s=e.current.alternate,(a&30)===0&&!yh(s)&&(t=hn(e,a),t===2&&(l=qn(e),l!==0&&(a=l,t=ll(e,l))),t===1))throw o=$i,Ca(e,0),oa(e,a),At(e,Ue()),o;switch(e.finishedWork=s,e.finishedLanes=a,t){case 0:case 1:throw Error(r(345));case 2:ka(e,Rt,Ao);break;case 3:if(oa(e,a),(a&130023424)===a&&(t=sl+500-Ue(),10<t)){if(Ps(e,0)!==0)break;if(s=e.suspendedLanes,(s&a)!==a){wt(),e.pingedLanes|=e.suspendedLanes&s;break}e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),t);break}ka(e,Rt,Ao);break;case 4:if(oa(e,a),(a&4194240)===a)break;for(t=e.eventTimes,s=-1;0<a;){var c=31-Me(a);l=1<<c,c=t[c],c>s&&(s=c),a&=~l}if(a=s,a=Ue()-a,a=(120>a?120:480>a?480:1080>a?1080:1920>a?1920:3e3>a?3e3:4320>a?4320:1960*mh(a/1960))-a,10<a){e.timeoutHandle=hr(ka.bind(null,e,Rt,Ao),a);break}ka(e,Rt,Ao);break;case 5:ka(e,Rt,Ao);break;default:throw Error(r(329))}}}return At(e,Ue()),e.callbackNode===o?lc.bind(null,e):null}function ll(e,t){var o=Qi;return e.current.memoizedState.isDehydrated&&(Ca(e,t).flags|=256),e=hn(e,t),e!==2&&(t=Rt,Rt=o,t!==null&&dl(t)),e}function dl(e){Rt===null?Rt=e:Rt.push.apply(Rt,e)}function yh(e){for(var t=e;;){if(t.flags&16384){var o=t.updateQueue;if(o!==null&&(o=o.stores,o!==null))for(var a=0;a<o.length;a++){var s=o[a],l=s.getSnapshot;s=s.value;try{if(!$t(l(),s))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 oa(e,t){for(t&=~il,t&=~ln,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var o=31-Me(t),a=1<<o;e[o]=-1,t&=~a}}function dc(e){if((Ee&6)!==0)throw Error(r(327));ni();var t=Ps(e,0);if((t&1)===0)return At(e,Ue()),null;var o=hn(e,t);if(e.tag!==0&&o===2){var a=qn(e);a!==0&&(t=a,o=ll(e,a))}if(o===1)throw o=$i,Ca(e,0),oa(e,t),At(e,Ue()),o;if(o===6)throw Error(r(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,ka(e,Rt,Ao),At(e,Ue()),null}function ul(e,t){var o=Ee;Ee|=1;try{return e(t)}finally{Ee=o,Ee===0&&(si=Ue()+500,Os&&Xo())}}function wa(e){ea!==null&&ea.tag===0&&(Ee&6)===0&&ni();var t=Ee;Ee|=1;var o=Bt.transition,a=Oe;try{if(Bt.transition=null,Oe=1,e)return e()}finally{Oe=a,Bt.transition=o,Ee=t,(Ee&6)===0&&Xo()}}function cl(){zt=ii.current,Ge(ii)}function Ca(e,t){e.finishedWork=null,e.finishedLanes=0;var o=e.timeoutHandle;if(o!==-1&&(e.timeoutHandle=-1,Yg(o)),it!==null)for(o=it.return;o!==null;){var a=o;switch(br(a),a.tag){case 1:a=a.type.childContextTypes,a!=null&&_s();break;case 3:ti(),Ge(Ct),Ge(ft),Ur();break;case 5:Tr(a);break;case 4:ti();break;case 13:Ge(Qe);break;case 19:Ge(Qe);break;case 10:Rr(a.type._context);break;case 22:case 23:cl()}o=o.return}if(ct=e,it=e=aa(e.current,null),yt=zt=t,lt=0,$i=null,il=ln=Pa=0,Rt=Qi=null,Sa!==null){for(t=0;t<Sa.length;t++)if(o=Sa[t],a=o.interleaved,a!==null){o.interleaved=null;var s=a.next,l=o.pending;if(l!==null){var c=l.next;l.next=s,a.next=c}o.pending=a}Sa=null}return e}function uc(e,t){do{var o=it;try{if(xr(),$s.current=en,Qs){for(var a=Ze.memoizedState;a!==null;){var s=a.queue;s!==null&&(s.pending=null),a=a.next}Qs=!1}if(ba=0,ut=rt=Ze=null,Fi=!1,Ki=0,al.current=null,o===null||o.return===null){lt=1,$i=t,it=null;break}e:{var l=e,c=o.return,m=o,S=t;if(t=yt,m.flags|=32768,S!==null&&typeof S=="object"&&typeof S.then=="function"){var T=S,_=m,q=_.tag;if((_.mode&1)===0&&(q===0||q===11||q===15)){var L=_.alternate;L?(_.updateQueue=L.updateQueue,_.memoizedState=L.memoizedState,_.lanes=L.lanes):(_.updateQueue=null,_.memoizedState=null)}var X=zu(c);if(X!==null){X.flags&=-257,Hu(X,c,m,l,t),X.mode&1&&Mu(l,T,t),t=X,S=T;var ae=t.updateQueue;if(ae===null){var ne=new Set;ne.add(S),t.updateQueue=ne}else ae.add(S);break e}else{if((t&1)===0){Mu(l,T,t),pl();break e}S=Error(r(426))}}else if(Xe&&m.mode&1){var at=zu(c);if(at!==null){(at.flags&65536)===0&&(at.flags|=256),Hu(at,c,m,l,t),Cr(oi(S,m));break e}}l=S=oi(S,m),lt!==4&&(lt=2),Qi===null?Qi=[l]:Qi.push(l),l=c;do{switch(l.tag){case 3:l.flags|=65536,t&=-t,l.lanes|=t;var A=ju(l,S,t);su(l,A);break e;case 1:m=S;var b=l.type,I=l.stateNode;if((l.flags&128)===0&&(typeof b.getDerivedStateFromError=="function"||I!==null&&typeof I.componentDidCatch=="function"&&(Jo===null||!Jo.has(I)))){l.flags|=65536,t&=-t,l.lanes|=t;var W=Uu(l,m,t);su(l,W);break e}}l=l.return}while(l!==null)}gc(o)}catch(re){t=re,it===o&&o!==null&&(it=o=o.return);continue}break}while(!0)}function cc(){var e=rn.current;return rn.current=en,e===null?en:e}function pl(){(lt===0||lt===3||lt===2)&&(lt=4),ct===null||(Pa&268435455)===0&&(ln&268435455)===0||oa(ct,yt)}function hn(e,t){var o=Ee;Ee|=2;var a=cc();(ct!==e||yt!==t)&&(Ao=null,Ca(e,t));do try{fh();break}catch(s){uc(e,s)}while(!0);if(xr(),Ee=o,rn.current=a,it!==null)throw Error(r(261));return ct=null,yt=0,lt}function fh(){for(;it!==null;)pc(it)}function Sh(){for(;it!==null&&!pa();)pc(it)}function pc(e){var t=yc(e.alternate,e,zt);e.memoizedProps=e.pendingProps,t===null?gc(e):it=t,al.current=null}function gc(e){var t=e;do{var o=t.alternate;if(e=t.return,(t.flags&32768)===0){if(o=uh(o,t,zt),o!==null){it=o;return}}else{if(o=ch(o,t),o!==null){o.flags&=32767,it=o;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{lt=6,it=null;return}}if(t=t.sibling,t!==null){it=t;return}it=t=e}while(t!==null);lt===0&&(lt=5)}function ka(e,t,o){var a=Oe,s=Bt.transition;try{Bt.transition=null,Oe=1,vh(e,t,o,a)}finally{Bt.transition=s,Oe=a}return null}function vh(e,t,o,a){do ni();while(ea!==null);if((Ee&6)!==0)throw Error(r(327));o=e.finishedWork;var s=e.finishedLanes;if(o===null)return null;if(e.finishedWork=null,e.finishedLanes=0,o===e.current)throw Error(r(177));e.callbackNode=null,e.callbackPriority=0;var l=o.lanes|o.childLanes;if(Jp(e,l),e===ct&&(it=ct=null,yt=0),(o.subtreeFlags&2064)===0&&(o.flags&2064)===0||un||(un=!0,fc(vo,function(){return ni(),null})),l=(o.flags&15990)!==0,(o.subtreeFlags&15990)!==0||l){l=Bt.transition,Bt.transition=null;var c=Oe;Oe=1;var m=Ee;Ee|=4,al.current=null,gh(e,o),ac(o,e),Ng(pr),ks=!!cr,pr=cr=null,e.current=o,hh(o),Xt(),Ee=m,Oe=c,Bt.transition=l}else e.current=o;if(un&&(un=!1,ea=e,cn=s),l=e.pendingLanes,l===0&&(Jo=null),ga(o.stateNode),At(e,Ue()),t!==null)for(a=e.onRecoverableError,o=0;o<t.length;o++)s=t[o],a(s.value,{componentStack:s.stack,digest:s.digest});if(dn)throw dn=!1,e=nl,nl=null,e;return(cn&1)!==0&&e.tag!==0&&ni(),l=e.pendingLanes,(l&1)!==0?e===rl?Zi++:(Zi=0,rl=e):Zi=0,Xo(),null}function ni(){if(ea!==null){var e=td(cn),t=Bt.transition,o=Oe;try{if(Bt.transition=null,Oe=16>e?16:e,ea===null)var a=!1;else{if(e=ea,ea=null,cn=0,(Ee&6)!==0)throw Error(r(331));var s=Ee;for(Ee|=4,J=e.current;J!==null;){var l=J,c=l.child;if((J.flags&16)!==0){var m=l.deletions;if(m!==null){for(var S=0;S<m.length;S++){var T=m[S];for(J=T;J!==null;){var _=J;switch(_.tag){case 0:case 11:case 15:Xi(8,_,l)}var q=_.child;if(q!==null)q.return=_,J=q;else for(;J!==null;){_=J;var L=_.sibling,X=_.return;if(Zu(_),_===T){J=null;break}if(L!==null){L.return=X,J=L;break}J=X}}}var ae=l.alternate;if(ae!==null){var ne=ae.child;if(ne!==null){ae.child=null;do{var at=ne.sibling;ne.sibling=null,ne=at}while(ne!==null)}}J=l}}if((l.subtreeFlags&2064)!==0&&c!==null)c.return=l,J=c;else e:for(;J!==null;){if(l=J,(l.flags&2048)!==0)switch(l.tag){case 0:case 11:case 15:Xi(9,l,l.return)}var A=l.sibling;if(A!==null){A.return=l.return,J=A;break e}J=l.return}}var b=e.current;for(J=b;J!==null;){c=J;var I=c.child;if((c.subtreeFlags&2064)!==0&&I!==null)I.return=c,J=I;else e:for(c=b;J!==null;){if(m=J,(m.flags&2048)!==0)try{switch(m.tag){case 0:case 11:case 15:nn(9,m)}}catch(re){tt(m,m.return,re)}if(m===c){J=null;break e}var W=m.sibling;if(W!==null){W.return=m.return,J=W;break e}J=m.return}}if(Ee=s,Xo(),ht&&typeof ht.onPostCommitFiberRoot=="function")try{ht.onPostCommitFiberRoot(Be,e)}catch{}a=!0}return a}finally{Oe=o,Bt.transition=t}}return!1}function hc(e,t,o){t=oi(o,t),t=ju(e,t,1),e=Qo(e,t,1),t=wt(),e!==null&&(wi(e,1,t),At(e,t))}function tt(e,t,o){if(e.tag===3)hc(e,e,o);else for(;t!==null;){if(t.tag===3){hc(t,e,o);break}else if(t.tag===1){var a=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof a.componentDidCatch=="function"&&(Jo===null||!Jo.has(a))){e=oi(o,e),e=Uu(t,e,1),t=Qo(t,e,1),e=wt(),t!==null&&(wi(t,1,e),At(t,e));break}}t=t.return}}function bh(e,t,o){var a=e.pingCache;a!==null&&a.delete(t),t=wt(),e.pingedLanes|=e.suspendedLanes&o,ct===e&&(yt&o)===o&&(lt===4||lt===3&&(yt&130023424)===yt&&500>Ue()-sl?Ca(e,0):il|=o),At(e,t)}function mc(e,t){t===0&&((e.mode&1)===0?t=1:(t=bs,bs<<=1,(bs&130023424)===0&&(bs=4194304)));var o=wt();e=ko(e,t),e!==null&&(wi(e,t,o),At(e,o))}function Ph(e){var t=e.memoizedState,o=0;t!==null&&(o=t.retryLane),mc(e,o)}function wh(e,t){var o=0;switch(e.tag){case 13:var a=e.stateNode,s=e.memoizedState;s!==null&&(o=s.retryLane);break;case 19:a=e.stateNode;break;default:throw Error(r(314))}a!==null&&a.delete(t),mc(e,o)}var yc;yc=function(e,t,o){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ct.current)xt=!0;else{if((e.lanes&o)===0&&(t.flags&128)===0)return xt=!1,dh(e,t,o);xt=(e.flags&131072)!==0}else xt=!1,Xe&&(t.flags&1048576)!==0&&Xd(t,Bs,t.index);switch(t.lanes=0,t.tag){case 2:var a=t.type;an(e,t),e=t.pendingProps;var s=Ga(t,ft.current);ei(t,o),s=Hr(null,t,a,e,s,o);var l=Lr();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,kt(a)?(l=!0,Ns(t)):l=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,Dr(t),s.updater=tn,t.stateNode=s,s._reactInternals=t,Wr(t,a,e,o),t=Vr(null,t,a,!0,l,o)):(t.tag=0,Xe&&l&&vr(t),Pt(null,t,s,o),t=t.child),t;case 16:a=t.elementType;e:{switch(an(e,t),e=t.pendingProps,s=a._init,a=s(a._payload),t.type=a,s=t.tag=kh(a),e=Zt(a,e),s){case 0:t=Yr(null,t,a,e,o);break e;case 1:t=Bu(null,t,a,e,o);break e;case 11:t=Lu(null,t,a,e,o);break e;case 14:t=_u(null,t,a,Zt(a.type,e),o);break e}throw Error(r(306,a,""))}return t;case 0:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Yr(e,t,a,s,o);case 1:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Bu(e,t,a,s,o);case 3:e:{if(Wu(t),e===null)throw Error(r(387));a=t.pendingProps,l=t.memoizedState,s=l.element,iu(e,t),Gs(t,a,null,o);var c=t.memoizedState;if(a=c.element,l.isDehydrated)if(l={element:a,isDehydrated:!1,cache:c.cache,pendingSuspenseBoundaries:c.pendingSuspenseBoundaries,transitions:c.transitions},t.updateQueue.baseState=l,t.memoizedState=l,t.flags&256){s=oi(Error(r(423)),t),t=Fu(e,t,a,o,s);break e}else if(a!==s){s=oi(Error(r(424)),t),t=Fu(e,t,a,o,s);break e}else for(Mt=Yo(t.stateNode.containerInfo.firstChild),Ut=t,Xe=!0,Qt=null,o=ou(t,null,a,o),t.child=o;o;)o.flags=o.flags&-3|4096,o=o.sibling;else{if(Qa(),a===s){t=Ro(e,t,o);break e}Pt(e,t,a,o)}t=t.child}return t;case 5:return ru(t),e===null&&wr(t),a=t.type,s=t.pendingProps,l=e!==null?e.memoizedProps:null,c=s.children,gr(a,s)?c=null:l!==null&&gr(a,l)&&(t.flags|=32),qu(e,t),Pt(e,t,c,o),t.child;case 6:return e===null&&wr(t),null;case 13:return Ku(e,t,o);case 4:return Er(t,t.stateNode.containerInfo),a=t.pendingProps,e===null?t.child=Za(t,null,a,o):Pt(e,t,a,o),t.child;case 11:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),Lu(e,t,a,s,o);case 7:return Pt(e,t,t.pendingProps,o),t.child;case 8:return Pt(e,t,t.pendingProps.children,o),t.child;case 12:return Pt(e,t,t.pendingProps.children,o),t.child;case 10:e:{if(a=t.type._context,s=t.pendingProps,l=t.memoizedProps,c=s.value,Fe(Ks,a._currentValue),a._currentValue=c,l!==null)if($t(l.value,c)){if(l.children===s.children&&!Ct.current){t=Ro(e,t,o);break e}}else for(l=t.child,l!==null&&(l.return=t);l!==null;){var m=l.dependencies;if(m!==null){c=l.child;for(var S=m.firstContext;S!==null;){if(S.context===a){if(l.tag===1){S=xo(-1,o&-o),S.tag=2;var T=l.updateQueue;if(T!==null){T=T.shared;var _=T.pending;_===null?S.next=S:(S.next=_.next,_.next=S),T.pending=S}}l.lanes|=o,S=l.alternate,S!==null&&(S.lanes|=o),Ar(l.return,o,t),m.lanes|=o;break}S=S.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(r(341));c.lanes|=o,m=c.alternate,m!==null&&(m.lanes|=o),Ar(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}Pt(e,t,s.children,o),t=t.child}return t;case 9:return s=t.type,a=t.pendingProps.children,ei(t,o),s=Ot(s),a=a(s),t.flags|=1,Pt(e,t,a,o),t.child;case 14:return a=t.type,s=Zt(a,t.pendingProps),s=Zt(a.type,s),_u(e,t,a,s,o);case 15:return Nu(e,t,t.type,t.pendingProps,o);case 17:return a=t.type,s=t.pendingProps,s=t.elementType===a?s:Zt(a,s),an(e,t),t.tag=1,kt(a)?(e=!0,Ns(t)):e=!1,ei(t,o),Eu(t,a,s),Wr(t,a,s,o),Vr(null,t,a,!0,e,o);case 19:return Vu(e,t,o);case 22:return Ou(e,t,o)}throw Error(r(156,t.tag))};function fc(e,t){return Ye(e,t)}function Ch(e,t,o,a){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=a,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Wt(e,t,o,a){return new Ch(e,t,o,a)}function gl(e){return e=e.prototype,!(!e||!e.isReactComponent)}function kh(e){if(typeof e=="function")return gl(e)?1:0;if(e!=null){if(e=e.$$typeof,e===ve)return 11;if(e===et)return 14}return 2}function aa(e,t){var o=e.alternate;return o===null?(o=Wt(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 mn(e,t,o,a,s,l){var c=2;if(a=e,typeof e=="function")gl(e)&&(c=1);else if(typeof e=="string")c=5;else e:switch(e){case E:return xa(o.children,s,l,t);case Q:c=8,s|=8;break;case Pe:return e=Wt(12,o,t,s|2),e.elementType=Pe,e.lanes=l,e;case Te:return e=Wt(13,o,t,s),e.elementType=Te,e.lanes=l,e;case Le:return e=Wt(19,o,t,s),e.elementType=Le,e.lanes=l,e;case _e:return yn(o,s,l,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ce:c=10;break e;case He:c=9;break e;case ve:c=11;break e;case et:c=14;break e;case ot:c=16,a=null;break e}throw Error(r(130,e==null?e:typeof e,""))}return t=Wt(c,o,t,s),t.elementType=e,t.type=a,t.lanes=l,t}function xa(e,t,o,a){return e=Wt(7,e,a,t),e.lanes=o,e}function yn(e,t,o,a){return e=Wt(22,e,a,t),e.elementType=_e,e.lanes=o,e.stateNode={isHidden:!1},e}function hl(e,t,o){return e=Wt(6,e,null,t),e.lanes=o,e}function ml(e,t,o){return t=Wt(4,e.children!==null?e.children:[],e.key,t),t.lanes=o,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function xh(e,t,o,a,s){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=Bn(0),this.expirationTimes=Bn(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Bn(0),this.identifierPrefix=a,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function yl(e,t,o,a,s,l,c,m,S){return e=new xh(e,t,o,m,S),t===1?(t=1,l===!0&&(t|=8)):t=0,l=Wt(3,null,null,t),e.current=l,l.stateNode=e,l.memoizedState={element:a,isDehydrated:o,cache:null,transitions:null,pendingSuspenseBoundaries:null},Dr(l),e}function Rh(e,t,o){var a=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:De,key:a==null?null:""+a,children:e,containerInfo:t,implementation:o}}function Sc(e){if(!e)return Go;e=e._reactInternals;e:{if(ee(e)!==e||e.tag!==1)throw Error(r(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(kt(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(r(171))}if(e.tag===1){var o=e.type;if(kt(o))return Yd(e,o,t)}return t}function vc(e,t,o,a,s,l,c,m,S){return e=yl(o,a,!0,e,s,l,c,m,S),e.context=Sc(null),o=e.current,a=wt(),s=ta(o),l=xo(a,s),l.callback=t??null,Qo(o,l,s),e.current.lanes=s,wi(e,s,a),At(e,a),e}function fn(e,t,o,a){var s=t.current,l=wt(),c=ta(s);return o=Sc(o),t.context===null?t.context=o:t.pendingContext=o,t=xo(l,c),t.payload={element:e},a=a===void 0?null:a,a!==null&&(t.callback=a),e=Qo(s,t,c),e!==null&&(to(e,s,c,l),Vs(e,s,c)),c}function Sn(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 bc(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var o=e.retryLane;e.retryLane=o!==0&&o<t?o:t}}function fl(e,t){bc(e,t),(e=e.alternate)&&bc(e,t)}function Ah(){return null}var Pc=typeof reportError=="function"?reportError:function(e){console.error(e)};function Sl(e){this._internalRoot=e}vn.prototype.render=Sl.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(r(409));fn(e,t,null,null)},vn.prototype.unmount=Sl.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;wa(function(){fn(null,e,null,null)}),t[bo]=null}};function vn(e){this._internalRoot=e}vn.prototype.unstable_scheduleHydration=function(e){if(e){var t=id();e={blockedOn:null,target:e,priority:t};for(var o=0;o<Wo.length&&t!==0&&t<Wo[o].priority;o++);Wo.splice(o,0,e),o===0&&rd(e)}};function vl(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function bn(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==" react-mount-point-unstable "))}function wc(){}function Ih(e,t,o,a,s){if(s){if(typeof a=="function"){var l=a;a=function(){var T=Sn(c);l.call(T)}}var c=vc(t,a,e,0,null,!1,!1,"",wc);return e._reactRootContainer=c,e[bo]=c.current,Hi(e.nodeType===8?e.parentNode:e),wa(),c}for(;s=e.lastChild;)e.removeChild(s);if(typeof a=="function"){var m=a;a=function(){var T=Sn(S);m.call(T)}}var S=yl(e,0,!1,null,null,!1,!1,"",wc);return e._reactRootContainer=S,e[bo]=S.current,Hi(e.nodeType===8?e.parentNode:e),wa(function(){fn(t,S,o,a)}),S}function Pn(e,t,o,a,s){var l=o._reactRootContainer;if(l){var c=l;if(typeof s=="function"){var m=s;s=function(){var S=Sn(c);m.call(S)}}fn(t,c,e,s)}else c=Ih(o,t,e,s,a);return Sn(c)}od=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var o=Pi(t.pendingLanes);o!==0&&(Wn(t,o|1),At(t,Ue()),(Ee&6)===0&&(si=Ue()+500,Xo()))}break;case 13:wa(function(){var a=ko(e,1);if(a!==null){var s=wt();to(a,e,1,s)}}),fl(e,1)}},Fn=function(e){if(e.tag===13){var t=ko(e,134217728);if(t!==null){var o=wt();to(t,e,134217728,o)}fl(e,134217728)}},ad=function(e){if(e.tag===13){var t=ta(e),o=ko(e,t);if(o!==null){var a=wt();to(o,e,t,a)}fl(e,t)}},id=function(){return Oe},sd=function(e,t){var o=Oe;try{return Oe=e,t()}finally{Oe=o}},La=function(e,t,o){switch(t){case"input":if(gi(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 a=o[t];if(a!==e&&a.form===e.form){var s=Ls(a);if(!s)throw Error(r(90));dt(a),gi(a,s)}}}break;case"textarea":so(e,o);break;case"select":t=o.value,t!=null&&Mo(e,!!o.multiple,t,!1)}},vi=ul,ua=wa;var Dh={usingClientEntryPoint:!1,Events:[Ni,Ya,Ls,Si,ys,ul]},Ji={findFiberByHostInstance:ha,bundleType:0,version:"18.3.1",rendererPackageName:"react-dom"},Eh={bundleType:Ji.bundleType,version:Ji.version,rendererPackageName:Ji.rendererPackageName,rendererConfig:Ji.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:V.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=Ne(e),e===null?null:e.stateNode},findFiberByHostInstance:Ji.findFiberByHostInstance||Ah,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 wn=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wn.isDisabled&&wn.supportsFiber)try{Be=wn.inject(Eh),ht=wn}catch{}}return It.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Dh,It.createPortal=function(e,t){var o=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!vl(t))throw Error(r(200));return Rh(e,t,null,o)},It.createRoot=function(e,t){if(!vl(e))throw Error(r(299));var o=!1,a="",s=Pc;return t!=null&&(t.unstable_strictMode===!0&&(o=!0),t.identifierPrefix!==void 0&&(a=t.identifierPrefix),t.onRecoverableError!==void 0&&(s=t.onRecoverableError)),t=yl(e,1,!1,null,null,o,!1,a,s),e[bo]=t.current,Hi(e.nodeType===8?e.parentNode:e),new Sl(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(r(188)):(e=Object.keys(e).join(","),Error(r(268,e)));return e=Ne(t),e=e===null?null:e.stateNode,e},It.flushSync=function(e){return wa(e)},It.hydrate=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!0,o)},It.hydrateRoot=function(e,t,o){if(!vl(e))throw Error(r(405));var a=o!=null&&o.hydratedSources||null,s=!1,l="",c=Pc;if(o!=null&&(o.unstable_strictMode===!0&&(s=!0),o.identifierPrefix!==void 0&&(l=o.identifierPrefix),o.onRecoverableError!==void 0&&(c=o.onRecoverableError)),t=vc(t,null,e,1,o??null,s,!1,l,c),e[bo]=t.current,Hi(e),a)for(e=0;e<a.length;e++)o=a[e],s=o._getVersion,s=s(o._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[o,s]:t.mutableSourceEagerHydrationData.push(o,s);return new vn(t)},It.render=function(e,t,o){if(!bn(t))throw Error(r(200));return Pn(null,e,t,!1,o)},It.unmountComponentAtNode=function(e){if(!bn(e))throw Error(r(40));return e._reactRootContainer?(wa(function(){Pn(null,null,e,!1,function(){e._reactRootContainer=null,e[bo]=null})}),!0):!1},It.unstable_batchedUpdates=ul,It.unstable_renderSubtreeIntoContainer=function(e,t,o,a){if(!bn(o))throw Error(r(200));if(e==null||e._reactInternals===void 0)throw Error(r(38));return Pn(e,t,o,!1,a)},It.version="18.3.1-next-f1338f8080-20240426",It}var Ec;function fp(){if(Ec)return wl.exports;Ec=1;function i(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(i)}catch(n){console.error(n)}}return i(),wl.exports=Nh(),wl.exports}var Tc;function Oh(){if(Tc)return Cn;Tc=1;var i=fp();return Cn.createRoot=i.createRoot,Cn.hydrateRoot=i.hydrateRoot,Cn}var qh=Oh(),R=Fl();const Bh=yp(R),Wh=mp({__proto__:null,default:Bh},[R]);var Un=fp();const Fh=yp(Un),Kh=mp({__proto__:null,default:Fh},[Un]);/**
|
|
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(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},$e.apply(this,arguments)}var st;(function(i){i.Pop="POP",i.Push="PUSH",i.Replace="REPLACE"})(st||(st={}));const jc="popstate";function Yh(i){i===void 0&&(i={});function n(u,p){let{pathname:g="/",search:y="",hash:h=""}=To(u.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),ns("",{pathname:g,search:y,hash:h},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function r(u,p){let g=u.document.querySelector("base"),y="";if(g&&g.getAttribute("href")){let h=u.location.href,v=h.indexOf("#");y=v===-1?h:h.slice(0,v)}return y+"#"+(typeof p=="string"?p:ja(p))}function d(u,p){ra(u.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Vh(n,r,d,i)}function Ce(i,n){if(i===!1||i===null||typeof i>"u")throw new Error(n)}function ra(i,n){if(!i){typeof console<"u"&&console.warn(n);try{throw new Error(n)}catch{}}}function Gh(){return Math.random().toString(36).substr(2,8)}function Uc(i,n){return{usr:i.state,key:i.key,idx:n}}function ns(i,n,r,d){return r===void 0&&(r=null),$e({pathname:typeof i=="string"?i:i.pathname,search:"",hash:""},typeof n=="string"?To(n):n,{state:r,key:n&&n.key||d||Gh()})}function ja(i){let{pathname:n="/",search:r="",hash:d=""}=i;return r&&r!=="?"&&(n+=r.charAt(0)==="?"?r:"?"+r),d&&d!=="#"&&(n+=d.charAt(0)==="#"?d:"#"+d),n}function To(i){let n={};if(i){let r=i.indexOf("#");r>=0&&(n.hash=i.substr(r),i=i.substr(0,r));let d=i.indexOf("?");d>=0&&(n.search=i.substr(d),i=i.substr(0,d)),i&&(n.pathname=i)}return n}function Vh(i,n,r,d){d===void 0&&(d={});let{window:u=document.defaultView,v5Compat:p=!1}=d,g=u.history,y=st.Pop,h=null,v=P();v==null&&(v=0,g.replaceState($e({},g.state,{idx:v}),""));function P(){return(g.state||{idx:null}).idx}function w(){y=st.Pop;let N=P(),te=N==null?null:N-v;v=N,h&&h({action:y,location:z.location,delta:te})}function D(N,te){y=st.Push;let K=ns(z.location,N,te);r&&r(K,N),v=P()+1;let $=Uc(K,v),G=z.createHref(K);try{g.pushState($,"",G)}catch(he){if(he instanceof DOMException&&he.name==="DataCloneError")throw he;u.location.assign(G)}p&&h&&h({action:y,location:z.location,delta:1})}function U(N,te){y=st.Replace;let K=ns(z.location,N,te);r&&r(K,N),v=P();let $=Uc(K,v),G=z.createHref(K);g.replaceState($,"",G),p&&h&&h({action:y,location:z.location,delta:0})}function B(N){let te=u.location.origin!=="null"?u.location.origin:u.location.href,K=typeof N=="string"?N:ja(N);return K=K.replace(/ $/,"%20"),Ce(te,"No window.location.(origin|href) available to create URL for href: "+K),new URL(K,te)}let z={get action(){return y},get location(){return i(u,g)},listen(N){if(h)throw new Error("A history only accepts one active listener");return u.addEventListener(jc,w),h=N,()=>{u.removeEventListener(jc,w),h=null}},createHref(N){return n(u,N)},createURL:B,encodeLocation(N){let te=B(N);return{pathname:te.pathname,search:te.search,hash:te.hash}},push:D,replace:U,go(N){return g.go(N)}};return z}var qe;(function(i){i.data="data",i.deferred="deferred",i.redirect="redirect",i.error="error"})(qe||(qe={}));const Xh=new Set(["lazy","caseSensitive","path","id","index","children"]);function $h(i){return i.index===!0}function Dn(i,n,r,d){return r===void 0&&(r=[]),d===void 0&&(d={}),i.map((u,p)=>{let g=[...r,String(p)],y=typeof u.id=="string"?u.id:g.join("-");if(Ce(u.index!==!0||!u.children,"Cannot specify children on an index route"),Ce(!d[y],'Found a route id collision on id "'+y+`". Route id's must be globally unique within Data Router usages`),$h(u)){let h=$e({},u,n(u),{id:y});return d[y]=h,h}else{let h=$e({},u,n(u),{id:y,children:void 0});return d[y]=h,u.children&&(h.children=Dn(u.children,n,g,d)),h}})}function Aa(i,n,r){return r===void 0&&(r="/"),Rn(i,n,r,!1)}function Rn(i,n,r,d){let u=typeof n=="string"?To(n):n,p=Eo(u.pathname||"/",r);if(p==null)return null;let g=Sp(i);Zh(g);let y=null;for(let h=0;y==null&&h<g.length;++h){let v=dm(p);y=rm(g[h],v,d)}return y}function Qh(i,n){let{route:r,pathname:d,params:u}=i;return{id:r.id,pathname:d,params:u,data:n[r.id],handle:r.handle}}function Sp(i,n,r,d){n===void 0&&(n=[]),r===void 0&&(r=[]),d===void 0&&(d="");let u=(p,g,y)=>{let h={relativePath:y===void 0?p.path||"":y,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};h.relativePath.startsWith("/")&&(Ce(h.relativePath.startsWith(d),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+d+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(d.length));let v=Do([d,h.relativePath]),P=r.concat(h);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+'".')),Sp(p.children,n,P,v)),!(p.path==null&&!p.index)&&n.push({path:v,score:sm(v,p.index),routesMeta:P})};return i.forEach((p,g)=>{var y;if(p.path===""||!((y=p.path)!=null&&y.includes("?")))u(p,g);else for(let h of vp(p.path))u(p,g,h)}),n}function vp(i){let n=i.split("/");if(n.length===0)return[];let[r,...d]=n,u=r.endsWith("?"),p=r.replace(/\?$/,"");if(d.length===0)return u?[p,""]:[p];let g=vp(d.join("/")),y=[];return y.push(...g.map(h=>h===""?p:[p,h].join("/"))),u&&y.push(...g),y.map(h=>i.startsWith("/")&&h===""?"/":h)}function Zh(i){i.sort((n,r)=>n.score!==r.score?r.score-n.score:nm(n.routesMeta.map(d=>d.childrenIndex),r.routesMeta.map(d=>d.childrenIndex)))}const Jh=/^:[\w-]+$/,em=3,tm=2,om=1,am=10,im=-2,Mc=i=>i==="*";function sm(i,n){let r=i.split("/"),d=r.length;return r.some(Mc)&&(d+=im),n&&(d+=tm),r.filter(u=>!Mc(u)).reduce((u,p)=>u+(Jh.test(p)?em:p===""?om:am),d)}function nm(i,n){return i.length===n.length&&i.slice(0,-1).every((d,u)=>d===n[u])?i[i.length-1]-n[n.length-1]:0}function rm(i,n,r){r===void 0&&(r=!1);let{routesMeta:d}=i,u={},p="/",g=[];for(let y=0;y<d.length;++y){let h=d[y],v=y===d.length-1,P=p==="/"?n:n.slice(p.length)||"/",w=En({path:h.relativePath,caseSensitive:h.caseSensitive,end:v},P),D=h.route;if(!w&&v&&r&&!d[d.length-1].route.index&&(w=En({path:h.relativePath,caseSensitive:h.caseSensitive,end:!1},P)),!w)return null;Object.assign(u,w.params),g.push({params:u,pathname:Do([p,w.pathname]),pathnameBase:gm(Do([p,w.pathnameBase])),route:D}),w.pathnameBase!=="/"&&(p=Do([p,w.pathnameBase]))}return g}function En(i,n){typeof i=="string"&&(i={path:i,caseSensitive:!1,end:!0});let[r,d]=lm(i.path,i.caseSensitive,i.end),u=n.match(r);if(!u)return null;let p=u[0],g=p.replace(/(.)\/+$/,"$1"),y=u.slice(1);return{params:d.reduce((v,P,w)=>{let{paramName:D,isOptional:U}=P;if(D==="*"){let z=y[w]||"";g=p.slice(0,p.length-z.length).replace(/(.)\/+$/,"$1")}const B=y[w];return U&&!B?v[D]=void 0:v[D]=(B||"").replace(/%2F/g,"/"),v},{}),pathname:p,pathnameBase:g,pattern:i}}function lm(i,n,r){n===void 0&&(n=!1),r===void 0&&(r=!0),ra(i==="*"||!i.endsWith("*")||i.endsWith("/*"),'Route path "'+i+'" will be treated as if it were '+('"'+i.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+i.replace(/\*$/,"/*")+'".'));let d=[],u="^"+i.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,y,h)=>(d.push({paramName:y,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return i.endsWith("*")?(d.push({paramName:"*"}),u+=i==="*"||i==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?u+="\\/*$":i!==""&&i!=="/"&&(u+="(?:(?=\\/|$))"),[new RegExp(u,n?void 0:"i"),d]}function dm(i){try{return i.split("/").map(n=>decodeURIComponent(n).replace(/\//g,"%2F")).join("/")}catch(n){return ra(!1,'The URL path "'+i+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+n+").")),i}}function Eo(i,n){if(n==="/")return i;if(!i.toLowerCase().startsWith(n.toLowerCase()))return null;let r=n.endsWith("/")?n.length-1:n.length,d=i.charAt(r);return d&&d!=="/"?null:i.slice(r)||"/"}const um=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,cm=i=>um.test(i);function pm(i,n){n===void 0&&(n="/");let{pathname:r,search:d="",hash:u=""}=typeof i=="string"?To(i):i,p;if(r)if(cm(r))p=r;else{if(r.includes("//")){let g=r;r=r.replace(/\/\/+/g,"/"),ra(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+r))}r.startsWith("/")?p=zc(r.substring(1),"/"):p=zc(r,n)}else p=n;return{pathname:p,search:hm(d),hash:mm(u)}}function zc(i,n){let r=n.replace(/\/+$/,"").split("/");return i.split("/").forEach(u=>{u===".."?r.length>1&&r.pop():u!=="."&&r.push(u)}),r.length>1?r.join("/"):"/"}function xl(i,n,r,d){return"Cannot include a '"+i+"' character in a manually specified "+("`to."+n+"` field ["+JSON.stringify(d)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function bp(i){return i.filter((n,r)=>r===0||n.route.path&&n.route.path.length>0)}function Mn(i,n){let r=bp(i);return n?r.map((d,u)=>u===r.length-1?d.pathname:d.pathnameBase):r.map(d=>d.pathnameBase)}function zn(i,n,r,d){d===void 0&&(d=!1);let u;typeof i=="string"?u=To(i):(u=$e({},i),Ce(!u.pathname||!u.pathname.includes("?"),xl("?","pathname","search",u)),Ce(!u.pathname||!u.pathname.includes("#"),xl("#","pathname","hash",u)),Ce(!u.search||!u.search.includes("#"),xl("#","search","hash",u)));let p=i===""||u.pathname==="",g=p?"/":u.pathname,y;if(g==null)y=r;else{let w=n.length-1;if(!d&&g.startsWith("..")){let D=g.split("/");for(;D[0]==="..";)D.shift(),w-=1;u.pathname=D.join("/")}y=w>=0?n[w]:"/"}let h=pm(u,y),v=g&&g!=="/"&&g.endsWith("/"),P=(p||g===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(v||P)&&(h.pathname+="/"),h}const Do=i=>i.join("/").replace(/\/\/+/g,"/"),gm=i=>i.replace(/\/+$/,"").replace(/^\/*/,"/"),hm=i=>!i||i==="?"?"":i.startsWith("?")?i:"?"+i,mm=i=>!i||i==="#"?"":i.startsWith("#")?i:"#"+i;class Tn{constructor(n,r,d,u){u===void 0&&(u=!1),this.status=n,this.statusText=r||"",this.internal=u,d instanceof Error?(this.data=d.toString(),this.error=d):this.data=d}}function rs(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.internal=="boolean"&&"data"in i}const Pp=["post","put","patch","delete"],ym=new Set(Pp),fm=["get",...Pp],Sm=new Set(fm),vm=new Set([301,302,303,307,308]),bm=new Set([307,308]),Rl={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},ts={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Kl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wm=i=>({hasErrorBoundary:!!i.hasErrorBoundary}),wp="remix-router-transitions";function Cm(i){const n=i.window?i.window:typeof window<"u"?window:void 0,r=typeof n<"u"&&typeof n.document<"u"&&typeof n.document.createElement<"u",d=!r;Ce(i.routes.length>0,"You must provide a non-empty routes array to createRouter");let u;if(i.mapRouteProperties)u=i.mapRouteProperties;else if(i.detectErrorBoundary){let f=i.detectErrorBoundary;u=k=>({hasErrorBoundary:f(k)})}else u=wm;let p={},g=Dn(i.routes,u,void 0,p),y,h=i.basename||"/",v=i.dataStrategy||Am,P=i.patchRoutesOnNavigation,w=$e({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},i.future),D=null,U=new Set,B=null,z=null,N=null,te=i.hydrationData!=null,K=Aa(g,i.history.location,h),$=!1,G=null;if(K==null&&!P){let f=Dt(404,{pathname:i.history.location.pathname}),{matches:k,route:j}=Yc(g);K=k,G={[j.id]:f}}K&&!i.hydrationData&&ua(K,g,i.history.location.pathname).active&&(K=null);let he;if(K)if(K.some(f=>f.route.lazy))he=!1;else if(!K.some(f=>f.route.loader))he=!0;else if(w.v7_partialHydration){let f=i.hydrationData?i.hydrationData.loaderData:null,k=i.hydrationData?i.hydrationData.errors:null;if(k){let j=K.findIndex(H=>k[H.route.id]!==void 0);he=K.slice(0,j+1).every(H=>!Hl(H.route,f,k))}else he=K.every(j=>!Hl(j.route,f,k))}else he=i.hydrationData!=null;else if(he=!1,K=[],w.v7_partialHydration){let f=ua(null,g,i.history.location.pathname);f.active&&f.matches&&($=!0,K=f.matches)}let De,E={historyAction:i.history.action,location:i.history.location,matches:K,initialized:he,navigation:Rl,restoreScrollPosition:i.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:i.hydrationData&&i.hydrationData.loaderData||{},actionData:i.hydrationData&&i.hydrationData.actionData||null,errors:i.hydrationData&&i.hydrationData.errors||G,fetchers:new Map,blockers:new Map},Q=st.Pop,Pe=!1,ce,He=!1,ve=new Map,Te=null,Le=!1,et=!1,ot=[],_e=new Set,O=new Map,de=0,V=-1,C=new Map,M=new Set,ye=new Map,F=new Map,ie=new Set,ue=new Map,we=new Map,ke;function je(){if(D=i.history.listen(f=>{let{action:k,location:j,delta:H}=f;if(ke){ke(),ke=void 0;return}ra(we.size===0||H!=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 Y=La({currentLocation:E.location,nextLocation:j,historyAction:k});if(Y&&H!=null){let le=new Promise(me=>{ke=me});i.history.go(H*-1),Lo(Y,{state:"blocked",location:j,proceed(){Lo(Y,{state:"proceeding",proceed:void 0,reset:void 0,location:j}),le.then(()=>i.history.go(H))},reset(){let me=new Map(E.blockers);me.set(Y,ts),dt({blockers:me})}});return}return io(k,j)}),r){qm(n,ve);let f=()=>Bm(n,ve);n.addEventListener("pagehide",f),Te=()=>n.removeEventListener("pagehide",f)}return E.initialized||io(st.Pop,E.location,{initialHydration:!0}),De}function gt(){D&&D(),Te&&Te(),U.clear(),ce&&ce.abort(),E.fetchers.forEach((f,k)=>no(k)),E.blockers.forEach((f,k)=>Ha(k))}function yo(f){return U.add(f),()=>U.delete(f)}function dt(f,k){k===void 0&&(k={}),E=$e({},E,f);let j=[],H=[];w.v7_fetcherPersist&&E.fetchers.forEach((Y,le)=>{Y.state==="idle"&&(ie.has(le)?H.push(le):j.push(le))}),ie.forEach(Y=>{!E.fetchers.has(Y)&&!O.has(Y)&&H.push(Y)}),[...U].forEach(Y=>Y(E,{deletedFetchers:H,viewTransitionOpts:k.viewTransitionOpts,flushSync:k.flushSync===!0})),w.v7_fetcherPersist?(j.forEach(Y=>E.fetchers.delete(Y)),H.forEach(Y=>no(Y))):H.forEach(Y=>ie.delete(Y))}function Gt(f,k,j){var H,Y;let{flushSync:le}=j===void 0?{}:j,me=E.actionData!=null&&E.navigation.formMethod!=null&&ao(E.navigation.formMethod)&&E.navigation.state==="loading"&&((H=f.state)==null?void 0:H._isRedirect)!==!0,oe;k.actionData?Object.keys(k.actionData).length>0?oe=k.actionData:oe=null:me?oe=E.actionData:oe=null;let se=k.loaderData?Fc(E.loaderData,k.loaderData,k.matches||[],k.errors):E.loaderData,Z=E.blockers;Z.size>0&&(Z=new Map(Z),Z.forEach((Re,nt)=>Z.set(nt,ts)));let ee=Pe===!0||E.navigation.formMethod!=null&&ao(E.navigation.formMethod)&&((Y=f.state)==null?void 0:Y._isRedirect)!==!0;y&&(g=y,y=void 0),Le||Q===st.Pop||(Q===st.Push?i.history.push(f,f.state):Q===st.Replace&&i.history.replace(f,f.state));let Se;if(Q===st.Pop){let Re=ve.get(E.location.pathname);Re&&Re.has(f.pathname)?Se={currentLocation:E.location,nextLocation:f}:ve.has(f.pathname)&&(Se={currentLocation:f,nextLocation:E.location})}else if(He){let Re=ve.get(E.location.pathname);Re?Re.add(f.pathname):(Re=new Set([f.pathname]),ve.set(E.location.pathname,Re)),Se={currentLocation:E.location,nextLocation:f}}dt($e({},k,{actionData:oe,loaderData:se,historyAction:Q,location:f,initialized:!0,navigation:Rl,revalidation:"idle",restoreScrollPosition:vi(f,k.matches||E.matches),preventScrollReset:ee,blockers:Z}),{viewTransitionOpts:Se,flushSync:le===!0}),Q=st.Pop,Pe=!1,He=!1,Le=!1,et=!1,ot=[]}async function Ua(f,k){if(typeof f=="number"){i.history.go(f);return}let j=zl(E.location,E.matches,h,w.v7_prependBasename,f,w.v7_relativeSplatPath,k==null?void 0:k.fromRouteId,k==null?void 0:k.relative),{path:H,submission:Y,error:le}=Hc(w.v7_normalizeFormMethod,!1,j,k),me=E.location,oe=ns(E.location,H,k&&k.state);oe=$e({},oe,i.history.encodeLocation(oe));let se=k&&k.replace!=null?k.replace:void 0,Z=st.Push;se===!0?Z=st.Replace:se===!1||Y!=null&&ao(Y.formMethod)&&Y.formAction===E.location.pathname+E.location.search&&(Z=st.Replace);let ee=k&&"preventScrollReset"in k?k.preventScrollReset===!0:void 0,Se=(k&&k.flushSync)===!0,Re=La({currentLocation:me,nextLocation:oe,historyAction:Z});if(Re){Lo(Re,{state:"blocked",location:oe,proceed(){Lo(Re,{state:"proceeding",proceed:void 0,reset:void 0,location:oe}),Ua(f,k)},reset(){let nt=new Map(E.blockers);nt.set(Re,ts),dt({blockers:nt})}});return}return await io(Z,oe,{submission:Y,pendingError:le,preventScrollReset:ee,replace:k&&k.replace,enableViewTransition:k&&k.viewTransition,flushSync:Se})}function cs(){if(da(),dt({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){io(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}io(Q||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation,enableViewTransition:He===!0})}}async function io(f,k,j){ce&&ce.abort(),ce=null,Q=f,Le=(j&&j.startUninterruptedRevalidation)===!0,ys(E.location,E.matches),Pe=(j&&j.preventScrollReset)===!0,He=(j&&j.enableViewTransition)===!0;let H=y||g,Y=j&&j.overrideNavigation,le=j!=null&&j.initialHydration&&E.matches&&E.matches.length>0&&!$?E.matches:Aa(H,k,h),me=(j&&j.flushSync)===!0;if(le&&E.initialized&&!et&&Um(E.location,k)&&!(j&&j.submission&&ao(j.submission.formMethod))){Gt(k,{matches:le},{flushSync:me});return}let oe=ua(le,H,k.pathname);if(oe.active&&oe.matches&&(le=oe.matches),!le){let{error:Ne,notFoundMatches:Ie,route:Ye}=ro(k.pathname);Gt(k,{matches:Ie,loaderData:{},errors:{[Ye.id]:Ne}},{flushSync:me});return}ce=new AbortController;let se=ri(i.history,k,ce.signal,j&&j.submission),Z;if(j&&j.pendingError)Z=[Ia(le).route.id,{type:qe.error,error:j.pendingError}];else if(j&&j.submission&&ao(j.submission.formMethod)){let Ne=await gi(se,k,j.submission,le,oe.active,{replace:j.replace,flushSync:me});if(Ne.shortCircuited)return;if(Ne.pendingActionResult){let[Ie,Ye]=Ne.pendingActionResult;if(Ht(Ye)&&rs(Ye.error)&&Ye.error.status===404){ce=null,Gt(k,{matches:Ne.matches,loaderData:{},errors:{[Ie]:Ye.error}});return}}le=Ne.matches||le,Z=Ne.pendingActionResult,Y=Al(k,j.submission),me=!1,oe.active=!1,se=ri(i.history,se.url,se.signal)}let{shortCircuited:ee,matches:Se,loaderData:Re,errors:nt}=await ps(se,k,le,oe.active,Y,j&&j.submission,j&&j.fetcherSubmission,j&&j.replace,j&&j.initialHydration===!0,me,Z);ee||(ce=null,Gt(k,$e({matches:Se||le},Kc(Z),{loaderData:Re,errors:nt})))}async function gi(f,k,j,H,Y,le){le===void 0&&(le={}),da();let me=Nm(k,j);if(dt({navigation:me},{flushSync:le.flushSync===!0}),Y){let Z=await _o(H,k.pathname,f.signal);if(Z.type==="aborted")return{shortCircuited:!0};if(Z.type==="error"){let ee=Ia(Z.partialMatches).route.id;return{matches:Z.partialMatches,pendingActionResult:[ee,{type:qe.error,error:Z.error}]}}else if(Z.matches)H=Z.matches;else{let{notFoundMatches:ee,error:Se,route:Re}=ro(k.pathname);return{matches:ee,pendingActionResult:[Re.id,{type:qe.error,error:Se}]}}}let oe,se=ss(H,k);if(!se.route.action&&!se.route.lazy)oe={type:qe.error,error:Dt(405,{method:f.method,pathname:k.pathname,routeId:se.route.id})};else if(oe=(await zo("action",E,f,[se],H,null))[se.route.id],f.signal.aborted)return{shortCircuited:!0};if(Da(oe)){let Z;return le&&le.replace!=null?Z=le.replace:Z=qc(oe.response.headers.get("Location"),new URL(f.url),h,i.history)===E.location.pathname+E.location.search,await so(f,oe,!0,{submission:j,replace:Z}),{shortCircuited:!0}}if(na(oe))throw Dt(400,{type:"defer-action"});if(Ht(oe)){let Z=Ia(H,se.route.id);return(le&&le.replace)!==!0&&(Q=st.Push),{matches:H,pendingActionResult:[Z.route.id,oe]}}return{matches:H,pendingActionResult:[se.route.id,oe]}}async function ps(f,k,j,H,Y,le,me,oe,se,Z,ee){let Se=Y||Al(k,le),Re=le||me||Vc(Se),nt=!Le&&(!w.v7_partialHydration||!se);if(H){if(nt){let Be=Ma(ee);dt($e({navigation:Se},Be!==void 0?{actionData:Be}:{}),{flushSync:Z})}let Ae=await _o(j,k.pathname,f.signal);if(Ae.type==="aborted")return{shortCircuited:!0};if(Ae.type==="error"){let Be=Ia(Ae.partialMatches).route.id;return{matches:Ae.partialMatches,loaderData:{},errors:{[Be]:Ae.error}}}else if(Ae.matches)j=Ae.matches;else{let{error:Be,notFoundMatches:ht,route:ga}=ro(k.pathname);return{matches:ht,loaderData:{},errors:{[ga.id]:Be}}}}let Ne=y||g,[Ie,Ye]=_c(i.history,E,j,Re,k,w.v7_partialHydration&&se===!0,w.v7_skipActionErrorRevalidation,et,ot,_e,ie,ye,M,Ne,h,ee);if(lo(Ae=>!(j&&j.some(Be=>Be.route.id===Ae))||Ie&&Ie.some(Be=>Be.route.id===Ae)),V=++de,Ie.length===0&&Ye.length===0){let Ae=hs();return Gt(k,$e({matches:j,loaderData:{},errors:ee&&Ht(ee[1])?{[ee[0]]:ee[1].error}:null},Kc(ee),Ae?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Z}),{shortCircuited:!0}}if(nt){let Ae={};if(!H){Ae.navigation=Se;let Be=Ma(ee);Be!==void 0&&(Ae.actionData=Be)}Ye.length>0&&(Ae.fetchers=la(Ye)),dt(Ae,{flushSync:Z})}Ye.forEach(Ae=>{Vt(Ae.key),Ae.controller&&O.set(Ae.key,Ae.controller)});let fo=()=>Ye.forEach(Ae=>Vt(Ae.key));ce&&ce.signal.addEventListener("abort",fo);let{loaderResults:pa,fetcherResults:Xt}=await mi(E,j,Ie,Ye,f);if(f.signal.aborted)return{shortCircuited:!0};ce&&ce.signal.removeEventListener("abort",fo),Ye.forEach(Ae=>O.delete(Ae.key));let Ue=kn(pa);if(Ue)return await so(f,Ue.result,!0,{replace:oe}),{shortCircuited:!0};if(Ue=kn(Xt),Ue)return M.add(Ue.key),await so(f,Ue.result,!0,{replace:oe}),{shortCircuited:!0};let{loaderData:bi,errors:So}=Wc(E,j,pa,ee,Ye,Xt,ue);ue.forEach((Ae,Be)=>{Ae.subscribe(ht=>{(ht||Ae.done)&&ue.delete(Be)})}),w.v7_partialHydration&&se&&E.errors&&(So=$e({},E.errors,So));let uo=hs(),vo=za(V),_a=uo||vo||Ye.length>0;return $e({matches:j,loaderData:bi,errors:So},_a?{fetchers:new Map(E.fetchers)}:{})}function Ma(f){if(f&&!Ht(f[1]))return{[f[0]]:f[1].data};if(E.actionData)return Object.keys(E.actionData).length===0?null:E.actionData}function la(f){return f.forEach(k=>{let j=E.fetchers.get(k.key),H=os(void 0,j?j.data:void 0);E.fetchers.set(k.key,H)}),new Map(E.fetchers)}function Mo(f,k,j,H){if(d)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.");Vt(f);let Y=(H&&H.flushSync)===!0,le=y||g,me=zl(E.location,E.matches,h,w.v7_prependBasename,j,w.v7_relativeSplatPath,k,H==null?void 0:H.relative),oe=Aa(le,me,h),se=ua(oe,le,me);if(se.active&&se.matches&&(oe=se.matches),!oe){Lt(f,k,Dt(404,{pathname:me}),{flushSync:Y});return}let{path:Z,submission:ee,error:Se}=Hc(w.v7_normalizeFormMethod,!0,me,H);if(Se){Lt(f,k,Se,{flushSync:Y});return}let Re=ss(oe,Z),nt=(H&&H.preventScrollReset)===!0;if(ee&&ao(ee.formMethod)){hi(f,k,Z,Re,oe,se.active,Y,nt,ee);return}ye.set(f,{routeId:k,path:Z}),gs(f,k,Z,Re,oe,se.active,Y,nt,ee)}async function hi(f,k,j,H,Y,le,me,oe,se){da(),ye.delete(f);function Z(Me){if(!Me.route.action&&!Me.route.lazy){let No=Dt(405,{method:se.formMethod,pathname:j,routeId:k});return Lt(f,k,No,{flushSync:me}),!0}return!1}if(!le&&Z(H))return;let ee=E.fetchers.get(f);Tt(f,Om(se,ee),{flushSync:me});let Se=new AbortController,Re=ri(i.history,j,Se.signal,se);if(le){let Me=await _o(Y,new URL(Re.url).pathname,Re.signal,f);if(Me.type==="aborted")return;if(Me.type==="error"){Lt(f,k,Me.error,{flushSync:me});return}else if(Me.matches){if(Y=Me.matches,H=ss(Y,j),Z(H))return}else{Lt(f,k,Dt(404,{pathname:j}),{flushSync:me});return}}O.set(f,Se);let nt=de,Ie=(await zo("action",E,Re,[H],Y,f))[H.route.id];if(Re.signal.aborted){O.get(f)===Se&&O.delete(f);return}if(w.v7_fetcherPersist&&ie.has(f)){if(Da(Ie)||Ht(Ie)){Tt(f,sa(void 0));return}}else{if(Da(Ie))if(O.delete(f),V>nt){Tt(f,sa(void 0));return}else return M.add(f),Tt(f,os(se)),so(Re,Ie,!1,{fetcherSubmission:se,preventScrollReset:oe});if(Ht(Ie)){Lt(f,k,Ie.error);return}}if(na(Ie))throw Dt(400,{type:"defer-action"});let Ye=E.navigation.location||E.location,fo=ri(i.history,Ye,Se.signal),pa=y||g,Xt=E.navigation.state!=="idle"?Aa(pa,E.navigation.location,h):E.matches;Ce(Xt,"Didn't find any matches after fetcher action");let Ue=++de;C.set(f,Ue);let bi=os(se,Ie.data);E.fetchers.set(f,bi);let[So,uo]=_c(i.history,E,Xt,se,Ye,!1,w.v7_skipActionErrorRevalidation,et,ot,_e,ie,ye,M,pa,h,[H.route.id,Ie]);uo.filter(Me=>Me.key!==f).forEach(Me=>{let No=Me.key,Ss=E.fetchers.get(No),On=os(void 0,Ss?Ss.data:void 0);E.fetchers.set(No,On),Vt(No),Me.controller&&O.set(No,Me.controller)}),dt({fetchers:new Map(E.fetchers)});let vo=()=>uo.forEach(Me=>Vt(Me.key));Se.signal.addEventListener("abort",vo);let{loaderResults:_a,fetcherResults:Ae}=await mi(E,Xt,So,uo,fo);if(Se.signal.aborted)return;Se.signal.removeEventListener("abort",vo),C.delete(f),O.delete(f),uo.forEach(Me=>O.delete(Me.key));let Be=kn(_a);if(Be)return so(fo,Be.result,!1,{preventScrollReset:oe});if(Be=kn(Ae),Be)return M.add(Be.key),so(fo,Be.result,!1,{preventScrollReset:oe});let{loaderData:ht,errors:ga}=Wc(E,Xt,_a,void 0,uo,Ae,ue);if(E.fetchers.has(f)){let Me=sa(Ie.data);E.fetchers.set(f,Me)}za(Ue),E.navigation.state==="loading"&&Ue>V?(Ce(Q,"Expected pending action"),ce&&ce.abort(),Gt(E.navigation.location,{matches:Xt,loaderData:ht,errors:ga,fetchers:new Map(E.fetchers)})):(dt({errors:ga,loaderData:Fc(E.loaderData,ht,Xt,ga),fetchers:new Map(E.fetchers)}),et=!1)}async function gs(f,k,j,H,Y,le,me,oe,se){let Z=E.fetchers.get(f);Tt(f,os(se,Z?Z.data:void 0),{flushSync:me});let ee=new AbortController,Se=ri(i.history,j,ee.signal);if(le){let Ie=await _o(Y,new URL(Se.url).pathname,Se.signal,f);if(Ie.type==="aborted")return;if(Ie.type==="error"){Lt(f,k,Ie.error,{flushSync:me});return}else if(Ie.matches)Y=Ie.matches,H=ss(Y,j);else{Lt(f,k,Dt(404,{pathname:j}),{flushSync:me});return}}O.set(f,ee);let Re=de,Ne=(await zo("loader",E,Se,[H],Y,f))[H.route.id];if(na(Ne)&&(Ne=await Yl(Ne,Se.signal,!0)||Ne),O.get(f)===ee&&O.delete(f),!Se.signal.aborted){if(ie.has(f)){Tt(f,sa(void 0));return}if(Da(Ne))if(V>Re){Tt(f,sa(void 0));return}else{M.add(f),await so(Se,Ne,!1,{preventScrollReset:oe});return}if(Ht(Ne)){Lt(f,k,Ne.error);return}Ce(!na(Ne),"Unhandled fetcher deferred data"),Tt(f,sa(Ne.data))}}async function so(f,k,j,H){let{submission:Y,fetcherSubmission:le,preventScrollReset:me,replace:oe}=H===void 0?{}:H;k.response.headers.has("X-Remix-Revalidate")&&(et=!0);let se=k.response.headers.get("Location");Ce(se,"Expected a Location header on the redirect Response"),se=qc(se,new URL(f.url),h,i.history);let Z=ns(E.location,se,{_isRedirect:!0});if(r){let Ie=!1;if(k.response.headers.has("X-Remix-Reload-Document"))Ie=!0;else if(Kl.test(se)){const Ye=i.history.createURL(se);Ie=Ye.origin!==n.location.origin||Eo(Ye.pathname,h)==null}if(Ie){oe?n.location.replace(se):n.location.assign(se);return}}ce=null;let ee=oe===!0||k.response.headers.has("X-Remix-Replace")?st.Replace:st.Push,{formMethod:Se,formAction:Re,formEncType:nt}=E.navigation;!Y&&!le&&Se&&Re&&nt&&(Y=Vc(E.navigation));let Ne=Y||le;if(bm.has(k.response.status)&&Ne&&ao(Ne.formMethod))await io(ee,Z,{submission:$e({},Ne,{formAction:se}),preventScrollReset:me||Pe,enableViewTransition:j?He:void 0});else{let Ie=Al(Z,Y);await io(ee,Z,{overrideNavigation:Ie,fetcherSubmission:le,preventScrollReset:me||Pe,enableViewTransition:j?He:void 0})}}async function zo(f,k,j,H,Y,le){let me,oe={};try{me=await Im(v,f,k,j,H,Y,le,p,u)}catch(se){return H.forEach(Z=>{oe[Z.route.id]={type:qe.error,error:se}}),oe}for(let[se,Z]of Object.entries(me))if(Mm(Z)){let ee=Z.result;oe[se]={type:qe.redirect,response:Tm(ee,j,se,Y,h,w.v7_relativeSplatPath)}}else oe[se]=await Em(Z);return oe}async function mi(f,k,j,H,Y){let le=f.matches,me=zo("loader",f,Y,j,k,null),oe=Promise.all(H.map(async ee=>{if(ee.matches&&ee.match&&ee.controller){let Re=(await zo("loader",f,ri(i.history,ee.path,ee.controller.signal),[ee.match],ee.matches,ee.key))[ee.match.route.id];return{[ee.key]:Re}}else return Promise.resolve({[ee.key]:{type:qe.error,error:Dt(404,{pathname:ee.path})}})})),se=await me,Z=(await oe).reduce((ee,Se)=>Object.assign(ee,Se),{});return await Promise.all([Lm(k,se,Y.signal,le,f.loaderData),_m(k,Z,H)]),{loaderResults:se,fetcherResults:Z}}function da(){et=!0,ot.push(...lo()),ye.forEach((f,k)=>{O.has(k)&&_e.add(k),Vt(k)})}function Tt(f,k,j){j===void 0&&(j={}),E.fetchers.set(f,k),dt({fetchers:new Map(E.fetchers)},{flushSync:(j&&j.flushSync)===!0})}function Lt(f,k,j,H){H===void 0&&(H={});let Y=Ia(E.matches,k);no(f),dt({errors:{[Y.route.id]:j},fetchers:new Map(E.fetchers)},{flushSync:(H&&H.flushSync)===!0})}function Ho(f){return F.set(f,(F.get(f)||0)+1),ie.has(f)&&ie.delete(f),E.fetchers.get(f)||Pm}function no(f){let k=E.fetchers.get(f);O.has(f)&&!(k&&k.state==="loading"&&C.has(f))&&Vt(f),ye.delete(f),C.delete(f),M.delete(f),w.v7_fetcherPersist&&ie.delete(f),_e.delete(f),E.fetchers.delete(f)}function Nn(f){let k=(F.get(f)||0)-1;k<=0?(F.delete(f),ie.add(f),w.v7_fetcherPersist||no(f)):F.set(f,k),dt({fetchers:new Map(E.fetchers)})}function Vt(f){let k=O.get(f);k&&(k.abort(),O.delete(f))}function yi(f){for(let k of f){let j=Ho(k),H=sa(j.data);E.fetchers.set(k,H)}}function hs(){let f=[],k=!1;for(let j of M){let H=E.fetchers.get(j);Ce(H,"Expected fetcher: "+j),H.state==="loading"&&(M.delete(j),f.push(j),k=!0)}return yi(f),k}function za(f){let k=[];for(let[j,H]of C)if(H<f){let Y=E.fetchers.get(j);Ce(Y,"Expected fetcher: "+j),Y.state==="loading"&&(Vt(j),C.delete(j),k.push(j))}return yi(k),k.length>0}function fi(f,k){let j=E.blockers.get(f)||ts;return we.get(f)!==k&&we.set(f,k),j}function Ha(f){E.blockers.delete(f),we.delete(f)}function Lo(f,k){let j=E.blockers.get(f)||ts;Ce(j.state==="unblocked"&&k.state==="blocked"||j.state==="blocked"&&k.state==="blocked"||j.state==="blocked"&&k.state==="proceeding"||j.state==="blocked"&&k.state==="unblocked"||j.state==="proceeding"&&k.state==="unblocked","Invalid blocker state transition: "+j.state+" -> "+k.state);let H=new Map(E.blockers);H.set(f,k),dt({blockers:H})}function La(f){let{currentLocation:k,nextLocation:j,historyAction:H}=f;if(we.size===0)return;we.size>1&&ra(!1,"A router only supports one blocker at a time");let Y=Array.from(we.entries()),[le,me]=Y[Y.length-1],oe=E.blockers.get(le);if(!(oe&&oe.state==="proceeding")&&me({currentLocation:k,nextLocation:j,historyAction:H}))return le}function ro(f){let k=Dt(404,{pathname:f}),j=y||g,{matches:H,route:Y}=Yc(j);return lo(),{notFoundMatches:H,route:Y,error:k}}function lo(f){let k=[];return ue.forEach((j,H)=>{(!f||f(H))&&(j.cancel(),k.push(H),ue.delete(H))}),k}function ms(f,k,j){if(B=f,N=k,z=j||null,!te&&E.navigation===Rl){te=!0;let H=vi(E.location,E.matches);H!=null&&dt({restoreScrollPosition:H})}return()=>{B=null,N=null,z=null}}function Si(f,k){return z&&z(f,k.map(H=>Qh(H,E.loaderData)))||f.key}function ys(f,k){if(B&&N){let j=Si(f,k);B[j]=N()}}function vi(f,k){if(B){let j=Si(f,k),H=B[j];if(typeof H=="number")return H}return null}function ua(f,k,j){if(P)if(f){if(Object.keys(f[0].params).length>0)return{active:!0,matches:Rn(k,j,h,!0)}}else return{active:!0,matches:Rn(k,j,h,!0)||[]};return{active:!1,matches:null}}async function _o(f,k,j,H){if(!P)return{type:"success",matches:f};let Y=f;for(;;){let le=y==null,me=y||g,oe=p;try{await P({signal:j,path:k,matches:Y,fetcherKey:H,patch:(ee,Se)=>{j.aborted||Oc(ee,Se,me,oe,u)}})}catch(ee){return{type:"error",error:ee,partialMatches:Y}}finally{le&&!j.aborted&&(g=[...g])}if(j.aborted)return{type:"aborted"};let se=Aa(me,k,h);if(se)return{type:"success",matches:se};let Z=Rn(me,k,h,!0);if(!Z||Y.length===Z.length&&Y.every((ee,Se)=>ee.route.id===Z[Se].route.id))return{type:"success",matches:null};Y=Z}}function fs(f){p={},y=Dn(f,u,void 0,p)}function ca(f,k){let j=y==null;Oc(f,k,y||g,p,u),j&&(g=[...g],dt({}))}return De={get basename(){return h},get future(){return w},get state(){return E},get routes(){return g},get window(){return n},initialize:je,subscribe:yo,enableScrollRestoration:ms,navigate:Ua,fetch:Mo,revalidate:cs,createHref:f=>i.history.createHref(f),encodeLocation:f=>i.history.encodeLocation(f),getFetcher:Ho,deleteFetcher:Nn,dispose:gt,getBlocker:fi,deleteBlocker:Ha,patchRoutes:ca,_internalFetchControllers:O,_internalActiveDeferreds:ue,_internalSetRoutes:fs},De}function km(i){return i!=null&&("formData"in i&&i.formData!=null||"body"in i&&i.body!==void 0)}function zl(i,n,r,d,u,p,g,y){let h,v;if(g){h=[];for(let w of n)if(h.push(w),w.route.id===g){v=w;break}}else h=n,v=n[n.length-1];let P=zn(u||".",Mn(h,p),Eo(i.pathname,r)||i.pathname,y==="path");if(u==null&&(P.search=i.search,P.hash=i.hash),(u==null||u===""||u===".")&&v){let w=Gl(P.search);if(v.route.index&&!w)P.search=P.search?P.search.replace(/^\?/,"?index&"):"?index";else if(!v.route.index&&w){let D=new URLSearchParams(P.search),U=D.getAll("index");D.delete("index"),U.filter(z=>z).forEach(z=>D.append("index",z));let B=D.toString();P.search=B?"?"+B:""}}return d&&r!=="/"&&(P.pathname=P.pathname==="/"?r:Do([r,P.pathname])),ja(P)}function Hc(i,n,r,d){if(!d||!km(d))return{path:r};if(d.formMethod&&!Hm(d.formMethod))return{path:r,error:Dt(405,{method:d.formMethod})};let u=()=>({path:r,error:Dt(400,{type:"invalid-body"})}),p=d.formMethod||"get",g=i?p.toUpperCase():p.toLowerCase(),y=xp(r);if(d.body!==void 0){if(d.formEncType==="text/plain"){if(!ao(g))return u();let D=typeof d.body=="string"?d.body:d.body instanceof FormData||d.body instanceof URLSearchParams?Array.from(d.body.entries()).reduce((U,B)=>{let[z,N]=B;return""+U+z+"="+N+`
|
|
51
|
-
`},""):String(d.body);return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:void 0,text:D}}}else if(d.formEncType==="application/json"){if(!ao(g))return u();try{let D=typeof d.body=="string"?JSON.parse(d.body):d.body;return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:D,text:void 0}}}catch{return u()}}}Ce(typeof FormData=="function","FormData is not available in this environment");let h,v;if(d.formData)h=Ll(d.formData),v=d.formData;else if(d.body instanceof FormData)h=Ll(d.body),v=d.body;else if(d.body instanceof URLSearchParams)h=d.body,v=Bc(h);else if(d.body==null)h=new URLSearchParams,v=new FormData;else try{h=new URLSearchParams(d.body),v=Bc(h)}catch{return u()}let P={formMethod:g,formAction:y,formEncType:d&&d.formEncType||"application/x-www-form-urlencoded",formData:v,json:void 0,text:void 0};if(ao(P.formMethod))return{path:r,submission:P};let w=To(r);return n&&w.search&&Gl(w.search)&&h.append("index",""),w.search="?"+h,{path:ja(w),submission:P}}function Lc(i,n,r){r===void 0&&(r=!1);let d=i.findIndex(u=>u.route.id===n);return d>=0?i.slice(0,r?d+1:d):i}function _c(i,n,r,d,u,p,g,y,h,v,P,w,D,U,B,z){let N=z?Ht(z[1])?z[1].error:z[1].data:void 0,te=i.createURL(n.location),K=i.createURL(u),$=r;p&&n.errors?$=Lc(r,Object.keys(n.errors)[0],!0):z&&Ht(z[1])&&($=Lc(r,z[0]));let G=z?z[1].statusCode:void 0,he=g&&G&&G>=400,De=$.filter((Q,Pe)=>{let{route:ce}=Q;if(ce.lazy)return!0;if(ce.loader==null)return!1;if(p)return Hl(ce,n.loaderData,n.errors);if(xm(n.loaderData,n.matches[Pe],Q)||h.some(Te=>Te===Q.route.id))return!0;let He=n.matches[Pe],ve=Q;return Nc(Q,$e({currentUrl:te,currentParams:He.params,nextUrl:K,nextParams:ve.params},d,{actionResult:N,actionStatus:G,defaultShouldRevalidate:he?!1:y||te.pathname+te.search===K.pathname+K.search||te.search!==K.search||Cp(He,ve)}))}),E=[];return w.forEach((Q,Pe)=>{if(p||!r.some(Le=>Le.route.id===Q.routeId)||P.has(Pe))return;let ce=Aa(U,Q.path,B);if(!ce){E.push({key:Pe,routeId:Q.routeId,path:Q.path,matches:null,match:null,controller:null});return}let He=n.fetchers.get(Pe),ve=ss(ce,Q.path),Te=!1;D.has(Pe)?Te=!1:v.has(Pe)?(v.delete(Pe),Te=!0):He&&He.state!=="idle"&&He.data===void 0?Te=y:Te=Nc(ve,$e({currentUrl:te,currentParams:n.matches[n.matches.length-1].params,nextUrl:K,nextParams:r[r.length-1].params},d,{actionResult:N,actionStatus:G,defaultShouldRevalidate:he?!1:y})),Te&&E.push({key:Pe,routeId:Q.routeId,path:Q.path,matches:ce,match:ve,controller:new AbortController})}),[De,E]}function Hl(i,n,r){if(i.lazy)return!0;if(!i.loader)return!1;let d=n!=null&&n[i.id]!==void 0,u=r!=null&&r[i.id]!==void 0;return!d&&u?!1:typeof i.loader=="function"&&i.loader.hydrate===!0?!0:!d&&!u}function xm(i,n,r){let d=!n||r.route.id!==n.route.id,u=i[r.route.id]===void 0;return d||u}function Cp(i,n){let r=i.route.path;return i.pathname!==n.pathname||r!=null&&r.endsWith("*")&&i.params["*"]!==n.params["*"]}function Nc(i,n){if(i.route.shouldRevalidate){let r=i.route.shouldRevalidate(n);if(typeof r=="boolean")return r}return n.defaultShouldRevalidate}function Oc(i,n,r,d,u){var p;let g;if(i){let v=d[i];Ce(v,"No route found to patch children into: routeId = "+i),v.children||(v.children=[]),g=v.children}else g=r;let y=n.filter(v=>!g.some(P=>kp(v,P))),h=Dn(y,u,[i||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],d);g.push(...h)}function kp(i,n){return"id"in i&&"id"in n&&i.id===n.id?!0:i.index===n.index&&i.path===n.path&&i.caseSensitive===n.caseSensitive?(!i.children||i.children.length===0)&&(!n.children||n.children.length===0)?!0:i.children.every((r,d)=>{var u;return(u=n.children)==null?void 0:u.some(p=>kp(r,p))}):!1}async function Rm(i,n,r){if(!i.lazy)return;let d=await i.lazy();if(!i.lazy)return;let u=r[i.id];Ce(u,"No route found in manifest");let p={};for(let g in d){let h=u[g]!==void 0&&g!=="hasErrorBoundary";ra(!h,'Route "'+u.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.')),!h&&!Xh.has(g)&&(p[g]=d[g])}Object.assign(u,p),Object.assign(u,$e({},n(u),{lazy:void 0}))}async function Am(i){let{matches:n}=i,r=n.filter(u=>u.shouldLoad);return(await Promise.all(r.map(u=>u.resolve()))).reduce((u,p,g)=>Object.assign(u,{[r[g].route.id]:p}),{})}async function Im(i,n,r,d,u,p,g,y,h,v){let P=p.map(U=>U.route.lazy?Rm(U.route,h,y):void 0),w=p.map((U,B)=>{let z=P[B],N=u.some(K=>K.route.id===U.route.id);return $e({},U,{shouldLoad:N,resolve:async K=>(K&&d.method==="GET"&&(U.route.lazy||U.route.loader)&&(N=!0),N?Dm(n,d,U,z,K,v):Promise.resolve({type:qe.data,result:void 0}))})}),D=await i({matches:w,request:d,params:p[0].params,fetcherKey:g,context:v});try{await Promise.all(P)}catch{}return D}async function Dm(i,n,r,d,u,p){let g,y,h=v=>{let P,w=new Promise((B,z)=>P=z);y=()=>P(),n.signal.addEventListener("abort",y);let D=B=>typeof v!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+i+'" [routeId: '+r.route.id+"]"))):v({request:n,params:r.params,context:p},...B!==void 0?[B]:[]),U=(async()=>{try{return{type:"data",result:await(u?u(z=>D(z)):D())}}catch(B){return{type:"error",result:B}}})();return Promise.race([U,w])};try{let v=r.route[i];if(d)if(v){let P,[w]=await Promise.all([h(v).catch(D=>{P=D}),d]);if(P!==void 0)throw P;g=w}else if(await d,v=r.route[i],v)g=await h(v);else if(i==="action"){let P=new URL(n.url),w=P.pathname+P.search;throw Dt(405,{method:n.method,pathname:w,routeId:r.route.id})}else return{type:qe.data,result:void 0};else if(v)g=await h(v);else{let P=new URL(n.url),w=P.pathname+P.search;throw Dt(404,{pathname:w})}Ce(g.result!==void 0,"You defined "+(i==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+i+"` ")+"function. Please return a value or `null`.")}catch(v){return{type:qe.error,result:v}}finally{y&&n.signal.removeEventListener("abort",y)}return g}async function Em(i){let{result:n,type:r}=i;if(Rp(n)){let w;try{let D=n.headers.get("Content-Type");D&&/\bapplication\/json\b/.test(D)?n.body==null?w=null:w=await n.json():w=await n.text()}catch(D){return{type:qe.error,error:D}}return r===qe.error?{type:qe.error,error:new Tn(n.status,n.statusText,w),statusCode:n.status,headers:n.headers}:{type:qe.data,data:w,statusCode:n.status,headers:n.headers}}if(r===qe.error){if(Gc(n)){var d,u;if(n.data instanceof Error){var p,g;return{type:qe.error,error:n.data,statusCode:(p=n.init)==null?void 0:p.status,headers:(g=n.init)!=null&&g.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:new Tn(((d=n.init)==null?void 0:d.status)||500,void 0,n.data),statusCode:rs(n)?n.status:void 0,headers:(u=n.init)!=null&&u.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:n,statusCode:rs(n)?n.status:void 0}}if(zm(n)){var y,h;return{type:qe.deferred,deferredData:n,statusCode:(y=n.init)==null?void 0:y.status,headers:((h=n.init)==null?void 0:h.headers)&&new Headers(n.init.headers)}}if(Gc(n)){var v,P;return{type:qe.data,data:n.data,statusCode:(v=n.init)==null?void 0:v.status,headers:(P=n.init)!=null&&P.headers?new Headers(n.init.headers):void 0}}return{type:qe.data,data:n}}function Tm(i,n,r,d,u,p){let g=i.headers.get("Location");if(Ce(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Kl.test(g)){let y=d.slice(0,d.findIndex(h=>h.route.id===r)+1);g=zl(new URL(n.url),y,u,!0,g,p),i.headers.set("Location",g)}return i}function qc(i,n,r,d){let u=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Kl.test(i)){let p=i,g=p.startsWith("//")?new URL(n.protocol+p):new URL(p);if(u.includes(g.protocol))throw new Error("Invalid redirect location");let y=Eo(g.pathname,r)!=null;if(g.origin===n.origin&&y)return g.pathname+g.search+g.hash}try{let p=d.createURL(i);if(u.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return i}function ri(i,n,r,d){let u=i.createURL(xp(n)).toString(),p={signal:r};if(d&&ao(d.formMethod)){let{formMethod:g,formEncType:y}=d;p.method=g.toUpperCase(),y==="application/json"?(p.headers=new Headers({"Content-Type":y}),p.body=JSON.stringify(d.json)):y==="text/plain"?p.body=d.text:y==="application/x-www-form-urlencoded"&&d.formData?p.body=Ll(d.formData):p.body=d.formData}return new Request(u,p)}function Ll(i){let n=new URLSearchParams;for(let[r,d]of i.entries())n.append(r,typeof d=="string"?d:d.name);return n}function Bc(i){let n=new FormData;for(let[r,d]of i.entries())n.append(r,d);return n}function jm(i,n,r,d,u){let p={},g=null,y,h=!1,v={},P=r&&Ht(r[1])?r[1].error:void 0;return i.forEach(w=>{if(!(w.route.id in n))return;let D=w.route.id,U=n[D];if(Ce(!Da(U),"Cannot handle redirect results in processLoaderData"),Ht(U)){let B=U.error;P!==void 0&&(B=P,P=void 0),g=g||{};{let z=Ia(i,D);g[z.route.id]==null&&(g[z.route.id]=B)}p[D]=void 0,h||(h=!0,y=rs(U.error)?U.error.status:500),U.headers&&(v[D]=U.headers)}else na(U)?(d.set(D,U.deferredData),p[D]=U.deferredData.data,U.statusCode!=null&&U.statusCode!==200&&!h&&(y=U.statusCode),U.headers&&(v[D]=U.headers)):(p[D]=U.data,U.statusCode&&U.statusCode!==200&&!h&&(y=U.statusCode),U.headers&&(v[D]=U.headers))}),P!==void 0&&r&&(g={[r[0]]:P},p[r[0]]=void 0),{loaderData:p,errors:g,statusCode:y||200,loaderHeaders:v}}function Wc(i,n,r,d,u,p,g){let{loaderData:y,errors:h}=jm(n,r,d,g);return u.forEach(v=>{let{key:P,match:w,controller:D}=v,U=p[P];if(Ce(U,"Did not find corresponding fetcher result"),!(D&&D.signal.aborted))if(Ht(U)){let B=Ia(i.matches,w==null?void 0:w.route.id);h&&h[B.route.id]||(h=$e({},h,{[B.route.id]:U.error})),i.fetchers.delete(P)}else if(Da(U))Ce(!1,"Unhandled fetcher revalidation redirect");else if(na(U))Ce(!1,"Unhandled fetcher deferred data");else{let B=sa(U.data);i.fetchers.set(P,B)}}),{loaderData:y,errors:h}}function Fc(i,n,r,d){let u=$e({},n);for(let p of r){let g=p.route.id;if(n.hasOwnProperty(g)?n[g]!==void 0&&(u[g]=n[g]):i[g]!==void 0&&p.route.loader&&(u[g]=i[g]),d&&d.hasOwnProperty(g))break}return u}function Kc(i){return i?Ht(i[1])?{actionData:{}}:{actionData:{[i[0]]:i[1].data}}:{}}function Ia(i,n){return(n?i.slice(0,i.findIndex(d=>d.route.id===n)+1):[...i]).reverse().find(d=>d.route.hasErrorBoundary===!0)||i[0]}function Yc(i){let n=i.length===1?i[0]:i.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:n}],route:n}}function Dt(i,n){let{pathname:r,routeId:d,method:u,type:p,message:g}=n===void 0?{}:n,y="Unknown Server Error",h="Unknown @remix-run/router error";return i===400?(y="Bad Request",u&&r&&d?h="You made a "+u+' request to "'+r+'" but '+('did not provide a `loader` for route "'+d+'", ')+"so there is no way to handle the request.":p==="defer-action"?h="defer() is not supported in actions":p==="invalid-body"&&(h="Unable to encode submission body")):i===403?(y="Forbidden",h='Route "'+d+'" does not match URL "'+r+'"'):i===404?(y="Not Found",h='No route matches URL "'+r+'"'):i===405&&(y="Method Not Allowed",u&&r&&d?h="You made a "+u.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+d+'", ')+"so there is no way to handle the request.":u&&(h='Invalid request method "'+u.toUpperCase()+'"')),new Tn(i||500,y,new Error(h),!0)}function kn(i){let n=Object.entries(i);for(let r=n.length-1;r>=0;r--){let[d,u]=n[r];if(Da(u))return{key:d,result:u}}}function xp(i){let n=typeof i=="string"?To(i):i;return ja($e({},n,{hash:""}))}function Um(i,n){return i.pathname!==n.pathname||i.search!==n.search?!1:i.hash===""?n.hash!=="":i.hash===n.hash?!0:n.hash!==""}function Mm(i){return Rp(i.result)&&vm.has(i.result.status)}function na(i){return i.type===qe.deferred}function Ht(i){return i.type===qe.error}function Da(i){return(i&&i.type)===qe.redirect}function Gc(i){return typeof i=="object"&&i!=null&&"type"in i&&"data"in i&&"init"in i&&i.type==="DataWithResponseInit"}function zm(i){let n=i;return n&&typeof n=="object"&&typeof n.data=="object"&&typeof n.subscribe=="function"&&typeof n.cancel=="function"&&typeof n.resolveData=="function"}function Rp(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.headers=="object"&&typeof i.body<"u"}function Hm(i){return Sm.has(i.toLowerCase())}function ao(i){return ym.has(i.toLowerCase())}async function Lm(i,n,r,d,u){let p=Object.entries(n);for(let g=0;g<p.length;g++){let[y,h]=p[g],v=i.find(D=>(D==null?void 0:D.route.id)===y);if(!v)continue;let P=d.find(D=>D.route.id===v.route.id),w=P!=null&&!Cp(P,v)&&(u&&u[v.route.id])!==void 0;na(h)&&w&&await Yl(h,r,!1).then(D=>{D&&(n[y]=D)})}}async function _m(i,n,r){for(let d=0;d<r.length;d++){let{key:u,routeId:p,controller:g}=r[d],y=n[u];i.find(v=>(v==null?void 0:v.route.id)===p)&&na(y)&&(Ce(g,"Expected an AbortController for revalidating fetcher deferred result"),await Yl(y,g.signal,!0).then(v=>{v&&(n[u]=v)}))}}async function Yl(i,n,r){if(r===void 0&&(r=!1),!await i.deferredData.resolveData(n)){if(r)try{return{type:qe.data,data:i.deferredData.unwrappedData}}catch(u){return{type:qe.error,error:u}}return{type:qe.data,data:i.deferredData.data}}}function Gl(i){return new URLSearchParams(i).getAll("index").some(n=>n==="")}function ss(i,n){let r=typeof n=="string"?To(n).search:n.search;if(i[i.length-1].route.index&&Gl(r||""))return i[i.length-1];let d=bp(i);return d[d.length-1]}function Vc(i){let{formMethod:n,formAction:r,formEncType:d,text:u,formData:p,json:g}=i;if(!(!n||!r||!d)){if(u!=null)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:void 0,text:u};if(p!=null)return{formMethod:n,formAction:r,formEncType:d,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:g,text:void 0}}}function Al(i,n){return n?{state:"loading",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}:{state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Nm(i,n){return{state:"submitting",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}}function os(i,n){return i?{state:"loading",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function Om(i,n){return{state:"submitting",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n?n.data:void 0}}function sa(i){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function qm(i,n){try{let r=i.sessionStorage.getItem(wp);if(r){let d=JSON.parse(r);for(let[u,p]of Object.entries(d||{}))p&&Array.isArray(p)&&n.set(u,new Set(p||[]))}}catch{}}function Bm(i,n){if(n.size>0){let r={};for(let[d,u]of n)r[d]=[...u];try{i.sessionStorage.setItem(wp,JSON.stringify(r))}catch(d){ra(!1,"Failed to save applied view transitions in sessionStorage ("+d+").")}}}/**
|
|
50
|
+
*/function $e(){return $e=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},$e.apply(this,arguments)}var st;(function(i){i.Pop="POP",i.Push="PUSH",i.Replace="REPLACE"})(st||(st={}));const jc="popstate";function Yh(i){i===void 0&&(i={});function n(u,p){let{pathname:g="/",search:y="",hash:h=""}=To(u.location.hash.substr(1));return!g.startsWith("/")&&!g.startsWith(".")&&(g="/"+g),ns("",{pathname:g,search:y,hash:h},p.state&&p.state.usr||null,p.state&&p.state.key||"default")}function r(u,p){let g=u.document.querySelector("base"),y="";if(g&&g.getAttribute("href")){let h=u.location.href,v=h.indexOf("#");y=v===-1?h:h.slice(0,v)}return y+"#"+(typeof p=="string"?p:ja(p))}function d(u,p){ra(u.pathname.charAt(0)==="/","relative pathnames are not supported in hash history.push("+JSON.stringify(p)+")")}return Gh(n,r,d,i)}function Ce(i,n){if(i===!1||i===null||typeof i>"u")throw new Error(n)}function ra(i,n){if(!i){typeof console<"u"&&console.warn(n);try{throw new Error(n)}catch{}}}function Vh(){return Math.random().toString(36).substr(2,8)}function Uc(i,n){return{usr:i.state,key:i.key,idx:n}}function ns(i,n,r,d){return r===void 0&&(r=null),$e({pathname:typeof i=="string"?i:i.pathname,search:"",hash:""},typeof n=="string"?To(n):n,{state:r,key:n&&n.key||d||Vh()})}function ja(i){let{pathname:n="/",search:r="",hash:d=""}=i;return r&&r!=="?"&&(n+=r.charAt(0)==="?"?r:"?"+r),d&&d!=="#"&&(n+=d.charAt(0)==="#"?d:"#"+d),n}function To(i){let n={};if(i){let r=i.indexOf("#");r>=0&&(n.hash=i.substr(r),i=i.substr(0,r));let d=i.indexOf("?");d>=0&&(n.search=i.substr(d),i=i.substr(0,d)),i&&(n.pathname=i)}return n}function Gh(i,n,r,d){d===void 0&&(d={});let{window:u=document.defaultView,v5Compat:p=!1}=d,g=u.history,y=st.Pop,h=null,v=P();v==null&&(v=0,g.replaceState($e({},g.state,{idx:v}),""));function P(){return(g.state||{idx:null}).idx}function w(){y=st.Pop;let N=P(),te=N==null?null:N-v;v=N,h&&h({action:y,location:z.location,delta:te})}function D(N,te){y=st.Push;let K=ns(z.location,N,te);r&&r(K,N),v=P()+1;let $=Uc(K,v),V=z.createHref(K);try{g.pushState($,"",V)}catch(he){if(he instanceof DOMException&&he.name==="DataCloneError")throw he;u.location.assign(V)}p&&h&&h({action:y,location:z.location,delta:1})}function U(N,te){y=st.Replace;let K=ns(z.location,N,te);r&&r(K,N),v=P();let $=Uc(K,v),V=z.createHref(K);g.replaceState($,"",V),p&&h&&h({action:y,location:z.location,delta:0})}function B(N){let te=u.location.origin!=="null"?u.location.origin:u.location.href,K=typeof N=="string"?N:ja(N);return K=K.replace(/ $/,"%20"),Ce(te,"No window.location.(origin|href) available to create URL for href: "+K),new URL(K,te)}let z={get action(){return y},get location(){return i(u,g)},listen(N){if(h)throw new Error("A history only accepts one active listener");return u.addEventListener(jc,w),h=N,()=>{u.removeEventListener(jc,w),h=null}},createHref(N){return n(u,N)},createURL:B,encodeLocation(N){let te=B(N);return{pathname:te.pathname,search:te.search,hash:te.hash}},push:D,replace:U,go(N){return g.go(N)}};return z}var qe;(function(i){i.data="data",i.deferred="deferred",i.redirect="redirect",i.error="error"})(qe||(qe={}));const Xh=new Set(["lazy","caseSensitive","path","id","index","children"]);function $h(i){return i.index===!0}function Dn(i,n,r,d){return r===void 0&&(r=[]),d===void 0&&(d={}),i.map((u,p)=>{let g=[...r,String(p)],y=typeof u.id=="string"?u.id:g.join("-");if(Ce(u.index!==!0||!u.children,"Cannot specify children on an index route"),Ce(!d[y],'Found a route id collision on id "'+y+`". Route id's must be globally unique within Data Router usages`),$h(u)){let h=$e({},u,n(u),{id:y});return d[y]=h,h}else{let h=$e({},u,n(u),{id:y,children:void 0});return d[y]=h,u.children&&(h.children=Dn(u.children,n,g,d)),h}})}function Aa(i,n,r){return r===void 0&&(r="/"),Rn(i,n,r,!1)}function Rn(i,n,r,d){let u=typeof n=="string"?To(n):n,p=Eo(u.pathname||"/",r);if(p==null)return null;let g=Sp(i);Zh(g);let y=null;for(let h=0;y==null&&h<g.length;++h){let v=dm(p);y=rm(g[h],v,d)}return y}function Qh(i,n){let{route:r,pathname:d,params:u}=i;return{id:r.id,pathname:d,params:u,data:n[r.id],handle:r.handle}}function Sp(i,n,r,d){n===void 0&&(n=[]),r===void 0&&(r=[]),d===void 0&&(d="");let u=(p,g,y)=>{let h={relativePath:y===void 0?p.path||"":y,caseSensitive:p.caseSensitive===!0,childrenIndex:g,route:p};h.relativePath.startsWith("/")&&(Ce(h.relativePath.startsWith(d),'Absolute route path "'+h.relativePath+'" nested under path '+('"'+d+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),h.relativePath=h.relativePath.slice(d.length));let v=Do([d,h.relativePath]),P=r.concat(h);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+'".')),Sp(p.children,n,P,v)),!(p.path==null&&!p.index)&&n.push({path:v,score:sm(v,p.index),routesMeta:P})};return i.forEach((p,g)=>{var y;if(p.path===""||!((y=p.path)!=null&&y.includes("?")))u(p,g);else for(let h of vp(p.path))u(p,g,h)}),n}function vp(i){let n=i.split("/");if(n.length===0)return[];let[r,...d]=n,u=r.endsWith("?"),p=r.replace(/\?$/,"");if(d.length===0)return u?[p,""]:[p];let g=vp(d.join("/")),y=[];return y.push(...g.map(h=>h===""?p:[p,h].join("/"))),u&&y.push(...g),y.map(h=>i.startsWith("/")&&h===""?"/":h)}function Zh(i){i.sort((n,r)=>n.score!==r.score?r.score-n.score:nm(n.routesMeta.map(d=>d.childrenIndex),r.routesMeta.map(d=>d.childrenIndex)))}const Jh=/^:[\w-]+$/,em=3,tm=2,om=1,am=10,im=-2,Mc=i=>i==="*";function sm(i,n){let r=i.split("/"),d=r.length;return r.some(Mc)&&(d+=im),n&&(d+=tm),r.filter(u=>!Mc(u)).reduce((u,p)=>u+(Jh.test(p)?em:p===""?om:am),d)}function nm(i,n){return i.length===n.length&&i.slice(0,-1).every((d,u)=>d===n[u])?i[i.length-1]-n[n.length-1]:0}function rm(i,n,r){r===void 0&&(r=!1);let{routesMeta:d}=i,u={},p="/",g=[];for(let y=0;y<d.length;++y){let h=d[y],v=y===d.length-1,P=p==="/"?n:n.slice(p.length)||"/",w=En({path:h.relativePath,caseSensitive:h.caseSensitive,end:v},P),D=h.route;if(!w&&v&&r&&!d[d.length-1].route.index&&(w=En({path:h.relativePath,caseSensitive:h.caseSensitive,end:!1},P)),!w)return null;Object.assign(u,w.params),g.push({params:u,pathname:Do([p,w.pathname]),pathnameBase:gm(Do([p,w.pathnameBase])),route:D}),w.pathnameBase!=="/"&&(p=Do([p,w.pathnameBase]))}return g}function En(i,n){typeof i=="string"&&(i={path:i,caseSensitive:!1,end:!0});let[r,d]=lm(i.path,i.caseSensitive,i.end),u=n.match(r);if(!u)return null;let p=u[0],g=p.replace(/(.)\/+$/,"$1"),y=u.slice(1);return{params:d.reduce((v,P,w)=>{let{paramName:D,isOptional:U}=P;if(D==="*"){let z=y[w]||"";g=p.slice(0,p.length-z.length).replace(/(.)\/+$/,"$1")}const B=y[w];return U&&!B?v[D]=void 0:v[D]=(B||"").replace(/%2F/g,"/"),v},{}),pathname:p,pathnameBase:g,pattern:i}}function lm(i,n,r){n===void 0&&(n=!1),r===void 0&&(r=!0),ra(i==="*"||!i.endsWith("*")||i.endsWith("/*"),'Route path "'+i+'" will be treated as if it were '+('"'+i.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+i.replace(/\*$/,"/*")+'".'));let d=[],u="^"+i.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(g,y,h)=>(d.push({paramName:y,isOptional:h!=null}),h?"/?([^\\/]+)?":"/([^\\/]+)"));return i.endsWith("*")?(d.push({paramName:"*"}),u+=i==="*"||i==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?u+="\\/*$":i!==""&&i!=="/"&&(u+="(?:(?=\\/|$))"),[new RegExp(u,n?void 0:"i"),d]}function dm(i){try{return i.split("/").map(n=>decodeURIComponent(n).replace(/\//g,"%2F")).join("/")}catch(n){return ra(!1,'The URL path "'+i+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+n+").")),i}}function Eo(i,n){if(n==="/")return i;if(!i.toLowerCase().startsWith(n.toLowerCase()))return null;let r=n.endsWith("/")?n.length-1:n.length,d=i.charAt(r);return d&&d!=="/"?null:i.slice(r)||"/"}const um=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,cm=i=>um.test(i);function pm(i,n){n===void 0&&(n="/");let{pathname:r,search:d="",hash:u=""}=typeof i=="string"?To(i):i,p;if(r)if(cm(r))p=r;else{if(r.includes("//")){let g=r;r=r.replace(/\/\/+/g,"/"),ra(!1,"Pathnames cannot have embedded double slashes - normalizing "+(g+" -> "+r))}r.startsWith("/")?p=zc(r.substring(1),"/"):p=zc(r,n)}else p=n;return{pathname:p,search:hm(d),hash:mm(u)}}function zc(i,n){let r=n.replace(/\/+$/,"").split("/");return i.split("/").forEach(u=>{u===".."?r.length>1&&r.pop():u!=="."&&r.push(u)}),r.length>1?r.join("/"):"/"}function xl(i,n,r,d){return"Cannot include a '"+i+"' character in a manually specified "+("`to."+n+"` field ["+JSON.stringify(d)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in <Link to="..."> and the router will parse it for you.'}function bp(i){return i.filter((n,r)=>r===0||n.route.path&&n.route.path.length>0)}function Mn(i,n){let r=bp(i);return n?r.map((d,u)=>u===r.length-1?d.pathname:d.pathnameBase):r.map(d=>d.pathnameBase)}function zn(i,n,r,d){d===void 0&&(d=!1);let u;typeof i=="string"?u=To(i):(u=$e({},i),Ce(!u.pathname||!u.pathname.includes("?"),xl("?","pathname","search",u)),Ce(!u.pathname||!u.pathname.includes("#"),xl("#","pathname","hash",u)),Ce(!u.search||!u.search.includes("#"),xl("#","search","hash",u)));let p=i===""||u.pathname==="",g=p?"/":u.pathname,y;if(g==null)y=r;else{let w=n.length-1;if(!d&&g.startsWith("..")){let D=g.split("/");for(;D[0]==="..";)D.shift(),w-=1;u.pathname=D.join("/")}y=w>=0?n[w]:"/"}let h=pm(u,y),v=g&&g!=="/"&&g.endsWith("/"),P=(p||g===".")&&r.endsWith("/");return!h.pathname.endsWith("/")&&(v||P)&&(h.pathname+="/"),h}const Do=i=>i.join("/").replace(/\/\/+/g,"/"),gm=i=>i.replace(/\/+$/,"").replace(/^\/*/,"/"),hm=i=>!i||i==="?"?"":i.startsWith("?")?i:"?"+i,mm=i=>!i||i==="#"?"":i.startsWith("#")?i:"#"+i;class Tn{constructor(n,r,d,u){u===void 0&&(u=!1),this.status=n,this.statusText=r||"",this.internal=u,d instanceof Error?(this.data=d.toString(),this.error=d):this.data=d}}function rs(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.internal=="boolean"&&"data"in i}const Pp=["post","put","patch","delete"],ym=new Set(Pp),fm=["get",...Pp],Sm=new Set(fm),vm=new Set([301,302,303,307,308]),bm=new Set([307,308]),Rl={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},ts={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Kl=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wm=i=>({hasErrorBoundary:!!i.hasErrorBoundary}),wp="remix-router-transitions";function Cm(i){const n=i.window?i.window:typeof window<"u"?window:void 0,r=typeof n<"u"&&typeof n.document<"u"&&typeof n.document.createElement<"u",d=!r;Ce(i.routes.length>0,"You must provide a non-empty routes array to createRouter");let u;if(i.mapRouteProperties)u=i.mapRouteProperties;else if(i.detectErrorBoundary){let f=i.detectErrorBoundary;u=k=>({hasErrorBoundary:f(k)})}else u=wm;let p={},g=Dn(i.routes,u,void 0,p),y,h=i.basename||"/",v=i.dataStrategy||Am,P=i.patchRoutesOnNavigation,w=$e({v7_fetcherPersist:!1,v7_normalizeFormMethod:!1,v7_partialHydration:!1,v7_prependBasename:!1,v7_relativeSplatPath:!1,v7_skipActionErrorRevalidation:!1},i.future),D=null,U=new Set,B=null,z=null,N=null,te=i.hydrationData!=null,K=Aa(g,i.history.location,h),$=!1,V=null;if(K==null&&!P){let f=Dt(404,{pathname:i.history.location.pathname}),{matches:k,route:j}=Yc(g);K=k,V={[j.id]:f}}K&&!i.hydrationData&&ua(K,g,i.history.location.pathname).active&&(K=null);let he;if(K)if(K.some(f=>f.route.lazy))he=!1;else if(!K.some(f=>f.route.loader))he=!0;else if(w.v7_partialHydration){let f=i.hydrationData?i.hydrationData.loaderData:null,k=i.hydrationData?i.hydrationData.errors:null;if(k){let j=K.findIndex(H=>k[H.route.id]!==void 0);he=K.slice(0,j+1).every(H=>!Hl(H.route,f,k))}else he=K.every(j=>!Hl(j.route,f,k))}else he=i.hydrationData!=null;else if(he=!1,K=[],w.v7_partialHydration){let f=ua(null,g,i.history.location.pathname);f.active&&f.matches&&($=!0,K=f.matches)}let De,E={historyAction:i.history.action,location:i.history.location,matches:K,initialized:he,navigation:Rl,restoreScrollPosition:i.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:i.hydrationData&&i.hydrationData.loaderData||{},actionData:i.hydrationData&&i.hydrationData.actionData||null,errors:i.hydrationData&&i.hydrationData.errors||V,fetchers:new Map,blockers:new Map},Q=st.Pop,Pe=!1,ce,He=!1,ve=new Map,Te=null,Le=!1,et=!1,ot=[],_e=new Set,O=new Map,de=0,G=-1,C=new Map,M=new Set,ye=new Map,F=new Map,ie=new Set,ue=new Map,we=new Map,ke;function je(){if(D=i.history.listen(f=>{let{action:k,location:j,delta:H}=f;if(ke){ke(),ke=void 0;return}ra(we.size===0||H!=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 Y=La({currentLocation:E.location,nextLocation:j,historyAction:k});if(Y&&H!=null){let le=new Promise(me=>{ke=me});i.history.go(H*-1),Lo(Y,{state:"blocked",location:j,proceed(){Lo(Y,{state:"proceeding",proceed:void 0,reset:void 0,location:j}),le.then(()=>i.history.go(H))},reset(){let me=new Map(E.blockers);me.set(Y,ts),dt({blockers:me})}});return}return io(k,j)}),r){qm(n,ve);let f=()=>Bm(n,ve);n.addEventListener("pagehide",f),Te=()=>n.removeEventListener("pagehide",f)}return E.initialized||io(st.Pop,E.location,{initialHydration:!0}),De}function gt(){D&&D(),Te&&Te(),U.clear(),ce&&ce.abort(),E.fetchers.forEach((f,k)=>no(k)),E.blockers.forEach((f,k)=>Ha(k))}function yo(f){return U.add(f),()=>U.delete(f)}function dt(f,k){k===void 0&&(k={}),E=$e({},E,f);let j=[],H=[];w.v7_fetcherPersist&&E.fetchers.forEach((Y,le)=>{Y.state==="idle"&&(ie.has(le)?H.push(le):j.push(le))}),ie.forEach(Y=>{!E.fetchers.has(Y)&&!O.has(Y)&&H.push(Y)}),[...U].forEach(Y=>Y(E,{deletedFetchers:H,viewTransitionOpts:k.viewTransitionOpts,flushSync:k.flushSync===!0})),w.v7_fetcherPersist?(j.forEach(Y=>E.fetchers.delete(Y)),H.forEach(Y=>no(Y))):H.forEach(Y=>ie.delete(Y))}function Vt(f,k,j){var H,Y;let{flushSync:le}=j===void 0?{}:j,me=E.actionData!=null&&E.navigation.formMethod!=null&&ao(E.navigation.formMethod)&&E.navigation.state==="loading"&&((H=f.state)==null?void 0:H._isRedirect)!==!0,oe;k.actionData?Object.keys(k.actionData).length>0?oe=k.actionData:oe=null:me?oe=E.actionData:oe=null;let se=k.loaderData?Fc(E.loaderData,k.loaderData,k.matches||[],k.errors):E.loaderData,Z=E.blockers;Z.size>0&&(Z=new Map(Z),Z.forEach((Re,nt)=>Z.set(nt,ts)));let ee=Pe===!0||E.navigation.formMethod!=null&&ao(E.navigation.formMethod)&&((Y=f.state)==null?void 0:Y._isRedirect)!==!0;y&&(g=y,y=void 0),Le||Q===st.Pop||(Q===st.Push?i.history.push(f,f.state):Q===st.Replace&&i.history.replace(f,f.state));let Se;if(Q===st.Pop){let Re=ve.get(E.location.pathname);Re&&Re.has(f.pathname)?Se={currentLocation:E.location,nextLocation:f}:ve.has(f.pathname)&&(Se={currentLocation:f,nextLocation:E.location})}else if(He){let Re=ve.get(E.location.pathname);Re?Re.add(f.pathname):(Re=new Set([f.pathname]),ve.set(E.location.pathname,Re)),Se={currentLocation:E.location,nextLocation:f}}dt($e({},k,{actionData:oe,loaderData:se,historyAction:Q,location:f,initialized:!0,navigation:Rl,revalidation:"idle",restoreScrollPosition:vi(f,k.matches||E.matches),preventScrollReset:ee,blockers:Z}),{viewTransitionOpts:Se,flushSync:le===!0}),Q=st.Pop,Pe=!1,He=!1,Le=!1,et=!1,ot=[]}async function Ua(f,k){if(typeof f=="number"){i.history.go(f);return}let j=zl(E.location,E.matches,h,w.v7_prependBasename,f,w.v7_relativeSplatPath,k==null?void 0:k.fromRouteId,k==null?void 0:k.relative),{path:H,submission:Y,error:le}=Hc(w.v7_normalizeFormMethod,!1,j,k),me=E.location,oe=ns(E.location,H,k&&k.state);oe=$e({},oe,i.history.encodeLocation(oe));let se=k&&k.replace!=null?k.replace:void 0,Z=st.Push;se===!0?Z=st.Replace:se===!1||Y!=null&&ao(Y.formMethod)&&Y.formAction===E.location.pathname+E.location.search&&(Z=st.Replace);let ee=k&&"preventScrollReset"in k?k.preventScrollReset===!0:void 0,Se=(k&&k.flushSync)===!0,Re=La({currentLocation:me,nextLocation:oe,historyAction:Z});if(Re){Lo(Re,{state:"blocked",location:oe,proceed(){Lo(Re,{state:"proceeding",proceed:void 0,reset:void 0,location:oe}),Ua(f,k)},reset(){let nt=new Map(E.blockers);nt.set(Re,ts),dt({blockers:nt})}});return}return await io(Z,oe,{submission:Y,pendingError:le,preventScrollReset:ee,replace:k&&k.replace,enableViewTransition:k&&k.viewTransition,flushSync:Se})}function cs(){if(da(),dt({revalidation:"loading"}),E.navigation.state!=="submitting"){if(E.navigation.state==="idle"){io(E.historyAction,E.location,{startUninterruptedRevalidation:!0});return}io(Q||E.historyAction,E.navigation.location,{overrideNavigation:E.navigation,enableViewTransition:He===!0})}}async function io(f,k,j){ce&&ce.abort(),ce=null,Q=f,Le=(j&&j.startUninterruptedRevalidation)===!0,ys(E.location,E.matches),Pe=(j&&j.preventScrollReset)===!0,He=(j&&j.enableViewTransition)===!0;let H=y||g,Y=j&&j.overrideNavigation,le=j!=null&&j.initialHydration&&E.matches&&E.matches.length>0&&!$?E.matches:Aa(H,k,h),me=(j&&j.flushSync)===!0;if(le&&E.initialized&&!et&&Um(E.location,k)&&!(j&&j.submission&&ao(j.submission.formMethod))){Vt(k,{matches:le},{flushSync:me});return}let oe=ua(le,H,k.pathname);if(oe.active&&oe.matches&&(le=oe.matches),!le){let{error:Ne,notFoundMatches:Ie,route:Ye}=ro(k.pathname);Vt(k,{matches:Ie,loaderData:{},errors:{[Ye.id]:Ne}},{flushSync:me});return}ce=new AbortController;let se=ri(i.history,k,ce.signal,j&&j.submission),Z;if(j&&j.pendingError)Z=[Ia(le).route.id,{type:qe.error,error:j.pendingError}];else if(j&&j.submission&&ao(j.submission.formMethod)){let Ne=await gi(se,k,j.submission,le,oe.active,{replace:j.replace,flushSync:me});if(Ne.shortCircuited)return;if(Ne.pendingActionResult){let[Ie,Ye]=Ne.pendingActionResult;if(Ht(Ye)&&rs(Ye.error)&&Ye.error.status===404){ce=null,Vt(k,{matches:Ne.matches,loaderData:{},errors:{[Ie]:Ye.error}});return}}le=Ne.matches||le,Z=Ne.pendingActionResult,Y=Al(k,j.submission),me=!1,oe.active=!1,se=ri(i.history,se.url,se.signal)}let{shortCircuited:ee,matches:Se,loaderData:Re,errors:nt}=await ps(se,k,le,oe.active,Y,j&&j.submission,j&&j.fetcherSubmission,j&&j.replace,j&&j.initialHydration===!0,me,Z);ee||(ce=null,Vt(k,$e({matches:Se||le},Kc(Z),{loaderData:Re,errors:nt})))}async function gi(f,k,j,H,Y,le){le===void 0&&(le={}),da();let me=Nm(k,j);if(dt({navigation:me},{flushSync:le.flushSync===!0}),Y){let Z=await _o(H,k.pathname,f.signal);if(Z.type==="aborted")return{shortCircuited:!0};if(Z.type==="error"){let ee=Ia(Z.partialMatches).route.id;return{matches:Z.partialMatches,pendingActionResult:[ee,{type:qe.error,error:Z.error}]}}else if(Z.matches)H=Z.matches;else{let{notFoundMatches:ee,error:Se,route:Re}=ro(k.pathname);return{matches:ee,pendingActionResult:[Re.id,{type:qe.error,error:Se}]}}}let oe,se=ss(H,k);if(!se.route.action&&!se.route.lazy)oe={type:qe.error,error:Dt(405,{method:f.method,pathname:k.pathname,routeId:se.route.id})};else if(oe=(await zo("action",E,f,[se],H,null))[se.route.id],f.signal.aborted)return{shortCircuited:!0};if(Da(oe)){let Z;return le&&le.replace!=null?Z=le.replace:Z=qc(oe.response.headers.get("Location"),new URL(f.url),h,i.history)===E.location.pathname+E.location.search,await so(f,oe,!0,{submission:j,replace:Z}),{shortCircuited:!0}}if(na(oe))throw Dt(400,{type:"defer-action"});if(Ht(oe)){let Z=Ia(H,se.route.id);return(le&&le.replace)!==!0&&(Q=st.Push),{matches:H,pendingActionResult:[Z.route.id,oe]}}return{matches:H,pendingActionResult:[se.route.id,oe]}}async function ps(f,k,j,H,Y,le,me,oe,se,Z,ee){let Se=Y||Al(k,le),Re=le||me||Gc(Se),nt=!Le&&(!w.v7_partialHydration||!se);if(H){if(nt){let Be=Ma(ee);dt($e({navigation:Se},Be!==void 0?{actionData:Be}:{}),{flushSync:Z})}let Ae=await _o(j,k.pathname,f.signal);if(Ae.type==="aborted")return{shortCircuited:!0};if(Ae.type==="error"){let Be=Ia(Ae.partialMatches).route.id;return{matches:Ae.partialMatches,loaderData:{},errors:{[Be]:Ae.error}}}else if(Ae.matches)j=Ae.matches;else{let{error:Be,notFoundMatches:ht,route:ga}=ro(k.pathname);return{matches:ht,loaderData:{},errors:{[ga.id]:Be}}}}let Ne=y||g,[Ie,Ye]=_c(i.history,E,j,Re,k,w.v7_partialHydration&&se===!0,w.v7_skipActionErrorRevalidation,et,ot,_e,ie,ye,M,Ne,h,ee);if(lo(Ae=>!(j&&j.some(Be=>Be.route.id===Ae))||Ie&&Ie.some(Be=>Be.route.id===Ae)),G=++de,Ie.length===0&&Ye.length===0){let Ae=hs();return Vt(k,$e({matches:j,loaderData:{},errors:ee&&Ht(ee[1])?{[ee[0]]:ee[1].error}:null},Kc(ee),Ae?{fetchers:new Map(E.fetchers)}:{}),{flushSync:Z}),{shortCircuited:!0}}if(nt){let Ae={};if(!H){Ae.navigation=Se;let Be=Ma(ee);Be!==void 0&&(Ae.actionData=Be)}Ye.length>0&&(Ae.fetchers=la(Ye)),dt(Ae,{flushSync:Z})}Ye.forEach(Ae=>{Gt(Ae.key),Ae.controller&&O.set(Ae.key,Ae.controller)});let fo=()=>Ye.forEach(Ae=>Gt(Ae.key));ce&&ce.signal.addEventListener("abort",fo);let{loaderResults:pa,fetcherResults:Xt}=await mi(E,j,Ie,Ye,f);if(f.signal.aborted)return{shortCircuited:!0};ce&&ce.signal.removeEventListener("abort",fo),Ye.forEach(Ae=>O.delete(Ae.key));let Ue=kn(pa);if(Ue)return await so(f,Ue.result,!0,{replace:oe}),{shortCircuited:!0};if(Ue=kn(Xt),Ue)return M.add(Ue.key),await so(f,Ue.result,!0,{replace:oe}),{shortCircuited:!0};let{loaderData:bi,errors:So}=Wc(E,j,pa,ee,Ye,Xt,ue);ue.forEach((Ae,Be)=>{Ae.subscribe(ht=>{(ht||Ae.done)&&ue.delete(Be)})}),w.v7_partialHydration&&se&&E.errors&&(So=$e({},E.errors,So));let uo=hs(),vo=za(G),_a=uo||vo||Ye.length>0;return $e({matches:j,loaderData:bi,errors:So},_a?{fetchers:new Map(E.fetchers)}:{})}function Ma(f){if(f&&!Ht(f[1]))return{[f[0]]:f[1].data};if(E.actionData)return Object.keys(E.actionData).length===0?null:E.actionData}function la(f){return f.forEach(k=>{let j=E.fetchers.get(k.key),H=os(void 0,j?j.data:void 0);E.fetchers.set(k.key,H)}),new Map(E.fetchers)}function Mo(f,k,j,H){if(d)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.");Gt(f);let Y=(H&&H.flushSync)===!0,le=y||g,me=zl(E.location,E.matches,h,w.v7_prependBasename,j,w.v7_relativeSplatPath,k,H==null?void 0:H.relative),oe=Aa(le,me,h),se=ua(oe,le,me);if(se.active&&se.matches&&(oe=se.matches),!oe){Lt(f,k,Dt(404,{pathname:me}),{flushSync:Y});return}let{path:Z,submission:ee,error:Se}=Hc(w.v7_normalizeFormMethod,!0,me,H);if(Se){Lt(f,k,Se,{flushSync:Y});return}let Re=ss(oe,Z),nt=(H&&H.preventScrollReset)===!0;if(ee&&ao(ee.formMethod)){hi(f,k,Z,Re,oe,se.active,Y,nt,ee);return}ye.set(f,{routeId:k,path:Z}),gs(f,k,Z,Re,oe,se.active,Y,nt,ee)}async function hi(f,k,j,H,Y,le,me,oe,se){da(),ye.delete(f);function Z(Me){if(!Me.route.action&&!Me.route.lazy){let No=Dt(405,{method:se.formMethod,pathname:j,routeId:k});return Lt(f,k,No,{flushSync:me}),!0}return!1}if(!le&&Z(H))return;let ee=E.fetchers.get(f);Tt(f,Om(se,ee),{flushSync:me});let Se=new AbortController,Re=ri(i.history,j,Se.signal,se);if(le){let Me=await _o(Y,new URL(Re.url).pathname,Re.signal,f);if(Me.type==="aborted")return;if(Me.type==="error"){Lt(f,k,Me.error,{flushSync:me});return}else if(Me.matches){if(Y=Me.matches,H=ss(Y,j),Z(H))return}else{Lt(f,k,Dt(404,{pathname:j}),{flushSync:me});return}}O.set(f,Se);let nt=de,Ie=(await zo("action",E,Re,[H],Y,f))[H.route.id];if(Re.signal.aborted){O.get(f)===Se&&O.delete(f);return}if(w.v7_fetcherPersist&&ie.has(f)){if(Da(Ie)||Ht(Ie)){Tt(f,sa(void 0));return}}else{if(Da(Ie))if(O.delete(f),G>nt){Tt(f,sa(void 0));return}else return M.add(f),Tt(f,os(se)),so(Re,Ie,!1,{fetcherSubmission:se,preventScrollReset:oe});if(Ht(Ie)){Lt(f,k,Ie.error);return}}if(na(Ie))throw Dt(400,{type:"defer-action"});let Ye=E.navigation.location||E.location,fo=ri(i.history,Ye,Se.signal),pa=y||g,Xt=E.navigation.state!=="idle"?Aa(pa,E.navigation.location,h):E.matches;Ce(Xt,"Didn't find any matches after fetcher action");let Ue=++de;C.set(f,Ue);let bi=os(se,Ie.data);E.fetchers.set(f,bi);let[So,uo]=_c(i.history,E,Xt,se,Ye,!1,w.v7_skipActionErrorRevalidation,et,ot,_e,ie,ye,M,pa,h,[H.route.id,Ie]);uo.filter(Me=>Me.key!==f).forEach(Me=>{let No=Me.key,Ss=E.fetchers.get(No),On=os(void 0,Ss?Ss.data:void 0);E.fetchers.set(No,On),Gt(No),Me.controller&&O.set(No,Me.controller)}),dt({fetchers:new Map(E.fetchers)});let vo=()=>uo.forEach(Me=>Gt(Me.key));Se.signal.addEventListener("abort",vo);let{loaderResults:_a,fetcherResults:Ae}=await mi(E,Xt,So,uo,fo);if(Se.signal.aborted)return;Se.signal.removeEventListener("abort",vo),C.delete(f),O.delete(f),uo.forEach(Me=>O.delete(Me.key));let Be=kn(_a);if(Be)return so(fo,Be.result,!1,{preventScrollReset:oe});if(Be=kn(Ae),Be)return M.add(Be.key),so(fo,Be.result,!1,{preventScrollReset:oe});let{loaderData:ht,errors:ga}=Wc(E,Xt,_a,void 0,uo,Ae,ue);if(E.fetchers.has(f)){let Me=sa(Ie.data);E.fetchers.set(f,Me)}za(Ue),E.navigation.state==="loading"&&Ue>G?(Ce(Q,"Expected pending action"),ce&&ce.abort(),Vt(E.navigation.location,{matches:Xt,loaderData:ht,errors:ga,fetchers:new Map(E.fetchers)})):(dt({errors:ga,loaderData:Fc(E.loaderData,ht,Xt,ga),fetchers:new Map(E.fetchers)}),et=!1)}async function gs(f,k,j,H,Y,le,me,oe,se){let Z=E.fetchers.get(f);Tt(f,os(se,Z?Z.data:void 0),{flushSync:me});let ee=new AbortController,Se=ri(i.history,j,ee.signal);if(le){let Ie=await _o(Y,new URL(Se.url).pathname,Se.signal,f);if(Ie.type==="aborted")return;if(Ie.type==="error"){Lt(f,k,Ie.error,{flushSync:me});return}else if(Ie.matches)Y=Ie.matches,H=ss(Y,j);else{Lt(f,k,Dt(404,{pathname:j}),{flushSync:me});return}}O.set(f,ee);let Re=de,Ne=(await zo("loader",E,Se,[H],Y,f))[H.route.id];if(na(Ne)&&(Ne=await Yl(Ne,Se.signal,!0)||Ne),O.get(f)===ee&&O.delete(f),!Se.signal.aborted){if(ie.has(f)){Tt(f,sa(void 0));return}if(Da(Ne))if(G>Re){Tt(f,sa(void 0));return}else{M.add(f),await so(Se,Ne,!1,{preventScrollReset:oe});return}if(Ht(Ne)){Lt(f,k,Ne.error);return}Ce(!na(Ne),"Unhandled fetcher deferred data"),Tt(f,sa(Ne.data))}}async function so(f,k,j,H){let{submission:Y,fetcherSubmission:le,preventScrollReset:me,replace:oe}=H===void 0?{}:H;k.response.headers.has("X-Remix-Revalidate")&&(et=!0);let se=k.response.headers.get("Location");Ce(se,"Expected a Location header on the redirect Response"),se=qc(se,new URL(f.url),h,i.history);let Z=ns(E.location,se,{_isRedirect:!0});if(r){let Ie=!1;if(k.response.headers.has("X-Remix-Reload-Document"))Ie=!0;else if(Kl.test(se)){const Ye=i.history.createURL(se);Ie=Ye.origin!==n.location.origin||Eo(Ye.pathname,h)==null}if(Ie){oe?n.location.replace(se):n.location.assign(se);return}}ce=null;let ee=oe===!0||k.response.headers.has("X-Remix-Replace")?st.Replace:st.Push,{formMethod:Se,formAction:Re,formEncType:nt}=E.navigation;!Y&&!le&&Se&&Re&&nt&&(Y=Gc(E.navigation));let Ne=Y||le;if(bm.has(k.response.status)&&Ne&&ao(Ne.formMethod))await io(ee,Z,{submission:$e({},Ne,{formAction:se}),preventScrollReset:me||Pe,enableViewTransition:j?He:void 0});else{let Ie=Al(Z,Y);await io(ee,Z,{overrideNavigation:Ie,fetcherSubmission:le,preventScrollReset:me||Pe,enableViewTransition:j?He:void 0})}}async function zo(f,k,j,H,Y,le){let me,oe={};try{me=await Im(v,f,k,j,H,Y,le,p,u)}catch(se){return H.forEach(Z=>{oe[Z.route.id]={type:qe.error,error:se}}),oe}for(let[se,Z]of Object.entries(me))if(Mm(Z)){let ee=Z.result;oe[se]={type:qe.redirect,response:Tm(ee,j,se,Y,h,w.v7_relativeSplatPath)}}else oe[se]=await Em(Z);return oe}async function mi(f,k,j,H,Y){let le=f.matches,me=zo("loader",f,Y,j,k,null),oe=Promise.all(H.map(async ee=>{if(ee.matches&&ee.match&&ee.controller){let Re=(await zo("loader",f,ri(i.history,ee.path,ee.controller.signal),[ee.match],ee.matches,ee.key))[ee.match.route.id];return{[ee.key]:Re}}else return Promise.resolve({[ee.key]:{type:qe.error,error:Dt(404,{pathname:ee.path})}})})),se=await me,Z=(await oe).reduce((ee,Se)=>Object.assign(ee,Se),{});return await Promise.all([Lm(k,se,Y.signal,le,f.loaderData),_m(k,Z,H)]),{loaderResults:se,fetcherResults:Z}}function da(){et=!0,ot.push(...lo()),ye.forEach((f,k)=>{O.has(k)&&_e.add(k),Gt(k)})}function Tt(f,k,j){j===void 0&&(j={}),E.fetchers.set(f,k),dt({fetchers:new Map(E.fetchers)},{flushSync:(j&&j.flushSync)===!0})}function Lt(f,k,j,H){H===void 0&&(H={});let Y=Ia(E.matches,k);no(f),dt({errors:{[Y.route.id]:j},fetchers:new Map(E.fetchers)},{flushSync:(H&&H.flushSync)===!0})}function Ho(f){return F.set(f,(F.get(f)||0)+1),ie.has(f)&&ie.delete(f),E.fetchers.get(f)||Pm}function no(f){let k=E.fetchers.get(f);O.has(f)&&!(k&&k.state==="loading"&&C.has(f))&&Gt(f),ye.delete(f),C.delete(f),M.delete(f),w.v7_fetcherPersist&&ie.delete(f),_e.delete(f),E.fetchers.delete(f)}function Nn(f){let k=(F.get(f)||0)-1;k<=0?(F.delete(f),ie.add(f),w.v7_fetcherPersist||no(f)):F.set(f,k),dt({fetchers:new Map(E.fetchers)})}function Gt(f){let k=O.get(f);k&&(k.abort(),O.delete(f))}function yi(f){for(let k of f){let j=Ho(k),H=sa(j.data);E.fetchers.set(k,H)}}function hs(){let f=[],k=!1;for(let j of M){let H=E.fetchers.get(j);Ce(H,"Expected fetcher: "+j),H.state==="loading"&&(M.delete(j),f.push(j),k=!0)}return yi(f),k}function za(f){let k=[];for(let[j,H]of C)if(H<f){let Y=E.fetchers.get(j);Ce(Y,"Expected fetcher: "+j),Y.state==="loading"&&(Gt(j),C.delete(j),k.push(j))}return yi(k),k.length>0}function fi(f,k){let j=E.blockers.get(f)||ts;return we.get(f)!==k&&we.set(f,k),j}function Ha(f){E.blockers.delete(f),we.delete(f)}function Lo(f,k){let j=E.blockers.get(f)||ts;Ce(j.state==="unblocked"&&k.state==="blocked"||j.state==="blocked"&&k.state==="blocked"||j.state==="blocked"&&k.state==="proceeding"||j.state==="blocked"&&k.state==="unblocked"||j.state==="proceeding"&&k.state==="unblocked","Invalid blocker state transition: "+j.state+" -> "+k.state);let H=new Map(E.blockers);H.set(f,k),dt({blockers:H})}function La(f){let{currentLocation:k,nextLocation:j,historyAction:H}=f;if(we.size===0)return;we.size>1&&ra(!1,"A router only supports one blocker at a time");let Y=Array.from(we.entries()),[le,me]=Y[Y.length-1],oe=E.blockers.get(le);if(!(oe&&oe.state==="proceeding")&&me({currentLocation:k,nextLocation:j,historyAction:H}))return le}function ro(f){let k=Dt(404,{pathname:f}),j=y||g,{matches:H,route:Y}=Yc(j);return lo(),{notFoundMatches:H,route:Y,error:k}}function lo(f){let k=[];return ue.forEach((j,H)=>{(!f||f(H))&&(j.cancel(),k.push(H),ue.delete(H))}),k}function ms(f,k,j){if(B=f,N=k,z=j||null,!te&&E.navigation===Rl){te=!0;let H=vi(E.location,E.matches);H!=null&&dt({restoreScrollPosition:H})}return()=>{B=null,N=null,z=null}}function Si(f,k){return z&&z(f,k.map(H=>Qh(H,E.loaderData)))||f.key}function ys(f,k){if(B&&N){let j=Si(f,k);B[j]=N()}}function vi(f,k){if(B){let j=Si(f,k),H=B[j];if(typeof H=="number")return H}return null}function ua(f,k,j){if(P)if(f){if(Object.keys(f[0].params).length>0)return{active:!0,matches:Rn(k,j,h,!0)}}else return{active:!0,matches:Rn(k,j,h,!0)||[]};return{active:!1,matches:null}}async function _o(f,k,j,H){if(!P)return{type:"success",matches:f};let Y=f;for(;;){let le=y==null,me=y||g,oe=p;try{await P({signal:j,path:k,matches:Y,fetcherKey:H,patch:(ee,Se)=>{j.aborted||Oc(ee,Se,me,oe,u)}})}catch(ee){return{type:"error",error:ee,partialMatches:Y}}finally{le&&!j.aborted&&(g=[...g])}if(j.aborted)return{type:"aborted"};let se=Aa(me,k,h);if(se)return{type:"success",matches:se};let Z=Rn(me,k,h,!0);if(!Z||Y.length===Z.length&&Y.every((ee,Se)=>ee.route.id===Z[Se].route.id))return{type:"success",matches:null};Y=Z}}function fs(f){p={},y=Dn(f,u,void 0,p)}function ca(f,k){let j=y==null;Oc(f,k,y||g,p,u),j&&(g=[...g],dt({}))}return De={get basename(){return h},get future(){return w},get state(){return E},get routes(){return g},get window(){return n},initialize:je,subscribe:yo,enableScrollRestoration:ms,navigate:Ua,fetch:Mo,revalidate:cs,createHref:f=>i.history.createHref(f),encodeLocation:f=>i.history.encodeLocation(f),getFetcher:Ho,deleteFetcher:Nn,dispose:gt,getBlocker:fi,deleteBlocker:Ha,patchRoutes:ca,_internalFetchControllers:O,_internalActiveDeferreds:ue,_internalSetRoutes:fs},De}function km(i){return i!=null&&("formData"in i&&i.formData!=null||"body"in i&&i.body!==void 0)}function zl(i,n,r,d,u,p,g,y){let h,v;if(g){h=[];for(let w of n)if(h.push(w),w.route.id===g){v=w;break}}else h=n,v=n[n.length-1];let P=zn(u||".",Mn(h,p),Eo(i.pathname,r)||i.pathname,y==="path");if(u==null&&(P.search=i.search,P.hash=i.hash),(u==null||u===""||u===".")&&v){let w=Vl(P.search);if(v.route.index&&!w)P.search=P.search?P.search.replace(/^\?/,"?index&"):"?index";else if(!v.route.index&&w){let D=new URLSearchParams(P.search),U=D.getAll("index");D.delete("index"),U.filter(z=>z).forEach(z=>D.append("index",z));let B=D.toString();P.search=B?"?"+B:""}}return d&&r!=="/"&&(P.pathname=P.pathname==="/"?r:Do([r,P.pathname])),ja(P)}function Hc(i,n,r,d){if(!d||!km(d))return{path:r};if(d.formMethod&&!Hm(d.formMethod))return{path:r,error:Dt(405,{method:d.formMethod})};let u=()=>({path:r,error:Dt(400,{type:"invalid-body"})}),p=d.formMethod||"get",g=i?p.toUpperCase():p.toLowerCase(),y=xp(r);if(d.body!==void 0){if(d.formEncType==="text/plain"){if(!ao(g))return u();let D=typeof d.body=="string"?d.body:d.body instanceof FormData||d.body instanceof URLSearchParams?Array.from(d.body.entries()).reduce((U,B)=>{let[z,N]=B;return""+U+z+"="+N+`
|
|
51
|
+
`},""):String(d.body);return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:void 0,text:D}}}else if(d.formEncType==="application/json"){if(!ao(g))return u();try{let D=typeof d.body=="string"?JSON.parse(d.body):d.body;return{path:r,submission:{formMethod:g,formAction:y,formEncType:d.formEncType,formData:void 0,json:D,text:void 0}}}catch{return u()}}}Ce(typeof FormData=="function","FormData is not available in this environment");let h,v;if(d.formData)h=Ll(d.formData),v=d.formData;else if(d.body instanceof FormData)h=Ll(d.body),v=d.body;else if(d.body instanceof URLSearchParams)h=d.body,v=Bc(h);else if(d.body==null)h=new URLSearchParams,v=new FormData;else try{h=new URLSearchParams(d.body),v=Bc(h)}catch{return u()}let P={formMethod:g,formAction:y,formEncType:d&&d.formEncType||"application/x-www-form-urlencoded",formData:v,json:void 0,text:void 0};if(ao(P.formMethod))return{path:r,submission:P};let w=To(r);return n&&w.search&&Vl(w.search)&&h.append("index",""),w.search="?"+h,{path:ja(w),submission:P}}function Lc(i,n,r){r===void 0&&(r=!1);let d=i.findIndex(u=>u.route.id===n);return d>=0?i.slice(0,r?d+1:d):i}function _c(i,n,r,d,u,p,g,y,h,v,P,w,D,U,B,z){let N=z?Ht(z[1])?z[1].error:z[1].data:void 0,te=i.createURL(n.location),K=i.createURL(u),$=r;p&&n.errors?$=Lc(r,Object.keys(n.errors)[0],!0):z&&Ht(z[1])&&($=Lc(r,z[0]));let V=z?z[1].statusCode:void 0,he=g&&V&&V>=400,De=$.filter((Q,Pe)=>{let{route:ce}=Q;if(ce.lazy)return!0;if(ce.loader==null)return!1;if(p)return Hl(ce,n.loaderData,n.errors);if(xm(n.loaderData,n.matches[Pe],Q)||h.some(Te=>Te===Q.route.id))return!0;let He=n.matches[Pe],ve=Q;return Nc(Q,$e({currentUrl:te,currentParams:He.params,nextUrl:K,nextParams:ve.params},d,{actionResult:N,actionStatus:V,defaultShouldRevalidate:he?!1:y||te.pathname+te.search===K.pathname+K.search||te.search!==K.search||Cp(He,ve)}))}),E=[];return w.forEach((Q,Pe)=>{if(p||!r.some(Le=>Le.route.id===Q.routeId)||P.has(Pe))return;let ce=Aa(U,Q.path,B);if(!ce){E.push({key:Pe,routeId:Q.routeId,path:Q.path,matches:null,match:null,controller:null});return}let He=n.fetchers.get(Pe),ve=ss(ce,Q.path),Te=!1;D.has(Pe)?Te=!1:v.has(Pe)?(v.delete(Pe),Te=!0):He&&He.state!=="idle"&&He.data===void 0?Te=y:Te=Nc(ve,$e({currentUrl:te,currentParams:n.matches[n.matches.length-1].params,nextUrl:K,nextParams:r[r.length-1].params},d,{actionResult:N,actionStatus:V,defaultShouldRevalidate:he?!1:y})),Te&&E.push({key:Pe,routeId:Q.routeId,path:Q.path,matches:ce,match:ve,controller:new AbortController})}),[De,E]}function Hl(i,n,r){if(i.lazy)return!0;if(!i.loader)return!1;let d=n!=null&&n[i.id]!==void 0,u=r!=null&&r[i.id]!==void 0;return!d&&u?!1:typeof i.loader=="function"&&i.loader.hydrate===!0?!0:!d&&!u}function xm(i,n,r){let d=!n||r.route.id!==n.route.id,u=i[r.route.id]===void 0;return d||u}function Cp(i,n){let r=i.route.path;return i.pathname!==n.pathname||r!=null&&r.endsWith("*")&&i.params["*"]!==n.params["*"]}function Nc(i,n){if(i.route.shouldRevalidate){let r=i.route.shouldRevalidate(n);if(typeof r=="boolean")return r}return n.defaultShouldRevalidate}function Oc(i,n,r,d,u){var p;let g;if(i){let v=d[i];Ce(v,"No route found to patch children into: routeId = "+i),v.children||(v.children=[]),g=v.children}else g=r;let y=n.filter(v=>!g.some(P=>kp(v,P))),h=Dn(y,u,[i||"_","patch",String(((p=g)==null?void 0:p.length)||"0")],d);g.push(...h)}function kp(i,n){return"id"in i&&"id"in n&&i.id===n.id?!0:i.index===n.index&&i.path===n.path&&i.caseSensitive===n.caseSensitive?(!i.children||i.children.length===0)&&(!n.children||n.children.length===0)?!0:i.children.every((r,d)=>{var u;return(u=n.children)==null?void 0:u.some(p=>kp(r,p))}):!1}async function Rm(i,n,r){if(!i.lazy)return;let d=await i.lazy();if(!i.lazy)return;let u=r[i.id];Ce(u,"No route found in manifest");let p={};for(let g in d){let h=u[g]!==void 0&&g!=="hasErrorBoundary";ra(!h,'Route "'+u.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.')),!h&&!Xh.has(g)&&(p[g]=d[g])}Object.assign(u,p),Object.assign(u,$e({},n(u),{lazy:void 0}))}async function Am(i){let{matches:n}=i,r=n.filter(u=>u.shouldLoad);return(await Promise.all(r.map(u=>u.resolve()))).reduce((u,p,g)=>Object.assign(u,{[r[g].route.id]:p}),{})}async function Im(i,n,r,d,u,p,g,y,h,v){let P=p.map(U=>U.route.lazy?Rm(U.route,h,y):void 0),w=p.map((U,B)=>{let z=P[B],N=u.some(K=>K.route.id===U.route.id);return $e({},U,{shouldLoad:N,resolve:async K=>(K&&d.method==="GET"&&(U.route.lazy||U.route.loader)&&(N=!0),N?Dm(n,d,U,z,K,v):Promise.resolve({type:qe.data,result:void 0}))})}),D=await i({matches:w,request:d,params:p[0].params,fetcherKey:g,context:v});try{await Promise.all(P)}catch{}return D}async function Dm(i,n,r,d,u,p){let g,y,h=v=>{let P,w=new Promise((B,z)=>P=z);y=()=>P(),n.signal.addEventListener("abort",y);let D=B=>typeof v!="function"?Promise.reject(new Error("You cannot call the handler for a route which defines a boolean "+('"'+i+'" [routeId: '+r.route.id+"]"))):v({request:n,params:r.params,context:p},...B!==void 0?[B]:[]),U=(async()=>{try{return{type:"data",result:await(u?u(z=>D(z)):D())}}catch(B){return{type:"error",result:B}}})();return Promise.race([U,w])};try{let v=r.route[i];if(d)if(v){let P,[w]=await Promise.all([h(v).catch(D=>{P=D}),d]);if(P!==void 0)throw P;g=w}else if(await d,v=r.route[i],v)g=await h(v);else if(i==="action"){let P=new URL(n.url),w=P.pathname+P.search;throw Dt(405,{method:n.method,pathname:w,routeId:r.route.id})}else return{type:qe.data,result:void 0};else if(v)g=await h(v);else{let P=new URL(n.url),w=P.pathname+P.search;throw Dt(404,{pathname:w})}Ce(g.result!==void 0,"You defined "+(i==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+i+"` ")+"function. Please return a value or `null`.")}catch(v){return{type:qe.error,result:v}}finally{y&&n.signal.removeEventListener("abort",y)}return g}async function Em(i){let{result:n,type:r}=i;if(Rp(n)){let w;try{let D=n.headers.get("Content-Type");D&&/\bapplication\/json\b/.test(D)?n.body==null?w=null:w=await n.json():w=await n.text()}catch(D){return{type:qe.error,error:D}}return r===qe.error?{type:qe.error,error:new Tn(n.status,n.statusText,w),statusCode:n.status,headers:n.headers}:{type:qe.data,data:w,statusCode:n.status,headers:n.headers}}if(r===qe.error){if(Vc(n)){var d,u;if(n.data instanceof Error){var p,g;return{type:qe.error,error:n.data,statusCode:(p=n.init)==null?void 0:p.status,headers:(g=n.init)!=null&&g.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:new Tn(((d=n.init)==null?void 0:d.status)||500,void 0,n.data),statusCode:rs(n)?n.status:void 0,headers:(u=n.init)!=null&&u.headers?new Headers(n.init.headers):void 0}}return{type:qe.error,error:n,statusCode:rs(n)?n.status:void 0}}if(zm(n)){var y,h;return{type:qe.deferred,deferredData:n,statusCode:(y=n.init)==null?void 0:y.status,headers:((h=n.init)==null?void 0:h.headers)&&new Headers(n.init.headers)}}if(Vc(n)){var v,P;return{type:qe.data,data:n.data,statusCode:(v=n.init)==null?void 0:v.status,headers:(P=n.init)!=null&&P.headers?new Headers(n.init.headers):void 0}}return{type:qe.data,data:n}}function Tm(i,n,r,d,u,p){let g=i.headers.get("Location");if(Ce(g,"Redirects returned/thrown from loaders/actions must have a Location header"),!Kl.test(g)){let y=d.slice(0,d.findIndex(h=>h.route.id===r)+1);g=zl(new URL(n.url),y,u,!0,g,p),i.headers.set("Location",g)}return i}function qc(i,n,r,d){let u=["about:","blob:","chrome:","chrome-untrusted:","content:","data:","devtools:","file:","filesystem:","javascript:"];if(Kl.test(i)){let p=i,g=p.startsWith("//")?new URL(n.protocol+p):new URL(p);if(u.includes(g.protocol))throw new Error("Invalid redirect location");let y=Eo(g.pathname,r)!=null;if(g.origin===n.origin&&y)return g.pathname+g.search+g.hash}try{let p=d.createURL(i);if(u.includes(p.protocol))throw new Error("Invalid redirect location")}catch{}return i}function ri(i,n,r,d){let u=i.createURL(xp(n)).toString(),p={signal:r};if(d&&ao(d.formMethod)){let{formMethod:g,formEncType:y}=d;p.method=g.toUpperCase(),y==="application/json"?(p.headers=new Headers({"Content-Type":y}),p.body=JSON.stringify(d.json)):y==="text/plain"?p.body=d.text:y==="application/x-www-form-urlencoded"&&d.formData?p.body=Ll(d.formData):p.body=d.formData}return new Request(u,p)}function Ll(i){let n=new URLSearchParams;for(let[r,d]of i.entries())n.append(r,typeof d=="string"?d:d.name);return n}function Bc(i){let n=new FormData;for(let[r,d]of i.entries())n.append(r,d);return n}function jm(i,n,r,d,u){let p={},g=null,y,h=!1,v={},P=r&&Ht(r[1])?r[1].error:void 0;return i.forEach(w=>{if(!(w.route.id in n))return;let D=w.route.id,U=n[D];if(Ce(!Da(U),"Cannot handle redirect results in processLoaderData"),Ht(U)){let B=U.error;P!==void 0&&(B=P,P=void 0),g=g||{};{let z=Ia(i,D);g[z.route.id]==null&&(g[z.route.id]=B)}p[D]=void 0,h||(h=!0,y=rs(U.error)?U.error.status:500),U.headers&&(v[D]=U.headers)}else na(U)?(d.set(D,U.deferredData),p[D]=U.deferredData.data,U.statusCode!=null&&U.statusCode!==200&&!h&&(y=U.statusCode),U.headers&&(v[D]=U.headers)):(p[D]=U.data,U.statusCode&&U.statusCode!==200&&!h&&(y=U.statusCode),U.headers&&(v[D]=U.headers))}),P!==void 0&&r&&(g={[r[0]]:P},p[r[0]]=void 0),{loaderData:p,errors:g,statusCode:y||200,loaderHeaders:v}}function Wc(i,n,r,d,u,p,g){let{loaderData:y,errors:h}=jm(n,r,d,g);return u.forEach(v=>{let{key:P,match:w,controller:D}=v,U=p[P];if(Ce(U,"Did not find corresponding fetcher result"),!(D&&D.signal.aborted))if(Ht(U)){let B=Ia(i.matches,w==null?void 0:w.route.id);h&&h[B.route.id]||(h=$e({},h,{[B.route.id]:U.error})),i.fetchers.delete(P)}else if(Da(U))Ce(!1,"Unhandled fetcher revalidation redirect");else if(na(U))Ce(!1,"Unhandled fetcher deferred data");else{let B=sa(U.data);i.fetchers.set(P,B)}}),{loaderData:y,errors:h}}function Fc(i,n,r,d){let u=$e({},n);for(let p of r){let g=p.route.id;if(n.hasOwnProperty(g)?n[g]!==void 0&&(u[g]=n[g]):i[g]!==void 0&&p.route.loader&&(u[g]=i[g]),d&&d.hasOwnProperty(g))break}return u}function Kc(i){return i?Ht(i[1])?{actionData:{}}:{actionData:{[i[0]]:i[1].data}}:{}}function Ia(i,n){return(n?i.slice(0,i.findIndex(d=>d.route.id===n)+1):[...i]).reverse().find(d=>d.route.hasErrorBoundary===!0)||i[0]}function Yc(i){let n=i.length===1?i[0]:i.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:n}],route:n}}function Dt(i,n){let{pathname:r,routeId:d,method:u,type:p,message:g}=n===void 0?{}:n,y="Unknown Server Error",h="Unknown @remix-run/router error";return i===400?(y="Bad Request",u&&r&&d?h="You made a "+u+' request to "'+r+'" but '+('did not provide a `loader` for route "'+d+'", ')+"so there is no way to handle the request.":p==="defer-action"?h="defer() is not supported in actions":p==="invalid-body"&&(h="Unable to encode submission body")):i===403?(y="Forbidden",h='Route "'+d+'" does not match URL "'+r+'"'):i===404?(y="Not Found",h='No route matches URL "'+r+'"'):i===405&&(y="Method Not Allowed",u&&r&&d?h="You made a "+u.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+d+'", ')+"so there is no way to handle the request.":u&&(h='Invalid request method "'+u.toUpperCase()+'"')),new Tn(i||500,y,new Error(h),!0)}function kn(i){let n=Object.entries(i);for(let r=n.length-1;r>=0;r--){let[d,u]=n[r];if(Da(u))return{key:d,result:u}}}function xp(i){let n=typeof i=="string"?To(i):i;return ja($e({},n,{hash:""}))}function Um(i,n){return i.pathname!==n.pathname||i.search!==n.search?!1:i.hash===""?n.hash!=="":i.hash===n.hash?!0:n.hash!==""}function Mm(i){return Rp(i.result)&&vm.has(i.result.status)}function na(i){return i.type===qe.deferred}function Ht(i){return i.type===qe.error}function Da(i){return(i&&i.type)===qe.redirect}function Vc(i){return typeof i=="object"&&i!=null&&"type"in i&&"data"in i&&"init"in i&&i.type==="DataWithResponseInit"}function zm(i){let n=i;return n&&typeof n=="object"&&typeof n.data=="object"&&typeof n.subscribe=="function"&&typeof n.cancel=="function"&&typeof n.resolveData=="function"}function Rp(i){return i!=null&&typeof i.status=="number"&&typeof i.statusText=="string"&&typeof i.headers=="object"&&typeof i.body<"u"}function Hm(i){return Sm.has(i.toLowerCase())}function ao(i){return ym.has(i.toLowerCase())}async function Lm(i,n,r,d,u){let p=Object.entries(n);for(let g=0;g<p.length;g++){let[y,h]=p[g],v=i.find(D=>(D==null?void 0:D.route.id)===y);if(!v)continue;let P=d.find(D=>D.route.id===v.route.id),w=P!=null&&!Cp(P,v)&&(u&&u[v.route.id])!==void 0;na(h)&&w&&await Yl(h,r,!1).then(D=>{D&&(n[y]=D)})}}async function _m(i,n,r){for(let d=0;d<r.length;d++){let{key:u,routeId:p,controller:g}=r[d],y=n[u];i.find(v=>(v==null?void 0:v.route.id)===p)&&na(y)&&(Ce(g,"Expected an AbortController for revalidating fetcher deferred result"),await Yl(y,g.signal,!0).then(v=>{v&&(n[u]=v)}))}}async function Yl(i,n,r){if(r===void 0&&(r=!1),!await i.deferredData.resolveData(n)){if(r)try{return{type:qe.data,data:i.deferredData.unwrappedData}}catch(u){return{type:qe.error,error:u}}return{type:qe.data,data:i.deferredData.data}}}function Vl(i){return new URLSearchParams(i).getAll("index").some(n=>n==="")}function ss(i,n){let r=typeof n=="string"?To(n).search:n.search;if(i[i.length-1].route.index&&Vl(r||""))return i[i.length-1];let d=bp(i);return d[d.length-1]}function Gc(i){let{formMethod:n,formAction:r,formEncType:d,text:u,formData:p,json:g}=i;if(!(!n||!r||!d)){if(u!=null)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:void 0,text:u};if(p!=null)return{formMethod:n,formAction:r,formEncType:d,formData:p,json:void 0,text:void 0};if(g!==void 0)return{formMethod:n,formAction:r,formEncType:d,formData:void 0,json:g,text:void 0}}}function Al(i,n){return n?{state:"loading",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}:{state:"loading",location:i,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0}}function Nm(i,n){return{state:"submitting",location:i,formMethod:n.formMethod,formAction:n.formAction,formEncType:n.formEncType,formData:n.formData,json:n.json,text:n.text}}function os(i,n){return i?{state:"loading",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n}:{state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:n}}function Om(i,n){return{state:"submitting",formMethod:i.formMethod,formAction:i.formAction,formEncType:i.formEncType,formData:i.formData,json:i.json,text:i.text,data:n?n.data:void 0}}function sa(i){return{state:"idle",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0,json:void 0,text:void 0,data:i}}function qm(i,n){try{let r=i.sessionStorage.getItem(wp);if(r){let d=JSON.parse(r);for(let[u,p]of Object.entries(d||{}))p&&Array.isArray(p)&&n.set(u,new Set(p||[]))}}catch{}}function Bm(i,n){if(n.size>0){let r={};for(let[d,u]of n)r[d]=[...u];try{i.sessionStorage.setItem(wp,JSON.stringify(r))}catch(d){ra(!1,"Failed to save applied view transitions in sessionStorage ("+d+").")}}}/**
|
|
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 jn(){return jn=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},jn.apply(this,arguments)}const ls=R.createContext(null),
|
|
60
|
+
*/function jn(){return jn=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},jn.apply(this,arguments)}const ls=R.createContext(null),Gl=R.createContext(null),jo=R.createContext(null),Xl=R.createContext(null),mo=R.createContext({outlet:null,matches:[],isDataRoute:!1}),Ap=R.createContext(null);function Wm(i,n){let{relative:r}=n===void 0?{}:n;pi()||Ce(!1);let{basename:d,navigator:u}=R.useContext(jo),{hash:p,pathname:g,search:y}=Hn(i,{relative:r}),h=g;return d!=="/"&&(h=g==="/"?d:Do([d,g])),u.createHref({pathname:h,search:y,hash:p})}function pi(){return R.useContext(Xl)!=null}function Yt(){return pi()||Ce(!1),R.useContext(Xl).location}function Ip(i){R.useContext(jo).static||R.useLayoutEffect(i)}function $l(){let{isDataRoute:i}=R.useContext(mo);return i?ay():Fm()}function Fm(){pi()||Ce(!1);let i=R.useContext(ls),{basename:n,future:r,navigator:d}=R.useContext(jo),{matches:u}=R.useContext(mo),{pathname:p}=Yt(),g=JSON.stringify(Mn(u,r.v7_relativeSplatPath)),y=R.useRef(!1);return Ip(()=>{y.current=!0}),R.useCallback(function(v,P){if(P===void 0&&(P={}),!y.current)return;if(typeof v=="number"){d.go(v);return}let w=zn(v,JSON.parse(g),p,P.relative==="path");i==null&&n!=="/"&&(w.pathname=w.pathname==="/"?n:Do([n,w.pathname])),(P.replace?d.replace:d.push)(w,P.state,P)},[n,d,g,p,i])}const Km=R.createContext(null);function Ym(i){let n=R.useContext(mo).outlet;return n&&R.createElement(Km.Provider,{value:i},n)}function Tb(){let{matches:i}=R.useContext(mo),n=i[i.length-1];return n?n.params:{}}function Hn(i,n){let{relative:r}=n===void 0?{}:n,{future:d}=R.useContext(jo),{matches:u}=R.useContext(mo),{pathname:p}=Yt(),g=JSON.stringify(Mn(u,d.v7_relativeSplatPath));return R.useMemo(()=>zn(i,JSON.parse(g),p,r==="path"),[i,g,p,r])}function Vm(i,n,r,d){pi()||Ce(!1);let{navigator:u}=R.useContext(jo),{matches:p}=R.useContext(mo),g=p[p.length-1],y=g?g.params:{};g&&g.pathname;let h=g?g.pathnameBase:"/";g&&g.route;let v=Yt(),P;P=v;let w=P.pathname||"/",D=w;if(h!=="/"){let z=h.replace(/^\//,"").split("/");D="/"+w.replace(/^\//,"").split("/").slice(z.length).join("/")}let U=Aa(i,{pathname:D});return Zm(U&&U.map(z=>Object.assign({},z,{params:Object.assign({},y,z.params),pathname:Do([h,u.encodeLocation?u.encodeLocation(z.pathname).pathname:z.pathname]),pathnameBase:z.pathnameBase==="/"?h:Do([h,u.encodeLocation?u.encodeLocation(z.pathnameBase).pathname:z.pathnameBase])})),p,r,d)}function Gm(){let i=oy(),n=rs(i)?i.status+" "+i.statusText:i instanceof Error?i.message:JSON.stringify(i),r=i instanceof Error?i.stack:null,u={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"}},n),r?R.createElement("pre",{style:u},r):null,null)}const Xm=R.createElement(Gm,null);class $m extends R.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,r){return r.location!==n.location||r.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:r.error,location:r.location,revalidation:n.revalidation||r.revalidation}}componentDidCatch(n,r){console.error("React Router caught the following error during render",n,r)}render(){return this.state.error!==void 0?R.createElement(mo.Provider,{value:this.props.routeContext},R.createElement(Ap.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function Qm(i){let{routeContext:n,match:r,children:d}=i,u=R.useContext(ls);return u&&u.static&&u.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(u.staticContext._deepestRenderedBoundaryId=r.route.id),R.createElement(mo.Provider,{value:n},d)}function Zm(i,n,r,d){var u;if(n===void 0&&(n=[]),r===void 0&&(r=null),d===void 0&&(d=null),i==null){var p;if(!r)return null;if(r.errors)i=r.matches;else if((p=d)!=null&&p.v7_partialHydration&&n.length===0&&!r.initialized&&r.matches.length>0)i=r.matches;else return null}let g=i,y=(u=r)==null?void 0:u.errors;if(y!=null){let P=g.findIndex(w=>w.route.id&&(y==null?void 0:y[w.route.id])!==void 0);P>=0||Ce(!1),g=g.slice(0,Math.min(g.length,P+1))}let h=!1,v=-1;if(r&&d&&d.v7_partialHydration)for(let P=0;P<g.length;P++){let w=g[P];if((w.route.HydrateFallback||w.route.hydrateFallbackElement)&&(v=P),w.route.id){let{loaderData:D,errors:U}=r,B=w.route.loader&&D[w.route.id]===void 0&&(!U||U[w.route.id]===void 0);if(w.route.lazy||B){h=!0,v>=0?g=g.slice(0,v+1):g=[g[0]];break}}}return g.reduceRight((P,w,D)=>{let U,B=!1,z=null,N=null;r&&(U=y&&w.route.id?y[w.route.id]:void 0,z=w.route.errorElement||Xm,h&&(v<0&&D===0?(iy("route-fallback"),B=!0,N=null):v===D&&(B=!0,N=w.route.hydrateFallbackElement||null)));let te=n.concat(g.slice(0,D+1)),K=()=>{let $;return U?$=z:B?$=N:w.route.Component?$=R.createElement(w.route.Component,null):w.route.element?$=w.route.element:$=P,R.createElement(Qm,{match:w,routeContext:{outlet:P,matches:te,isDataRoute:r!=null},children:$})};return r&&(w.route.ErrorBoundary||w.route.errorElement||D===0)?R.createElement($m,{location:r.location,revalidation:r.revalidation,component:z,error:U,children:K(),routeContext:{outlet:null,matches:te,isDataRoute:!0}}):K()},null)}var Dp=(function(i){return i.UseBlocker="useBlocker",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i})(Dp||{}),Ep=(function(i){return i.UseBlocker="useBlocker",i.UseLoaderData="useLoaderData",i.UseActionData="useActionData",i.UseRouteError="useRouteError",i.UseNavigation="useNavigation",i.UseRouteLoaderData="useRouteLoaderData",i.UseMatches="useMatches",i.UseRevalidator="useRevalidator",i.UseNavigateStable="useNavigate",i.UseRouteId="useRouteId",i})(Ep||{});function Jm(i){let n=R.useContext(ls);return n||Ce(!1),n}function ey(i){let n=R.useContext(Gl);return n||Ce(!1),n}function ty(i){let n=R.useContext(mo);return n||Ce(!1),n}function Tp(i){let n=ty(),r=n.matches[n.matches.length-1];return r.route.id||Ce(!1),r.route.id}function oy(){var i;let n=R.useContext(Ap),r=ey(),d=Tp();return n!==void 0?n:(i=r.errors)==null?void 0:i[d]}function ay(){let{router:i}=Jm(Dp.UseNavigateStable),n=Tp(Ep.UseNavigateStable),r=R.useRef(!1);return Ip(()=>{r.current=!0}),R.useCallback(function(u,p){p===void 0&&(p={}),r.current&&(typeof u=="number"?i.navigate(u):i.navigate(u,jn({fromRouteId:n},p)))},[i,n])}const Xc={};function iy(i,n,r){Xc[i]||(Xc[i]=!0)}function sy(i,n){i==null||i.v7_startTransition,(i==null?void 0:i.v7_relativeSplatPath)===void 0&&(!n||n.v7_relativeSplatPath),n&&(n.v7_fetcherPersist,n.v7_normalizeFormMethod,n.v7_partialHydration,n.v7_skipActionErrorRevalidation)}function jb(i){let{to:n,replace:r,state:d,relative:u}=i;pi()||Ce(!1);let{future:p,static:g}=R.useContext(jo),{matches:y}=R.useContext(mo),{pathname:h}=Yt(),v=$l(),P=zn(n,Mn(y,p.v7_relativeSplatPath),h,u==="path"),w=JSON.stringify(P);return R.useEffect(()=>v(JSON.parse(w),{replace:r,state:d,relative:u}),[v,w,u,r,d]),null}function ny(i){return Ym(i.context)}function ry(i){let{basename:n="/",children:r=null,location:d,navigationType:u=st.Pop,navigator:p,static:g=!1,future:y}=i;pi()&&Ce(!1);let h=n.replace(/^\/*/,"/"),v=R.useMemo(()=>({basename:h,navigator:p,static:g,future:jn({v7_relativeSplatPath:!1},y)}),[h,y,p,g]);typeof d=="string"&&(d=To(d));let{pathname:P="/",search:w="",hash:D="",state:U=null,key:B="default"}=d,z=R.useMemo(()=>{let N=Eo(P,h);return N==null?null:{location:{pathname:N,search:w,hash:D,state:U,key:B},navigationType:u}},[h,P,w,D,U,B,u]);return z==null?null:R.createElement(jo.Provider,{value:v},R.createElement(Xl.Provider,{children:r,value:z}))}new Promise(()=>{});function ly(i){let n={hasErrorBoundary:i.ErrorBoundary!=null||i.errorElement!=null};return i.Component&&Object.assign(n,{element:R.createElement(i.Component),Component:void 0}),i.HydrateFallback&&Object.assign(n,{hydrateFallbackElement:R.createElement(i.HydrateFallback),HydrateFallback:void 0}),i.ErrorBoundary&&Object.assign(n,{errorElement:R.createElement(i.ErrorBoundary),ErrorBoundary:void 0}),n}/**
|
|
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 ui(){return ui=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},ui.apply(this,arguments)}function jp(i,n){if(i==null)return{};var r={},d=Object.keys(i),u,p;for(p=0;p<d.length;p++)u=d[p],!(n.indexOf(u)>=0)&&(r[u]=i[u]);return r}function dy(i){return!!(i.metaKey||i.altKey||i.ctrlKey||i.shiftKey)}function uy(i,n){return i.button===0&&(!n||n==="_self")&&!dy(i)}function _l(i){return i===void 0&&(i=""),new URLSearchParams(typeof i=="string"||Array.isArray(i)||i instanceof URLSearchParams?i:Object.keys(i).reduce((n,r)=>{let d=i[r];return n.concat(Array.isArray(d)?d.map(u=>[r,u]):[[r,d]])},[]))}function cy(i,n){let r=_l(i);return n&&n.forEach((d,u)=>{r.has(u)||n.getAll(u).forEach(p=>{r.append(u,p)})}),r}const py=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],gy=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],hy="6";try{window.__reactRouterVersion=hy}catch{}function my(i,n){return Cm({basename:void 0,future:ui({},void 0,{v7_prependBasename:!0}),history:Yh({window:void 0}),hydrationData:yy(),routes:i,mapRouteProperties:ly,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function yy(){var i;let n=(i=window)==null?void 0:i.__staticRouterHydrationData;return n&&n.errors&&(n=ui({},n,{errors:fy(n.errors)})),n}function fy(i){if(!i)return null;let n=Object.entries(i),r={};for(let[d,u]of n)if(u&&u.__type==="RouteErrorResponse")r[d]=new Tn(u.status,u.statusText,u.data,u.internal===!0);else if(u&&u.__type==="Error"){if(u.__subType){let p=window[u.__subType];if(typeof p=="function")try{let g=new p(u.message);g.stack="",r[d]=g}catch{}}if(r[d]==null){let p=new Error(u.message);p.stack="",r[d]=p}}else r[d]=u;return r}const Up=R.createContext({isTransitioning:!1}),Sy=R.createContext(new Map),vy="startTransition",$c=Wh[vy],by="flushSync",Qc=Kh[by];function Py(i){$c?$c(i):i()}function as(i){Qc?Qc(i):i()}class wy{constructor(){this.status="pending",this.promise=new Promise((n,r)=>{this.resolve=d=>{this.status==="pending"&&(this.status="resolved",n(d))},this.reject=d=>{this.status==="pending"&&(this.status="rejected",r(d))}})}}function Cy(i){let{fallbackElement:n,router:r,future:d}=i,[u,p]=R.useState(r.state),[g,y]=R.useState(),[h,v]=R.useState({isTransitioning:!1}),[P,w]=R.useState(),[D,U]=R.useState(),[B,z]=R.useState(),N=R.useRef(new Map),{v7_startTransition:te}=d||{},K=R.useCallback(Q=>{te?Py(Q):Q()},[te]),$=R.useCallback((Q,Pe)=>{let{deletedFetchers:ce,flushSync:He,viewTransitionOpts:ve}=Pe;Q.fetchers.forEach((Le,et)=>{Le.data!==void 0&&N.current.set(et,Le.data)}),ce.forEach(Le=>N.current.delete(Le));let Te=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!ve||Te){He?as(()=>p(Q)):K(()=>p(Q));return}if(He){as(()=>{D&&(P&&P.resolve(),D.skipTransition()),v({isTransitioning:!0,flushSync:!0,currentLocation:ve.currentLocation,nextLocation:ve.nextLocation})});let Le=r.window.document.startViewTransition(()=>{as(()=>p(Q))});Le.finished.finally(()=>{as(()=>{w(void 0),U(void 0),y(void 0),v({isTransitioning:!1})})}),as(()=>U(Le));return}D?(P&&P.resolve(),D.skipTransition(),z({state:Q,currentLocation:ve.currentLocation,nextLocation:ve.nextLocation})):(y(Q),v({isTransitioning:!0,flushSync:!1,currentLocation:ve.currentLocation,nextLocation:ve.nextLocation}))},[r.window,D,P,N,K]);R.useLayoutEffect(()=>r.subscribe($),[r,$]),R.useEffect(()=>{h.isTransitioning&&!h.flushSync&&w(new wy)},[h]),R.useEffect(()=>{if(P&&g&&r.window){let Q=g,Pe=P.promise,ce=r.window.document.startViewTransition(async()=>{K(()=>p(Q)),await Pe});ce.finished.finally(()=>{w(void 0),U(void 0),y(void 0),v({isTransitioning:!1})}),U(ce)}},[K,g,P,r.window]),R.useEffect(()=>{P&&g&&u.location.key===g.location.key&&P.resolve()},[P,D,u.location,g]),R.useEffect(()=>{!h.isTransitioning&&B&&(y(B.state),v({isTransitioning:!0,flushSync:!1,currentLocation:B.currentLocation,nextLocation:B.nextLocation}),z(void 0))},[h.isTransitioning,B]),R.useEffect(()=>{},[]);let G=R.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:Q=>r.navigate(Q),push:(Q,Pe,ce)=>r.navigate(Q,{state:Pe,preventScrollReset:ce==null?void 0:ce.preventScrollReset}),replace:(Q,Pe,ce)=>r.navigate(Q,{replace:!0,state:Pe,preventScrollReset:ce==null?void 0:ce.preventScrollReset})}),[r]),he=r.basename||"/",De=R.useMemo(()=>({router:r,navigator:G,static:!1,basename:he}),[r,G,he]),E=R.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return R.useEffect(()=>sy(d,r.future),[d,r.future]),R.createElement(R.Fragment,null,R.createElement(ls.Provider,{value:De},R.createElement(Vl.Provider,{value:u},R.createElement(Sy.Provider,{value:N.current},R.createElement(Up.Provider,{value:h},R.createElement(ry,{basename:he,location:u.location,navigationType:u.historyAction,navigator:G,future:E},u.initialized||r.future.v7_partialHydration?R.createElement(ky,{routes:r.routes,future:r.future,state:u}):n))))),null)}const ky=R.memo(xy);function xy(i){let{routes:n,future:r,state:d}=i;return Gm(n,void 0,d,r)}const Ry=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Ay=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Ea=R.forwardRef(function(n,r){let{onClick:d,relative:u,reloadDocument:p,replace:g,state:y,target:h,to:v,preventScrollReset:P,viewTransition:w}=n,D=jp(n,py),{basename:U}=R.useContext(jo),B,z=!1;if(typeof v=="string"&&Ay.test(v)&&(B=v,Ry))try{let $=new URL(window.location.href),G=v.startsWith("//")?new URL($.protocol+v):new URL(v),he=Eo(G.pathname,U);G.origin===$.origin&&he!=null?v=he+G.search+G.hash:z=!0}catch{}let N=Wm(v,{relative:u}),te=Ey(v,{replace:g,state:y,target:h,preventScrollReset:P,relative:u,viewTransition:w});function K($){d&&d($),$.defaultPrevented||te($)}return R.createElement("a",ui({},D,{href:B||N,onClick:z||p?d:K,ref:r,target:h}))}),Iy=R.forwardRef(function(n,r){let{"aria-current":d="page",caseSensitive:u=!1,className:p="",end:g=!1,style:y,to:h,viewTransition:v,children:P}=n,w=jp(n,gy),D=Hn(h,{relative:w.relative}),U=Yt(),B=R.useContext(Vl),{navigator:z,basename:N}=R.useContext(jo),te=B!=null&&Ty(D)&&v===!0,K=z.encodeLocation?z.encodeLocation(D).pathname:D.pathname,$=U.pathname,G=B&&B.navigation&&B.navigation.location?B.navigation.location.pathname:null;u||($=$.toLowerCase(),G=G?G.toLowerCase():null,K=K.toLowerCase()),G&&N&&(G=Eo(G,N)||G);const he=K!=="/"&&K.endsWith("/")?K.length-1:K.length;let De=$===K||!g&&$.startsWith(K)&&$.charAt(he)==="/",E=G!=null&&(G===K||!g&&G.startsWith(K)&&G.charAt(K.length)==="/"),Q={isActive:De,isPending:E,isTransitioning:te},Pe=De?d:void 0,ce;typeof p=="function"?ce=p(Q):ce=[p,De?"active":null,E?"pending":null,te?"transitioning":null].filter(Boolean).join(" ");let He=typeof y=="function"?y(Q):y;return R.createElement(Ea,ui({},w,{"aria-current":Pe,className:ce,ref:r,style:He,to:h,viewTransition:v}),typeof P=="function"?P(Q):P)});var Nl;(function(i){i.UseScrollRestoration="useScrollRestoration",i.UseSubmit="useSubmit",i.UseSubmitFetcher="useSubmitFetcher",i.UseFetcher="useFetcher",i.useViewTransitionState="useViewTransitionState"})(Nl||(Nl={}));var Zc;(function(i){i.UseFetcher="useFetcher",i.UseFetchers="useFetchers",i.UseScrollRestoration="useScrollRestoration"})(Zc||(Zc={}));function Dy(i){let n=R.useContext(ls);return n||Ce(!1),n}function Ey(i,n){let{target:r,replace:d,state:u,preventScrollReset:p,relative:g,viewTransition:y}=n===void 0?{}:n,h=$l(),v=Yt(),P=Hn(i,{relative:g});return R.useCallback(w=>{if(uy(w,r)){w.preventDefault();let D=d!==void 0?d:ja(v)===ja(P);h(i,{replace:D,state:u,preventScrollReset:p,relative:g,viewTransition:y})}},[v,h,P,d,u,r,i,p,g,y])}function Ub(i){let n=R.useRef(_l(i)),r=R.useRef(!1),d=Yt(),u=R.useMemo(()=>cy(d.search,r.current?null:n.current),[d.search]),p=$l(),g=R.useCallback((y,h)=>{const v=_l(typeof y=="function"?y(u):y);r.current=!0,p("?"+v,h)},[p,u]);return[u,g]}function Ty(i,n){n===void 0&&(n={});let r=R.useContext(Up);r==null&&Ce(!1);let{basename:d}=Dy(Nl.useViewTransitionState),u=Hn(i,{relative:n.relative});if(!r.isTransitioning)return!1;let p=Eo(r.currentLocation.pathname,d)||r.currentLocation.pathname,g=Eo(r.nextLocation.pathname,d)||r.nextLocation.pathname;return En(u.pathname,g)!=null||En(u.pathname,p)!=null}const jy="modulepreload",Uy=function(i){return"/dashboard/"+i},Jc={},Kt=function(n,r,d){let u=Promise.resolve();if(r&&r.length>0){let g=function(v){return Promise.all(v.map(P=>Promise.resolve(P).then(w=>({status:"fulfilled",value:w}),w=>({status:"rejected",reason:w}))))};document.getElementsByTagName("link");const y=document.querySelector("meta[property=csp-nonce]"),h=(y==null?void 0:y.nonce)||(y==null?void 0:y.getAttribute("nonce"));u=g(r.map(v=>{if(v=Uy(v),v in Jc)return;Jc[v]=!0;const P=v.endsWith(".css"),w=P?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${w}`))return;const D=document.createElement("link");if(D.rel=P?"stylesheet":jy,P||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),P)return new Promise((U,B)=>{D.addEventListener("load",U),D.addEventListener("error",()=>B(new Error(`Unable to preload CSS for ${v}`)))})}))}function p(g){const y=new Event("vite:preloadError",{cancelable:!0});if(y.payload=g,window.dispatchEvent(y),!y.defaultPrevented)throw g}return u.then(g=>{for(const y of g||[])y.status==="rejected"&&p(y.reason);return n().catch(p)})},Ln=window.location.origin,My=3e3,zy=5e3;class Hy extends Error{constructor(r,d,u=null,p=null){super(d);Io(this,"status");Io(this,"error");Io(this,"payload");this.name="ApiClientError",this.status=r,this.error=u,this.payload=p}}function Ly(i){var r,d;const n=(d=(r=i.headers)==null?void 0:r.get)==null?void 0:d.call(r,"content-type");return typeof n=="string"&&n.toLowerCase().includes("application/json")}async function _y(i){if(!Ly(i))return null;try{const n=await i.json();if(n&&typeof n=="object")return n}catch{return null}return null}async function is(i){if(i.ok)return;const n=await _y(i),r=typeof(n==null?void 0:n.message)=="string"&&n.message.trim().length>0?n.message:`API ${i.status}: ${i.statusText}`,d=typeof(n==null?void 0:n.error)=="string"?n.error:null;throw new Hy(i.status,r,d,n)}class Ny{constructor(n){Io(this,"base");this.base=n}async get(n,r){const d=new URL(n,this.base);r&&Object.entries(r).forEach(([p,g])=>d.searchParams.set(p,g));const u=await fetch(d.toString(),{method:"GET"});return await is(u),u.json()}async patch(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async put(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async post(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"POST",headers:r?{"Content-Type":"application/json"}:{},body:r?JSON.stringify(r):void 0});return await is(u),u.json()}async delete(n){const r=new URL(n,this.base),d=await fetch(r.toString(),{method:"DELETE"});return await is(d),d.json()}}const Et=new Ny(Ln);class Ql{constructor(n){Io(this,"source",null);Io(this,"handlers",new Map);Io(this,"reconnectTimer",null);Io(this,"url");this.url=n??`${Ln}/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 r;(r=this.source)==null||r.close(),this.source=null,this.scheduleReconnect()};const n=["connection","sync","command","game_change","mcp_status","license"];for(const r of n)this.source.addEventListener(r,d=>{var p;const u=JSON.parse(d.data);(p=this.handlers.get(r))==null||p.forEach(g=>g(u))})}on(n,r){return this.handlers.has(n)||this.handlers.set(n,new Set),this.handlers.get(n).add(r),()=>{var d;return(d=this.handlers.get(n))==null?void 0:d.delete(r)}}disconnect(){var n;(n=this.source)==null||n.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var n;return((n=this.source)==null?void 0:n.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},My))}}function Oy(i){return i.pluginClients&&i.pluginClients.length>0?"studioConnected":(i.connectedClients===0||!i.pluginClients,"serverOnly")}const Mp=R.createContext(null);function qy({children:i}){const[n,r]=R.useState("disconnected"),[d,u]=R.useState(null),[p,g]=R.useState(null),y=R.useRef(null);return R.useEffect(()=>{let h=!1;async function v(){try{const D=await Et.get("/status");if(h)return;u(D),r(Oy(D)),g(null)}catch(D){if(h)return;r("disconnected"),g(D instanceof Error?D.message:String(D))}}v(),y.current=setInterval(v,zy);const P=new Ql;P.connect();const w=P.on("connection",()=>{v()});return()=>{h=!0,y.current&&clearInterval(y.current),w(),P.disconnect()}},[]),x.jsx(Mp.Provider,{value:{level:n,status:d,error:p},children:i})}function _n(){const i=R.useContext(Mp);if(!i)throw new Error("useConnection must be used within a ConnectionProvider");return i}const By={"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","placeScope.current.label":"Current Place","placeScope.lastActive.label":"Last Active Place","placeScope.selected.label":"Selected Place","placeScope.unknownPlace":"Unknown place","placeScope.live":"Live","placeScope.stored":"Stored","placeScope.pluginRequired":"Plugin required","placeScope.pluginRequired.note":"Connect WEPPY Plugin to confirm the live active place.","placeScope.noPlace.label":"Place scope","placeScope.noPlace.value":"No place data available yet","placeScope.noPlace.badge":"No place","placeScope.noPlace.note":"Connect WEPPY Plugin and sync a place to create place-scoped data.","placeScope.selected.note":"Showing stored data only. Studio routing is unchanged.","placeScope.surface.sync":"Sync status and logs use this place.","placeScope.surface.changelog":"Changelog sessions use this place.","placeScope.surface.playtest":"Playtest reports use this place.","placeScope.surface.uiStudio":"UI captures and change history use this place.","placeScope.surface.tools":"Tool history and statistics use this place.","placeScope.loading":"Loading place scope...","placeScope.unavailable":"Place scope unavailable","placeScope.selector.label":"Place data","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":"View Pro","tier.banner.save":"Save AI tokens with Pro!","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":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","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.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test connection","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","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.warn":"WARN","tools.col.warn.tooltip":"Number of expected failures caused by caller input, project state, Roblox policy, or user code.","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.warn":"WARN","tools.badge.warn.tooltip":"The tool call failed as an expected caller, project, policy, or user-code issue.","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.warningMessage":"Warning Message","tools.detail.errorMessage":"Error Message","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","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.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","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":"Full changelog timeline browsing is available with Pro.","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.deletePolicy":"Delete Policy","sync.directions.deletePolicy.tooltip":"Controls whether local file deletes can remove matching Studio instances automatically.","sync.directions.deletePolicy.ask":"Ask Before Delete","sync.directions.deletePolicy.ask.tooltip":"Deleted local files are reviewed before Studio instances are removed.","sync.directions.deletePolicy.auto":"Auto Delete","sync.directions.deletePolicy.auto.tooltip":"Deleted local files can remove matching Studio instances automatically.","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":"Explore 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":"View 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 after the AI Agent runs a Playtest.","playtest.empty.message.before":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","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":"Available with Pro for 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 ui(){return ui=Object.assign?Object.assign.bind():function(i){for(var n=1;n<arguments.length;n++){var r=arguments[n];for(var d in r)Object.prototype.hasOwnProperty.call(r,d)&&(i[d]=r[d])}return i},ui.apply(this,arguments)}function jp(i,n){if(i==null)return{};var r={},d=Object.keys(i),u,p;for(p=0;p<d.length;p++)u=d[p],!(n.indexOf(u)>=0)&&(r[u]=i[u]);return r}function dy(i){return!!(i.metaKey||i.altKey||i.ctrlKey||i.shiftKey)}function uy(i,n){return i.button===0&&(!n||n==="_self")&&!dy(i)}function _l(i){return i===void 0&&(i=""),new URLSearchParams(typeof i=="string"||Array.isArray(i)||i instanceof URLSearchParams?i:Object.keys(i).reduce((n,r)=>{let d=i[r];return n.concat(Array.isArray(d)?d.map(u=>[r,u]):[[r,d]])},[]))}function cy(i,n){let r=_l(i);return n&&n.forEach((d,u)=>{r.has(u)||n.getAll(u).forEach(p=>{r.append(u,p)})}),r}const py=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],gy=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],hy="6";try{window.__reactRouterVersion=hy}catch{}function my(i,n){return Cm({basename:void 0,future:ui({},void 0,{v7_prependBasename:!0}),history:Yh({window:void 0}),hydrationData:yy(),routes:i,mapRouteProperties:ly,dataStrategy:void 0,patchRoutesOnNavigation:void 0,window:void 0}).initialize()}function yy(){var i;let n=(i=window)==null?void 0:i.__staticRouterHydrationData;return n&&n.errors&&(n=ui({},n,{errors:fy(n.errors)})),n}function fy(i){if(!i)return null;let n=Object.entries(i),r={};for(let[d,u]of n)if(u&&u.__type==="RouteErrorResponse")r[d]=new Tn(u.status,u.statusText,u.data,u.internal===!0);else if(u&&u.__type==="Error"){if(u.__subType){let p=window[u.__subType];if(typeof p=="function")try{let g=new p(u.message);g.stack="",r[d]=g}catch{}}if(r[d]==null){let p=new Error(u.message);p.stack="",r[d]=p}}else r[d]=u;return r}const Up=R.createContext({isTransitioning:!1}),Sy=R.createContext(new Map),vy="startTransition",$c=Wh[vy],by="flushSync",Qc=Kh[by];function Py(i){$c?$c(i):i()}function as(i){Qc?Qc(i):i()}class wy{constructor(){this.status="pending",this.promise=new Promise((n,r)=>{this.resolve=d=>{this.status==="pending"&&(this.status="resolved",n(d))},this.reject=d=>{this.status==="pending"&&(this.status="rejected",r(d))}})}}function Cy(i){let{fallbackElement:n,router:r,future:d}=i,[u,p]=R.useState(r.state),[g,y]=R.useState(),[h,v]=R.useState({isTransitioning:!1}),[P,w]=R.useState(),[D,U]=R.useState(),[B,z]=R.useState(),N=R.useRef(new Map),{v7_startTransition:te}=d||{},K=R.useCallback(Q=>{te?Py(Q):Q()},[te]),$=R.useCallback((Q,Pe)=>{let{deletedFetchers:ce,flushSync:He,viewTransitionOpts:ve}=Pe;Q.fetchers.forEach((Le,et)=>{Le.data!==void 0&&N.current.set(et,Le.data)}),ce.forEach(Le=>N.current.delete(Le));let Te=r.window==null||r.window.document==null||typeof r.window.document.startViewTransition!="function";if(!ve||Te){He?as(()=>p(Q)):K(()=>p(Q));return}if(He){as(()=>{D&&(P&&P.resolve(),D.skipTransition()),v({isTransitioning:!0,flushSync:!0,currentLocation:ve.currentLocation,nextLocation:ve.nextLocation})});let Le=r.window.document.startViewTransition(()=>{as(()=>p(Q))});Le.finished.finally(()=>{as(()=>{w(void 0),U(void 0),y(void 0),v({isTransitioning:!1})})}),as(()=>U(Le));return}D?(P&&P.resolve(),D.skipTransition(),z({state:Q,currentLocation:ve.currentLocation,nextLocation:ve.nextLocation})):(y(Q),v({isTransitioning:!0,flushSync:!1,currentLocation:ve.currentLocation,nextLocation:ve.nextLocation}))},[r.window,D,P,N,K]);R.useLayoutEffect(()=>r.subscribe($),[r,$]),R.useEffect(()=>{h.isTransitioning&&!h.flushSync&&w(new wy)},[h]),R.useEffect(()=>{if(P&&g&&r.window){let Q=g,Pe=P.promise,ce=r.window.document.startViewTransition(async()=>{K(()=>p(Q)),await Pe});ce.finished.finally(()=>{w(void 0),U(void 0),y(void 0),v({isTransitioning:!1})}),U(ce)}},[K,g,P,r.window]),R.useEffect(()=>{P&&g&&u.location.key===g.location.key&&P.resolve()},[P,D,u.location,g]),R.useEffect(()=>{!h.isTransitioning&&B&&(y(B.state),v({isTransitioning:!0,flushSync:!1,currentLocation:B.currentLocation,nextLocation:B.nextLocation}),z(void 0))},[h.isTransitioning,B]),R.useEffect(()=>{},[]);let V=R.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:Q=>r.navigate(Q),push:(Q,Pe,ce)=>r.navigate(Q,{state:Pe,preventScrollReset:ce==null?void 0:ce.preventScrollReset}),replace:(Q,Pe,ce)=>r.navigate(Q,{replace:!0,state:Pe,preventScrollReset:ce==null?void 0:ce.preventScrollReset})}),[r]),he=r.basename||"/",De=R.useMemo(()=>({router:r,navigator:V,static:!1,basename:he}),[r,V,he]),E=R.useMemo(()=>({v7_relativeSplatPath:r.future.v7_relativeSplatPath}),[r.future.v7_relativeSplatPath]);return R.useEffect(()=>sy(d,r.future),[d,r.future]),R.createElement(R.Fragment,null,R.createElement(ls.Provider,{value:De},R.createElement(Gl.Provider,{value:u},R.createElement(Sy.Provider,{value:N.current},R.createElement(Up.Provider,{value:h},R.createElement(ry,{basename:he,location:u.location,navigationType:u.historyAction,navigator:V,future:E},u.initialized||r.future.v7_partialHydration?R.createElement(ky,{routes:r.routes,future:r.future,state:u}):n))))),null)}const ky=R.memo(xy);function xy(i){let{routes:n,future:r,state:d}=i;return Vm(n,void 0,d,r)}const Ry=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Ay=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Ea=R.forwardRef(function(n,r){let{onClick:d,relative:u,reloadDocument:p,replace:g,state:y,target:h,to:v,preventScrollReset:P,viewTransition:w}=n,D=jp(n,py),{basename:U}=R.useContext(jo),B,z=!1;if(typeof v=="string"&&Ay.test(v)&&(B=v,Ry))try{let $=new URL(window.location.href),V=v.startsWith("//")?new URL($.protocol+v):new URL(v),he=Eo(V.pathname,U);V.origin===$.origin&&he!=null?v=he+V.search+V.hash:z=!0}catch{}let N=Wm(v,{relative:u}),te=Ey(v,{replace:g,state:y,target:h,preventScrollReset:P,relative:u,viewTransition:w});function K($){d&&d($),$.defaultPrevented||te($)}return R.createElement("a",ui({},D,{href:B||N,onClick:z||p?d:K,ref:r,target:h}))}),Iy=R.forwardRef(function(n,r){let{"aria-current":d="page",caseSensitive:u=!1,className:p="",end:g=!1,style:y,to:h,viewTransition:v,children:P}=n,w=jp(n,gy),D=Hn(h,{relative:w.relative}),U=Yt(),B=R.useContext(Gl),{navigator:z,basename:N}=R.useContext(jo),te=B!=null&&Ty(D)&&v===!0,K=z.encodeLocation?z.encodeLocation(D).pathname:D.pathname,$=U.pathname,V=B&&B.navigation&&B.navigation.location?B.navigation.location.pathname:null;u||($=$.toLowerCase(),V=V?V.toLowerCase():null,K=K.toLowerCase()),V&&N&&(V=Eo(V,N)||V);const he=K!=="/"&&K.endsWith("/")?K.length-1:K.length;let De=$===K||!g&&$.startsWith(K)&&$.charAt(he)==="/",E=V!=null&&(V===K||!g&&V.startsWith(K)&&V.charAt(K.length)==="/"),Q={isActive:De,isPending:E,isTransitioning:te},Pe=De?d:void 0,ce;typeof p=="function"?ce=p(Q):ce=[p,De?"active":null,E?"pending":null,te?"transitioning":null].filter(Boolean).join(" ");let He=typeof y=="function"?y(Q):y;return R.createElement(Ea,ui({},w,{"aria-current":Pe,className:ce,ref:r,style:He,to:h,viewTransition:v}),typeof P=="function"?P(Q):P)});var Nl;(function(i){i.UseScrollRestoration="useScrollRestoration",i.UseSubmit="useSubmit",i.UseSubmitFetcher="useSubmitFetcher",i.UseFetcher="useFetcher",i.useViewTransitionState="useViewTransitionState"})(Nl||(Nl={}));var Zc;(function(i){i.UseFetcher="useFetcher",i.UseFetchers="useFetchers",i.UseScrollRestoration="useScrollRestoration"})(Zc||(Zc={}));function Dy(i){let n=R.useContext(ls);return n||Ce(!1),n}function Ey(i,n){let{target:r,replace:d,state:u,preventScrollReset:p,relative:g,viewTransition:y}=n===void 0?{}:n,h=$l(),v=Yt(),P=Hn(i,{relative:g});return R.useCallback(w=>{if(uy(w,r)){w.preventDefault();let D=d!==void 0?d:ja(v)===ja(P);h(i,{replace:D,state:u,preventScrollReset:p,relative:g,viewTransition:y})}},[v,h,P,d,u,r,i,p,g,y])}function Ub(i){let n=R.useRef(_l(i)),r=R.useRef(!1),d=Yt(),u=R.useMemo(()=>cy(d.search,r.current?null:n.current),[d.search]),p=$l(),g=R.useCallback((y,h)=>{const v=_l(typeof y=="function"?y(u):y);r.current=!0,p("?"+v,h)},[p,u]);return[u,g]}function Ty(i,n){n===void 0&&(n={});let r=R.useContext(Up);r==null&&Ce(!1);let{basename:d}=Dy(Nl.useViewTransitionState),u=Hn(i,{relative:n.relative});if(!r.isTransitioning)return!1;let p=Eo(r.currentLocation.pathname,d)||r.currentLocation.pathname,g=Eo(r.nextLocation.pathname,d)||r.nextLocation.pathname;return En(u.pathname,g)!=null||En(u.pathname,p)!=null}const jy="modulepreload",Uy=function(i){return"/dashboard/"+i},Jc={},Kt=function(n,r,d){let u=Promise.resolve();if(r&&r.length>0){let g=function(v){return Promise.all(v.map(P=>Promise.resolve(P).then(w=>({status:"fulfilled",value:w}),w=>({status:"rejected",reason:w}))))};document.getElementsByTagName("link");const y=document.querySelector("meta[property=csp-nonce]"),h=(y==null?void 0:y.nonce)||(y==null?void 0:y.getAttribute("nonce"));u=g(r.map(v=>{if(v=Uy(v),v in Jc)return;Jc[v]=!0;const P=v.endsWith(".css"),w=P?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${w}`))return;const D=document.createElement("link");if(D.rel=P?"stylesheet":jy,P||(D.as="script"),D.crossOrigin="",D.href=v,h&&D.setAttribute("nonce",h),document.head.appendChild(D),P)return new Promise((U,B)=>{D.addEventListener("load",U),D.addEventListener("error",()=>B(new Error(`Unable to preload CSS for ${v}`)))})}))}function p(g){const y=new Event("vite:preloadError",{cancelable:!0});if(y.payload=g,window.dispatchEvent(y),!y.defaultPrevented)throw g}return u.then(g=>{for(const y of g||[])y.status==="rejected"&&p(y.reason);return n().catch(p)})},Ln=window.location.origin,My=3e3,zy=5e3;class Hy extends Error{constructor(r,d,u=null,p=null){super(d);Io(this,"status");Io(this,"error");Io(this,"payload");this.name="ApiClientError",this.status=r,this.error=u,this.payload=p}}function Ly(i){var r,d;const n=(d=(r=i.headers)==null?void 0:r.get)==null?void 0:d.call(r,"content-type");return typeof n=="string"&&n.toLowerCase().includes("application/json")}async function _y(i){if(!Ly(i))return null;try{const n=await i.json();if(n&&typeof n=="object")return n}catch{return null}return null}async function is(i){if(i.ok)return;const n=await _y(i),r=typeof(n==null?void 0:n.message)=="string"&&n.message.trim().length>0?n.message:`API ${i.status}: ${i.statusText}`,d=typeof(n==null?void 0:n.error)=="string"?n.error:null;throw new Hy(i.status,r,d,n)}class Ny{constructor(n){Io(this,"base");this.base=n}async get(n,r){const d=new URL(n,this.base);r&&Object.entries(r).forEach(([p,g])=>d.searchParams.set(p,g));const u=await fetch(d.toString(),{method:"GET"});return await is(u),u.json()}async patch(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async put(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)});return await is(u),u.json()}async post(n,r){const d=new URL(n,this.base),u=await fetch(d.toString(),{method:"POST",headers:r?{"Content-Type":"application/json"}:{},body:r?JSON.stringify(r):void 0});return await is(u),u.json()}async delete(n){const r=new URL(n,this.base),d=await fetch(r.toString(),{method:"DELETE"});return await is(d),d.json()}}const Et=new Ny(Ln);class Ql{constructor(n){Io(this,"source",null);Io(this,"handlers",new Map);Io(this,"reconnectTimer",null);Io(this,"url");this.url=n??`${Ln}/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 r;(r=this.source)==null||r.close(),this.source=null,this.scheduleReconnect()};const n=["connection","sync","command","game_change","mcp_status","license"];for(const r of n)this.source.addEventListener(r,d=>{var p;const u=JSON.parse(d.data);(p=this.handlers.get(r))==null||p.forEach(g=>g(u))})}on(n,r){return this.handlers.has(n)||this.handlers.set(n,new Set),this.handlers.get(n).add(r),()=>{var d;return(d=this.handlers.get(n))==null?void 0:d.delete(r)}}disconnect(){var n;(n=this.source)==null||n.close(),this.source=null,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null)}get connected(){var n;return((n=this.source)==null?void 0:n.readyState)===EventSource.OPEN}scheduleReconnect(){this.reconnectTimer||(this.reconnectTimer=setTimeout(()=>{this.reconnectTimer=null,this.connect()},My))}}function Oy(i){return i.pluginClients&&i.pluginClients.length>0?"studioConnected":(i.connectedClients===0||!i.pluginClients,"serverOnly")}const Mp=R.createContext(null);function qy({children:i}){const[n,r]=R.useState("disconnected"),[d,u]=R.useState(null),[p,g]=R.useState(null),y=R.useRef(null);return R.useEffect(()=>{let h=!1;async function v(){try{const D=await Et.get("/status");if(h)return;u(D),r(Oy(D)),g(null)}catch(D){if(h)return;r("disconnected"),g(D instanceof Error?D.message:String(D))}}v(),y.current=setInterval(v,zy);const P=new Ql;P.connect();const w=P.on("connection",()=>{v()});return()=>{h=!0,y.current&&clearInterval(y.current),w(),P.disconnect()}},[]),x.jsx(Mp.Provider,{value:{level:n,status:d,error:p},children:i})}function _n(){const i=R.useContext(Mp);if(!i)throw new Error("useConnection must be used within a ConnectionProvider");return i}const By={"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","placeScope.current.label":"Current Place","placeScope.lastActive.label":"Last Active Place","placeScope.selected.label":"Selected Place","placeScope.unknownPlace":"Unknown place","placeScope.live":"Live","placeScope.stored":"Stored","placeScope.pluginRequired":"Plugin required","placeScope.pluginRequired.note":"Connect WEPPY Plugin to confirm the live active place.","placeScope.noPlace.label":"Place scope","placeScope.noPlace.value":"No place data available yet","placeScope.noPlace.badge":"No place","placeScope.noPlace.note":"Connect WEPPY Plugin and sync a place to create place-scoped data.","placeScope.selected.note":"Showing stored data only. Studio routing is unchanged.","placeScope.surface.sync":"Sync status and logs use this place.","placeScope.surface.changelog":"Changelog sessions use this place.","placeScope.surface.playtest":"Playtest reports use this place.","placeScope.surface.uiStudio":"UI captures and change history use this place.","placeScope.surface.tools":"Tool history and statistics use this place.","placeScope.loading":"Loading place scope...","placeScope.unavailable":"Place scope unavailable","placeScope.selector.label":"Place data","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":"View Pro","tier.banner.save":"Save AI tokens with Pro!","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":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","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.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test connection","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","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.warn":"WARN","tools.col.warn.tooltip":"Number of expected failures caused by caller input, project state, Roblox policy, or user code.","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.warn":"WARN","tools.badge.warn.tooltip":"The tool call failed as an expected caller, project, policy, or user-code issue.","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.warningMessage":"Warning Message","tools.detail.errorMessage":"Error Message","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","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.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","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":"Full changelog timeline browsing is available with Pro.","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.deletePolicy":"Delete Policy","sync.directions.deletePolicy.tooltip":"Controls whether local file deletes can remove matching Studio instances automatically.","sync.directions.deletePolicy.ask":"Ask Before Delete","sync.directions.deletePolicy.ask.tooltip":"Deleted local files are reviewed before Studio instances are removed.","sync.directions.deletePolicy.auto":"Auto Delete","sync.directions.deletePolicy.auto.tooltip":"Deleted local files can remove matching Studio instances automatically.","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":"Explore 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":"View 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 after the AI Agent runs a Playtest.","playtest.empty.message.before":"Test results will appear here after the AI Agent runs a Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","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":"Available with Pro for 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
|
|
@@ -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 のバグ報告を開く","bugReportDialog.title":"diagnostics.zip は原因調査に役立ちます","bugReportDialog.subtitle":"WEPPY がこのコンピューターに診断 zip を作成しました。Studio、プラグイン、Sync、ツール実行ログが含まれ、問題の確認に役立ちます。","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"このファイルがなくてもバグ報告は送信できますが、zip を添付すると原因を早く確認しやすくなります。","bugReportDialog.attachHow":"添付するには zip をダウンロードするか Finder/Explorer で開き、送信前に GitHub issue の Diagnostics ZIP (optional) アップロード欄へ追加してください。","bugReportDialog.download":"1. diagnostics.zip をダウンロード","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. GitHub issue を開く","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"zip にはローカルログやプロジェクト情報が含まれることがあります。共有する場合は添付前に内容を確認してください。","sidebar.help.feature":"機能を提案","sidebar.help.feature.tooltip":"GitHub で新機能や改善を提案する","sidebar.help.discussions":"インストール/使い方の相談","sidebar.help.discussions.tooltip":"GitHub Issues でインストール、接続、使い方の相談をする","sidebar.help.troubleshooting":"トラブルシューティングガイド","sidebar.help.troubleshooting.tooltip":"weppyai.com の公式トラブルシューティングガイドを開く","header.whatsNew":"新着情報","header.whatsNew.tooltip":"新着情報","upgrade.title":"Proを確認","upgrade.tagline":"Pro機能を確認","upgrade.cta":"Proを確認","upgrade.licenseShortcut":"ライセンスを入力","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"新着情報","whatsNew.pageSubtitle":"MCPの最新変更をチェック","whatsNew.unreadSection":"未読","whatsNew.allSection":"すべてのお知らせ","whatsNew.empty":"お知らせはまだありません","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"重要","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.loadingPlace":"現在の Place を読み込み中...","uiStudio.history.noPlace":"現在の Place データはまだありません。UI 変更履歴を表示するには WEPPY Plugin を接続して Place を同期してください。","uiStudio.history.noPlaceAction":"現在の Place はまだ利用できません。","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":"Pro機能と購入オプションを確認します。","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":"任意改善の提案数です。","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"エラー","uiStudio.analysis.expandChildren":"子ターゲットを表示","uiStudio.analysis.openDetail":"詳細を開く","uiStudio.analysis.childTargets":"子ターゲット","uiStudio.analysis.childDetailHint":"子ターゲットの詳細を開く","uiStudio.compare.before":"変更前","uiStudio.compare.after":"変更後","uiStudio.history.drawer.changeDetails":"変更詳細","uiStudio.gallery.cardCheckbox":"スクリーンショットを選択","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.place.selector":"Asset place","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"閉じる","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.currentPriorityTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.recentPriorityHelp":"Requests the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.pinnedHelp":"Requests the pinned Studio unless the agent names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Sync形式を更新できます","sync.migration.description":"このPlaceのSync形式をv2からv3へ更新する前に、メタデータの変更内容を確認してください。","sync.migration.status.ready":"確認可能","sync.migration.status.blocked":"ブロック中","sync.migration.preview":"変更内容を確認","sync.migration.summary.add":"追加","sync.migration.summary.modify":"変更","sync.migration.summary.delete":"削除","sync.migration.summary.blocked":"ブロック","sync.migration.changes":"メタデータの変更","sync.migration.blockers":"解決が必要な項目","sync.migration.operation.add":"追加","sync.migration.operation.modify":"変更","sync.migration.operation.delete":"削除","sync.migration.reason.serializer_regeneration":"メタデータを標準のv3形式で再生成します。","sync.migration.reason.volatile_metadata_removal":"一時的なSyncメタデータを削除します。","sync.migration.reason.redundant_empty_metadata":"不要な空のメタデータを削除します。","sync.migration.reason.runtime_ignore_policy":"管理対象のランタイム除外ルールを更新します。","sync.migration.reason.reverse_pending":"保留中のローカルからStudioへの変更を先に適用または破棄してください。","sync.migration.reason.conflict":"ローカルとStudioの競合を先に解決してください。","sync.migration.reason.local_canonical_change":"ローカルで変更された標準メタデータを先に確認してください。","sync.migration.reason.source_mutation_detected":"Migrationの検証中にユーザーソースが変更されました。","sync.migration.blocked":"Syncの競合を解決してから更新してください","sync.migration.stale":"プレビューが変わりました。最新の差分を確認してください。","sync.migration.error":"Sync形式を更新できませんでした。もう一度お試しください。","sync.migration.refresh":"プレビューを更新","sync.migration.refreshing":"更新中…","sync.migration.applying":"適用中…","sync.migration.apply":"更新を適用","sync.migration.confirm.title":"Sync形式の更新を適用しますか?","sync.migration.confirm.message":"一覧のSyncメタデータをバックアップして更新します。Luauソースファイルは変更しません。","changelog.ownership.showGenerated":"生成メタデータを表示","changelog.ownership.userSource":"ユーザーソース","changelog.ownership.canonicalMirror":"ミラーメタデータ","changelog.ownership.generated":"生成済み"},Gy={"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","placeScope.current.label":"Place saat ini","placeScope.lastActive.label":"Place aktif terakhir","placeScope.selected.label":"Place yang dipilih","placeScope.unknownPlace":"Place tidak dikenal","placeScope.live":"Live","placeScope.stored":"Tersimpan","placeScope.pluginRequired":"Plugin diperlukan","placeScope.pluginRequired.note":"Hubungkan WEPPY Plugin untuk mengonfirmasi place aktif live.","placeScope.noPlace.label":"Cakupan place","placeScope.noPlace.value":"Belum ada data place","placeScope.noPlace.badge":"Tidak ada place","placeScope.noPlace.note":"Hubungkan WEPPY Plugin dan sinkronkan place untuk membuat data per place.","placeScope.selected.note":"Hanya menampilkan data tersimpan. Routing Studio tidak berubah.","placeScope.surface.sync":"Status sinkronisasi dan log memakai place ini.","placeScope.surface.changelog":"Sesi changelog memakai place ini.","placeScope.surface.playtest":"Laporan playtest memakai place ini.","placeScope.surface.uiStudio":"Capture UI dan riwayat perubahan memakai place ini.","placeScope.surface.tools":"Riwayat dan statistik tool memakai place ini.","placeScope.loading":"Memuat cakupan place...","placeScope.unavailable":"Cakupan place tidak tersedia","placeScope.selector.label":"Data place","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":"Lihat Pro","tier.banner.save":"Hemat token AI dengan Pro!","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":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","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.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Koneksi Play/Test Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","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.warn":"WARN","tools.col.warn.tooltip":"Jumlah kegagalan yang diperkirakan karena input, status proyek, kebijakan Roblox, atau kode pengguna.","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.warn":"WARN","tools.badge.warn.tooltip":"Panggilan alat gagal karena masalah input, proyek, kebijakan, atau kode pengguna yang diperkirakan.","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.warningMessage":"Pesan peringatan","tools.detail.errorMessage":"Pesan error","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","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.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","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.deletePolicy":"Kebijakan hapus","sync.directions.deletePolicy.tooltip":"Mengontrol apakah penghapusan file lokal dapat otomatis menghapus instance Studio yang cocok.","sync.directions.deletePolicy.ask":"Tanya sebelum hapus","sync.directions.deletePolicy.ask.tooltip":"File lokal yang dihapus ditinjau sebelum instance Studio dihapus.","sync.directions.deletePolicy.auto":"Hapus otomatis","sync.directions.deletePolicy.auto.tooltip":"File lokal yang dihapus dapat otomatis menghapus instance Studio yang cocok.","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":"Lihat 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":"Lihat 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 setelah agen AI menjalankan Playtest.","playtest.empty.message.before":"Hasil akan muncul di sini setelah agen AI menjalankan Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","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 のバグ報告を開く","bugReportDialog.title":"diagnostics.zip は原因調査に役立ちます","bugReportDialog.subtitle":"WEPPY がこのコンピューターに診断 zip を作成しました。Studio、プラグイン、Sync、ツール実行ログが含まれ、問題の確認に役立ちます。","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"このファイルがなくてもバグ報告は送信できますが、zip を添付すると原因を早く確認しやすくなります。","bugReportDialog.attachHow":"添付するには zip をダウンロードするか Finder/Explorer で開き、送信前に GitHub issue の Diagnostics ZIP (optional) アップロード欄へ追加してください。","bugReportDialog.download":"1. diagnostics.zip をダウンロード","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. GitHub issue を開く","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"zip にはローカルログやプロジェクト情報が含まれることがあります。共有する場合は添付前に内容を確認してください。","sidebar.help.feature":"機能を提案","sidebar.help.feature.tooltip":"GitHub で新機能や改善を提案する","sidebar.help.discussions":"インストール/使い方の相談","sidebar.help.discussions.tooltip":"GitHub Issues でインストール、接続、使い方の相談をする","sidebar.help.troubleshooting":"トラブルシューティングガイド","sidebar.help.troubleshooting.tooltip":"weppyai.com の公式トラブルシューティングガイドを開く","header.whatsNew":"新着情報","header.whatsNew.tooltip":"新着情報","upgrade.title":"Proを確認","upgrade.tagline":"Pro機能を確認","upgrade.cta":"Proを確認","upgrade.licenseShortcut":"ライセンスを入力","upgrade.validUntil":"Until {{date}}","whatsNew.pageTitle":"新着情報","whatsNew.pageSubtitle":"MCPの最新変更をチェック","whatsNew.unreadSection":"未読","whatsNew.allSection":"すべてのお知らせ","whatsNew.empty":"お知らせはまだありません","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"重要","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.loadingPlace":"現在の Place を読み込み中...","uiStudio.history.noPlace":"現在の Place データはまだありません。UI 変更履歴を表示するには WEPPY Plugin を接続して Place を同期してください。","uiStudio.history.noPlaceAction":"現在の Place はまだ利用できません。","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":"Pro機能と購入オプションを確認します。","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":"任意改善の提案数です。","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"エラー","uiStudio.analysis.expandChildren":"子ターゲットを表示","uiStudio.analysis.openDetail":"詳細を開く","uiStudio.analysis.childTargets":"子ターゲット","uiStudio.analysis.childDetailHint":"子ターゲットの詳細を開く","uiStudio.compare.before":"変更前","uiStudio.compare.after":"変更後","uiStudio.history.drawer.changeDetails":"変更詳細","uiStudio.gallery.cardCheckbox":"スクリーンショットを選択","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.place.selector":"Asset place","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"閉じる","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.currentPriorityTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.recentPriorityHelp":"Requests the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.pinnedHelp":"Requests the pinned Studio unless the agent names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Sync形式を更新できます","sync.migration.description":"このPlaceのSync形式をv2からv3へ更新する前に、メタデータの変更内容を確認してください。","sync.migration.status.ready":"確認可能","sync.migration.status.blocked":"ブロック中","sync.migration.preview":"変更内容を確認","sync.migration.summary.add":"追加","sync.migration.summary.modify":"変更","sync.migration.summary.delete":"削除","sync.migration.summary.blocked":"ブロック","sync.migration.changes":"メタデータの変更","sync.migration.blockers":"解決が必要な項目","sync.migration.operation.add":"追加","sync.migration.operation.modify":"変更","sync.migration.operation.delete":"削除","sync.migration.reason.serializer_regeneration":"メタデータを標準のv3形式で再生成します。","sync.migration.reason.volatile_metadata_removal":"一時的なSyncメタデータを削除します。","sync.migration.reason.redundant_empty_metadata":"不要な空のメタデータを削除します。","sync.migration.reason.runtime_ignore_policy":"管理対象のランタイム除外ルールを更新します。","sync.migration.reason.reverse_pending":"保留中のローカルからStudioへの変更を先に適用または破棄してください。","sync.migration.reason.conflict":"ローカルとStudioの競合を先に解決してください。","sync.migration.reason.local_canonical_change":"ローカルで変更された標準メタデータを先に確認してください。","sync.migration.reason.source_mutation_detected":"Migrationの検証中にユーザーソースが変更されました。","sync.migration.blocked":"Syncの競合を解決してから更新してください","sync.migration.stale":"プレビューが変わりました。最新の差分を確認してください。","sync.migration.error":"Sync形式を更新できませんでした。もう一度お試しください。","sync.migration.refresh":"プレビューを更新","sync.migration.refreshing":"更新中…","sync.migration.applying":"適用中…","sync.migration.apply":"更新を適用","sync.migration.confirm.title":"Sync形式の更新を適用しますか?","sync.migration.confirm.message":"一覧のSyncメタデータをバックアップして更新します。Luauソースファイルは変更しません。","changelog.ownership.showGenerated":"生成メタデータを表示","changelog.ownership.userSource":"ユーザーソース","changelog.ownership.canonicalMirror":"ミラーメタデータ","changelog.ownership.generated":"生成済み"},Vy={"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","placeScope.current.label":"Place saat ini","placeScope.lastActive.label":"Place aktif terakhir","placeScope.selected.label":"Place yang dipilih","placeScope.unknownPlace":"Place tidak dikenal","placeScope.live":"Live","placeScope.stored":"Tersimpan","placeScope.pluginRequired":"Plugin diperlukan","placeScope.pluginRequired.note":"Hubungkan WEPPY Plugin untuk mengonfirmasi place aktif live.","placeScope.noPlace.label":"Cakupan place","placeScope.noPlace.value":"Belum ada data place","placeScope.noPlace.badge":"Tidak ada place","placeScope.noPlace.note":"Hubungkan WEPPY Plugin dan sinkronkan place untuk membuat data per place.","placeScope.selected.note":"Hanya menampilkan data tersimpan. Routing Studio tidak berubah.","placeScope.surface.sync":"Status sinkronisasi dan log memakai place ini.","placeScope.surface.changelog":"Sesi changelog memakai place ini.","placeScope.surface.playtest":"Laporan playtest memakai place ini.","placeScope.surface.uiStudio":"Capture UI dan riwayat perubahan memakai place ini.","placeScope.surface.tools":"Riwayat dan statistik tool memakai place ini.","placeScope.loading":"Memuat cakupan place...","placeScope.unavailable":"Cakupan place tidak tersedia","placeScope.selector.label":"Data place","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":"Lihat Pro","tier.banner.save":"Hemat token AI dengan Pro!","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":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","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.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Koneksi Play/Test Studio","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","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.warn":"WARN","tools.col.warn.tooltip":"Jumlah kegagalan yang diperkirakan karena input, status proyek, kebijakan Roblox, atau kode pengguna.","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.warn":"WARN","tools.badge.warn.tooltip":"Panggilan alat gagal karena masalah input, proyek, kebijakan, atau kode pengguna yang diperkirakan.","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.warningMessage":"Pesan peringatan","tools.detail.errorMessage":"Pesan error","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","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.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","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.deletePolicy":"Kebijakan hapus","sync.directions.deletePolicy.tooltip":"Mengontrol apakah penghapusan file lokal dapat otomatis menghapus instance Studio yang cocok.","sync.directions.deletePolicy.ask":"Tanya sebelum hapus","sync.directions.deletePolicy.ask.tooltip":"File lokal yang dihapus ditinjau sebelum instance Studio dihapus.","sync.directions.deletePolicy.auto":"Hapus otomatis","sync.directions.deletePolicy.auto.tooltip":"File lokal yang dihapus dapat otomatis menghapus instance Studio yang cocok.","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":"Lihat 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":"Lihat 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 setelah agen AI menjalankan Playtest.","playtest.empty.message.before":"Hasil akan muncul di sini setelah agen AI menjalankan Playtest.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","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":"Buat paket diagnostik lokal, lalu buka laporan bug GitHub yang sudah terisi","bugReportDialog.title":"diagnostics.zip dapat membantu investigasi","bugReportDialog.subtitle":"WEPPY membuat zip diagnostik di komputer ini. File ini berisi log Studio, plugin, Sync, dan tool yang dapat membantu kami memahami masalahnya.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Kamu tetap bisa mengirim laporan bug tanpa file ini, tetapi melampirkan zip biasanya membantu kami menemukan penyebabnya lebih cepat.","bugReportDialog.attachHow":"Untuk melampirkannya, unduh atau tampilkan zip, lalu tambahkan ke kolom Diagnostics ZIP (optional) di issue GitHub sebelum dikirim.","bugReportDialog.download":"1. Unduh diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Buka issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Zip dapat berisi log lokal dan konteks proyek. Tinjau sebelum melampirkannya jika ingin dibagikan.","sidebar.help.feature":"Sarankan fitur baru","sidebar.help.feature.tooltip":"Sarankan fitur baru atau peningkatan di GitHub","sidebar.help.discussions":"Bantuan instalasi/penggunaan","sidebar.help.discussions.tooltip":"Minta bantuan instalasi atau penggunaan lewat GitHub Issues","sidebar.help.troubleshooting":"Panduan 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":"Lihat Pro","upgrade.tagline":"Lihat fitur Pro","upgrade.cta":"Lihat Pro","upgrade.licenseShortcut":"Masukkan lisensi","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.importantBadge":"PENTING","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.loadingPlace":"Memuat place saat ini...","uiStudio.history.noPlace":"Data place saat ini belum tersedia. Hubungkan WEPPY Plugin dan sinkronkan place untuk melihat riwayat perubahan UI.","uiStudio.history.noPlaceAction":"Place saat ini belum tersedia.","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":"Lihat fitur Pro dan opsi pembelian.","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.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Error","uiStudio.analysis.expandChildren":"Tampilkan target turunan","uiStudio.analysis.openDetail":"Buka detail","uiStudio.analysis.childTargets":"Target turunan","uiStudio.analysis.childDetailHint":"Buka detail target turunan","uiStudio.compare.before":"Sebelum","uiStudio.compare.after":"Sesudah","uiStudio.history.drawer.changeDetails":"Detail perubahan","uiStudio.gallery.cardCheckbox":"Pilih tangkapan layar","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.place.selector":"Asset place","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Tutup","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.currentPriorityTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.recentPriorityHelp":"Requests the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.pinnedHelp":"Requests the pinned Studio unless the agent names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Pembaruan format Sync tersedia","sync.migration.description":"Tinjau perubahan metadata sebelum memperbarui Place ini dari format Sync v2 ke v3.","sync.migration.status.ready":"Siap ditinjau","sync.migration.status.blocked":"Diblokir","sync.migration.preview":"Tinjau perubahan","sync.migration.summary.add":"Tambah","sync.migration.summary.modify":"Ubah","sync.migration.summary.delete":"Hapus","sync.migration.summary.blocked":"Diblokir","sync.migration.changes":"Perubahan metadata","sync.migration.blockers":"Item yang perlu diselesaikan","sync.migration.operation.add":"tambah","sync.migration.operation.modify":"ubah","sync.migration.operation.delete":"hapus","sync.migration.reason.serializer_regeneration":"Menulis ulang metadata dalam format standar v3.","sync.migration.reason.volatile_metadata_removal":"Menghapus metadata Sync sementara.","sync.migration.reason.redundant_empty_metadata":"Menghapus metadata kosong yang tidak diperlukan.","sync.migration.reason.runtime_ignore_policy":"Memperbarui kebijakan pengecualian runtime terkelola.","sync.migration.reason.reverse_pending":"Terapkan atau buang perubahan lokal ke Studio yang tertunda terlebih dahulu.","sync.migration.reason.conflict":"Selesaikan konflik antara file lokal dan Studio terlebih dahulu.","sync.migration.reason.local_canonical_change":"Tinjau metadata standar yang diubah secara lokal terlebih dahulu.","sync.migration.reason.source_mutation_detected":"File sumber pengguna berubah selama validasi.","sync.migration.blocked":"Selesaikan konflik Sync sebelum memperbarui","sync.migration.stale":"Pratinjau berubah. Tinjau perbedaan terbaru.","sync.migration.error":"Format Sync tidak dapat diperbarui. Coba lagi.","sync.migration.refresh":"Segarkan pratinjau","sync.migration.refreshing":"Menyegarkan…","sync.migration.applying":"Menerapkan…","sync.migration.apply":"Terapkan pembaruan","sync.migration.confirm.title":"Terapkan pembaruan format Sync?","sync.migration.confirm.message":"Metadata Sync yang tercantum akan dicadangkan dan diperbarui. File sumber Luau Anda tidak akan berubah.","changelog.ownership.showGenerated":"Tampilkan metadata yang dihasilkan","changelog.ownership.userSource":"Sumber pengguna","changelog.ownership.canonicalMirror":"Metadata mirror","changelog.ownership.generated":"Dihasilkan"},Vy={"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","placeScope.current.label":"Aktueller Place","placeScope.lastActive.label":"Zuletzt aktiver Place","placeScope.selected.label":"Ausgewählter Place","placeScope.unknownPlace":"Unbekannter Place","placeScope.live":"Live","placeScope.stored":"Gespeichert","placeScope.pluginRequired":"Plugin erforderlich","placeScope.pluginRequired.note":"Verbinde das WEPPY Plugin, um den live aktiven Place zu bestätigen.","placeScope.noPlace.label":"Place-Bereich","placeScope.noPlace.value":"Noch keine Place-Daten verfügbar","placeScope.noPlace.badge":"Kein Place","placeScope.noPlace.note":"Verbinde das WEPPY Plugin und synchronisiere einen Place, um Place-bezogene Daten zu erstellen.","placeScope.selected.note":"Es werden nur gespeicherte Daten angezeigt. Das Studio-Routing bleibt unverändert.","placeScope.surface.sync":"Sync-Status und Logs verwenden diesen Place.","placeScope.surface.changelog":"Changelog-Sitzungen verwenden diesen Place.","placeScope.surface.playtest":"Playtest-Berichte verwenden diesen Place.","placeScope.surface.uiStudio":"UI-Aufnahmen und Änderungsverlauf verwenden diesen Place.","placeScope.surface.tools":"Tool-Verlauf und Statistiken verwenden diesen Place.","placeScope.loading":"Place-Bereich wird geladen...","placeScope.unavailable":"Place-Bereich nicht verfügbar","placeScope.selector.label":"Place-Daten","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":"Pro ansehen","tier.banner.save":"Sparen Sie KI-Token mit Pro!","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":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","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.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test-Verbindung","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","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.warn":"WARN","tools.col.warn.tooltip":"Anzahl erwarteter Fehler durch Eingabe, Projektstatus, Roblox-Richtlinie oder Benutzercode.","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.warn":"WARN","tools.badge.warn.tooltip":"Der Tool-Aufruf ist wegen eines erwarteten Eingabe-, Projekt-, Richtlinien- oder Benutzercode-Problems fehlgeschlagen.","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.warningMessage":"Warnmeldung","tools.detail.errorMessage":"Fehlermeldung","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","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.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","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.deletePolicy":"Löschrichtlinie","sync.directions.deletePolicy.tooltip":"Steuert, ob gelöschte lokale Dateien passende Studio-Instanzen automatisch entfernen können.","sync.directions.deletePolicy.ask":"Vor dem Löschen fragen","sync.directions.deletePolicy.ask.tooltip":"Gelöschte lokale Dateien werden geprüft, bevor Studio-Instanzen entfernt werden.","sync.directions.deletePolicy.auto":"Automatisch löschen","sync.directions.deletePolicy.auto.tooltip":"Gelöschte lokale Dateien können passende Studio-Instanzen automatisch entfernen.","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 ansehen","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":"Pro ansehen","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, nachdem der KI-Agent einen Playtest ausgeführt hat.","playtest.empty.message.before":"Testergebnisse erscheinen hier, nachdem der KI-Agent einen Playtest ausgeführt hat.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","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":"Buat paket diagnostik lokal, lalu buka laporan bug GitHub yang sudah terisi","bugReportDialog.title":"diagnostics.zip dapat membantu investigasi","bugReportDialog.subtitle":"WEPPY membuat zip diagnostik di komputer ini. File ini berisi log Studio, plugin, Sync, dan tool yang dapat membantu kami memahami masalahnya.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Kamu tetap bisa mengirim laporan bug tanpa file ini, tetapi melampirkan zip biasanya membantu kami menemukan penyebabnya lebih cepat.","bugReportDialog.attachHow":"Untuk melampirkannya, unduh atau tampilkan zip, lalu tambahkan ke kolom Diagnostics ZIP (optional) di issue GitHub sebelum dikirim.","bugReportDialog.download":"1. Unduh diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Buka issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Zip dapat berisi log lokal dan konteks proyek. Tinjau sebelum melampirkannya jika ingin dibagikan.","sidebar.help.feature":"Sarankan fitur baru","sidebar.help.feature.tooltip":"Sarankan fitur baru atau peningkatan di GitHub","sidebar.help.discussions":"Bantuan instalasi/penggunaan","sidebar.help.discussions.tooltip":"Minta bantuan instalasi atau penggunaan lewat GitHub Issues","sidebar.help.troubleshooting":"Panduan 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":"Lihat Pro","upgrade.tagline":"Lihat fitur Pro","upgrade.cta":"Lihat Pro","upgrade.licenseShortcut":"Masukkan lisensi","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.importantBadge":"PENTING","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.loadingPlace":"Memuat place saat ini...","uiStudio.history.noPlace":"Data place saat ini belum tersedia. Hubungkan WEPPY Plugin dan sinkronkan place untuk melihat riwayat perubahan UI.","uiStudio.history.noPlaceAction":"Place saat ini belum tersedia.","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":"Lihat fitur Pro dan opsi pembelian.","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.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Error","uiStudio.analysis.expandChildren":"Tampilkan target turunan","uiStudio.analysis.openDetail":"Buka detail","uiStudio.analysis.childTargets":"Target turunan","uiStudio.analysis.childDetailHint":"Buka detail target turunan","uiStudio.compare.before":"Sebelum","uiStudio.compare.after":"Sesudah","uiStudio.history.drawer.changeDetails":"Detail perubahan","uiStudio.gallery.cardCheckbox":"Pilih tangkapan layar","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.place.selector":"Asset place","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Tutup","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.currentPriorityTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.recentPriorityHelp":"Requests the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.pinnedHelp":"Requests the pinned Studio unless the agent names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Pembaruan format Sync tersedia","sync.migration.description":"Tinjau perubahan metadata sebelum memperbarui Place ini dari format Sync v2 ke v3.","sync.migration.status.ready":"Siap ditinjau","sync.migration.status.blocked":"Diblokir","sync.migration.preview":"Tinjau perubahan","sync.migration.summary.add":"Tambah","sync.migration.summary.modify":"Ubah","sync.migration.summary.delete":"Hapus","sync.migration.summary.blocked":"Diblokir","sync.migration.changes":"Perubahan metadata","sync.migration.blockers":"Item yang perlu diselesaikan","sync.migration.operation.add":"tambah","sync.migration.operation.modify":"ubah","sync.migration.operation.delete":"hapus","sync.migration.reason.serializer_regeneration":"Menulis ulang metadata dalam format standar v3.","sync.migration.reason.volatile_metadata_removal":"Menghapus metadata Sync sementara.","sync.migration.reason.redundant_empty_metadata":"Menghapus metadata kosong yang tidak diperlukan.","sync.migration.reason.runtime_ignore_policy":"Memperbarui kebijakan pengecualian runtime terkelola.","sync.migration.reason.reverse_pending":"Terapkan atau buang perubahan lokal ke Studio yang tertunda terlebih dahulu.","sync.migration.reason.conflict":"Selesaikan konflik antara file lokal dan Studio terlebih dahulu.","sync.migration.reason.local_canonical_change":"Tinjau metadata standar yang diubah secara lokal terlebih dahulu.","sync.migration.reason.source_mutation_detected":"File sumber pengguna berubah selama validasi.","sync.migration.blocked":"Selesaikan konflik Sync sebelum memperbarui","sync.migration.stale":"Pratinjau berubah. Tinjau perbedaan terbaru.","sync.migration.error":"Format Sync tidak dapat diperbarui. Coba lagi.","sync.migration.refresh":"Segarkan pratinjau","sync.migration.refreshing":"Menyegarkan…","sync.migration.applying":"Menerapkan…","sync.migration.apply":"Terapkan pembaruan","sync.migration.confirm.title":"Terapkan pembaruan format Sync?","sync.migration.confirm.message":"Metadata Sync yang tercantum akan dicadangkan dan diperbarui. File sumber Luau Anda tidak akan berubah.","changelog.ownership.showGenerated":"Tampilkan metadata yang dihasilkan","changelog.ownership.userSource":"Sumber pengguna","changelog.ownership.canonicalMirror":"Metadata mirror","changelog.ownership.generated":"Dihasilkan"},Gy={"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","placeScope.current.label":"Aktueller Place","placeScope.lastActive.label":"Zuletzt aktiver Place","placeScope.selected.label":"Ausgewählter Place","placeScope.unknownPlace":"Unbekannter Place","placeScope.live":"Live","placeScope.stored":"Gespeichert","placeScope.pluginRequired":"Plugin erforderlich","placeScope.pluginRequired.note":"Verbinde das WEPPY Plugin, um den live aktiven Place zu bestätigen.","placeScope.noPlace.label":"Place-Bereich","placeScope.noPlace.value":"Noch keine Place-Daten verfügbar","placeScope.noPlace.badge":"Kein Place","placeScope.noPlace.note":"Verbinde das WEPPY Plugin und synchronisiere einen Place, um Place-bezogene Daten zu erstellen.","placeScope.selected.note":"Es werden nur gespeicherte Daten angezeigt. Das Studio-Routing bleibt unverändert.","placeScope.surface.sync":"Sync-Status und Logs verwenden diesen Place.","placeScope.surface.changelog":"Changelog-Sitzungen verwenden diesen Place.","placeScope.surface.playtest":"Playtest-Berichte verwenden diesen Place.","placeScope.surface.uiStudio":"UI-Aufnahmen und Änderungsverlauf verwenden diesen Place.","placeScope.surface.tools":"Tool-Verlauf und Statistiken verwenden diesen Place.","placeScope.loading":"Place-Bereich wird geladen...","placeScope.unavailable":"Place-Bereich nicht verfügbar","placeScope.selector.label":"Place-Daten","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":"Pro ansehen","tier.banner.save":"Sparen Sie KI-Token mit Pro!","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":"Connection ID","connection.plugins.clientId.tooltip":"Full connection ID for diagnostics","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.targets.title":"Studio Targets","connection.targets.target":"Studio ID","connection.targets.target.tooltip":"Short name for this Roblox Studio window","connection.targets.place":"Place","connection.targets.placeId":"Place ID","connection.targets.placeId.tooltip":"Roblox Place ID for this Studio window","connection.targets.clientId":"Connection ID","connection.targets.clientId.tooltip":"Full connection ID for diagnostics. Usually use Studio ID instead.","connection.targets.session":"Session","connection.targets.session.tooltip":"Command channel state for this Studio target","connection.targets.lastUsed":"Last Used","connection.targets.lastUsed.tooltip":"Most recent plugin-route request routed to this Studio target","connection.targets.lastSeen":"Last Seen","connection.targets.lastSeen.tooltip":"Most recent heartbeat received from this Studio target","connection.targets.version":"Version","connection.targets.version.tooltip":"Installed plugin version reported by Studio","connection.targets.routing":"Routing","connection.targets.routing.tooltip":"Default Studio window when the agent does not name one","connection.targets.inFlight":"In Flight","connection.targets.inFlight.tooltip":"Active command request currently routed to this Studio target","connection.targets.studioState":"Studio State","connection.targets.studioState.tooltip":"Current edit/play runtime state reported by this Studio window","connection.targets.studioState.edit":"Edit","connection.targets.studioState.running":"Running","connection.targets.studioState.paused":"Paused","connection.targets.studioState.unknown":"Unknown","connection.targets.studioState.source.thread":"WEPPY play command","connection.targets.studioState.source.pluginConnection":"Studio Play/Test-Verbindung","connection.targets.studioState.source.runService":"Studio RunService","connection.targets.studioState.source.unknown":"Unknown source","connection.targets.studioState.updatedUnknown":"not reported","connection.targets.copyPlaceId":"Copy Place ID","connection.targets.copyTargetAlias":"Copy Studio ID","connection.targets.copyClientId":"Copy Connection ID","connection.targets.copied":"Copied value","connection.targets.copyFailed":"Failed to copy value","connection.targets.none":"No Studio targets connected. Open Roblox Studio and connect WEPPY Plugin.","connection.targets.help":"When multiple Studio windows are connected, tell the agent to use Studio ID studio-1 to choose one.","connection.topology.ariaLabel":"Connection topology","connection.topology.title":"Connection topology","connection.topology.description":"AI agents and Roblox Studio windows connect through one WEPPY MCP Server.","connection.topology.serverTitle":"MCP Server","connection.topology.active":"Active","connection.topology.stale":"Stale","connection.topology.unknown":"Unknown","connection.topology.lastActivity":"Last activity","connection.topology.noActivity":"No recent activity","connection.topology.versionUnknown":"Version unknown","connection.topology.placeUnknown":"Place unknown","connection.topology.moreAgents":"+{count} more agents","connection.topology.moreStudios":"+{count} more studios","connection.topology.allAgentsVisible":"All agents visible","connection.topology.allStudiosVisible":"All studios visible","connection.topology.showAll":"Show all","connection.topology.showLess":"Show less","connection.topology.showAllAgents":"Show all AI agents","connection.topology.showAllStudios":"Show all Studio targets","connection.topology.showLessAgents":"Show less AI agents","connection.topology.showLessStudios":"Show less Studio targets","connection.routing.updateFailed":"Failed to update routing target","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.warn":"WARN","tools.col.warn.tooltip":"Anzahl erwarteter Fehler durch Eingabe, Projektstatus, Roblox-Richtlinie oder Benutzercode.","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.warn":"WARN","tools.badge.warn.tooltip":"Der Tool-Aufruf ist wegen eines erwarteten Eingabe-, Projekt-, Richtlinien- oder Benutzercode-Problems fehlgeschlagen.","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.warningMessage":"Warnmeldung","tools.detail.errorMessage":"Fehlermeldung","tools.history.routing":"Routing","tools.history.routing.mode":"Mode","tools.history.routing.requested":"Requested","tools.history.routing.actual":"Actual","tools.history.routing.none":"No Studio target named","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.auto":"auto","settings.license.provider.polar":"polar","settings.license.provider.gumroad":"gumroad","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.deletePolicy":"Löschrichtlinie","sync.directions.deletePolicy.tooltip":"Steuert, ob gelöschte lokale Dateien passende Studio-Instanzen automatisch entfernen können.","sync.directions.deletePolicy.ask":"Vor dem Löschen fragen","sync.directions.deletePolicy.ask.tooltip":"Gelöschte lokale Dateien werden geprüft, bevor Studio-Instanzen entfernt werden.","sync.directions.deletePolicy.auto":"Automatisch löschen","sync.directions.deletePolicy.auto.tooltip":"Gelöschte lokale Dateien können passende Studio-Instanzen automatisch entfernen.","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 ansehen","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":"Pro ansehen","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, nachdem der KI-Agent einen Playtest ausgeführt hat.","playtest.empty.message.before":"Testergebnisse erscheinen hier, nachdem der KI-Agent einen Playtest ausgeführt hat.","playtest.empty.message.after":"","playtest.empty.runTest.tooltip":"Ask the AI Agent to run a Playtest when you need a fresh report.","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
|
|
@@ -146,7 +146,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
|
|
|
146
146
|
[exemple] protection contre l'apparition active
|
|
147
147
|
[exemple] compte à rebours hud rendu
|
|
148
148
|
[exemple] première vague terminée
|
|
149
|
-
[exemple] rapport d'aperçu terminé`,"sidebar.whatsNew":"Quoi de neuf","sidebar.help.group":"Aide et commentaires","sidebar.help.bug":"Signaler un bug","sidebar.help.bug.tooltip":"Créer un bundle de diagnostic local, puis ouvrir un rapport de bug pré-rempli sur GitHub","bugReportDialog.title":"diagnostics.zip peut nous aider à analyser le problème","bugReportDialog.subtitle":"WEPPY a créé un zip de diagnostic sur cet ordinateur. Il contient des logs Studio, plugin, Sync et outils qui peuvent nous aider à comprendre ce qui s’est passé.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Vous pouvez envoyer le rapport sans ce fichier, mais joindre le zip nous aide souvent à trouver la cause plus vite.","bugReportDialog.attachHow":"Pour le joindre, téléchargez ou affichez le zip, puis ajoutez-le au champ Diagnostics ZIP (optional) de l’issue GitHub avant de l’envoyer.","bugReportDialog.download":"1. Télécharger diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Ouvrir l’issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Le zip peut contenir des logs locaux et du contexte de projet. Vérifiez-le avant de le joindre si vous voulez le partager.","sidebar.help.feature":"Suggérer une fonctionnalité","sidebar.help.feature.tooltip":"Suggérer une nouvelle fonctionnalité ou une amélioration sur GitHub","sidebar.help.discussions":"Aide pour l’installation et l’utilisation","sidebar.help.discussions.tooltip":"Demander de l'aide pour l'installation ou l'utilisation via GitHub Issues","sidebar.help.troubleshooting":"Guide de dépannage","sidebar.help.troubleshooting.tooltip":"Ouvrez le guide de dépannage officiel sur weppyai.com","header.whatsNew":"Quoi de neuf","header.whatsNew.tooltip":"Quoi de neuf","upgrade.title":"Voir Pro","upgrade.tagline":"Découvrir les fonctions Pro","upgrade.cta":"Voir Pro","upgrade.licenseShortcut":"Saisir la licence","upgrade.validUntil":"Jusqu'au {{date}}","whatsNew.pageTitle":"Quoi de neuf","whatsNew.pageSubtitle":"Restez informé des modifications apportées à MCP","whatsNew.unreadSection":"Non lu","whatsNew.allSection":"Toutes les annonces","whatsNew.empty":"Aucune annonce pour l'instant","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"IMPORTANT","whatsNew.category.release":"Libérer","whatsNew.category.notice":"Avis","whatsNew.category.deprecation":"Obsolète","whatsNew.category.tip":"Conseil","uiStudio.title":"UI Studio","uiStudio.empty":"Aucune capture d'écran enregistrée pour l'instant. Ils sont créés automatiquement lorsqu'un agent IA capture l'état actuel de l'interface utilisateur.","uiStudio.loading":"Chargement…","uiStudio.pluginGuide.title":"Le plugin Roblox Studio n'est pas connecté","uiStudio.pluginGuide.message":"UI Studio affiche des captures d'écran et l'historique des modifications à partir du lieu Studio connecté. Il sera mis à jour automatiquement après la connexion de Studio et de WEPPY Plugin.","uiStudio.pluginGuide.check1":"Roblox Studio est-il en cours d'exécution ?","uiStudio.pluginGuide.check2":"Le WEPPY Plugin est-il installé et en cours d'exécution ?","uiStudio.pluginGuide.waiting":"En attente de connexion au plugin...","uiStudio.capturedAt":"Capturé à","uiStudio.scope":"Portée","uiStudio.target":"Cible","uiStudio.briefId":"Brève pièce d'identité","uiStudio.detailClose":"Fermer","uiStudio.colCheck":"Vérifier","uiStudio.colPriority":"Priorité","uiStudio.colCurrent":"Actuel","uiStudio.colRecommended":"Recommandé","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Examinez d'abord","uiStudio.priorityLow":"Amélioration facultative","uiStudio.highPrioritySection":"Examinez d'abord","uiStudio.lowPrioritySection":"Améliorations facultatives","uiStudio.groupSummary":"articles","uiStudio.fixLabel":"Réparer","uiStudio.copyFixCommand":"Copier l'instruction IA","uiStudio.copiedToClipboard":"Copié","uiStudio.fullPath":"Chemin complet","uiStudio.falsePositiveWarning":"Ce groupe peut contenir des faux positifs","uiStudio.noSuggestions":"Aucune suggestion d'amélioration actuelle","uiStudio.sample.badge":"Aperçu du Pro UI Studio","uiStudio.sample.title":"Vous prévisualisez le UI Studio qui se déverrouille après la mise à niveau vers Pro.","uiStudio.sample.message":"Cet aperçu utilise des exemples de données provenant d’une interface utilisateur d’inventaire de démonstration. De vraies captures d'écran, un historique des révisions et des correctifs basés sur l'IA sont déverrouillés avec Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Histoire","uiStudio.analysis.reportsTitle":"Dernière analyse par cible d'interface utilisateur","uiStudio.analysis.recentCapturesTitle":"Captures récentes","uiStudio.analysis.detailDialog":"Détail de l'analyse","uiStudio.analysis.targetCountLabel":"Cibles analysées","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Suggestions d'amélioration","uiStudio.analysis.verdict.needsFix":"Suggestions d'amélioration","uiStudio.analysis.verdict.review":"Suggestions d'amélioration","uiStudio.analysis.verdict.passed":"Aucune suggestion actuelle","uiStudio.analysis.verdictLabel":"Résumé des améliorations","uiStudio.analysis.thresholds":"Base de révision","uiStudio.analysis.issueSummary.passed":"Aucune suggestion d’amélioration supplémentaire dans le cadre de l’examen actuel.","uiStudio.history.title":"Historique des modifications","uiStudio.history.empty":"Pas d'historique pour l'instant. Lorsqu'un agent IA modifie l'interface utilisateur à l'aide de manage_ui, cela sera automatiquement enregistré.","uiStudio.history.loading":"Chargement...","uiStudio.history.loadingPlace":"Chargement du place actuel...","uiStudio.history.noPlace":"Aucune donnée du place actuel n'est encore disponible. Connectez le WEPPY Plugin et synchronisez un place pour voir l'historique des changements UI.","uiStudio.history.noPlaceAction":"Le place actuel n'est pas encore disponible.","uiStudio.history.error":"Erreur","uiStudio.history.clear":"Clair","uiStudio.history.filter.actions":"Type d'action","uiStudio.history.filter.actionAll":"Tous","uiStudio.history.filter.actionCreate":"Créer","uiStudio.history.filter.actionUpdate":"Mise à jour","uiStudio.history.filter.actionDelete":"Supprimer","uiStudio.history.filter.period":"Période","uiStudio.history.filter.dateAll":"Tous","uiStudio.history.filter.today":"Aujourd'hui","uiStudio.history.filter.yesterday":"Hier","uiStudio.history.filter.last7Days":"7 derniers jours","uiStudio.history.filter.last30Days":"30 derniers jours","uiStudio.history.filter.customRange":"Gamme personnalisée","uiStudio.history.filter.reset":"Réinitialiser","uiStudio.history.filter.from":"Depuis","uiStudio.history.filter.to":"À","uiStudio.history.row.affectedPaths":"Chemins","uiStudio.history.row.mutations":"Modifier les détails","uiStudio.history.row.expand":"▾ Développer","uiStudio.history.row.collapse":"▲ Réduire","uiStudio.history.row.expandDetails":"Afficher les détails de la modification {n}","uiStudio.history.row.collapseDetails":"Masquer les détails des modifications","uiStudio.history.row.toggleDetails":"Toggle modifier les détails","uiStudio.history.row.mutationsEmpty":"Aucun détail de changement","uiStudio.history.row.toolLabel":"Modifications de l'interface utilisateur ({n})","uiStudio.history.row.compare":"Avant/Après","uiStudio.history.row.noBeforeState":"Non avant l'état","uiStudio.history.row.noAfterState":"Non après l'état","uiStudio.history.row.qualityPlan":"Direction de la conception","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: indisponible","uiStudio.history.row.designCheckNone":"Suggestions : aucune","uiStudio.history.selection.deleteSelected":"Supprimer la sélection","uiStudio.history.selection.selectAll":"Sélectionner tout","uiStudio.history.selection.clearSelection":"Effacer la sélection","uiStudio.history.confirm.deleteRequestsTitle":"Supprimer les enregistrements de modifications","uiStudio.history.confirm.deleteRequestsMessage":"Les enregistrements de modifications sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.history.confirm.clearRequestsTitle":"Effacer l'historique des modifications","uiStudio.history.confirm.clearRequestsMessage":"Cela efface l’historique actuel des changements de lieu. Les instances Studio ne sont pas affectées.","uiStudio.history.confirm.cascadeOption":"Supprimez également les captures d'écran liées","uiStudio.history.drawer.close":"Fermer","uiStudio.actions.previewAgain":"Aperçu à nouveau","uiStudio.actions.deleteSnapshot":"Supprimer cette capture d'écran","uiStudio.actions.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.actions.captureCurrentState":"Capturer l'état actuel","uiStudio.actions.checkSuggestionsAgain":"Revérifiez les suggestions","uiStudio.actions.previewRunning":"Capturer…","uiStudio.actions.previewRunningDetail":"Le nouvel ID de fichier de capture d'écran apparaîtra une fois la capture terminée.","uiStudio.actions.previewNeedsSaveCheck":"Capture terminée, la sauvegarde doit être révisée","uiStudio.actions.previewSaved":"Nouvelle capture d'écran enregistrée","uiStudio.actions.previewComplete":"Capture terminée","uiStudio.actions.previewSavedDetail":"Les captures d'écran existantes sont conservées ; cela a été enregistré en tant que nouveau fichier.","uiStudio.actions.previewSavedPathMissing":"Un nouvel ID de capture d'écran a été renvoyé, mais le chemin du fichier enregistré n'a pas pu être confirmé.","uiStudio.actions.previewSnapshotIdMissing":"Le nouvel ID de capture d'écran n'a pas pu être confirmé. Actualisez la liste pour vérifier si elle a été enregistrée.","uiStudio.actions.more":"Plus","uiStudio.gallery.selection.selectedCount":"choisi","uiStudio.confirm.deleteSnapshotTitle":"Supprimer la capture d'écran","uiStudio.confirm.deleteSnapshotMessage":"Seul ce fichier de capture d'écran sera supprimé (l'instance Studio est conservée).","uiStudio.confirm.deleteBatchTitle":"Supprimer les captures d'écran sélectionnées","uiStudio.confirm.deleteBatchMessage":"Les captures d'écran sélectionnées seront supprimées. Cette action ne peut pas être annulée.","uiStudio.gallery.selectMode":"Sélectionner","uiStudio.gallery.exitSelectMode":"Annuler","uiStudio.gallery.selectAll":"Sélectionner tout","uiStudio.gallery.clearSelection":"Effacer la sélection","uiStudio.gallery.deleteSelected":"Supprimer la sélection","common.cancel":"Annuler","common.delete":"Supprimer","uiStudio.storage.title":"UI Studio Données enregistrées","uiStudio.storage.usageLabel":"Utilisé","uiStudio.storage.historyBytes":"Changer l'historique","uiStudio.storage.snapshotBytes":"Captures d'écran","uiStudio.storage.requestCount":"Modifier les enregistrements","uiStudio.storage.mutationCount":"Modifier les détails","uiStudio.storage.snapshotCount":"Captures d'écran","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Dernier nettoyage automatique","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"libéré","uiStudio.storage.lastRunErrors":"Erreurs","uiStudio.storage.loading":"Chargement...","uiStudio.cleanup.policy.title":"Politique de suppression automatique","uiStudio.cleanup.policy.modeOff":"Désactivé","uiStudio.cleanup.policy.modeAge":"Basé sur l'âge","uiStudio.cleanup.policy.modeSize":"Basé sur la taille","uiStudio.cleanup.policy.cascade":"Supprimez également les captures d'écran liées","uiStudio.cleanup.policy.save":"Enregistrer la politique","uiStudio.cleanup.policy.runNow":"Courez maintenant","uiStudio.cleanup.policy.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmer la politique","uiStudio.cleanup.policy.confirm.messageStrict":"L'application de cette politique entraînera la suppression immédiate","uiStudio.cleanup.policy.confirm.requests":"modifier les enregistrements","uiStudio.cleanup.policy.confirm.snapshots":"captures d'écran","uiStudio.cleanup.policy.confirm.freed":"libéré — Postuler ?","uiStudio.cleanup.keepLastNDays":"Conserver les {n} derniers jours","uiStudio.cleanup.selectedDelete":"Supprimer la sélection…","uiStudio.cleanup.deleteAll":"Supprimer tout…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmer le nettoyage","uiStudio.cleanup.cleanupConfirmMessage":"Tous les éléments sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Les enregistrements de modifications et les captures d'écran datant de plus de 7 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Les enregistrements de modifications et les captures d'écran datant de plus de 30 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.all":"Les enregistrements de modifications enregistrées et les captures d'écran seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.label":"Nettoyage manuel","uiStudio.cleanup.studioPreservedNote":"Cela supprime uniquement les enregistrements de modifications enregistrées et les captures d'écran sur le disque ; Les instances Roblox Studio ne sont pas affectées.","uiStudio.history.sample.bannerBadge":"Aperçu de l'historique des modifications Pro","uiStudio.history.sample.bannerTitle":"Vous prévisualisez l'historique des modifications de l'interface utilisateur qui se déverrouille après la mise à niveau vers Pro.","uiStudio.history.sample.bannerMessage":"Cet aperçu utilise des exemples de données. Historique réel des modifications, comparaison avant/après et déverrouillage de suppression par lots avec Pro.","uiStudio.fix.touchTarget.label":"Taille de la cible tactile","uiStudio.fix.touchTarget.description":"Vérifie si les commandes sont suffisamment grandes pour appuyer confortablement sur mobile.","uiStudio.fix.touchTarget.howToFix":"Augmentez la taille du bouton à au moins 44 x 44 px ou agrandissez la zone tactile avec UIPadding.","uiStudio.fix.contrast.label":"Contraste du texte","uiStudio.fix.contrast.description":"Vérifie si le contraste du texte et de l’arrière-plan respecte les directives d’accessibilité.","uiStudio.fix.contrast.howToFix":"Utilisez un TextColor3 plus clair ou assombrissez le BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Les icônes Emoji peuvent être des faux positifs lorsque leur couleur est corrigée.","uiStudio.fix.textScaled.label":"Utilisation à l'échelle du texte","uiStudio.fix.textScaled.description":"TextScaled sans UITextSizeConstraint peut interrompre les mises en page lorsque le texte se développe.","uiStudio.fix.textScaled.howToFix":"Ajoutez un enfant UITextSizeConstraint au TextLabel et définissez MaxTextSize.","uiStudio.fix.safezone.label":"Placement en zone de sécurité","uiStudio.fix.safezone.description":"Vérifie si les contrôles restent à l’intérieur des zones de sécurité de la plate-forme.","uiStudio.fix.safezone.howToFix":"Déplacez la position à l’intérieur de la zone de sécurité ou réduisez le cadre parent.","uiStudio.fix.minTextSize.label":"Taille de police minimale","uiStudio.fix.minTextSize.description":"Vérifie si le texte est trop petit pour être lu confortablement.","uiStudio.fix.minTextSize.howToFix":"Augmentez TextSize à au moins 14 pour le corps du texte.","uiStudio.sample.history.request1.label":"Création initiale de la disposition du HUD","uiStudio.sample.history.request2.label":"Mise à jour de la conception modale de l'inventaire","uiStudio.sample.history.request3.label":"Mise à jour des couleurs du HUD HealthBar","uiStudio.sample.history.request4.label":"Cibles tactiles du bouton de l'onglet Développer l'inventaire","uiStudio.sample.history.request5.label":"Fenêtre contextuelle Supprimer les paramètres","uiStudio.sample.history.request6.label":"Ajouter un composant de mini-carte HUD","uiStudio.sample.history.request1.mutation1.diff":"Cadre créé + 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":"Définir le point d'ancrage, la position et la taille","uiStudio.sample.history.request1.mutation5.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 pour un meilleur contraste","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, définissez BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (ton rouge)","uiStudio.sample.history.request3.mutation2.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request4.mutation1.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui supprimé (interface utilisateur réservée aux paramètres uniquement)","uiStudio.sample.history.request6.mutation1.diff":"Tentative de création de Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Définir la taille, la position et la transparence de l'arrière-plan","uiStudio.sample.history.request6.mutation3.diff":"Interrompu par le redémarrage du serveur lors de la configuration d'ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Capture d'écran partielle enregistrée","uiStudio.sample.history.request6.mutation3.error":"server_restart : connexion perdue","uiStudio.sample.history.request6.mutation4.error":"capture d'écran partielle : couches manquantes","uiStudio.sample.history.detail.backgroundColor":"Couleur de fond","uiStudio.sample.history.detail.anchorPoint":"Ancre","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Taille","uiStudio.sample.history.detail.textColor":"Couleur du texte","uiStudio.sample.history.detail.textSize":"Taille du texte","uiStudio.sample.history.detail.borderSize":"Taille de la bordure","uiStudio.sample.history.detail.borderColor":"Couleur de la bordure","settings.dataHistory.title":"Données et historique","settings.dataHistory.title.tooltip":"Gérez les données enregistrées du tableau de bord en un seul endroit.","settings.dataHistory.collapse":"Réduire {title}","settings.dataHistory.expand":"Développez {title}","settings.dataHistory.scope":"Projet actuel","settings.dataHistory.scope.tooltip":"Des actions claires s’appliquent au projet en cours et au lieu actif le cas échéant.","settings.dataHistory.intro":"Consultez les données enregistrées du tableau de bord, ouvrez la page associée ou effacez les enregistrements stockés à partir d'un seul endroit.","settings.dataHistory.toolsActivity.title":"Activité de l'outil","settings.dataHistory.toolsActivity.description":"Exécutions d'outils enregistrées affichées sur la page Outils.","settings.dataHistory.toolStats.title":"Statistiques d'utilisation des outils","settings.dataHistory.toolStats.description":"Nombre d’outils agrégés et totaux d’état.","settings.dataHistory.syncLog.title":"Journal de synchronisation","settings.dataHistory.syncLog.description":"Événements de synchronisation de fichiers enregistrés pour le lieu actif.","settings.dataHistory.playtest.title":"Rapports de tests de jeu","settings.dataHistory.playtest.description":"Rapports et journaux de tests de jeu automatisés enregistrés.","settings.dataHistory.projectChanges.title":"Prorésumé des modifications du projet","settings.dataHistory.projectChanges.description":"Résumés enregistrés des modifications du projet.","settings.dataHistory.connectionLog.title":"Journal de connexion","settings.dataHistory.connectionLog.description":"Enregistrement des événements de connexion MCP et Studio.","settings.dataHistory.uiStudio.title":"Historique et captures d'écran de UI Studio","settings.dataHistory.uiStudio.tooltip":"Gérez les enregistrements de modifications UI Studio enregistrés, les captures d'écran et la politique de suppression automatique.","settings.dataHistory.uiStudio.description":"Enregistrements de modifications, captures d'écran et politique de nettoyage UI Studio enregistrés.","settings.dataHistory.uiStudio.clear.title":"Effacer les données enregistrées UI Studio ?","settings.dataHistory.uiStudio.clear.message":"Cela supprime uniquement les enregistrements de modifications et les captures d'écran UI Studio enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.uiStudio.clear.success":"Les données enregistrées par UI Studio ont été effacées.","settings.dataHistory.uiStudio.clear.failed":"Échec de la suppression des données enregistrées UI Studio.","settings.dataHistory.metric.unavailable":"Indisponible","settings.dataHistory.metric.sizeUnavailable":"taille indisponible","settings.dataHistory.metric.records":"enregistrements","settings.dataHistory.metric.runs":"court","settings.dataHistory.metric.sessions":"séances","settings.dataHistory.metric.reports":"rapports","settings.dataHistory.open":"Ouvrir","settings.dataHistory.clear.title":"Effacer les données enregistrées ?","settings.dataHistory.clear.message":"Cela supprime uniquement les enregistrements de tableau de bord enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.clear.success":"Données enregistrées effacées.","settings.dataHistory.clear.failed":"Échec de la suppression des données enregistrées.","uiStudio.history.sample.tooltip":"Passez à Pro pour débloquer l'historique complet","toast.serverConnected":"Serveur MCP connecté","toast.serverDisconnected":"Serveur MCP déconnecté","toast.pluginConnected":"Plugin connecté","toast.pluginDisconnected":"Plugin déconnecté","toast.clearSuccess":"Effacé avec succès","toast.clearFailed":"Échec de la suppression des données","common.clear":"Clair","settings.license.activate":"Activer la licence","settings.license.refresh":"Actualiser la licence","settings.license.keyInput":"Clé de licence","settings.license.disconnected":"Déconnecté","settings.license.disconnected.tooltip":"Reconnectez-vous au serveur MCP pour gérer les actions de licence à partir de WEPPY Dashboard.","settings.license.live.tooltip":"Les actions de licence sont immédiatement envoyées au serveur MCP.","settings.license.status.activationRequired":"Activation requise","settings.license.status.activationRequired.tooltip":"L'activation manuelle de la licence est requise avant que WEPPY Dashboard puisse actualiser ce statut.","settings.license.status.grace":"Grâce","settings.license.status.grace.tooltip":"La vérification Provider est temporairement indisponible, mais l'accès Pro reste actif pendant la période de grâce.","settings.license.status.graceBilling.tooltip":"L'accès Pro est toujours disponible pendant une période de grâce liée à la facturation.","settings.license.detail.graceBilling":"L'accès Pro reste disponible pendant une période de grâce de facturation.","settings.license.detail.graceProviderUnavailable":"Provider indisponible. L'accès Pro reste actif pendant le mode grâce.","settings.license.detail.manualActivation":"Activation manuelle requise pour restaurer l'accès à Pro.","settings.license.detail.missingSessionToken":"L'actualisation est bloquée car le jeton de session en cours est manquant.","settings.license.detail.refreshRecommended":"La vérification des licences devrait être actualisée prochainement.","connection.agents.kill":"Tuer","connection.agents.kill.title":"Tuer l'agent ?","connection.agents.killed":"Agent tué","connection.agents.killFailed":"Impossible de tuer l'agent","connection.agents.lastCommand":"Dernière commande","connection.agents.lastCommand.tooltip":"Appel d'outil le plus récent exécuté par cet agent","connection.agents.lastSeen":"Vu pour la dernière fois","connection.agents.lastSeen.tooltip":"Battement de cœur ou activité la plus récente de cet agent","connection.clear.title":"Effacer le journal de connexion ?","connection.clear.message":"Cela supprime définitivement le journal de connexion stocké pour le projet en cours.","sync.clear.title":"Effacer le journal de synchronisation ?","sync.clear.message":"Cela supprime définitivement le journal de synchronisation stocké pour le lieu actuel.","playtest.clear.title":"Effacer l'historique des tests ?","playtest.clear.message":"Cela supprime définitivement les rapports de test de jeu stockés pour le lieu actuel.","changelog.clear.title":"Effacer le journal des modifications ?","changelog.clear.message":"Cela supprime définitivement le journal des modifications stocké pour le lieu actuel.","sync.status.placePath":"Placer le chemin","sync.status.placePath.tooltip":"Répertoire de lieu actif où les fichiers de l'explorateur sont synchronisés.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Zone représentative","changelog.card.verification":"Vérification","uiStudio.tabs.analysis.tooltip":"Parcourez les écrans d’interface utilisateur capturés par l’IA et trouvez rapidement quelles interfaces utilisateur doivent être améliorées.","uiStudio.tabs.history.tooltip":"Chaque changement d'interface utilisateur effectué par l'IA, dans l'ordre. Comparez les écrans avant et après.","uiStudio.title.tooltip":"Un endroit central pour examiner les écrans d’interface utilisateur générés par l’IA et les suggestions d’amélioration.","uiStudio.analysis.reportsTitle.tooltip":"Affiche le dernier résumé de capture et de suggestion par interface utilisateur (par exemple, fenêtre d'inventaire, menu principal).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Certaines améliorations ont été trouvées dans cette interface utilisateur. Cliquez sur la carte pour plus de détails.","uiStudio.analysis.verdict.passed.tooltip":"Aucune amélioration suggérée en vertu des seuils d'examen actuels.","uiStudio.analysis.counts.tooltip":"« Principal » sont les éléments clés à examiner en premier ; Les « notes » sont des raffinements agréables à avoir.","uiStudio.analysis.thresholds.tooltip":"Ensemble de seuils utilisé pour cet examen (par défaut ou personnalisé).","uiStudio.analysis.recentCapturesTitle.tooltip":"Toutes les captures récemment enregistrées par ordre chronologique.","uiStudio.gallery.selectAll.tooltip":"Sélectionnez toutes les captures visibles à la fois.","uiStudio.gallery.clearSelection.tooltip":"Effacez la sélection actuelle.","uiStudio.gallery.deleteSelected.tooltip":"Supprimez uniquement les fichiers de capture sélectionnés. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.gallery.cardCheckbox.tooltip":"Sélectionnez cette capture. Choisissez-en plusieurs pour les supprimer ensemble.","uiStudio.detailClose.tooltip":"Fermez ce panneau de détails.","uiStudio.actions.captureCurrentState.tooltip":"Enregistrez l'interface utilisateur actuellement affichée dans Studio en tant que nouvelle capture. Les captures existantes sont conservées.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recalculez les suggestions pour cette capture sans prendre une nouvelle capture d'écran.","uiStudio.actions.more.tooltip":"Ouvrez des actions supplémentaires.","uiStudio.actions.deleteSnapshot.tooltip":"Supprimez uniquement ce fichier de capture. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.capturedAt.tooltip":"Quand cet écran a été capturé.","uiStudio.scope.tooltip":"Portée de capture (plein écran ou interface utilisateur spécifique).","uiStudio.target.tooltip":"Chemin exact de l’instance d’interface utilisateur capturée.","uiStudio.briefId.tooltip":"Identifiant du cahier des charges qui a produit cette interface utilisateur.","uiStudio.analysis.verdictLabel.tooltip":"Verdict d'amélioration globale pour cette capture.","uiStudio.suggestionGroup.tooltip":"Suggestions du même genre regroupées. Cliquez pour agrandir ou réduire.","uiStudio.groupSummary.tooltip":"Nombre d'éléments d'interface utilisateur correspondant à ce groupe.","uiStudio.colCurrent.tooltip":"La valeur actuellement appliquée.","uiStudio.colRecommended.tooltip":"La valeur recommandée.","uiStudio.copyFixCommand.tooltip":"Copiez une invite demandant à l'IA de résoudre ce problème.","uiStudio.falsePositiveWarning.tooltip":"Cette vérification peut produire des faux positifs – vérifiez avant de postuler.","uiStudio.history.filter.actions.tooltip":"Filtrez les enregistrements en fonction du type de modification apportée par l'IA.","uiStudio.history.filter.period.tooltip":"Filtrer les enregistrements par plage horaire.","uiStudio.history.filter.from.tooltip":"Date de début de la requête.","uiStudio.history.filter.to.tooltip":"Date de fin de la requête.","uiStudio.history.filter.actionAll.tooltip":"Montrez tout type d'action.","uiStudio.history.filter.actionCreate.tooltip":"Afficher uniquement les actions qui ont créé une nouvelle interface utilisateur.","uiStudio.history.filter.actionUpdate.tooltip":"Afficher uniquement les actions qui ont mis à jour une interface utilisateur existante.","uiStudio.history.filter.actionDelete.tooltip":"Afficher uniquement les actions qui ont supprimé une interface utilisateur.","uiStudio.history.filter.dateAll.tooltip":"Afficher l'historique complet.","uiStudio.history.filter.today.tooltip":"Afficher uniquement les modifications apportées à aujourd'hui.","uiStudio.history.filter.yesterday.tooltip":"Afficher uniquement les modifications d'hier.","uiStudio.history.filter.last7Days.tooltip":"Afficher les modifications des 7 derniers jours.","uiStudio.history.filter.last30Days.tooltip":"Afficher les modifications des 30 derniers jours.","uiStudio.history.filter.customRange.tooltip":"Choisissez une date de début et de fin personnalisée.","uiStudio.history.filter.reset.tooltip":"Réinitialisez tous les filtres aux valeurs par défaut.","uiStudio.history.title.tooltip":"Une chronologie de chaque modification de l'interface utilisateur effectuée par l'IA.","uiStudio.history.clear.tooltip":"Supprimez tous les enregistrements de modifications pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.history.row.compare.tooltip":"Comparez les écrans avant et après. Cliquez pour ouvrir la vue de comparaison complète.","uiStudio.history.row.extraPaths.tooltip":"Nombre d'interfaces utilisateur supplémentaires modifiées dans cette action.","uiStudio.history.row.noBeforeState.tooltip":"Aucune capture enregistrée avant ce changement.","uiStudio.history.row.noAfterState.tooltip":"Aucune capture enregistrée après ce changement.","uiStudio.history.row.affectedPaths.tooltip":"Nombre d'interfaces utilisateur affectées par cette action.","uiStudio.history.row.mutations.tooltip":"Nombre de modifications détaillées (par exemple, modifications de propriétés).","uiStudio.history.row.qualityPlan.tooltip":"Brève direction de conception utilisée pour ce changement.","uiStudio.history.row.designCheck.tooltip":"Résumé des suggestions de contrôle de conception après modification.","uiStudio.history.row.toggleDetails.tooltip":"Afficher ou masquer une ventilation par ligne de ce qui a changé.","uiStudio.compare.before.tooltip":"L'écran a été enregistré juste avant que l'IA n'effectue la modification.","uiStudio.compare.after.tooltip":"L'écran a été enregistré juste après que l'IA ait effectué la modification.","uiStudio.compare.path.tooltip":"Chemin d'accès à l'instance d'interface utilisateur pour cet écran.","uiStudio.storage.title.tooltip":"Utilisation du disque des enregistrements de modifications et des captures d'écran de UI Studio.","uiStudio.storage.usageLabel.tooltip":"Espace disque actuellement utilisé par UI Studio pour ce projet.","uiStudio.storage.historyBytes.tooltip":"Espace occupé par les données d'enregistrement de modification (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Espace occupé par les fichiers image PNG capturés.","uiStudio.storage.requestCount.tooltip":"Nombre d'actions où l'IA a modifié l'interface utilisateur.","uiStudio.storage.mutationCount.tooltip":"Nombre de modifications détaillées dans les actions (une modification de propriété = 1).","uiStudio.storage.snapshotCount.tooltip":"Nombre de fichiers d'images de capture enregistrés.","uiStudio.storage.lastRun.tooltip":"Quand la stratégie de nettoyage automatique a été exécutée pour la dernière fois et ce qu’elle a supprimé.","uiStudio.cleanup.label.tooltip":"Nettoyez manuellement les enregistrements et les captures de modifications quand vous le souhaitez.","uiStudio.cleanup.keep7.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 7 jours.","uiStudio.cleanup.keep30.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 30 jours.","uiStudio.cleanup.deleteAll.tooltip":"Supprimez chaque enregistrement de modification et capture pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.cleanup.policy.title.tooltip":"Règles qui suppriment automatiquement les captures anciennes ou volumineuses.","uiStudio.cleanup.policy.modeOff.tooltip":"Désactivez le nettoyage automatique. Les données restent jusqu'à ce que vous les supprimiez manuellement.","uiStudio.cleanup.policy.modeAge.tooltip":"Supprimez automatiquement les données antérieures au nombre de jours configuré.","uiStudio.cleanup.policy.modeSize.tooltip":"Lorsque l'utilisation totale dépasse la limite, les données les plus anciennes sont supprimées en premier.","uiStudio.cleanup.policy.agePreset.tooltip":"Supprimez les données datant de plus de plusieurs jours.","uiStudio.cleanup.policy.ageInput.tooltip":"Entrez n'importe quelle valeur comprise entre 1 et 365 jours.","uiStudio.cleanup.policy.sizePreset.tooltip":"Gardez l’utilisation totale en dessous de cette taille.","uiStudio.cleanup.policy.sizeInput.tooltip":"Saisissez n'importe quelle valeur comprise entre 50 Mo et 10 000 Mo (10 Go).","uiStudio.cleanup.policy.cascade.tooltip":"Supprimez également les images de capture liées à ces enregistrements. Si cette option est désactivée, les images restent.","uiStudio.cleanup.policy.save.tooltip":"Enregistrez la règle de nettoyage actuelle. Il fonctionne désormais en arrière-plan.","uiStudio.cleanup.policy.runNow.tooltip":"Exécutez la règle actuelle une fois maintenant, sans attendre la prochaine exécution planifiée.","settings.license.refresh.tooltip":"Récupérez à nouveau l'état actuel à partir du serveur de licences. Utile lorsqu'un changement de facturation n'est pas encore apparu.","settings.license.reset.tooltip":"Supprimez la clé de licence actuellement enregistrée. Utilisez-le avant d'activer avec une clé différente.","settings.license.activate.tooltip":"Activez les fonctionnalités Pro avec la clé de licence saisie.","tier.upgrade.tooltip":"Voir les fonctions Pro et les options d’achat.","settings.language.auto.tooltip":"Suivez la langue du système d'exploitation. Revient à l'anglais lorsqu'il n'est pas pris en charge.","settings.dataHistory.open.tooltip":"Ouvrez la page qui montre cet élément en détail.","settings.dataHistory.clear.tooltip":"Supprimez uniquement les enregistrements enregistrés pour cet élément. Les données Roblox Studio ne sont pas modifiées.","settings.dataHistory.toggle.tooltip":"Réduisez ou développez cette section.","settings.dataHistory.toolsActivity.metric.tooltip":"Nombre d'exécutions d'outils enregistrées et espace disque qu'elles utilisent.","settings.dataHistory.toolStats.metric.tooltip":"Nombre total d'exécutions et de sessions agrégées.","settings.dataHistory.syncLog.metric.tooltip":"Nombre d'événements de synchronisation enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.playtestReports.metric.tooltip":"Nombre de rapports de tests de jeu enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.projectChanges.metric.tooltip":"Nombre de résumés de modifications de projet enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.connectionLog.metric.tooltip":"Nombre d'événements de connexion enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio modifie le nombre d'enregistrements et de captures, ainsi que l'utilisation totale du disque.","uiStudio.designCheckResultsTitle":"Suggestions de contrôle de conception","uiStudio.designCheckResultsTitle.tooltip":"Toutes les suggestions d'amélioration trouvées dans cette capture.","uiStudio.actions.designCheckAgain":"Revérifier","uiStudio.actions.designCheckRunning":"Vérification des suggestions...","uiStudio.actions.designCheckRunningDetail":"Les décomptes d’articles examinés en premier, recommandés et facultatifs apparaîtront une fois la vérification terminée.","uiStudio.actions.designCheckComplete":"Vérification des suggestions terminée","uiStudio.actions.designCheckNoSnapshotSaved":"Cette action n'enregistre pas un nouveau fichier de capture d'écran.","uiStudio.sample.designCheck.contrast":"Le contraste du texte est inférieur à {expected} (actuel {actual}). Ajustez TextColor3 ou BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"La cible tactile est inférieure à {expected} (actuel {actual}). Augmentez la taille ou le rembourrage.","uiStudio.sample.designCheck.minTextSize":"TextSize est inférieur à {expected} (actuel {actual}). Augmentez-le pour plus de lisibilité.","uiStudio.gallery.priorityHighBadge.tooltip":"Nombre de suggestions à examiner en premier. Cliquez pour plus de détails.","uiStudio.gallery.priorityMediumBadge.tooltip":"Nombre de suggestions recommandées.","uiStudio.priorityMedium":"Examen recommandé","uiStudio.mediumPrioritySection":"Examen recommandé","uiStudio.gallery.priorityLowBadge.tooltip":"Nombre d'améliorations facultatives.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Erreur","uiStudio.analysis.expandChildren":"Afficher les cibles enfants","uiStudio.analysis.openDetail":"Détail ouvert","uiStudio.analysis.childTargets":"Enfants cibles","uiStudio.analysis.childDetailHint":"Ouvrir les détails de la cible enfant","uiStudio.compare.before":"Avant","uiStudio.compare.after":"Après","uiStudio.history.drawer.changeDetails":"Modifier les détails","uiStudio.gallery.cardCheckbox":"Sélectionnez une capture d'écran","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.place.selector":"Asset place","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Fermer","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.currentPriorityTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.recentPriorityHelp":"Requests the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.pinnedHelp":"Requests the pinned Studio unless the agent names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Mise à jour du format Sync disponible","sync.migration.description":"Vérifiez les changements de métadonnées avant de faire passer ce Place du format Sync v2 au v3.","sync.migration.status.ready":"Prêt à vérifier","sync.migration.status.blocked":"Bloqué","sync.migration.preview":"Vérifier les changements","sync.migration.summary.add":"Ajouter","sync.migration.summary.modify":"Modifier","sync.migration.summary.delete":"Supprimer","sync.migration.summary.blocked":"Bloqué","sync.migration.changes":"Changements de métadonnées","sync.migration.blockers":"Éléments à résoudre","sync.migration.operation.add":"ajouter","sync.migration.operation.modify":"modifier","sync.migration.operation.delete":"supprimer","sync.migration.reason.serializer_regeneration":"Réécrit les métadonnées dans le format canonique v3.","sync.migration.reason.volatile_metadata_removal":"Supprime les métadonnées Sync temporaires.","sync.migration.reason.redundant_empty_metadata":"Supprime les métadonnées vides redondantes.","sync.migration.reason.runtime_ignore_policy":"Met à jour la règle d’exclusion du runtime gérée.","sync.migration.reason.reverse_pending":"Appliquez ou abandonnez d’abord les changements locaux en attente vers Studio.","sync.migration.reason.conflict":"Résolvez d’abord le conflit entre les fichiers locaux et Studio.","sync.migration.reason.local_canonical_change":"Vérifiez d’abord les métadonnées canoniques modifiées localement.","sync.migration.reason.source_mutation_detected":"Un fichier source utilisateur a changé pendant la validation.","sync.migration.blocked":"Résolvez les conflits Sync avant la mise à jour","sync.migration.stale":"L’aperçu a changé. Vérifiez la différence la plus récente.","sync.migration.error":"Impossible de mettre à jour le format Sync. Réessayez.","sync.migration.refresh":"Actualiser l’aperçu","sync.migration.refreshing":"Actualisation…","sync.migration.applying":"Application…","sync.migration.apply":"Appliquer la mise à jour","sync.migration.confirm.title":"Appliquer la mise à jour du format Sync ?","sync.migration.confirm.message":"Les métadonnées Sync indiquées seront sauvegardées puis mises à jour. Vos fichiers source Luau ne seront pas modifiés.","changelog.ownership.showGenerated":"Afficher les métadonnées générées","changelog.ownership.userSource":"Source utilisateur","changelog.ownership.canonicalMirror":"Métadonnées du miroir","changelog.ownership.generated":"Généré"},$y=["en","ko","es","pt-br","ja","id","de","fr-fr"],Ta="auto",Il={en:By,ko:Wy,es:Fy,"pt-br":Ky,ja:Yy,id:Gy,de:Vy,"fr-fr":Xy},An="dashboard-locale";function Ol(i){return $y.includes(i)}function Qy(){const n=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return n==="ko"||n.startsWith("ko-")?"ko":n==="pt-br"?"pt-br":n==="ja"||n.startsWith("ja-")?"ja":n==="es"||n.startsWith("es-")?"es":n==="id"||n.startsWith("id-")?"id":n==="de"||n.startsWith("de-")?"de":n==="fr"||n.startsWith("fr-")?"fr-fr":"en"}function ep(){if(typeof localStorage<"u"){const i=localStorage.getItem(An);if(i===Ta)return Ta;if(i&&Ol(i))return i}return Ta}function tp(i){return i===Ta?Qy():i}const zp=R.createContext(null);function Zy({children:i}){const[n,r]=R.useState(ep),[d,u]=R.useState(()=>tp(ep())),p=R.useCallback((y,h)=>{const v=Il[d]??Il.en??{};if(y in v)return v[y];const P=Il.en;return P&&y in P?P[y]:h!==void 0?h:y},[d]),g=R.useCallback(y=>{typeof localStorage<"u"&&(y===Ta?localStorage.removeItem(An):Ol(y)?localStorage.setItem(An,y):localStorage.setItem(An,"en"));const h=y===Ta?Ta:Ol(y)?y:"en";r(h),u(tp(h))},[]);return R.createElement(zp.Provider,{value:{locale:d,selectedLocale:n,t:p,setLocale:g}},i)}function Uo(){const i=R.useContext(zp);if(!i)throw new Error("useLocale must be used within a LocaleProvider");return i}const Jy="_container_6jg7e_2",ef="_toast_6jg7e_14",tf="_slideIn_6jg7e_1",of="_success_6jg7e_39",af="_info_6jg7e_44",sf="_warning_6jg7e_49",nf="_error_6jg7e_54",Dl={container:Jy,toast:ef,slideIn:tf,success:of,info:af,warning:sf,error:nf},Hp=R.createContext(null),rf=3e3;function lf({children:i}){const[n,r]=R.useState([]),d=R.useRef(0),u=R.useCallback((p,g="info")=>{const y=d.current++;r(h=>[...h,{id:y,message:p,type:g}]),setTimeout(()=>{r(h=>h.filter(v=>v.id!==y))},rf)},[]);return x.jsxs(Hp.Provider,{value:{show:u},children:[i,x.jsx("div",{className:Dl.container,children:n.map(p=>x.jsx("div",{className:`${Dl.toast} ${Dl[p.type]}`,children:p.message},p.id))})]})}function df(){const i=R.useContext(Hp);return i||{show:()=>{}}}function uf(){const{level:i}=_n(),{show:n}=df(),{t:r}=Uo(),d=R.useRef(null);return R.useEffect(()=>{const u=d.current;d.current=i,u!==null&&u!==i&&(u==="disconnected"&&i==="serverOnly"?n(r("toast.serverConnected","MCP 서버 연결됨"),"success"):u==="serverOnly"&&i==="studioConnected"?n(r("toast.pluginConnected","플러그인 연결됨"),"success"):(u==="serverOnly"||u==="studioConnected")&&i==="disconnected"?n(r("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):u==="studioConnected"&&i==="serverOnly"&&n(r("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[i,n,r]),null}const cf="_wrapper_x0nim_2",pf="_tooltip_x0nim_11",gf="_tooltipVisible_x0nim_30",El={wrapper:cf,tooltip:pf,tooltipVisible:gf},li=8,xn=6;function Ft({text:i,children:n}){const r=R.useRef(null),d=R.useRef(null),[u,p]=R.useState(!1),[g,y]=R.useState("top"),[h,v]=R.useState("center"),[P,w]=R.useState(null),D=i.trim(),U=R.useCallback(()=>{const te=r.current,K=d.current;if(!te||!K)return;const $=te.getBoundingClientRect(),G=K.getBoundingClientRect(),he=window.innerWidth,De=window.innerHeight;let E="top";$.top-G.height-xn<li&&$.bottom+G.height+xn<=De-li&&(E="bottom");let Q="center";const Pe=$.left+$.width/2,ce=G.width/2;Pe-ce<li?Q="left":Pe+ce>he-li&&(Q="right");const He=E==="top"?$.top-G.height-xn:$.bottom+xn;let ve;Q==="left"?ve=$.left:Q==="right"?ve=$.right-G.width:ve=Pe-ce,ve=Math.max(li,Math.min(ve,he-G.width-li)),y(E),v(Q),w({top:He,left:ve})},[]);if(R.useLayoutEffect(()=>{u&&U()},[u,U]),R.useEffect(()=>{if(!u)return;const te=()=>U();return window.addEventListener("scroll",te,!0),window.addEventListener("resize",te),()=>{window.removeEventListener("scroll",te,!0),window.removeEventListener("resize",te)}},[u,U]),!D)return x.jsx(x.Fragment,{children:n});const B=()=>p(!0),z=()=>p(!1),N=x.jsx("span",{ref:d,className:[El.tooltip,u?El.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":h,"data-vertical":g,style:P?{top:P.top,left:P.left}:{top:-9999,left:-9999,visibility:"hidden"},children:D});return x.jsxs(x.Fragment,{children:[x.jsx("span",{ref:r,className:El.wrapper,"data-tooltip-text":D,onMouseEnter:B,onMouseLeave:z,onFocus:B,onBlur:z,children:n}),typeof document<"u"?Un.createPortal(N,document.body):null]})}function hf(i){return i==="auto"||i==="polar"||i==="gumroad"?i:void 0}function mf(i){if(!i||typeof i!="object")return!1;const n=i.status;return(i.tier==="basic"||i.tier==="pro")&&(n==="active"||n==="grace"||n==="invalid"||n==="revoked"||n==="unlicensed"||n==="unknown")}function Lp(i){return i&&typeof i=="object"&&"data"in i&&i.data?i.data:i}function _p(i){if(!i||typeof i!="object")return null;if(mf(i))return i;const n=i;if(typeof n.canUsePro!="boolean"||typeof n.status!="string"||n.status!=="active"&&n.status!=="grace"&&n.status!=="invalid"&&n.status!=="revoked"&&n.status!=="unlicensed"&&n.status!=="unknown")return null;const r=hf(n.provider);return{tier:n.canUsePro?"pro":"basic",status:n.status,...typeof n.statusDetail=="string"?{statusDetail:n.statusDetail}:{},...typeof n.maskedKey=="string"?{maskedKey:n.maskedKey}:{},...r?{provider:r}:{},refreshRequired:n.refreshRequired===!0,...typeof n.refreshBlockedReason=="string"?{refreshBlockedReason:n.refreshBlockedReason}:{}}}async function Np(i="auto"){const n=await Et.get("/api/dashboard/license/status",{provider:i});return _p(Lp(n))}function Zl(i){const n=Lp(i),r=n,d=_p(n),u=typeof(r==null?void 0:r.reasonCode)=="string"?r.reasonCode:void 0;return{ok:(r==null?void 0:r.ok)===!0,license:d?{...d,refreshRequired:d.refreshRequired||u==="missing_session_token",refreshBlockedReason:d.refreshBlockedReason??(u==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(r==null?void 0:r.message)=="string"?r.message:null,reasonCode:u,recoverable:(r==null?void 0:r.recoverable)===!0}}async function Mb(i){const n=i.provider??"auto",r=await Et.post("/api/dashboard/license/activate",{provider:n,licenseKey:i.licenseKey,clientType:"dashboard"});return Zl(r)}async function zb(i={}){const n=i.provider??"auto",r=await Et.post("/api/dashboard/license/refresh",{provider:n,clientType:"dashboard"});return Zl(r)}async function Hb(i={}){const n=i.provider??"auto",r=await Et.post("/api/dashboard/license/reset",{provider:n,clientType:"dashboard"});return Zl(r)}/**
|
|
149
|
+
[exemple] rapport d'aperçu terminé`,"sidebar.whatsNew":"Quoi de neuf","sidebar.help.group":"Aide et commentaires","sidebar.help.bug":"Signaler un bug","sidebar.help.bug.tooltip":"Créer un bundle de diagnostic local, puis ouvrir un rapport de bug pré-rempli sur GitHub","bugReportDialog.title":"diagnostics.zip peut nous aider à analyser le problème","bugReportDialog.subtitle":"WEPPY a créé un zip de diagnostic sur cet ordinateur. Il contient des logs Studio, plugin, Sync et outils qui peuvent nous aider à comprendre ce qui s’est passé.","bugReportDialog.close":"Close","bugReportDialog.loading":"Preparing diagnostics.zip...","bugReportDialog.error":"Could not create the diagnostics bundle. You can still open GitHub without diagnostics.","bugReportDialog.bundle":"Bundle","bugReportDialog.included":"Included","bugReportDialog.included.none":"No log files found","bugReportDialog.optional":"Vous pouvez envoyer le rapport sans ce fichier, mais joindre le zip nous aide souvent à trouver la cause plus vite.","bugReportDialog.attachHow":"Pour le joindre, téléchargez ou affichez le zip, puis ajoutez-le au champ Diagnostics ZIP (optional) de l’issue GitHub avant de l’envoyer.","bugReportDialog.download":"1. Télécharger diagnostics.zip","bugReportDialog.reveal":"Reveal in Finder","bugReportDialog.reveal.opening":"Opening...","bugReportDialog.reveal.opened":"Opened location","bugReportDialog.reveal.failed":"Could not open the file location.","bugReportDialog.openGithub":"2. Ouvrir l’issue GitHub","bugReportDialog.openGithubFallback":"Open GitHub without diagnostics","bugReportDialog.retry":"Try again","bugReportDialog.hint":"Le zip peut contenir des logs locaux et du contexte de projet. Vérifiez-le avant de le joindre si vous voulez le partager.","sidebar.help.feature":"Suggérer une fonctionnalité","sidebar.help.feature.tooltip":"Suggérer une nouvelle fonctionnalité ou une amélioration sur GitHub","sidebar.help.discussions":"Aide pour l’installation et l’utilisation","sidebar.help.discussions.tooltip":"Demander de l'aide pour l'installation ou l'utilisation via GitHub Issues","sidebar.help.troubleshooting":"Guide de dépannage","sidebar.help.troubleshooting.tooltip":"Ouvrez le guide de dépannage officiel sur weppyai.com","header.whatsNew":"Quoi de neuf","header.whatsNew.tooltip":"Quoi de neuf","upgrade.title":"Voir Pro","upgrade.tagline":"Découvrir les fonctions Pro","upgrade.cta":"Voir Pro","upgrade.licenseShortcut":"Saisir la licence","upgrade.validUntil":"Jusqu'au {{date}}","whatsNew.pageTitle":"Quoi de neuf","whatsNew.pageSubtitle":"Restez informé des modifications apportées à MCP","whatsNew.unreadSection":"Non lu","whatsNew.allSection":"Toutes les annonces","whatsNew.empty":"Aucune annonce pour l'instant","whatsNew.newBadge":"NEW","whatsNew.importantBadge":"IMPORTANT","whatsNew.category.release":"Libérer","whatsNew.category.notice":"Avis","whatsNew.category.deprecation":"Obsolète","whatsNew.category.tip":"Conseil","uiStudio.title":"UI Studio","uiStudio.empty":"Aucune capture d'écran enregistrée pour l'instant. Ils sont créés automatiquement lorsqu'un agent IA capture l'état actuel de l'interface utilisateur.","uiStudio.loading":"Chargement…","uiStudio.pluginGuide.title":"Le plugin Roblox Studio n'est pas connecté","uiStudio.pluginGuide.message":"UI Studio affiche des captures d'écran et l'historique des modifications à partir du lieu Studio connecté. Il sera mis à jour automatiquement après la connexion de Studio et de WEPPY Plugin.","uiStudio.pluginGuide.check1":"Roblox Studio est-il en cours d'exécution ?","uiStudio.pluginGuide.check2":"Le WEPPY Plugin est-il installé et en cours d'exécution ?","uiStudio.pluginGuide.waiting":"En attente de connexion au plugin...","uiStudio.capturedAt":"Capturé à","uiStudio.scope":"Portée","uiStudio.target":"Cible","uiStudio.briefId":"Brève pièce d'identité","uiStudio.detailClose":"Fermer","uiStudio.colCheck":"Vérifier","uiStudio.colPriority":"Priorité","uiStudio.colCurrent":"Actuel","uiStudio.colRecommended":"Recommandé","uiStudio.colSuggestion":"Suggestion","uiStudio.priorityHigh":"Examinez d'abord","uiStudio.priorityLow":"Amélioration facultative","uiStudio.highPrioritySection":"Examinez d'abord","uiStudio.lowPrioritySection":"Améliorations facultatives","uiStudio.groupSummary":"articles","uiStudio.fixLabel":"Réparer","uiStudio.copyFixCommand":"Copier l'instruction IA","uiStudio.copiedToClipboard":"Copié","uiStudio.fullPath":"Chemin complet","uiStudio.falsePositiveWarning":"Ce groupe peut contenir des faux positifs","uiStudio.noSuggestions":"Aucune suggestion d'amélioration actuelle","uiStudio.sample.badge":"Aperçu du Pro UI Studio","uiStudio.sample.title":"Vous prévisualisez le UI Studio qui se déverrouille après la mise à niveau vers Pro.","uiStudio.sample.message":"Cet aperçu utilise des exemples de données provenant d’une interface utilisateur d’inventaire de démonstration. De vraies captures d'écran, un historique des révisions et des correctifs basés sur l'IA sont déverrouillés avec Pro.","uiStudio.tabs.analysis":"Analyse","uiStudio.tabs.history":"Histoire","uiStudio.analysis.reportsTitle":"Dernière analyse par cible d'interface utilisateur","uiStudio.analysis.recentCapturesTitle":"Captures récentes","uiStudio.analysis.detailDialog":"Détail de l'analyse","uiStudio.analysis.targetCountLabel":"Cibles analysées","uiStudio.analysis.captureLabel":"Captures","uiStudio.analysis.verdict.hasSuggestions":"Suggestions d'amélioration","uiStudio.analysis.verdict.needsFix":"Suggestions d'amélioration","uiStudio.analysis.verdict.review":"Suggestions d'amélioration","uiStudio.analysis.verdict.passed":"Aucune suggestion actuelle","uiStudio.analysis.verdictLabel":"Résumé des améliorations","uiStudio.analysis.thresholds":"Base de révision","uiStudio.analysis.issueSummary.passed":"Aucune suggestion d’amélioration supplémentaire dans le cadre de l’examen actuel.","uiStudio.history.title":"Historique des modifications","uiStudio.history.empty":"Pas d'historique pour l'instant. Lorsqu'un agent IA modifie l'interface utilisateur à l'aide de manage_ui, cela sera automatiquement enregistré.","uiStudio.history.loading":"Chargement...","uiStudio.history.loadingPlace":"Chargement du place actuel...","uiStudio.history.noPlace":"Aucune donnée du place actuel n'est encore disponible. Connectez le WEPPY Plugin et synchronisez un place pour voir l'historique des changements UI.","uiStudio.history.noPlaceAction":"Le place actuel n'est pas encore disponible.","uiStudio.history.error":"Erreur","uiStudio.history.clear":"Clair","uiStudio.history.filter.actions":"Type d'action","uiStudio.history.filter.actionAll":"Tous","uiStudio.history.filter.actionCreate":"Créer","uiStudio.history.filter.actionUpdate":"Mise à jour","uiStudio.history.filter.actionDelete":"Supprimer","uiStudio.history.filter.period":"Période","uiStudio.history.filter.dateAll":"Tous","uiStudio.history.filter.today":"Aujourd'hui","uiStudio.history.filter.yesterday":"Hier","uiStudio.history.filter.last7Days":"7 derniers jours","uiStudio.history.filter.last30Days":"30 derniers jours","uiStudio.history.filter.customRange":"Gamme personnalisée","uiStudio.history.filter.reset":"Réinitialiser","uiStudio.history.filter.from":"Depuis","uiStudio.history.filter.to":"À","uiStudio.history.row.affectedPaths":"Chemins","uiStudio.history.row.mutations":"Modifier les détails","uiStudio.history.row.expand":"▾ Développer","uiStudio.history.row.collapse":"▲ Réduire","uiStudio.history.row.expandDetails":"Afficher les détails de la modification {n}","uiStudio.history.row.collapseDetails":"Masquer les détails des modifications","uiStudio.history.row.toggleDetails":"Toggle modifier les détails","uiStudio.history.row.mutationsEmpty":"Aucun détail de changement","uiStudio.history.row.toolLabel":"Modifications de l'interface utilisateur ({n})","uiStudio.history.row.compare":"Avant/Après","uiStudio.history.row.noBeforeState":"Non avant l'état","uiStudio.history.row.noAfterState":"Non après l'état","uiStudio.history.row.qualityPlan":"Direction de la conception","uiStudio.history.row.designCheck":"Suggestions","uiStudio.history.row.designCheckUnavailable":"Suggestions: indisponible","uiStudio.history.row.designCheckNone":"Suggestions : aucune","uiStudio.history.selection.deleteSelected":"Supprimer la sélection","uiStudio.history.selection.selectAll":"Sélectionner tout","uiStudio.history.selection.clearSelection":"Effacer la sélection","uiStudio.history.confirm.deleteRequestsTitle":"Supprimer les enregistrements de modifications","uiStudio.history.confirm.deleteRequestsMessage":"Les enregistrements de modifications sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.history.confirm.clearRequestsTitle":"Effacer l'historique des modifications","uiStudio.history.confirm.clearRequestsMessage":"Cela efface l’historique actuel des changements de lieu. Les instances Studio ne sont pas affectées.","uiStudio.history.confirm.cascadeOption":"Supprimez également les captures d'écran liées","uiStudio.history.drawer.close":"Fermer","uiStudio.actions.previewAgain":"Aperçu à nouveau","uiStudio.actions.deleteSnapshot":"Supprimer cette capture d'écran","uiStudio.actions.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.actions.captureCurrentState":"Capturer l'état actuel","uiStudio.actions.checkSuggestionsAgain":"Revérifiez les suggestions","uiStudio.actions.previewRunning":"Capturer…","uiStudio.actions.previewRunningDetail":"Le nouvel ID de fichier de capture d'écran apparaîtra une fois la capture terminée.","uiStudio.actions.previewNeedsSaveCheck":"Capture terminée, la sauvegarde doit être révisée","uiStudio.actions.previewSaved":"Nouvelle capture d'écran enregistrée","uiStudio.actions.previewComplete":"Capture terminée","uiStudio.actions.previewSavedDetail":"Les captures d'écran existantes sont conservées ; cela a été enregistré en tant que nouveau fichier.","uiStudio.actions.previewSavedPathMissing":"Un nouvel ID de capture d'écran a été renvoyé, mais le chemin du fichier enregistré n'a pas pu être confirmé.","uiStudio.actions.previewSnapshotIdMissing":"Le nouvel ID de capture d'écran n'a pas pu être confirmé. Actualisez la liste pour vérifier si elle a été enregistrée.","uiStudio.actions.more":"Plus","uiStudio.gallery.selection.selectedCount":"choisi","uiStudio.confirm.deleteSnapshotTitle":"Supprimer la capture d'écran","uiStudio.confirm.deleteSnapshotMessage":"Seul ce fichier de capture d'écran sera supprimé (l'instance Studio est conservée).","uiStudio.confirm.deleteBatchTitle":"Supprimer les captures d'écran sélectionnées","uiStudio.confirm.deleteBatchMessage":"Les captures d'écran sélectionnées seront supprimées. Cette action ne peut pas être annulée.","uiStudio.gallery.selectMode":"Sélectionner","uiStudio.gallery.exitSelectMode":"Annuler","uiStudio.gallery.selectAll":"Sélectionner tout","uiStudio.gallery.clearSelection":"Effacer la sélection","uiStudio.gallery.deleteSelected":"Supprimer la sélection","common.cancel":"Annuler","common.delete":"Supprimer","uiStudio.storage.title":"UI Studio Données enregistrées","uiStudio.storage.usageLabel":"Utilisé","uiStudio.storage.historyBytes":"Changer l'historique","uiStudio.storage.snapshotBytes":"Captures d'écran","uiStudio.storage.requestCount":"Modifier les enregistrements","uiStudio.storage.mutationCount":"Modifier les détails","uiStudio.storage.snapshotCount":"Captures d'écran","uiStudio.storage.countSuffix":"","uiStudio.storage.lastRun":"Dernier nettoyage automatique","uiStudio.storage.lastRunNever":"—","uiStudio.storage.lastRunFreed":"libéré","uiStudio.storage.lastRunErrors":"Erreurs","uiStudio.storage.loading":"Chargement...","uiStudio.cleanup.policy.title":"Politique de suppression automatique","uiStudio.cleanup.policy.modeOff":"Désactivé","uiStudio.cleanup.policy.modeAge":"Basé sur l'âge","uiStudio.cleanup.policy.modeSize":"Basé sur la taille","uiStudio.cleanup.policy.cascade":"Supprimez également les captures d'écran liées","uiStudio.cleanup.policy.save":"Enregistrer la politique","uiStudio.cleanup.policy.runNow":"Courez maintenant","uiStudio.cleanup.policy.proRequired":"Disponible après la mise à niveau vers Pro","uiStudio.cleanup.policy.daysUnit":"d","uiStudio.cleanup.policy.mbUnit":"MB","uiStudio.cleanup.policy.gbUnit":"GB","uiStudio.cleanup.policy.confirm.title":"Confirmer la politique","uiStudio.cleanup.policy.confirm.messageStrict":"L'application de cette politique entraînera la suppression immédiate","uiStudio.cleanup.policy.confirm.requests":"modifier les enregistrements","uiStudio.cleanup.policy.confirm.snapshots":"captures d'écran","uiStudio.cleanup.policy.confirm.freed":"libéré — Postuler ?","uiStudio.cleanup.keepLastNDays":"Conserver les {n} derniers jours","uiStudio.cleanup.selectedDelete":"Supprimer la sélection…","uiStudio.cleanup.deleteAll":"Supprimer tout…","uiStudio.cleanup.cleanupConfirmTitle":"Confirmer le nettoyage","uiStudio.cleanup.cleanupConfirmMessage":"Tous les éléments sélectionnés seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep7":"Les enregistrements de modifications et les captures d'écran datant de plus de 7 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.keep30":"Les enregistrements de modifications et les captures d'écran datant de plus de 30 jours seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.cleanupConfirmMessage.all":"Les enregistrements de modifications enregistrées et les captures d'écran seront supprimés. Cette action ne peut pas être annulée.","uiStudio.cleanup.label":"Nettoyage manuel","uiStudio.cleanup.studioPreservedNote":"Cela supprime uniquement les enregistrements de modifications enregistrées et les captures d'écran sur le disque ; Les instances Roblox Studio ne sont pas affectées.","uiStudio.history.sample.bannerBadge":"Aperçu de l'historique des modifications Pro","uiStudio.history.sample.bannerTitle":"Vous prévisualisez l'historique des modifications de l'interface utilisateur qui se déverrouille après la mise à niveau vers Pro.","uiStudio.history.sample.bannerMessage":"Cet aperçu utilise des exemples de données. Historique réel des modifications, comparaison avant/après et déverrouillage de suppression par lots avec Pro.","uiStudio.fix.touchTarget.label":"Taille de la cible tactile","uiStudio.fix.touchTarget.description":"Vérifie si les commandes sont suffisamment grandes pour appuyer confortablement sur mobile.","uiStudio.fix.touchTarget.howToFix":"Augmentez la taille du bouton à au moins 44 x 44 px ou agrandissez la zone tactile avec UIPadding.","uiStudio.fix.contrast.label":"Contraste du texte","uiStudio.fix.contrast.description":"Vérifie si le contraste du texte et de l’arrière-plan respecte les directives d’accessibilité.","uiStudio.fix.contrast.howToFix":"Utilisez un TextColor3 plus clair ou assombrissez le BackgroundColor3.","uiStudio.fix.contrast.falsePositive":"Les icônes Emoji peuvent être des faux positifs lorsque leur couleur est corrigée.","uiStudio.fix.textScaled.label":"Utilisation à l'échelle du texte","uiStudio.fix.textScaled.description":"TextScaled sans UITextSizeConstraint peut interrompre les mises en page lorsque le texte se développe.","uiStudio.fix.textScaled.howToFix":"Ajoutez un enfant UITextSizeConstraint au TextLabel et définissez MaxTextSize.","uiStudio.fix.safezone.label":"Placement en zone de sécurité","uiStudio.fix.safezone.description":"Vérifie si les contrôles restent à l’intérieur des zones de sécurité de la plate-forme.","uiStudio.fix.safezone.howToFix":"Déplacez la position à l’intérieur de la zone de sécurité ou réduisez le cadre parent.","uiStudio.fix.minTextSize.label":"Taille de police minimale","uiStudio.fix.minTextSize.description":"Vérifie si le texte est trop petit pour être lu confortablement.","uiStudio.fix.minTextSize.howToFix":"Augmentez TextSize à au moins 14 pour le corps du texte.","uiStudio.sample.history.request1.label":"Création initiale de la disposition du HUD","uiStudio.sample.history.request2.label":"Mise à jour de la conception modale de l'inventaire","uiStudio.sample.history.request3.label":"Mise à jour des couleurs du HUD HealthBar","uiStudio.sample.history.request4.label":"Cibles tactiles du bouton de l'onglet Développer l'inventaire","uiStudio.sample.history.request5.label":"Fenêtre contextuelle Supprimer les paramètres","uiStudio.sample.history.request6.label":"Ajouter un composant de mini-carte HUD","uiStudio.sample.history.request1.mutation1.diff":"Cadre créé + 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":"Définir le point d'ancrage, la position et la taille","uiStudio.sample.history.request1.mutation5.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request2.mutation1.diff":"Darkened BackgroundColor3 pour un meilleur contraste","uiStudio.sample.history.request2.mutation2.diff":"TextColor3 -> Color3.new(1,1,1), TextSize 16 -> 18","uiStudio.sample.history.request2.mutation3.diff":"BorderSizePixel 0 -> 2, définissez BorderColor3","uiStudio.sample.history.request2.mutation4.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request3.mutation1.diff":"BackgroundColor3 -> Color3.new(0.9,0.2,0.2) (ton rouge)","uiStudio.sample.history.request3.mutation2.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request4.mutation1.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation2.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation3.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation4.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation5.diff":"Taille {0,64},{0,32} -> {0,64},{0,44}","uiStudio.sample.history.request4.mutation6.diff":"Capture d'écran enregistrée","uiStudio.sample.history.request5.mutation1.diff":"ScreenGui supprimé (interface utilisateur réservée aux paramètres uniquement)","uiStudio.sample.history.request6.mutation1.diff":"Tentative de création de Frame + MapImage + PlayerDot","uiStudio.sample.history.request6.mutation2.diff":"Définir la taille, la position et la transparence de l'arrière-plan","uiStudio.sample.history.request6.mutation3.diff":"Interrompu par le redémarrage du serveur lors de la configuration d'ImageLabel","uiStudio.sample.history.request6.mutation4.diff":"Capture d'écran partielle enregistrée","uiStudio.sample.history.request6.mutation3.error":"server_restart : connexion perdue","uiStudio.sample.history.request6.mutation4.error":"capture d'écran partielle : couches manquantes","uiStudio.sample.history.detail.backgroundColor":"Couleur de fond","uiStudio.sample.history.detail.anchorPoint":"Ancre","uiStudio.sample.history.detail.position":"Position","uiStudio.sample.history.detail.size":"Taille","uiStudio.sample.history.detail.textColor":"Couleur du texte","uiStudio.sample.history.detail.textSize":"Taille du texte","uiStudio.sample.history.detail.borderSize":"Taille de la bordure","uiStudio.sample.history.detail.borderColor":"Couleur de la bordure","settings.dataHistory.title":"Données et historique","settings.dataHistory.title.tooltip":"Gérez les données enregistrées du tableau de bord en un seul endroit.","settings.dataHistory.collapse":"Réduire {title}","settings.dataHistory.expand":"Développez {title}","settings.dataHistory.scope":"Projet actuel","settings.dataHistory.scope.tooltip":"Des actions claires s’appliquent au projet en cours et au lieu actif le cas échéant.","settings.dataHistory.intro":"Consultez les données enregistrées du tableau de bord, ouvrez la page associée ou effacez les enregistrements stockés à partir d'un seul endroit.","settings.dataHistory.toolsActivity.title":"Activité de l'outil","settings.dataHistory.toolsActivity.description":"Exécutions d'outils enregistrées affichées sur la page Outils.","settings.dataHistory.toolStats.title":"Statistiques d'utilisation des outils","settings.dataHistory.toolStats.description":"Nombre d’outils agrégés et totaux d’état.","settings.dataHistory.syncLog.title":"Journal de synchronisation","settings.dataHistory.syncLog.description":"Événements de synchronisation de fichiers enregistrés pour le lieu actif.","settings.dataHistory.playtest.title":"Rapports de tests de jeu","settings.dataHistory.playtest.description":"Rapports et journaux de tests de jeu automatisés enregistrés.","settings.dataHistory.projectChanges.title":"Prorésumé des modifications du projet","settings.dataHistory.projectChanges.description":"Résumés enregistrés des modifications du projet.","settings.dataHistory.connectionLog.title":"Journal de connexion","settings.dataHistory.connectionLog.description":"Enregistrement des événements de connexion MCP et Studio.","settings.dataHistory.uiStudio.title":"Historique et captures d'écran de UI Studio","settings.dataHistory.uiStudio.tooltip":"Gérez les enregistrements de modifications UI Studio enregistrés, les captures d'écran et la politique de suppression automatique.","settings.dataHistory.uiStudio.description":"Enregistrements de modifications, captures d'écran et politique de nettoyage UI Studio enregistrés.","settings.dataHistory.uiStudio.clear.title":"Effacer les données enregistrées UI Studio ?","settings.dataHistory.uiStudio.clear.message":"Cela supprime uniquement les enregistrements de modifications et les captures d'écran UI Studio enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.uiStudio.clear.success":"Les données enregistrées par UI Studio ont été effacées.","settings.dataHistory.uiStudio.clear.failed":"Échec de la suppression des données enregistrées UI Studio.","settings.dataHistory.metric.unavailable":"Indisponible","settings.dataHistory.metric.sizeUnavailable":"taille indisponible","settings.dataHistory.metric.records":"enregistrements","settings.dataHistory.metric.runs":"court","settings.dataHistory.metric.sessions":"séances","settings.dataHistory.metric.reports":"rapports","settings.dataHistory.open":"Ouvrir","settings.dataHistory.clear.title":"Effacer les données enregistrées ?","settings.dataHistory.clear.message":"Cela supprime uniquement les enregistrements de tableau de bord enregistrés. Les instances Roblox Studio et les objets de projet ne sont pas modifiés.","settings.dataHistory.clear.success":"Données enregistrées effacées.","settings.dataHistory.clear.failed":"Échec de la suppression des données enregistrées.","uiStudio.history.sample.tooltip":"Passez à Pro pour débloquer l'historique complet","toast.serverConnected":"Serveur MCP connecté","toast.serverDisconnected":"Serveur MCP déconnecté","toast.pluginConnected":"Plugin connecté","toast.pluginDisconnected":"Plugin déconnecté","toast.clearSuccess":"Effacé avec succès","toast.clearFailed":"Échec de la suppression des données","common.clear":"Clair","settings.license.activate":"Activer la licence","settings.license.refresh":"Actualiser la licence","settings.license.keyInput":"Clé de licence","settings.license.disconnected":"Déconnecté","settings.license.disconnected.tooltip":"Reconnectez-vous au serveur MCP pour gérer les actions de licence à partir de WEPPY Dashboard.","settings.license.live.tooltip":"Les actions de licence sont immédiatement envoyées au serveur MCP.","settings.license.status.activationRequired":"Activation requise","settings.license.status.activationRequired.tooltip":"L'activation manuelle de la licence est requise avant que WEPPY Dashboard puisse actualiser ce statut.","settings.license.status.grace":"Grâce","settings.license.status.grace.tooltip":"La vérification Provider est temporairement indisponible, mais l'accès Pro reste actif pendant la période de grâce.","settings.license.status.graceBilling.tooltip":"L'accès Pro est toujours disponible pendant une période de grâce liée à la facturation.","settings.license.detail.graceBilling":"L'accès Pro reste disponible pendant une période de grâce de facturation.","settings.license.detail.graceProviderUnavailable":"Provider indisponible. L'accès Pro reste actif pendant le mode grâce.","settings.license.detail.manualActivation":"Activation manuelle requise pour restaurer l'accès à Pro.","settings.license.detail.missingSessionToken":"L'actualisation est bloquée car le jeton de session en cours est manquant.","settings.license.detail.refreshRecommended":"La vérification des licences devrait être actualisée prochainement.","connection.agents.kill":"Tuer","connection.agents.kill.title":"Tuer l'agent ?","connection.agents.killed":"Agent tué","connection.agents.killFailed":"Impossible de tuer l'agent","connection.agents.lastCommand":"Dernière commande","connection.agents.lastCommand.tooltip":"Appel d'outil le plus récent exécuté par cet agent","connection.agents.lastSeen":"Vu pour la dernière fois","connection.agents.lastSeen.tooltip":"Battement de cœur ou activité la plus récente de cet agent","connection.clear.title":"Effacer le journal de connexion ?","connection.clear.message":"Cela supprime définitivement le journal de connexion stocké pour le projet en cours.","sync.clear.title":"Effacer le journal de synchronisation ?","sync.clear.message":"Cela supprime définitivement le journal de synchronisation stocké pour le lieu actuel.","playtest.clear.title":"Effacer l'historique des tests ?","playtest.clear.message":"Cela supprime définitivement les rapports de test de jeu stockés pour le lieu actuel.","changelog.clear.title":"Effacer le journal des modifications ?","changelog.clear.message":"Cela supprime définitivement le journal des modifications stocké pour le lieu actuel.","sync.status.placePath":"Placer le chemin","sync.status.placePath.tooltip":"Répertoire de lieu actif où les fichiers de l'explorateur sont synchronisés.","tier.progress.label":"Pro / Total","changelog.card.representativeArea":"Zone représentative","changelog.card.verification":"Vérification","uiStudio.tabs.analysis.tooltip":"Parcourez les écrans d’interface utilisateur capturés par l’IA et trouvez rapidement quelles interfaces utilisateur doivent être améliorées.","uiStudio.tabs.history.tooltip":"Chaque changement d'interface utilisateur effectué par l'IA, dans l'ordre. Comparez les écrans avant et après.","uiStudio.title.tooltip":"Un endroit central pour examiner les écrans d’interface utilisateur générés par l’IA et les suggestions d’amélioration.","uiStudio.analysis.reportsTitle.tooltip":"Affiche le dernier résumé de capture et de suggestion par interface utilisateur (par exemple, fenêtre d'inventaire, menu principal).","uiStudio.analysis.verdict.hasSuggestions.tooltip":"Certaines améliorations ont été trouvées dans cette interface utilisateur. Cliquez sur la carte pour plus de détails.","uiStudio.analysis.verdict.passed.tooltip":"Aucune amélioration suggérée en vertu des seuils d'examen actuels.","uiStudio.analysis.counts.tooltip":"« Principal » sont les éléments clés à examiner en premier ; Les « notes » sont des raffinements agréables à avoir.","uiStudio.analysis.thresholds.tooltip":"Ensemble de seuils utilisé pour cet examen (par défaut ou personnalisé).","uiStudio.analysis.recentCapturesTitle.tooltip":"Toutes les captures récemment enregistrées par ordre chronologique.","uiStudio.gallery.selectAll.tooltip":"Sélectionnez toutes les captures visibles à la fois.","uiStudio.gallery.clearSelection.tooltip":"Effacez la sélection actuelle.","uiStudio.gallery.deleteSelected.tooltip":"Supprimez uniquement les fichiers de capture sélectionnés. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.gallery.cardCheckbox.tooltip":"Sélectionnez cette capture. Choisissez-en plusieurs pour les supprimer ensemble.","uiStudio.detailClose.tooltip":"Fermez ce panneau de détails.","uiStudio.actions.captureCurrentState.tooltip":"Enregistrez l'interface utilisateur actuellement affichée dans Studio en tant que nouvelle capture. Les captures existantes sont conservées.","uiStudio.actions.checkSuggestionsAgain.tooltip":"Recalculez les suggestions pour cette capture sans prendre une nouvelle capture d'écran.","uiStudio.actions.more.tooltip":"Ouvrez des actions supplémentaires.","uiStudio.actions.deleteSnapshot.tooltip":"Supprimez uniquement ce fichier de capture. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.capturedAt.tooltip":"Quand cet écran a été capturé.","uiStudio.scope.tooltip":"Portée de capture (plein écran ou interface utilisateur spécifique).","uiStudio.target.tooltip":"Chemin exact de l’instance d’interface utilisateur capturée.","uiStudio.briefId.tooltip":"Identifiant du cahier des charges qui a produit cette interface utilisateur.","uiStudio.analysis.verdictLabel.tooltip":"Verdict d'amélioration globale pour cette capture.","uiStudio.suggestionGroup.tooltip":"Suggestions du même genre regroupées. Cliquez pour agrandir ou réduire.","uiStudio.groupSummary.tooltip":"Nombre d'éléments d'interface utilisateur correspondant à ce groupe.","uiStudio.colCurrent.tooltip":"La valeur actuellement appliquée.","uiStudio.colRecommended.tooltip":"La valeur recommandée.","uiStudio.copyFixCommand.tooltip":"Copiez une invite demandant à l'IA de résoudre ce problème.","uiStudio.falsePositiveWarning.tooltip":"Cette vérification peut produire des faux positifs – vérifiez avant de postuler.","uiStudio.history.filter.actions.tooltip":"Filtrez les enregistrements en fonction du type de modification apportée par l'IA.","uiStudio.history.filter.period.tooltip":"Filtrer les enregistrements par plage horaire.","uiStudio.history.filter.from.tooltip":"Date de début de la requête.","uiStudio.history.filter.to.tooltip":"Date de fin de la requête.","uiStudio.history.filter.actionAll.tooltip":"Montrez tout type d'action.","uiStudio.history.filter.actionCreate.tooltip":"Afficher uniquement les actions qui ont créé une nouvelle interface utilisateur.","uiStudio.history.filter.actionUpdate.tooltip":"Afficher uniquement les actions qui ont mis à jour une interface utilisateur existante.","uiStudio.history.filter.actionDelete.tooltip":"Afficher uniquement les actions qui ont supprimé une interface utilisateur.","uiStudio.history.filter.dateAll.tooltip":"Afficher l'historique complet.","uiStudio.history.filter.today.tooltip":"Afficher uniquement les modifications apportées à aujourd'hui.","uiStudio.history.filter.yesterday.tooltip":"Afficher uniquement les modifications d'hier.","uiStudio.history.filter.last7Days.tooltip":"Afficher les modifications des 7 derniers jours.","uiStudio.history.filter.last30Days.tooltip":"Afficher les modifications des 30 derniers jours.","uiStudio.history.filter.customRange.tooltip":"Choisissez une date de début et de fin personnalisée.","uiStudio.history.filter.reset.tooltip":"Réinitialisez tous les filtres aux valeurs par défaut.","uiStudio.history.title.tooltip":"Une chronologie de chaque modification de l'interface utilisateur effectuée par l'IA.","uiStudio.history.clear.tooltip":"Supprimez tous les enregistrements de modifications pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.history.row.compare.tooltip":"Comparez les écrans avant et après. Cliquez pour ouvrir la vue de comparaison complète.","uiStudio.history.row.extraPaths.tooltip":"Nombre d'interfaces utilisateur supplémentaires modifiées dans cette action.","uiStudio.history.row.noBeforeState.tooltip":"Aucune capture enregistrée avant ce changement.","uiStudio.history.row.noAfterState.tooltip":"Aucune capture enregistrée après ce changement.","uiStudio.history.row.affectedPaths.tooltip":"Nombre d'interfaces utilisateur affectées par cette action.","uiStudio.history.row.mutations.tooltip":"Nombre de modifications détaillées (par exemple, modifications de propriétés).","uiStudio.history.row.qualityPlan.tooltip":"Brève direction de conception utilisée pour ce changement.","uiStudio.history.row.designCheck.tooltip":"Résumé des suggestions de contrôle de conception après modification.","uiStudio.history.row.toggleDetails.tooltip":"Afficher ou masquer une ventilation par ligne de ce qui a changé.","uiStudio.compare.before.tooltip":"L'écran a été enregistré juste avant que l'IA n'effectue la modification.","uiStudio.compare.after.tooltip":"L'écran a été enregistré juste après que l'IA ait effectué la modification.","uiStudio.compare.path.tooltip":"Chemin d'accès à l'instance d'interface utilisateur pour cet écran.","uiStudio.storage.title.tooltip":"Utilisation du disque des enregistrements de modifications et des captures d'écran de UI Studio.","uiStudio.storage.usageLabel.tooltip":"Espace disque actuellement utilisé par UI Studio pour ce projet.","uiStudio.storage.historyBytes.tooltip":"Espace occupé par les données d'enregistrement de modification (JSON).","uiStudio.storage.snapshotBytes.tooltip":"Espace occupé par les fichiers image PNG capturés.","uiStudio.storage.requestCount.tooltip":"Nombre d'actions où l'IA a modifié l'interface utilisateur.","uiStudio.storage.mutationCount.tooltip":"Nombre de modifications détaillées dans les actions (une modification de propriété = 1).","uiStudio.storage.snapshotCount.tooltip":"Nombre de fichiers d'images de capture enregistrés.","uiStudio.storage.lastRun.tooltip":"Quand la stratégie de nettoyage automatique a été exécutée pour la dernière fois et ce qu’elle a supprimé.","uiStudio.cleanup.label.tooltip":"Nettoyez manuellement les enregistrements et les captures de modifications quand vous le souhaitez.","uiStudio.cleanup.keep7.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 7 jours.","uiStudio.cleanup.keep30.tooltip":"Supprimez les enregistrements de modifications et les captures datant de plus de 30 jours.","uiStudio.cleanup.deleteAll.tooltip":"Supprimez chaque enregistrement de modification et capture pour ce projet. L'interface utilisateur réelle dans Roblox Studio n'est pas affectée.","uiStudio.cleanup.policy.title.tooltip":"Règles qui suppriment automatiquement les captures anciennes ou volumineuses.","uiStudio.cleanup.policy.modeOff.tooltip":"Désactivez le nettoyage automatique. Les données restent jusqu'à ce que vous les supprimiez manuellement.","uiStudio.cleanup.policy.modeAge.tooltip":"Supprimez automatiquement les données antérieures au nombre de jours configuré.","uiStudio.cleanup.policy.modeSize.tooltip":"Lorsque l'utilisation totale dépasse la limite, les données les plus anciennes sont supprimées en premier.","uiStudio.cleanup.policy.agePreset.tooltip":"Supprimez les données datant de plus de plusieurs jours.","uiStudio.cleanup.policy.ageInput.tooltip":"Entrez n'importe quelle valeur comprise entre 1 et 365 jours.","uiStudio.cleanup.policy.sizePreset.tooltip":"Gardez l’utilisation totale en dessous de cette taille.","uiStudio.cleanup.policy.sizeInput.tooltip":"Saisissez n'importe quelle valeur comprise entre 50 Mo et 10 000 Mo (10 Go).","uiStudio.cleanup.policy.cascade.tooltip":"Supprimez également les images de capture liées à ces enregistrements. Si cette option est désactivée, les images restent.","uiStudio.cleanup.policy.save.tooltip":"Enregistrez la règle de nettoyage actuelle. Il fonctionne désormais en arrière-plan.","uiStudio.cleanup.policy.runNow.tooltip":"Exécutez la règle actuelle une fois maintenant, sans attendre la prochaine exécution planifiée.","settings.license.refresh.tooltip":"Récupérez à nouveau l'état actuel à partir du serveur de licences. Utile lorsqu'un changement de facturation n'est pas encore apparu.","settings.license.reset.tooltip":"Supprimez la clé de licence actuellement enregistrée. Utilisez-le avant d'activer avec une clé différente.","settings.license.activate.tooltip":"Activez les fonctionnalités Pro avec la clé de licence saisie.","tier.upgrade.tooltip":"Voir les fonctions Pro et les options d’achat.","settings.language.auto.tooltip":"Suivez la langue du système d'exploitation. Revient à l'anglais lorsqu'il n'est pas pris en charge.","settings.dataHistory.open.tooltip":"Ouvrez la page qui montre cet élément en détail.","settings.dataHistory.clear.tooltip":"Supprimez uniquement les enregistrements enregistrés pour cet élément. Les données Roblox Studio ne sont pas modifiées.","settings.dataHistory.toggle.tooltip":"Réduisez ou développez cette section.","settings.dataHistory.toolsActivity.metric.tooltip":"Nombre d'exécutions d'outils enregistrées et espace disque qu'elles utilisent.","settings.dataHistory.toolStats.metric.tooltip":"Nombre total d'exécutions et de sessions agrégées.","settings.dataHistory.syncLog.metric.tooltip":"Nombre d'événements de synchronisation enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.playtestReports.metric.tooltip":"Nombre de rapports de tests de jeu enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.projectChanges.metric.tooltip":"Nombre de résumés de modifications de projet enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.connectionLog.metric.tooltip":"Nombre d'événements de connexion enregistrés et espace disque qu'ils utilisent.","settings.dataHistory.uiStudio.metric.tooltip":"UI Studio modifie le nombre d'enregistrements et de captures, ainsi que l'utilisation totale du disque.","uiStudio.designCheckResultsTitle":"Suggestions de contrôle de conception","uiStudio.designCheckResultsTitle.tooltip":"Toutes les suggestions d'amélioration trouvées dans cette capture.","uiStudio.actions.designCheckAgain":"Revérifier","uiStudio.actions.designCheckRunning":"Vérification des suggestions...","uiStudio.actions.designCheckRunningDetail":"Les décomptes d’articles examinés en premier, recommandés et facultatifs apparaîtront une fois la vérification terminée.","uiStudio.actions.designCheckComplete":"Vérification des suggestions terminée","uiStudio.actions.designCheckNoSnapshotSaved":"Cette action n'enregistre pas un nouveau fichier de capture d'écran.","uiStudio.sample.designCheck.contrast":"Le contraste du texte est inférieur à {expected} (actuel {actual}). Ajustez TextColor3 ou BackgroundColor3.","uiStudio.sample.designCheck.touchTarget":"La cible tactile est inférieure à {expected} (actuel {actual}). Augmentez la taille ou le rembourrage.","uiStudio.sample.designCheck.minTextSize":"TextSize est inférieur à {expected} (actuel {actual}). Augmentez-le pour plus de lisibilité.","uiStudio.gallery.priorityHighBadge.tooltip":"Nombre de suggestions à examiner en premier. Cliquez pour plus de détails.","uiStudio.gallery.priorityMediumBadge.tooltip":"Nombre de suggestions recommandées.","uiStudio.priorityMedium":"Examen recommandé","uiStudio.mediumPrioritySection":"Examen recommandé","uiStudio.gallery.priorityLowBadge.tooltip":"Nombre d'améliorations facultatives.","tier.banner.progressLabel":"Pro / Total","uiStudio.error":"Erreur","uiStudio.analysis.expandChildren":"Afficher les cibles enfants","uiStudio.analysis.openDetail":"Détail ouvert","uiStudio.analysis.childTargets":"Enfants cibles","uiStudio.analysis.childDetailHint":"Ouvrir les détails de la cible enfant","uiStudio.compare.before":"Avant","uiStudio.compare.after":"Après","uiStudio.history.drawer.changeDetails":"Modifier les détails","uiStudio.gallery.cardCheckbox":"Sélectionnez une capture d'écran","sidebar.assets":"Assets","assets.title":"Assets","assets.experimental":"Experimental","assets.subtitle":"Browse local originals, upload to Roblox, and inspect synced usage by place.","assets.scope.label":"Asset scope","assets.scope.place":"Current Place","assets.scope.shared":"Shared","assets.place.selector":"Asset place","assets.place.id":"Place ID {placeId}","assets.place.connected":"Connected","assets.count.shown":"Shown assets: {count}","assets.category.filter":"Category","assets.category.all":"All","assets.category.image":"Images","assets.category.decal":"Decals","assets.category.audio":"Audio","assets.category.mesh":"Meshes","assets.category.model":"Models","assets.category.rbxm":"RBXM","assets.category.video":"Videos","assets.category.animation":"Animations","assets.category.comingSoon":"Coming soon","assets.status.localOnly":"Local only","assets.status.uploading":"Uploading","assets.status.processing":"Processing","assets.status.uploaded":"Uploaded","assets.status.failed":"Failed","assets.status.superseded":"Superseded","assets.rescan":"Rescan","assets.rescan.tooltip":"Scan the selected inbox folder.","assets.rescan.chooseCategory":"Choose a category before rescanning.","assets.rbxmGuide.title":"Save RBXM from Studio","assets.rbxmGuide.body":"Select objects in Roblox Studio, then use WEPPY Plugin > Assets to save the selection as a local RBXM asset.","assets.rbxmGuide.thumbnail":"The plugin save flow includes a thumbnail option, and saved RBXM assets appear here for management, upload, and insertion.","assets.exportSelection":"Export Studio selection","assets.exportSelection.tooltip":"Export the current Studio selection as a local .rbxm asset.","assets.exportSelection.chooseCategory":"Choose RBXM before exporting a Studio selection.","assets.upload.open":"Upload","assets.upload.open.tooltip":"Upload this local file to Roblox through Open Cloud.","assets.upload.selectFirst":"Select an asset first.","assets.upload.title":"Upload asset","assets.upload.checkingSettings":"Checking upload settings...","assets.upload.settingsLoadFailed":"Failed to load upload settings.","assets.upload.settingsRequired":"Upload settings required","assets.upload.settingsRequired.apiKey":"Save an Open Cloud API key before uploading.","assets.upload.settingsRequired.toggle":"Enable Open Cloud upload before uploading.","assets.upload.settingsRequired.creator":"Save a default Creator before uploading.","assets.upload.openSettings":"Open Asset Library settings","assets.upload.creator":"Creator","assets.upload.creatorType":"Creator type","assets.upload.creatorId":"Creator ID","assets.upload.envCreatorHelp":"Environment API keys cannot save a default Creator here. Enter the Creator for this upload.","assets.upload.displayNameHelp":"Saved to Roblox as the asset display name.","assets.upload.descriptionHelp":"Saved to Roblox as the asset description.","assets.upload.creatorHelp":"Used by Open Cloud as the owner of the uploaded asset.","assets.upload.creatorTypeHelp":"Sent to Open Cloud as the Creator type.","assets.upload.creatorIdHelp":"Sent to Open Cloud as the User or Group ID that owns the uploaded asset.","assets.upload.submit":"Upload with Roblox Open Cloud","assets.upload.uploading":"Uploading...","assets.upload.noDelete":"WEPPY does not provide Roblox asset deletion.","assets.upload.delay":"Roblox processing and moderation can delay visibility in Studio or Creator Dashboard.","assets.delete.tooltip":"Delete this local Asset Library item.","assets.delete.title":"Delete asset","assets.delete.message":"This removes the local Asset Library files only. Uploaded Roblox assets are not deleted.","assets.creator.user":"User","assets.creator.group":"Group","assets.settings.open":"Open settings","assets.settings.open.tooltip":"Open Roblox upload settings.","assets.settings.title":"Asset Library settings","assets.settings.proOnly":"Roblox upload settings and Open Cloud credential controls are available on Pro.","assets.settings.openCloudToggle":"Open Cloud upload","assets.settings.openCloudToggle.help":"Controls whether server-side Open Cloud upload mutations can run.","assets.settings.apiKey":"Open Cloud API Key","assets.settings.apiKeyGuide":"Create a Roblox API key with Assets Read and Write permissions.","assets.settings.creatorHelp":"Use the numeric user ID from a profile URL or group ID from a group URL.","assets.settings.credential.none":"No API key saved","assets.settings.credential.env":"Environment variable","assets.settings.credential.local":"Local encrypted file","assets.settings.registeredApiKey":"Registered API Key","assets.settings.credentialProfile":"Credential Profile","assets.settings.activeProfileBadge":"Active","assets.settings.field.profile":"Profile","assets.settings.field.apiKey":"API Key","assets.settings.field.storage":"Storage","assets.settings.field.validationStatus":"Validation status","assets.settings.field.creators":"Creators","assets.settings.validation.unknown":"Not tested","assets.settings.validation.valid":"Connected","assets.settings.validation.invalid":"Needs attention","assets.settings.profileSelected":"Open Cloud credential profile selected.","assets.settings.useProfile":"Use profile","assets.settings.replaceApiKey":"Replace API Key","assets.settings.profileLabel":"Profile name (optional)","assets.settings.profileLabel.placeholder":"Studio automation key","assets.settings.profileLabel.help":"Optional. If left blank, WEPPY saves this profile as Open Cloud key automatically.","assets.settings.saveApiKey":"Save API Key","assets.settings.testConnection":"Test Connection","assets.settings.removeApiKey":"Unregister API Key","assets.settings.saveCreator":"Save default Creator","assets.settings.saveCreatorPreset":"Save Creator","assets.settings.addCreator":"Add Creator","assets.settings.addCreator.tooltip.ready":"Add another User or Group Creator preset to this profile.","assets.settings.cancelCreator":"Cancel","assets.settings.defaultCreatorBadge":"Default","assets.settings.makeDefaultCreator":"Make default","assets.settings.unregisterCreator":"Unregister Creator","assets.settings.creatorLabel":"Creator label (optional)","assets.settings.creatorLabel.placeholder":"Main studio group","assets.settings.creatorLabel.help":"Optional. If left blank, WEPPY automatically saves a label like User 123 or Group 456.","assets.settings.action.proRequired":"Asset upload settings are available on Pro.","assets.settings.action.busy":"Wait for the current settings action to finish.","assets.settings.saveApiKey.tooltip.ready":"Save this API key to local encrypted storage.","assets.settings.saveApiKey.tooltip.enter":"Enter an Open Cloud API key to save it locally.","assets.settings.testConnection.tooltip.entered":"Test the entered API key before saving it.","assets.settings.testConnection.tooltip.saved":"Test the saved Open Cloud API key.","assets.settings.testConnection.tooltip.enterOrSaved":"Enter an API key or save one before testing the connection.","assets.settings.removeApiKey.tooltip.ready":"Unregister the locally saved Open Cloud API key from WEPPY.","assets.settings.removeApiKey.tooltip.none":"No local Open Cloud API key is saved.","assets.settings.removeApiKey.tooltip.env":"Environment API keys cannot be removed from Dashboard. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY.","assets.settings.unregisterCreator.tooltip.ready":"Unregister this Creator from the selected profile.","assets.settings.unregisterApiKey.title":"Unregister API Key?","assets.settings.unregisterApiKey.message":"Roblox API key is not revoked. WEPPY only removes the local Credential Profile registration on this device.","assets.settings.unregisterCreator.title":"Unregister Creator?","assets.settings.unregisterCreator.message":"Roblox user or group is not deleted. WEPPY only removes this Creator from the selected API Key profile.","assets.settings.saveCreator.tooltip.ready":"Save this Creator as the default owner for uploads.","assets.settings.saveCreator.tooltip.noLocal":"Save a local Open Cloud API key before saving a default Creator.","assets.settings.saveCreator.tooltip.env":"Environment API keys cannot save a default Creator here. Enter Creator details in the upload dialog.","assets.settings.saveCreator.tooltip.enterId":"Enter a user or group ID before saving the default Creator.","assets.settings.apiKeySaved":"Open Cloud API key saved locally.","assets.settings.apiKeyTested":"Open Cloud API key connection tested.","assets.settings.apiKeyRemoved":"Open Cloud API key unregistered from local storage.","assets.settings.envApiKeyStillActive":"Environment variable credential is still active. Remove ROBLOX_OPEN_CLOUD_API_KEY outside WEPPY Dashboard.","assets.settings.defaultCreatorSaved":"Open Cloud default Creator saved locally.","assets.settings.creatorUnregistered":"Creator unregistered from this profile.","assets.settings.creatorUnregisterFailed":"Failed to unregister Creator.","assets.settings.saved":"Upload settings saved.","assets.settings.saveFailed":"Failed to save upload settings.","assets.settings.loadFailed":"Failed to load upload settings.","assets.settings.tested":"Connection tested.","assets.settings.testFailed":"Connection test failed.","assets.settings.removed":"API key unregistered.","assets.settings.removeFailed":"Failed to unregister API key.","assets.basic.notice":"Browse, preview, edit metadata, and scan usage on Basic. Roblox upload controls are available on Pro.","assets.proOnly.tooltip":"Roblox upload is available on Pro.","assets.proOnly.upload":"Roblox upload is available on Pro.","assets.empty.title":"No assets yet","assets.empty.body":"Choose a scope and category, then rescan that inbox folder.","assets.detail.title":"Asset details","assets.detail.displayName":"Display name","assets.detail.description":"Description","assets.detail.save":"Save metadata","assets.detail.refreshStatus":"Refresh","assets.detail.scanUsage":"Scan usage","assets.detail.localFile":"Local file","assets.detail.fileName":"File","assets.detail.category":"Category","assets.detail.scope":"Scope","assets.detail.mimeType":"Type","assets.detail.size":"Size","assets.detail.dimensions":"Dimensions","assets.detail.duration":"Duration","assets.detail.source":"Source path","assets.detail.sha256":"SHA-256","assets.detail.roblox":"Roblox upload status","assets.detail.status":"Status","assets.detail.assetId":"Asset ID","assets.detail.error":"Error","assets.detail.copyAssetId":"Copy Asset ID","assets.detail.copyUri":"Copy URI","assets.detail.studioUri":"Studio URI","assets.detail.robloxWebUrl":"Creator Dashboard URL","assets.detail.copyStudioUri":"Copy Studio URI","assets.detail.copyWebUrl":"Copy configure URL","assets.detail.openRobloxPage":"Open configure page","assets.detail.robloxWebUrlNotice":"Opening this page requires the Roblox account that owns or can manage the uploaded asset.","assets.detail.uploadHistory":"Upload history","assets.detail.usedInPlace":"Where this asset is used in this Place","assets.detail.noUsage":"No local Sync references found yet.","assets.detail.usageSource":"Checked against","assets.detail.usageSource.localSync":"Local Sync files","assets.detail.usageSource.notScanned":"Not checked yet","assets.detail.lastScanned":"Last checked","assets.detail.lastScannedAt":"Last checked: {time}","assets.detail.lastScanned.never":"No check yet","assets.detail.noUsageUnscanned":"Run Scan usage to search local Sync files for this Roblox Asset ID.","assets.detail.noUsageAfterScan":"No references were found in local Sync files during the last check.","assets.detail.noUsageNoRobloxId":"This asset does not have a Roblox Asset ID yet, so usage cannot be checked. Upload it before scanning usage.","assets.detail.technicalDetails":"Technical details","assets.detail.stableId":"Stable ID","assets.detail.sourceKind":"Source kind","assets.detail.createdAt":"Created","assets.detail.updatedAt":"Updated","assets.detail.operationId":"Operation ID","assets.detail.operationPath":"Operation path","assets.detail.versionId":"Version ID","assets.detail.remotePath":"Remote path","assets.detail.moderationState":"Moderation","assets.detail.line":"line {line}","assets.studio.notConnected":"Connect Roblox Studio before using Studio asset actions.","assets.detail.importRbxm":"Insert into Studio","assets.detail.importRbxm.tooltip":"Insert this local RBXM asset into {target} in the connected Studio place.","assets.detail.generateThumbnail":"Generate thumbnail","assets.detail.generateThumbnail.tooltip":"Create or replace the Asset Library thumbnail from Studio.","assets.detail.rbxmOnly":"Studio import is available for .rbxm assets.","assets.detail.rbxmCategoryOnly":"Studio .rbxm actions support models and animations.","assets.detail.thumbnailRbxmOnly":"Thumbnail generation is available for .rbxm model assets.","assets.detail.thumbnailModelOnly":"Thumbnail generation is available for model .rbxm assets.","assets.detail.rbxm":"RBXM contents","assets.detail.rbxmExportedCount":"Exported roots","assets.detail.rbxmClasses":"Classes","assets.detail.rbxmThumbnail":"Thumbnail","assets.detail.studioInsertTarget":"Studio insert target","assets.detail.rbxmRoots":"Root tree","assets.detail.rbxmReferences":"Asset references","assets.detail.rbxmStudioUploads":"Studio-local uploads","assets.detail.rbxmStudioUploadsLabel":"Studio uploads","assets.detail.rbxmStudioUploadsUploaded":"uploaded","assets.detail.rbxmStudioUploadsFailed":"failed","assets.detail.rbxmGeneration":"Generated model","assets.detail.rbxmGenerationProvider":"Provider","assets.detail.rbxmGenerationPrompt":"Prompt","assets.detail.rbxmGenerationSchema":"Schema","assets.detail.rbxmGenerationPath":"Studio path","assets.detail.rbxmReview":"Model review","assets.detail.rbxmReviewReadiness":"Readiness","assets.detail.rbxmReviewSummary":"Summary","assets.detail.rbxmThumbnailAttempts":"Thumbnail attempts","dashboardHelp.button":"Help","dashboardHelp.pageButton.ariaLabel":"Open page help","dashboardHelp.fieldButton.ariaLabel":"Open field help","dashboardHelp.section.canDo":"What you can do here","dashboardHelp.section.needs":"What you need to use it","dashboardHelp.section.links":"Related links","dashboardHelp.overview.title":"Overview help","dashboardHelp.overview.canDo.1":"Check MCP server, WEPPY Plugin, AI Agent, Sync, and recent game changes in one place.","dashboardHelp.overview.needs.1":"Useful status requires the MCP server. Live Studio status also needs WEPPY Plugin connected to the active place.","dashboardHelp.connection.title":"Connection help","dashboardHelp.connection.canDo.1":"Inspect server process details, connected AI agents, Studio plugin clients, and connection log events.","dashboardHelp.connection.needs.1":"The MCP server must be reachable. Plugin rows appear after Studio sends heartbeats.","dashboardHelp.sync.title":"Sync help","dashboardHelp.sync.canDo.1":"Review Studio to local sync status, direction, apply mode, and sync logs.","dashboardHelp.sync.needs.1":"Sync needs an active place and connected WEPPY Plugin. Two-way and reverse workflows depend on Pro.","dashboardHelp.assets.title":"Assets help","dashboardHelp.assets.canDo.1":"Browse local Asset Library files, switch place/shared scope, filter categories, scan usage, insert RBXM into Studio, and upload local assets to Roblox.","dashboardHelp.assets.needs.1":"Upload needs Pro, the Open Cloud upload toggle, a valid API Key, and a Creator. Browse and preview work on Basic.","dashboardHelp.changelog.title":"Changelog help","dashboardHelp.changelog.canDo.1":"Review real game-change sessions extracted from AI actions and sync events.","dashboardHelp.changelog.needs.1":"Entries are scoped to the active place. Basic shows only the latest preview entries.","dashboardHelp.playtest.title":"Playtest help","dashboardHelp.playtest.canDo.1":"Review Playtest results and reports saved by the AI Agent.","dashboardHelp.playtest.needs.1":"Pro shows real stored reports. Basic shows sample preview data. Live active-place confidence needs WEPPY Plugin connected.","dashboardHelp.uiStudio.title":"UI Studio help","dashboardHelp.uiStudio.canDo.1":"Review AI-created UI analysis, improvement suggestions, captures, and before/after history.","dashboardHelp.uiStudio.needs.1":"Pro shows real UI Studio data. Basic shows a bundled sample. New capture/check actions need WEPPY Plugin connected.","dashboardHelp.tools.title":"Tools help","dashboardHelp.tools.canDo.1":"Inspect tool history, status classification, fallback/unsupported/warn/error details, and usage statistics.","dashboardHelp.tools.needs.1":"History and statistics depend on local recording settings and the active place bucket.","dashboardHelp.settings.title":"Settings help","dashboardHelp.settings.canDo.1":"Manage License, saved data cleanup, server environment display, and language.","dashboardHelp.settings.needs.1":"License actions need MCP server connection. Server environment values are read-only here. Asset upload controls live in Assets settings.","dashboardHelp.openCloudApiKey.title":"Open Cloud API Key help","dashboardHelp.openCloudApiKey.canDo.1":"WEPPY uses this key only for Roblox Open Cloud requests.","dashboardHelp.openCloudApiKey.needs.1":"Create a Roblox API key in Creator Hub. Add Assets under Access Permissions, then enable both Read and Write operations.","dashboardHelp.openCloudApiKey.needs.2":"Set the key target to the same User or Group that you use as the upload Creator.","dashboardHelp.openCloudApiKey.needs.3":"The raw key is encrypted on this device. It is not sent to WEPPY servers, and it is not stored in any other external storage, browser storage, telemetry, logs, tool history, or Asset Library metadata.","dashboardHelp.openCloudApiKey.link.apiKeys":"Roblox API keys","dashboardHelp.openCloudApiKey.link.assetsGuide":"Assets API usage guide","dashboardHelp.openCloudApiKey.link.assetsReference":"Assets API reference","dashboardHelp.openCloudCreatorId.title":"Creator ID help","dashboardHelp.openCloudCreatorId.canDo.1":"The default Creator decides which User or Group owns newly uploaded Roblox assets.","dashboardHelp.openCloudCreatorId.needs.1":"For User, sign in to roblox.com, open your profile from your avatar or username, then copy only the number between /users/ and /profile in the browser URL.","dashboardHelp.openCloudCreatorId.needs.2":"For Group, open the Roblox group or community page, then copy only the number after /groups/ or /communities/ in the browser URL.","dashboardHelp.openCloudCreatorId.needs.3":"Paste only the numeric ID in Creator ID. Do not paste the full URL, rbxassetid://, User, or Group text.","dashboardHelp.openCloudCreatorId.link.creatorId":"Creator ID reference","dashboardHelp.openCloudCreatorId.link.userId":"User ID reference","dashboardHelp.openCloudCreatorId.link.groups":"Roblox groups","dashboardHelp.openCloudCreatorId.link.groupsApi":"Groups Cloud API","assets.settings.apiKey.inlineHelp":"WEPPY uses this key only for Roblox Open Cloud requests. The key is encrypted on this device and is not sent to WEPPY servers or stored in any other external storage.","assets.settings.creatorId.inlineHelp":"Default owner for new Roblox assets: your User ID or a Group ID.","common.close":"Fermer","dashboardHelp.section.currentState":"Check based on current status","dashboardHelp.overview.currentState.serverOnly":"Open Roblox Studio and start WEPPY Plugin so live place data can appear.","dashboardHelp.overview.currentState.default":"If the server disconnects, restart MCP or wait for the automatic reconnect.","dashboardHelp.connection.currentState.1":"If Plugin is missing, open Roblox Studio and run WEPPY Plugin. If AI Agent is missing, reconnect the MCP server from your AI tool.","dashboardHelp.sync.currentState.pluginMissing":"Connect WEPPY Plugin in Studio before using live sync details.","dashboardHelp.sync.currentState.basic":"Activate Pro to use bidirectional or reverse sync.","dashboardHelp.sync.currentState.default":"Use the sync log to diagnose stuck or failed sync activity.","dashboardHelp.assets.currentState.basic":"Activate Pro before uploading to Roblox.","dashboardHelp.assets.currentState.uploadDisabled":"Turn on Open Cloud upload in Assets settings.","dashboardHelp.assets.currentState.noCredential":"Save and test an Open Cloud API Key.","dashboardHelp.assets.currentState.noCreator":"Save a default Creator ID or enter Creator details during upload.","dashboardHelp.assets.currentState.default":"Open an asset detail dialog to start upload or usage scan.","dashboardHelp.changelog.currentState.1":"If the list is empty, ask the AI Agent to make a game change. Clear only deletes saved history records, not Studio objects.","dashboardHelp.playtest.currentState.basic":"Activate Pro to use real Playtest history.","dashboardHelp.playtest.currentState.default":"Ask the AI Agent to run a Playtest when no report is available.","dashboardHelp.uiStudio.currentState.basic":"Activate Pro to use live UI Studio previews.","dashboardHelp.uiStudio.currentState.default":"Ask the AI Agent to capture the UI or recheck improvement suggestions, then copy follow-up requests back to the AI chat.","dashboardHelp.tools.currentState.1":"If no records appear, check Controls > General Settings and confirm history/statistics are enabled. Expand failed rows to inspect input, permission, or connection causes.","dashboardHelp.settings.currentState.1":"Activate a license for Pro features. Change environment values outside WEPPY Dashboard, then restart MCP. Review delete confirmations before clearing saved data.","dashboardHelp.openCloudApiKey.currentState.saved":"Use Test Connection to confirm the saved key still works.","dashboardHelp.openCloudApiKey.currentState.empty":"Create an API key in Roblox Creator Hub, paste it here, then save and test it.","dashboardHelp.openCloudCreatorId.currentState.saved":"Keep this value if new assets should continue using the same owner.","dashboardHelp.openCloudCreatorId.currentState.empty":"Choose User or Group, paste the numeric ID, then save the default Creator.","page.overview.title":"Overview","page.overview.description":"Check server, plugin, agent, sync, and recent game-change status in one place.","page.connection.title":"Connection","page.connection.description":"Inspect MCP server, AI agent, Studio plugin, and connection log status.","page.sync.title":"Sync","page.sync.description":"Monitor Studio to local sync status, direction, apply mode, and recent sync logs.","page.changelog.title":"Changelog","page.changelog.description":"Review game-change sessions captured from AI actions and sync events.","page.playtest.title":"Playtest","page.playtest.description":"Review automated playtest runs, saved reports, and result history.","page.uiStudio.title":"UI Studio","page.uiStudio.description":"Review UI captures, improvement suggestions, and before/after change history.","page.tools.title":"Tools","page.tools.description":"Inspect tool history, outcomes, fallback details, and usage statistics.","page.settings.title":"Settings","page.settings.description":"Manage license, saved data, server environment, and language.","dashboardHelp.whatsNew.title":"What's New help","dashboardHelp.whatsNew.canDo.1":"Review WEPPY Dashboard, MCP, and Plugin announcements, releases, and change notes.","dashboardHelp.whatsNew.needs.1":"Announcements are bundled locally. Unread state is stored in this browser.","dashboardHelp.whatsNew.currentState.1":"After you visit this page, unread announcements from this visit are marked read when you leave. The top header does not show a duplicate What's New button on this page.","sidebar.controls":"Controls","header.manageProjectRoot":"Manage Project Root","header.manageProjectRoot.tooltip":"Open Project Root controls","connection.routing.manage":"Manage routing","controls.projectRoot.title":"Project Root","controls.projectRoot.title.tooltip":"Authoritative project root and sync target used by MCP.","controls.projectRoot.live.tooltip":"Changing this updates MCP runtime state immediately after confirmation.","controls.projectRoot.unavailable":"Project root unavailable","controls.projectRoot.projectRoot":"Project Root","controls.projectRoot.syncRoot":"Sync Root","controls.projectRoot.hint":"Use this only when MCP should write sync data under a different project folder. Existing sync folders are not moved automatically.","controls.studioRouting.title":"Studio Routing","controls.studioRouting.title.tooltip":"Routing priority for MCP requests that do not name a Studio target.","page.controls.title":"Controls","page.controls.description":"Manage project root, Studio routing, and MCP live settings.","dashboardHelp.controls.title":"Controls help","dashboardHelp.controls.canDo.1":"Manage Project Root, Studio routing, and MCP hot settings.","dashboardHelp.controls.needs.1":"Project Root and Studio Routing need MCP server connection. Hot settings need a server response. Asset upload controls live in Assets settings.","dashboardHelp.controls.currentState.1":"Use Project Root only when MCP should write sync data under a different project folder. Use Studio Routing only for requests where the agent does not name Studio ID, Connection ID, or Place ID.","header.projectGroup.label":"Project","header.activeStudio.label":"Active Studio","header.activeStudio.tooltip":"Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target.","header.studioTarget.tooltip":"Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}","header.storedPlace.tooltip":"Stored project place: {placeName} · Place ID: {placeId} · State: {state}","header.activeStudio.emptyTooltip":"No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin.","header.placeData.label":"Place Data","header.placeData.unavailable":"Place data unavailable","header.placeData.tooltip":"Current place data directory","controls.studioRouting.duplicatePlaceWarning":"More than one connected Studio window has the same Place ID. Ask the AI agent to use Studio ID for that place.","connection.routing.priorityControl":"Priority mode for requests without a named Studio target","connection.routing.recentPriority":"Automatic: Recent priority","connection.routing.pinned":"Manual: Pinned Studio","connection.routing.priorityBadge":"Priority","connection.routing.pinnedBadge":"Pinned","connection.routing.setPriorityTarget":"Set as priority target","controls.studioRouting.priorityTitle":"Priority for requests without a named Studio target","controls.studioRouting.priorityDescription":"Explicit Studio ID, Connection ID, or Place ID requests bypass this priority setting and route to the named Studio.","controls.studioRouting.currentPriorityTarget":"Current priority target","controls.studioRouting.noPriorityTarget":"No connected Studio target","controls.studioRouting.recentPriorityHelp":"Requests the highest-priority active Studio, based on recent routed commands and connection order.","controls.studioRouting.pinnedHelp":"Requests the pinned Studio unless the agent names a Studio ID, Connection ID, or Place ID.","sync.migration.title":"Mise à jour du format Sync disponible","sync.migration.description":"Vérifiez les changements de métadonnées avant de faire passer ce Place du format Sync v2 au v3.","sync.migration.status.ready":"Prêt à vérifier","sync.migration.status.blocked":"Bloqué","sync.migration.preview":"Vérifier les changements","sync.migration.summary.add":"Ajouter","sync.migration.summary.modify":"Modifier","sync.migration.summary.delete":"Supprimer","sync.migration.summary.blocked":"Bloqué","sync.migration.changes":"Changements de métadonnées","sync.migration.blockers":"Éléments à résoudre","sync.migration.operation.add":"ajouter","sync.migration.operation.modify":"modifier","sync.migration.operation.delete":"supprimer","sync.migration.reason.serializer_regeneration":"Réécrit les métadonnées dans le format canonique v3.","sync.migration.reason.volatile_metadata_removal":"Supprime les métadonnées Sync temporaires.","sync.migration.reason.redundant_empty_metadata":"Supprime les métadonnées vides redondantes.","sync.migration.reason.runtime_ignore_policy":"Met à jour la règle d’exclusion du runtime gérée.","sync.migration.reason.reverse_pending":"Appliquez ou abandonnez d’abord les changements locaux en attente vers Studio.","sync.migration.reason.conflict":"Résolvez d’abord le conflit entre les fichiers locaux et Studio.","sync.migration.reason.local_canonical_change":"Vérifiez d’abord les métadonnées canoniques modifiées localement.","sync.migration.reason.source_mutation_detected":"Un fichier source utilisateur a changé pendant la validation.","sync.migration.blocked":"Résolvez les conflits Sync avant la mise à jour","sync.migration.stale":"L’aperçu a changé. Vérifiez la différence la plus récente.","sync.migration.error":"Impossible de mettre à jour le format Sync. Réessayez.","sync.migration.refresh":"Actualiser l’aperçu","sync.migration.refreshing":"Actualisation…","sync.migration.applying":"Application…","sync.migration.apply":"Appliquer la mise à jour","sync.migration.confirm.title":"Appliquer la mise à jour du format Sync ?","sync.migration.confirm.message":"Les métadonnées Sync indiquées seront sauvegardées puis mises à jour. Vos fichiers source Luau ne seront pas modifiés.","changelog.ownership.showGenerated":"Afficher les métadonnées générées","changelog.ownership.userSource":"Source utilisateur","changelog.ownership.canonicalMirror":"Métadonnées du miroir","changelog.ownership.generated":"Généré"},$y=["en","ko","es","pt-br","ja","id","de","fr-fr"],Ta="auto",Il={en:By,ko:Wy,es:Fy,"pt-br":Ky,ja:Yy,id:Vy,de:Gy,"fr-fr":Xy},An="dashboard-locale";function Ol(i){return $y.includes(i)}function Qy(){const n=((typeof navigator<"u"?navigator.language:"en")??"en").toLowerCase();return n==="ko"||n.startsWith("ko-")?"ko":n==="pt-br"?"pt-br":n==="ja"||n.startsWith("ja-")?"ja":n==="es"||n.startsWith("es-")?"es":n==="id"||n.startsWith("id-")?"id":n==="de"||n.startsWith("de-")?"de":n==="fr"||n.startsWith("fr-")?"fr-fr":"en"}function ep(){if(typeof localStorage<"u"){const i=localStorage.getItem(An);if(i===Ta)return Ta;if(i&&Ol(i))return i}return Ta}function tp(i){return i===Ta?Qy():i}const zp=R.createContext(null);function Zy({children:i}){const[n,r]=R.useState(ep),[d,u]=R.useState(()=>tp(ep())),p=R.useCallback((y,h)=>{const v=Il[d]??Il.en??{};if(y in v)return v[y];const P=Il.en;return P&&y in P?P[y]:h!==void 0?h:y},[d]),g=R.useCallback(y=>{typeof localStorage<"u"&&(y===Ta?localStorage.removeItem(An):Ol(y)?localStorage.setItem(An,y):localStorage.setItem(An,"en"));const h=y===Ta?Ta:Ol(y)?y:"en";r(h),u(tp(h))},[]);return R.createElement(zp.Provider,{value:{locale:d,selectedLocale:n,t:p,setLocale:g}},i)}function Uo(){const i=R.useContext(zp);if(!i)throw new Error("useLocale must be used within a LocaleProvider");return i}const Jy="_container_6jg7e_2",ef="_toast_6jg7e_14",tf="_slideIn_6jg7e_1",of="_success_6jg7e_39",af="_info_6jg7e_44",sf="_warning_6jg7e_49",nf="_error_6jg7e_54",Dl={container:Jy,toast:ef,slideIn:tf,success:of,info:af,warning:sf,error:nf},Hp=R.createContext(null),rf=3e3;function lf({children:i}){const[n,r]=R.useState([]),d=R.useRef(0),u=R.useCallback((p,g="info")=>{const y=d.current++;r(h=>[...h,{id:y,message:p,type:g}]),setTimeout(()=>{r(h=>h.filter(v=>v.id!==y))},rf)},[]);return x.jsxs(Hp.Provider,{value:{show:u},children:[i,x.jsx("div",{className:Dl.container,children:n.map(p=>x.jsx("div",{className:`${Dl.toast} ${Dl[p.type]}`,children:p.message},p.id))})]})}function df(){const i=R.useContext(Hp);return i||{show:()=>{}}}function uf(){const{level:i}=_n(),{show:n}=df(),{t:r}=Uo(),d=R.useRef(null);return R.useEffect(()=>{const u=d.current;d.current=i,u!==null&&u!==i&&(u==="disconnected"&&i==="serverOnly"?n(r("toast.serverConnected","MCP 서버 연결됨"),"success"):u==="serverOnly"&&i==="studioConnected"?n(r("toast.pluginConnected","플러그인 연결됨"),"success"):(u==="serverOnly"||u==="studioConnected")&&i==="disconnected"?n(r("toast.serverDisconnected","MCP 서버 연결 끊김"),"error"):u==="studioConnected"&&i==="serverOnly"&&n(r("toast.pluginDisconnected","플러그인 연결 끊김"),"warning"))},[i,n,r]),null}const cf="_wrapper_x0nim_2",pf="_tooltip_x0nim_11",gf="_tooltipVisible_x0nim_30",El={wrapper:cf,tooltip:pf,tooltipVisible:gf},li=8,xn=6;function Ft({text:i,children:n}){const r=R.useRef(null),d=R.useRef(null),[u,p]=R.useState(!1),[g,y]=R.useState("top"),[h,v]=R.useState("center"),[P,w]=R.useState(null),D=i.trim(),U=R.useCallback(()=>{const te=r.current,K=d.current;if(!te||!K)return;const $=te.getBoundingClientRect(),V=K.getBoundingClientRect(),he=window.innerWidth,De=window.innerHeight;let E="top";$.top-V.height-xn<li&&$.bottom+V.height+xn<=De-li&&(E="bottom");let Q="center";const Pe=$.left+$.width/2,ce=V.width/2;Pe-ce<li?Q="left":Pe+ce>he-li&&(Q="right");const He=E==="top"?$.top-V.height-xn:$.bottom+xn;let ve;Q==="left"?ve=$.left:Q==="right"?ve=$.right-V.width:ve=Pe-ce,ve=Math.max(li,Math.min(ve,he-V.width-li)),y(E),v(Q),w({top:He,left:ve})},[]);if(R.useLayoutEffect(()=>{u&&U()},[u,U]),R.useEffect(()=>{if(!u)return;const te=()=>U();return window.addEventListener("scroll",te,!0),window.addEventListener("resize",te),()=>{window.removeEventListener("scroll",te,!0),window.removeEventListener("resize",te)}},[u,U]),!D)return x.jsx(x.Fragment,{children:n});const B=()=>p(!0),z=()=>p(!1),N=x.jsx("span",{ref:d,className:[El.tooltip,u?El.tooltipVisible:""].filter(Boolean).join(" "),"data-placement":h,"data-vertical":g,style:P?{top:P.top,left:P.left}:{top:-9999,left:-9999,visibility:"hidden"},children:D});return x.jsxs(x.Fragment,{children:[x.jsx("span",{ref:r,className:El.wrapper,"data-tooltip-text":D,onMouseEnter:B,onMouseLeave:z,onFocus:B,onBlur:z,children:n}),typeof document<"u"?Un.createPortal(N,document.body):null]})}function hf(i){return i==="auto"||i==="polar"||i==="gumroad"?i:void 0}function mf(i){if(!i||typeof i!="object")return!1;const n=i.status;return(i.tier==="basic"||i.tier==="pro")&&(n==="active"||n==="grace"||n==="invalid"||n==="revoked"||n==="unlicensed"||n==="unknown")}function Lp(i){return i&&typeof i=="object"&&"data"in i&&i.data?i.data:i}function _p(i){if(!i||typeof i!="object")return null;if(mf(i))return i;const n=i;if(typeof n.canUsePro!="boolean"||typeof n.status!="string"||n.status!=="active"&&n.status!=="grace"&&n.status!=="invalid"&&n.status!=="revoked"&&n.status!=="unlicensed"&&n.status!=="unknown")return null;const r=hf(n.provider);return{tier:n.canUsePro?"pro":"basic",status:n.status,...typeof n.statusDetail=="string"?{statusDetail:n.statusDetail}:{},...typeof n.maskedKey=="string"?{maskedKey:n.maskedKey}:{},...r?{provider:r}:{},refreshRequired:n.refreshRequired===!0,...typeof n.refreshBlockedReason=="string"?{refreshBlockedReason:n.refreshBlockedReason}:{}}}async function Np(i="auto"){const n=await Et.get("/api/dashboard/license/status",{provider:i});return _p(Lp(n))}function Zl(i){const n=Lp(i),r=n,d=_p(n),u=typeof(r==null?void 0:r.reasonCode)=="string"?r.reasonCode:void 0;return{ok:(r==null?void 0:r.ok)===!0,license:d?{...d,refreshRequired:d.refreshRequired||u==="missing_session_token",refreshBlockedReason:d.refreshBlockedReason??(u==="missing_session_token"?"missing_session_token":void 0)}:null,message:typeof(r==null?void 0:r.message)=="string"?r.message:null,reasonCode:u,recoverable:(r==null?void 0:r.recoverable)===!0}}async function Mb(i){const n=i.provider??"auto",r=await Et.post("/api/dashboard/license/activate",{provider:n,licenseKey:i.licenseKey,clientType:"dashboard"});return Zl(r)}async function zb(i={}){const n=i.provider??"auto",r=await Et.post("/api/dashboard/license/refresh",{provider:n,clientType:"dashboard"});return Zl(r)}async function Hb(i={}){const n=i.provider??"auto",r=await Et.post("/api/dashboard/license/reset",{provider:n,clientType:"dashboard"});return Zl(r)}/**
|
|
150
150
|
* @license lucide-react v1.8.0 - ISC
|
|
151
151
|
*
|
|
152
152
|
* This source code is licensed under the ISC license.
|
|
@@ -256,7 +256,7 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
|
|
|
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
|
|
259
|
+
*/const Vf=[["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"}]],Gf=Ke("lightbulb",Vf);/**
|
|
260
260
|
* @license lucide-react v1.8.0 - ISC
|
|
261
261
|
*
|
|
262
262
|
* This source code is licensed under the ISC license.
|
|
@@ -311,7 +311,71 @@ Ceci est un exemple d’aperçu. Passez à Pro pour exécuter des tests de jeu e
|
|
|
311
311
|
*
|
|
312
312
|
* This source code is licensed under the ISC license.
|
|
313
313
|
* See the LICENSE file in the root directory of this source tree.
|
|
314
|
-
*/const pS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],gS=Ke("x",pS),Fp=[{labelKey:"sidebar.overview",route:"/",icon:Yf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./OverviewPage-DI5xU7tr.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))},{labelKey:"sidebar.connection",route:"/connection",icon:iS,minLevel:"disconnected",lazy:()=>Kt(()=>import("./ConnectionPage-8_vdhL7O.js"),__vite__mapDeps([13,1,2,3,4,5,6,7,8,14,15,16,11,17,18]))},{labelKey:"sidebar.sync",route:"/sync",icon:Bp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./SyncPage-ChaWvprV.js"),__vite__mapDeps([19,2,3,4,5,1,8,14,15,16,20,21,6,7,22]))},{labelKey:"sidebar.assets",route:"/assets",icon:oS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./AssetsPage-kz1FKCck.js"),__vite__mapDeps([23,14,15,16,2,3,4,5,8,17,24]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:qf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ChangelogPage-DBeldxYm.js"),__vite__mapDeps([25,2,3,4,5,14,15,16,20,21,8,26,27,28]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Nf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./PlaytestPage-BXzNfelw.js"),__vite__mapDeps([29,2,3,4,5,1,20,21,8,14,15,16,30]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Wf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./UiStudioPage-De2Q3D5I.js"),__vite__mapDeps([31,1,8,3,4,32,33,26,27,2,5,20,21,34]))},{labelKey:"sidebar.tools",route:"/tools",icon:cS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ToolsPage-AYrVzepe.js"),__vite__mapDeps([35,2,3,4,5,8,14,15,16,20,21,26,27,36]))}],ql=[{labelKey:"sidebar.controls",route:"/controls",icon:Wp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ControlsPage-CZBhWyyn.js"),__vite__mapDeps([37,2,3,4,5,1,15,16,8,38,39,17]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:Cf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./WhatsNewPage-CK-MRVXv.js"),__vite__mapDeps([40,2,3,4,5,41]))}],jl="https://github.com/hope1026/weppy-roblox-mcp",hS="https://weppyai.com";function Bl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Kp(i){var v,P,w,D,U;const n=Bl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((P=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:P.pluginVersion)??"",p=((D=(w=r==null?void 0:r.pluginClients)==null?void 0:w[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((U=r==null?void 0:r.aiClientNames)==null?void 0:U[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function mS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function yS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const fS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Af,buildUrl:i=>`${jl}/issues/new?${mS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Vf,buildUrl:()=>`${jl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:Zf,buildUrl:i=>`${jl}/issues/new?${yS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:xf,buildUrl:i=>`${hS}/${i.locale}/docs/troubleshooting/`}];function SS(){const[i,n]=R.useState("basic"),[r,d]=R.useState(0),[u,p]=R.useState(0),[g,y]=R.useState(0),[h,v]=R.useState(!0);R.useEffect(()=>{let w=!1;async function D(){try{return await Np("auto")}catch{return null}}async function U(){var N,te;try{const[K,$]=await Promise.all([D(),Et.get("/api/dashboard/tool-stats").catch(()=>null)]);if(w)return;if(K!=null&&K.tier&&n(K.tier),$!=null&&$.tierSummary){const G=((N=$.tierSummary.basic)==null?void 0:N.totalCalls)??0,he=((te=$.tierSummary.pro)==null?void 0:te.totalCalls)??0;y(G),p(he),d(G+he)}}catch{}finally{w||v(!1)}}U();const B=new Ql;B.connect();const z=B.on("license",()=>{D().then(N=>{!w&&(N!=null&&N.tier)&&n(N.tier)})});return()=>{w=!0,z(),B.disconnect()}},[]);const P=r>0?u/r*100:0;return{tier:i,proUsagePercent:P,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const vS="https://weppyai.com/plans/";function Ra(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${vS}?${n.toString()}`}const bS={sidebarUpgrade:Ra("sidebar_upgrade"),settingsLicense:Ra("settings_license"),sync:Ra("sync_tier_panel"),changelog:Ra("changelog_limit_notice"),playtest:Ra("playtest_sample_banner"),uiStudioAnalysis:Ra("ui_studio_analysis_banner"),uiStudioHistory:Ra("ui_studio_history_banner")},PS=5e3,wS=5;function CS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function kS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function ds(i,n){const r=CS(i);if(n===void 0)return r;const d=kS(r,n);return d?{page:r,tab:d}:{page:r}}let ci=[],np=null;function Yp(){if(ci.length===0)return;const i=ci.splice(0),n=`${Ln}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function xS(){np||(np=setInterval(Yp,PS))}function rp(i){ci.push(i),xS(),ci.length>=wS&&Yp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ci.length===0)return;const i=`${Ln}/api/dashboard/analytics`,n=JSON.stringify({events:ci.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function us(){const i=R.useCallback((r,d)=>{rp({name:r,params:d})},[]),n=R.useCallback(r=>{rp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const RS="_widget_1q1ab_1",AS="_header_1q1ab_12",IS="_sparkle_1q1ab_18",DS="_title_1q1ab_23",ES="_actions_1q1ab_31",TS="_cta_1q1ab_37",jS="_licenseCta_1q1ab_38",US="_collapsedGroup_1q1ab_70",MS="_collapsed_1q1ab_70",zS="_collapsedSecondary_1q1ab_91",oo={widget:RS,header:AS,sparkle:IS,title:DS,actions:ES,cta:TS,licenseCta:jS,collapsedGroup:US,collapsed:MS,collapsedSecondary:zS};function HS({collapsed:i=!1}){const{tier:n}=SS(),{t:r}=Uo(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt();if(n==="pro")return null;const g=bS.sidebarUpgrade,y="/settings?section=license",h=ds(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},P=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?x.jsxs("div",{className:oo.collapsedGroup,children:[x.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:x.jsx(sp,{size:18,strokeWidth:1.75})}),x.jsx(Ea,{to:y,className:`${oo.collapsed} ${oo.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:P,children:x.jsx(ip,{size:18,strokeWidth:1.75})})]}):x.jsxs("div",{className:oo.widget,children:[x.jsxs("div",{className:oo.header,children:[x.jsx(sp,{size:16,strokeWidth:1.75,className:oo.sparkle}),x.jsx("span",{className:oo.title,children:r("upgrade.tagline","Check Pro features")})]}),x.jsxs("div",{className:oo.actions,children:[x.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),x.jsxs(Ea,{to:y,className:oo.licenseCta,onClick:P,children:[x.jsx(ip,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),x.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const LS="_backdrop_1r5ey_1",_S="_dialog_1r5ey_11",NS="_header_1r5ey_21",OS="_titleBlock_1r5ey_30",qS="_title_1r5ey_30",BS="_subtitle_1r5ey_42",WS="_closeButton_1r5ey_49",FS="_body_1r5ey_67",KS="_statusBox_1r5ey_73",YS="_errorBox_1r5ey_74",GS="_spin_1r5ey_92",VS="_bundleBlock_1r5ey_102",XS="_label_1r5ey_107",$S="_bundleName_1r5ey_115",QS="_guidanceBox_1r5ey_127",ZS="_includedList_1r5ey_143",JS="_includedItem_1r5ey_152",ev="_actions_1r5ey_163",tv="_button_1r5ey_169",ov="_primaryLink_1r5ey_170",av="_hint_1r5ey_206",We={backdrop:LS,dialog:_S,header:NS,titleBlock:OS,title:qS,subtitle:BS,closeButton:WS,body:FS,statusBox:KS,errorBox:YS,spin:GS,bundleBlock:VS,label:XS,bundleName:$S,guidanceBox:QS,includedList:ZS,includedItem:JS,actions:ev,button:tv,primaryLink:ov,hint:av};function Ul(){return typeof navigator<"u"?navigator.userAgent:""}function iv(i){window.open(i,"_blank","noopener,noreferrer")}function sv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=Uo(),p=R.useId(),[g,y]=R.useState(!1),[h,v]=R.useState(null),[P,w]=R.useState(null),[D,U]=R.useState("idle");if(R.useEffect(()=>{if(!i)return;let G=!1;const he=Ul();return y(!0),v(null),w(null),U("idle"),Et.post("/api/dashboard/support/bug-report",{os:Bl(he),userAgent:he,locale:d}).then(De=>{G||(v(De),y(!1))}).catch(()=>{G||(w(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{G=!0}},[i,d]),R.useEffect(()=>{if(!i||g)return;function G(he){he.key==="Escape"&&r()}return window.addEventListener("keydown",G),()=>window.removeEventListener("keydown",G)},[i,g,r]),!i)return null;async function B(){if(h)try{U("opening"),await Et.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),U("opened")}catch{U("failed")}}const z=h!==null,N=(h==null?void 0:h.issueUrl)??n,te=(h==null?void 0:h.includedFiles)??[],K=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),$=x.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:x.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:G=>G.stopPropagation(),children:[x.jsxs("div",{className:We.header,children:[x.jsxs("div",{className:We.titleBlock,children:[x.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),x.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),x.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:x.jsx(gS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),x.jsxs("div",{className:We.body,children:[g&&x.jsxs("div",{className:We.statusBox,role:"status",children:[x.jsx($f,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),P&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(Mf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:P})]}),z&&x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:We.guidanceBox,children:[x.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),x.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),x.jsx("code",{className:We.bundleName,children:h.bundleName})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),x.jsx("ul",{className:We.includedList,children:te.length>0?te.map(G=>x.jsx("li",{className:We.includedItem,children:G.label},`${G.label}:${G.archivePath??G.path}`)):x.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(ap,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),x.jsxs("div",{className:We.actions,children:[z&&x.jsxs(x.Fragment,{children:[x.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[x.jsx(Tf,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[x.jsx(ap,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),K]})]}),P&&!z&&x.jsxs("button",{type:"button",className:We.button,onClick:()=>{w(null),y(!0),Et.post("/api/dashboard/support/bug-report",{os:Bl(Ul()),userAgent:Ul(),locale:d}).then(G=>{v(G),y(!1)}).catch(()=>{w(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[x.jsx(Bp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>iv(N),disabled:g,children:[x.jsx(qp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),z?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),x.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?$:Un.createPortal($,document.body)}const nv="_sidebar_19hyu_2",rv="_brand_19hyu_17",lv="_brandIcon_19hyu_28",dv="_brandText_19hyu_33",uv="_brandTextPro_19hyu_44",cv="_nav_19hyu_50",pv="_spacer_19hyu_57",gv="_navLink_19hyu_63",hv="_active_19hyu_84",mv="_disabled_19hyu_91",yv="_icon_19hyu_102",fv="_label_19hyu_113",Sv="_secondaryDivider_19hyu_120",vv="_secondaryNav_19hyu_127",bv="_secondaryNavEntry_19hyu_134",Pv="_secondaryItemDivider_19hyu_140",wv="_helpDivider_19hyu_147",Cv="_helpGroupTitle_19hyu_154",kv="_helpNav_19hyu_165",xv="_externalIcon_19hyu_172",Je={sidebar:nv,brand:rv,brandIcon:lv,brandText:dv,brandTextPro:uv,nav:cv,spacer:pv,navLink:gv,active:hv,disabled:mv,icon:yv,label:fv,secondaryDivider:Sv,secondaryNav:vv,secondaryNavEntry:bv,secondaryItemDivider:Pv,helpDivider:wv,helpGroupTitle:Cv,helpNav:kv,externalIcon:xv},Rv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Av(){const[i,n]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const lp={disconnected:0,serverOnly:1,studioConnected:2};function Iv(i,n){return lp[i]>=lp[n]}function Dv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function dp({item:i}){const{level:n}=_n(),{t:r}=Uo(),d=Iv(n,i.minLevel),u=i.icon,p=x.jsxs(Iy,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[x.jsx("span",{className:Je.icon,children:x.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:x.jsx(Ft,{text:Dv(i.minLevel,r),children:p})}function Ev({item:i,ctx:n}){const{t:r}=Uo(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=ds(u,p),[P,w]=R.useState(!1),D=x.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Rv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),w(!0))},children:[x.jsx("span",{className:Je.icon,children:x.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)}),x.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:x.jsx(qp,{size:12,strokeWidth:1.75})})]}),U=h?x.jsx(Ft,{text:h,children:D}):D;return x.jsxs(x.Fragment,{children:[U,i.id==="bug"&&x.jsx(sv,{open:P,fallbackHref:y,onClose:()=>w(!1)})]})}function Tv(){const[i,n]=R.useState("basic"),r=Av(),{status:d}=_n(),{locale:u,t:p}=Uo(),g={locale:u,status:d};return R.useEffect(()=>{let y=!1;async function h(){try{const w=await Np("auto");!y&&(w!=null&&w.tier)&&n(w.tier)}catch{y||n("basic")}}h();const v=new Ql;v.connect();const P=v.on("license",()=>{h()});return()=>{y=!0,P(),v.disconnect()}},[]),x.jsxs("aside",{className:Je.sidebar,children:[x.jsxs("div",{className:Je.brand,children:[x.jsx("span",{className:Je.brandIcon,children:x.jsx(Df,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),x.jsx("nav",{className:Je.nav,children:Fp.map(y=>x.jsx(dp,{item:y},y.route))}),x.jsx("div",{className:Je.secondaryDivider}),x.jsx("nav",{className:Je.secondaryNav,children:ql.map((y,h)=>x.jsxs("div",{className:Je.secondaryNavEntry,children:[x.jsx(dp,{item:y}),h<ql.length-1?x.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),x.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),x.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),x.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:fS.map(y=>x.jsx(Ev,{item:y,ctx:g},y.id))}),x.jsx("div",{className:Je.spacer}),x.jsx(HS,{collapsed:r})]})}async function jv(){return Et.get("/api/dashboard/place-summary")}async function Uv(){return Et.get("/api/dashboard/sync-root")}async function Lb(){return Et.post("/api/dashboard/sync-root/pick")}async function _b(i){return Et.patch("/api/dashboard/sync-root",{projectRoot:i})}const Mv=[{id:"2026-07-18-sync-file-format-update",date:"2026-07-18",title:{en:"Review changes before applying the Sync update",ko:"Sync 업데이트 전 변경 내용을 확인하세요",es:"Revisa los cambios antes de aplicar la actualización de Sync","pt-br":"Revise as alterações antes de aplicar a atualização do Sync",ja:"Syncアップデートを適用する前に変更内容を確認してください",id:"Tinjau perubahan sebelum menerapkan pembaruan Sync",de:"Änderungen vor dem Sync-Update prüfen","fr-fr":"Vérifiez les changements avant d’appliquer la mise à jour Sync"},body:{en:`The Sync file format has changed. Existing Sync projects are not changed automatically. Open the Sync page in WEPPY Dashboard to review the files that would change, then apply the update when you are ready.
|
|
314
|
+
*/const pS=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],gS=Ke("x",pS),Fp=[{labelKey:"sidebar.overview",route:"/",icon:Yf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./OverviewPage-D97-QaK1.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12]))},{labelKey:"sidebar.connection",route:"/connection",icon:iS,minLevel:"disconnected",lazy:()=>Kt(()=>import("./ConnectionPage-Gzmb4mZX.js"),__vite__mapDeps([13,1,2,3,4,5,6,7,8,14,15,16,11,17,18]))},{labelKey:"sidebar.sync",route:"/sync",icon:Bp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./SyncPage-DEdR5Ijn.js"),__vite__mapDeps([19,2,3,4,5,1,8,14,15,16,20,21,6,7,22]))},{labelKey:"sidebar.assets",route:"/assets",icon:oS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./AssetsPage-umP7b78C.js"),__vite__mapDeps([23,14,15,16,2,3,4,5,8,17,24]))},{labelKey:"sidebar.changelog",route:"/changelog",icon:qf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ChangelogPage-6jN6-VKm.js"),__vite__mapDeps([25,2,3,4,5,14,15,16,20,21,8,26,27,28]))},{labelKey:"sidebar.playtest",route:"/playtest",icon:Nf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./PlaytestPage-T_t7jgJo.js"),__vite__mapDeps([29,2,3,4,5,1,20,21,8,14,15,16,30]))},{labelKey:"sidebar.ui_studio",route:"/ui-studio",icon:Wf,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./UiStudioPage-B4VBb4-9.js"),__vite__mapDeps([31,1,8,3,4,32,33,26,27,2,5,20,21,34]))},{labelKey:"sidebar.tools",route:"/tools",icon:cS,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ToolsPage-C5s8W0Y6.js"),__vite__mapDeps([35,2,3,4,5,8,14,15,16,20,21,26,27,36]))}],ql=[{labelKey:"sidebar.controls",route:"/controls",icon:Wp,minLevel:"serverOnly",lazy:()=>Kt(()=>import("./ControlsPage-ZEYij-3D.js"),__vite__mapDeps([37,2,3,4,5,1,15,16,8,38,39,17]))},{labelKey:"sidebar.whatsNew",route:"/whats-new",icon:Cf,minLevel:"disconnected",lazy:()=>Kt(()=>import("./WhatsNewPage-DXgOgUUb.js"),__vite__mapDeps([40,2,3,4,5,41]))}],jl="https://github.com/hope1026/weppy-roblox-mcp",hS="https://weppyai.com";function Bl(i){return i?/Mac OS X|Macintosh/i.test(i)?"macOS":/Windows NT/i.test(i)?"Windows":/Linux/i.test(i)?"Linux":"":""}function Kp(i){var v,P,w,D,U;const n=Bl(typeof navigator<"u"?navigator.userAgent:""),r=i.status,d=(r==null?void 0:r.version)??"",u=((P=(v=r==null?void 0:r.pluginClients)==null?void 0:v[0])==null?void 0:P.pluginVersion)??"",p=((D=(w=r==null?void 0:r.pluginClients)==null?void 0:w[0])==null?void 0:D.studioVersion)??"",g=d||u||p?[d?`MCP ${d}`:"",u?`Plugin ${u}`:"",p?`Studio ${p}`:""].filter(Boolean).join(" / "):"",y=((U=r==null?void 0:r.aiClientNames)==null?void 0:U[0])??"",h=(r==null?void 0:r.nodeVersion)??"";return{os:n,nodeVersion:h,aiClient:y,pluginVersionLabel:g}}function mS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","bug_report.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}function yS(i){const{os:n,nodeVersion:r,aiClient:d,pluginVersionLabel:u}=Kp(i),p=new URLSearchParams;return p.set("template","install_help.yml"),n&&p.set("os",n),r&&p.set("node",r),d&&p.set("ai-client",d),u&&p.set("plugin-version",u),p.toString()}const fS=[{id:"bug",labelKey:"sidebar.help.bug",tooltipKey:"sidebar.help.bug.tooltip",icon:Af,buildUrl:i=>`${jl}/issues/new?${mS(i)}`},{id:"feature",labelKey:"sidebar.help.feature",tooltipKey:"sidebar.help.feature.tooltip",icon:Gf,buildUrl:()=>`${jl}/issues/new?template=feature_request.yml`},{id:"discussions",labelKey:"sidebar.help.discussions",tooltipKey:"sidebar.help.discussions.tooltip",icon:Zf,buildUrl:i=>`${jl}/issues/new?${yS(i)}`},{id:"troubleshooting",labelKey:"sidebar.help.troubleshooting",tooltipKey:"sidebar.help.troubleshooting.tooltip",icon:xf,buildUrl:i=>`${hS}/${i.locale}/docs/troubleshooting/`}];function SS(){const[i,n]=R.useState("basic"),[r,d]=R.useState(0),[u,p]=R.useState(0),[g,y]=R.useState(0),[h,v]=R.useState(!0);R.useEffect(()=>{let w=!1;async function D(){try{return await Np("auto")}catch{return null}}async function U(){var N,te;try{const[K,$]=await Promise.all([D(),Et.get("/api/dashboard/tool-stats").catch(()=>null)]);if(w)return;if(K!=null&&K.tier&&n(K.tier),$!=null&&$.tierSummary){const V=((N=$.tierSummary.basic)==null?void 0:N.totalCalls)??0,he=((te=$.tierSummary.pro)==null?void 0:te.totalCalls)??0;y(V),p(he),d(V+he)}}catch{}finally{w||v(!1)}}U();const B=new Ql;B.connect();const z=B.on("license",()=>{D().then(N=>{!w&&(N!=null&&N.tier)&&n(N.tier)})});return()=>{w=!0,z(),B.disconnect()}},[]);const P=r>0?u/r*100:0;return{tier:i,proUsagePercent:P,totalCalls:r,proCalls:u,basicCalls:g,loading:h}}const vS="https://weppyai.com/plans/";function Ra(i){const n=new URLSearchParams({utm_source:"weppy_dashboard",utm_medium:"app",utm_campaign:"pro_upgrade",utm_content:i});return`${vS}?${n.toString()}`}const bS={sidebarUpgrade:Ra("sidebar_upgrade"),settingsLicense:Ra("settings_license"),sync:Ra("sync_tier_panel"),changelog:Ra("changelog_limit_notice"),playtest:Ra("playtest_sample_banner"),uiStudioAnalysis:Ra("ui_studio_analysis_banner"),uiStudioHistory:Ra("ui_studio_history_banner")},PS=5e3,wS=5;function CS(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function kS(i,n){const r=new URLSearchParams(n);if(i==="ui-studio")return r.get("tab")==="history"?"ui_studio_history":"ui_studio_analysis";if(i==="tools")return"tools_history";if(i==="changelog")return"changelog_all"}function ds(i,n){const r=CS(i);if(n===void 0)return r;const d=kS(r,n);return d?{page:r,tab:d}:{page:r}}let ci=[],np=null;function Yp(){if(ci.length===0)return;const i=ci.splice(0),n=`${Ln}/api/dashboard/analytics`,r=JSON.stringify({events:i});fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:r}).catch(()=>{})}function xS(){np||(np=setInterval(Yp,PS))}function rp(i){ci.push(i),xS(),ci.length>=wS&&Yp()}typeof window<"u"&&window.addEventListener("beforeunload",()=>{if(ci.length===0)return;const i=`${Ln}/api/dashboard/analytics`,n=JSON.stringify({events:ci.splice(0)});navigator.sendBeacon(i,new Blob([n],{type:"application/json"}))});function us(){const i=R.useCallback((r,d)=>{rp({name:r,params:d})},[]),n=R.useCallback(r=>{rp({name:"dashboard_page_view",params:{...typeof r=="string"?{page:r}:r}})},[]);return{trackEvent:i,trackPageView:n}}const RS="_widget_1q1ab_1",AS="_header_1q1ab_12",IS="_sparkle_1q1ab_18",DS="_title_1q1ab_23",ES="_actions_1q1ab_31",TS="_cta_1q1ab_37",jS="_licenseCta_1q1ab_38",US="_collapsedGroup_1q1ab_70",MS="_collapsed_1q1ab_70",zS="_collapsedSecondary_1q1ab_91",oo={widget:RS,header:AS,sparkle:IS,title:DS,actions:ES,cta:TS,licenseCta:jS,collapsedGroup:US,collapsed:MS,collapsedSecondary:zS};function HS({collapsed:i=!1}){const{tier:n}=SS(),{t:r}=Uo(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt();if(n==="pro")return null;const g=bS.sidebarUpgrade,y="/settings?section=license",h=ds(u,p),v=()=>{d("dashboard_click_event",{click_target:"upgrade_cta",placement:"sidebar_upgrade",...h})},P=()=>{d("dashboard_click_event",{click_target:"license_shortcut",placement:"sidebar_license",...h})};return i?x.jsxs("div",{className:oo.collapsedGroup,children:[x.jsx("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.collapsed,title:r("upgrade.title","View Pro"),"aria-label":r("upgrade.title","View Pro"),onClick:v,children:x.jsx(sp,{size:18,strokeWidth:1.75})}),x.jsx(Ea,{to:y,className:`${oo.collapsed} ${oo.collapsedSecondary}`,title:r("upgrade.licenseShortcut","Enter License"),"aria-label":r("upgrade.licenseShortcut","Enter License"),onClick:P,children:x.jsx(ip,{size:18,strokeWidth:1.75})})]}):x.jsxs("div",{className:oo.widget,children:[x.jsxs("div",{className:oo.header,children:[x.jsx(sp,{size:16,strokeWidth:1.75,className:oo.sparkle}),x.jsx("span",{className:oo.title,children:r("upgrade.tagline","Check Pro features")})]}),x.jsxs("div",{className:oo.actions,children:[x.jsxs("a",{href:g,target:"_blank",rel:"noopener noreferrer",className:oo.cta,onClick:v,children:[r("upgrade.cta","View Pro")," →"]}),x.jsxs(Ea,{to:y,className:oo.licenseCta,onClick:P,children:[x.jsx(ip,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"}),x.jsx("span",{children:r("upgrade.licenseShortcut","Enter License")})]})]})]})}const LS="_backdrop_1r5ey_1",_S="_dialog_1r5ey_11",NS="_header_1r5ey_21",OS="_titleBlock_1r5ey_30",qS="_title_1r5ey_30",BS="_subtitle_1r5ey_42",WS="_closeButton_1r5ey_49",FS="_body_1r5ey_67",KS="_statusBox_1r5ey_73",YS="_errorBox_1r5ey_74",VS="_spin_1r5ey_92",GS="_bundleBlock_1r5ey_102",XS="_label_1r5ey_107",$S="_bundleName_1r5ey_115",QS="_guidanceBox_1r5ey_127",ZS="_includedList_1r5ey_143",JS="_includedItem_1r5ey_152",ev="_actions_1r5ey_163",tv="_button_1r5ey_169",ov="_primaryLink_1r5ey_170",av="_hint_1r5ey_206",We={backdrop:LS,dialog:_S,header:NS,titleBlock:OS,title:qS,subtitle:BS,closeButton:WS,body:FS,statusBox:KS,errorBox:YS,spin:VS,bundleBlock:GS,label:XS,bundleName:$S,guidanceBox:QS,includedList:ZS,includedItem:JS,actions:ev,button:tv,primaryLink:ov,hint:av};function Ul(){return typeof navigator<"u"?navigator.userAgent:""}function iv(i){window.open(i,"_blank","noopener,noreferrer")}function sv({open:i,fallbackHref:n,onClose:r}){const{locale:d,t:u}=Uo(),p=R.useId(),[g,y]=R.useState(!1),[h,v]=R.useState(null),[P,w]=R.useState(null),[D,U]=R.useState("idle");if(R.useEffect(()=>{if(!i)return;let V=!1;const he=Ul();return y(!0),v(null),w(null),U("idle"),Et.post("/api/dashboard/support/bug-report",{os:Bl(he),userAgent:he,locale:d}).then(De=>{V||(v(De),y(!1))}).catch(()=>{V||(w(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1))}),()=>{V=!0}},[i,d]),R.useEffect(()=>{if(!i||g)return;function V(he){he.key==="Escape"&&r()}return window.addEventListener("keydown",V),()=>window.removeEventListener("keydown",V)},[i,g,r]),!i)return null;async function B(){if(h)try{U("opening"),await Et.post("/api/dashboard/support/bug-report/reveal",{bundleName:h.bundleName}),U("opened")}catch{U("failed")}}const z=h!==null,N=(h==null?void 0:h.issueUrl)??n,te=(h==null?void 0:h.includedFiles)??[],K=D==="opening"?u("bugReportDialog.reveal.opening","Opening..."):D==="opened"?u("bugReportDialog.reveal.opened","Opened location"):u("bugReportDialog.reveal","Reveal in Finder"),$=x.jsx("div",{className:We.backdrop,onClick:g?void 0:r,children:x.jsxs("section",{className:We.dialog,role:"dialog","aria-modal":"true","aria-labelledby":p,onClick:V=>V.stopPropagation(),children:[x.jsxs("div",{className:We.header,children:[x.jsxs("div",{className:We.titleBlock,children:[x.jsx("h2",{id:p,className:We.title,children:u("bugReportDialog.title","diagnostics.zip can help us investigate")}),x.jsx("p",{className:We.subtitle,children:u("bugReportDialog.subtitle","WEPPY created a diagnostics zip on your computer. It includes Studio, plugin, Sync, and tool logs that can help us understand what happened.")})]}),x.jsx("button",{type:"button",className:We.closeButton,"aria-label":u("bugReportDialog.close","Close"),onClick:r,disabled:g,children:x.jsx(gS,{size:16,strokeWidth:1.75,"aria-hidden":"true"})})]}),x.jsxs("div",{className:We.body,children:[g&&x.jsxs("div",{className:We.statusBox,role:"status",children:[x.jsx($f,{className:We.spin,size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.loading","Preparing diagnostics.zip...")})]}),P&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(Mf,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:P})]}),z&&x.jsxs(x.Fragment,{children:[x.jsxs("div",{className:We.guidanceBox,children:[x.jsx("p",{children:u("bugReportDialog.optional","You can submit the bug report without this file, but attaching it usually helps us find the cause faster.")}),x.jsx("p",{children:u("bugReportDialog.attachHow","To attach it, download or reveal the zip, then add it to the Diagnostics ZIP (optional) upload field on GitHub before you submit.")})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.bundle","Bundle")}),x.jsx("code",{className:We.bundleName,children:h.bundleName})]}),x.jsxs("div",{className:We.bundleBlock,children:[x.jsx("span",{className:We.label,children:u("bugReportDialog.included","Included")}),x.jsx("ul",{className:We.includedList,children:te.length>0?te.map(V=>x.jsx("li",{className:We.includedItem,children:V.label},`${V.label}:${V.archivePath??V.path}`)):x.jsx("li",{className:We.includedItem,children:u("bugReportDialog.included.none","No log files found")})})]}),D==="failed"&&x.jsxs("div",{className:We.errorBox,role:"alert",children:[x.jsx(ap,{size:18,strokeWidth:1.75,"aria-hidden":"true"}),x.jsx("span",{children:u("bugReportDialog.reveal.failed","Could not open the file location.")})]})]}),x.jsxs("div",{className:We.actions,children:[z&&x.jsxs(x.Fragment,{children:[x.jsxs("a",{className:We.primaryLink,href:h.downloadUrl,download:h.bundleName,children:[x.jsx(Tf,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.download","1. Download diagnostics.zip")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>void B(),disabled:D==="opening",children:[x.jsx(ap,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),K]})]}),P&&!z&&x.jsxs("button",{type:"button",className:We.button,onClick:()=>{w(null),y(!0),Et.post("/api/dashboard/support/bug-report",{os:Bl(Ul()),userAgent:Ul(),locale:d}).then(V=>{v(V),y(!1)}).catch(()=>{w(u("bugReportDialog.error","Could not create the diagnostics bundle. You can still open GitHub without diagnostics.")),y(!1)})},children:[x.jsx(Bp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),u("bugReportDialog.retry","Try again")]}),x.jsxs("button",{type:"button",className:We.button,onClick:()=>iv(N),disabled:g,children:[x.jsx(qp,{size:16,strokeWidth:1.75,"aria-hidden":"true"}),z?u("bugReportDialog.openGithub","2. Open GitHub issue"):u("bugReportDialog.openGithubFallback","Open GitHub without diagnostics")]})]}),x.jsx("p",{className:We.hint,children:u("bugReportDialog.hint","The zip can contain local logs and project context. Review it before attaching if you want to share it.")})]})]})});return typeof document>"u"?$:Un.createPortal($,document.body)}const nv="_sidebar_19hyu_2",rv="_brand_19hyu_17",lv="_brandIcon_19hyu_28",dv="_brandText_19hyu_33",uv="_brandTextPro_19hyu_44",cv="_nav_19hyu_50",pv="_spacer_19hyu_57",gv="_navLink_19hyu_63",hv="_active_19hyu_84",mv="_disabled_19hyu_91",yv="_icon_19hyu_102",fv="_label_19hyu_113",Sv="_secondaryDivider_19hyu_120",vv="_secondaryNav_19hyu_127",bv="_secondaryNavEntry_19hyu_134",Pv="_secondaryItemDivider_19hyu_140",wv="_helpDivider_19hyu_147",Cv="_helpGroupTitle_19hyu_154",kv="_helpNav_19hyu_165",xv="_externalIcon_19hyu_172",Je={sidebar:nv,brand:rv,brandIcon:lv,brandText:dv,brandTextPro:uv,nav:cv,spacer:pv,navLink:gv,active:hv,disabled:mv,icon:yv,label:fv,secondaryDivider:Sv,secondaryNav:vv,secondaryNavEntry:bv,secondaryItemDivider:Pv,helpDivider:wv,helpGroupTitle:Cv,helpNav:kv,externalIcon:xv},Rv={bug:"sidebar_help_bug",feature:"sidebar_help_feature",discussions:"sidebar_help_community",troubleshooting:"sidebar_help_troubleshooting"};function Av(){const[i,n]=R.useState(!1);return R.useEffect(()=>{if(typeof window>"u"||!window.matchMedia)return;const r=window.matchMedia("(max-width: 768px)"),d=()=>n(r.matches);return d(),r.addEventListener("change",d),()=>r.removeEventListener("change",d)},[]),i}const lp={disconnected:0,serverOnly:1,studioConnected:2};function Iv(i,n){return lp[i]>=lp[n]}function Dv(i,n){return i==="serverOnly"?n("sidebar.gate.l1","MCP server connection required"):i==="studioConnected"?n("sidebar.gate.l2","Roblox Studio plugin connection required"):""}function dp({item:i}){const{level:n}=_n(),{t:r}=Uo(),d=Iv(n,i.minLevel),u=i.icon,p=x.jsxs(Iy,{to:i.route,end:i.route==="/",className:({isActive:g})=>[Je.navLink,g?Je.active:"",d?"":Je.disabled].filter(Boolean).join(" "),onClick:g=>{d||g.preventDefault()},children:[x.jsx("span",{className:Je.icon,children:x.jsx(u,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)})]});return d?p:x.jsx(Ft,{text:Dv(i.minLevel,r),children:p})}function Ev({item:i,ctx:n}){const{t:r}=Uo(),{trackEvent:d}=us(),{pathname:u,search:p}=Yt(),g=i.icon,y=i.buildUrl(n),h=r(i.tooltipKey,""),v=ds(u,p),[P,w]=R.useState(!1),D=x.jsxs("a",{href:y,target:"_blank",rel:"noopener noreferrer",className:Je.navLink,"data-testid":`sidebar-help-${i.id}`,onClick:B=>{d("dashboard_click_event",{click_target:Rv[i.id],placement:"sidebar_help",...v}),i.id==="bug"&&(B.preventDefault(),w(!0))},children:[x.jsx("span",{className:Je.icon,children:x.jsx(g,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{className:Je.label,children:r(i.labelKey)}),x.jsx("span",{className:Je.externalIcon,"aria-hidden":"true",children:x.jsx(qp,{size:12,strokeWidth:1.75})})]}),U=h?x.jsx(Ft,{text:h,children:D}):D;return x.jsxs(x.Fragment,{children:[U,i.id==="bug"&&x.jsx(sv,{open:P,fallbackHref:y,onClose:()=>w(!1)})]})}function Tv(){const[i,n]=R.useState("basic"),r=Av(),{status:d}=_n(),{locale:u,t:p}=Uo(),g={locale:u,status:d};return R.useEffect(()=>{let y=!1;async function h(){try{const w=await Np("auto");!y&&(w!=null&&w.tier)&&n(w.tier)}catch{y||n("basic")}}h();const v=new Ql;v.connect();const P=v.on("license",()=>{h()});return()=>{y=!0,P(),v.disconnect()}},[]),x.jsxs("aside",{className:Je.sidebar,children:[x.jsxs("div",{className:Je.brand,children:[x.jsx("span",{className:Je.brandIcon,children:x.jsx(Df,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})}),x.jsx("span",{"data-testid":"sidebar-brand-text",className:[Je.brandText,i==="pro"?Je.brandTextPro:""].filter(Boolean).join(" "),children:"WEPPY"})]}),x.jsx("nav",{className:Je.nav,children:Fp.map(y=>x.jsx(dp,{item:y},y.route))}),x.jsx("div",{className:Je.secondaryDivider}),x.jsx("nav",{className:Je.secondaryNav,children:ql.map((y,h)=>x.jsxs("div",{className:Je.secondaryNavEntry,children:[x.jsx(dp,{item:y}),h<ql.length-1?x.jsx("div",{className:Je.secondaryItemDivider,"data-testid":"sidebar-controls-whats-new-divider","aria-hidden":"true"}):null]},y.route))}),x.jsx("div",{className:Je.helpDivider,"aria-hidden":"true"}),x.jsx("div",{className:Je.helpGroupTitle,"aria-label":p("sidebar.help.group"),children:p("sidebar.help.group")}),x.jsx("nav",{className:Je.helpNav,"aria-label":p("sidebar.help.group"),children:fS.map(y=>x.jsx(Ev,{item:y,ctx:g},y.id))}),x.jsx("div",{className:Je.spacer}),x.jsx(HS,{collapsed:r})]})}async function jv(){return Et.get("/api/dashboard/place-summary")}async function Uv(){return Et.get("/api/dashboard/sync-root")}async function Lb(){return Et.post("/api/dashboard/sync-root/pick")}async function _b(i){return Et.patch("/api/dashboard/sync-root",{projectRoot:i})}const Mv=[{id:"2026-07-24-preflight-and-script-improvements",date:"2026-07-24",title:{en:"Preflight checks and script work are more precise",ko:"AI 작업 전 점검과 스크립트 작업을 개선했습니다",es:"Mejoramos las comprobaciones previas y el trabajo con scripts","pt-br":"Aprimoramos as verificações prévias e o trabalho com scripts",ja:"事前チェックとスクリプト作業を改善しました",id:"Pemeriksaan awal dan pekerjaan script telah ditingkatkan",de:"Vorabprüfungen und Skriptarbeit wurden verbessert","fr-fr":"Les vérifications préalables et le travail sur les scripts ont été améliorés"},body:{en:`AI agents can now check the Studio connection, current place, Edit or Play state, publish status, and screen capture and image or mesh readiness before starting work. If something needs attention, WEPPY explains what to check without changing Studio settings or game data.
|
|
315
|
+
|
|
316
|
+
Before Open Cloud uploads, Pro users can check saved API key authentication, Assets Read and Write permissions, the Creator target, file format, and file size. This check does not upload or modify assets.
|
|
317
|
+
|
|
318
|
+
For large scripts, AI agents can read only the lines they need instead of loading the entire source each time. This is available on Basic and helps the AI focus on the area being changed.
|
|
319
|
+
|
|
320
|
+
If a request includes options that are not used by the selected operation, WEPPY now shows a warning. Runnable work continues, and the AI can correct the options on the next request.
|
|
321
|
+
|
|
322
|
+
Duplicate logs and signals no longer appear in completed Playtest reports. No setup or migration is required.`,ko:`AI가 Roblox Studio 작업을 시작하기 전에 연결 상태, 현재 place, Edit·Play 상태, 게시 여부, 화면 캡처와 이미지·메시 기능의 준비 상태를 먼저 확인할 수 있습니다. 필요한 설정이 있으면 해결 방법을 안내하며, 점검 과정에서 Studio 설정이나 게임 데이터는 변경하지 않습니다.
|
|
323
|
+
|
|
324
|
+
Open Cloud 업로드 전에는 저장된 API Key의 인증 상태와 Assets 읽기·쓰기 권한, Creator 대상, 파일 형식과 크기를 확인할 수 있습니다. 점검만으로 에셋이 업로드되거나 기존 에셋이 변경되지는 않습니다. Open Cloud 점검은 Pro에서 사용할 수 있습니다.
|
|
325
|
+
|
|
326
|
+
큰 스크립트는 전체 내용을 매번 불러오지 않고 필요한 줄만 읽을 수 있습니다. Basic에서도 사용할 수 있으며, AI가 수정할 부분 주변을 더 효율적으로 확인할 수 있습니다.
|
|
327
|
+
|
|
328
|
+
선택한 작업에서 사용하지 않는 옵션이 함께 전달되면 경고를 표시합니다. 경고가 있어도 실행 가능한 작업은 계속 진행되며, AI는 잘못 전달한 옵션을 다음 요청에서 바로 수정할 수 있습니다.
|
|
329
|
+
|
|
330
|
+
Playtest 완료 리포트에서 같은 로그와 신호가 중복으로 표시되던 문제도 수정했습니다. 별도 설정이나 마이그레이션은 필요 없습니다.`,es:`Los agentes de IA ahora pueden comprobar la conexión con Studio, el place actual, el estado Edit o Play, el estado de publicación y la disponibilidad de captura de pantalla y de las funciones de imagen o malla antes de empezar a trabajar. Si algo requiere atención, WEPPY explica qué revisar sin cambiar la configuración de Studio ni los datos del juego.
|
|
331
|
+
|
|
332
|
+
Antes de subir archivos con Open Cloud, los usuarios Pro pueden comprobar la autenticación de la API key guardada, los permisos Assets Read y Write, el Creator de destino, el formato y el tamaño del archivo. Esta comprobación no sube ni modifica assets.
|
|
333
|
+
|
|
334
|
+
En scripts grandes, los agentes de IA pueden leer solo las líneas necesarias en lugar de cargar todo el código cada vez. Esta función está disponible en Basic y permite que la IA se concentre en la parte que se va a modificar.
|
|
335
|
+
|
|
336
|
+
Si una solicitud incluye opciones que la operación elegida no utiliza, WEPPY muestra una advertencia. El trabajo que puede ejecutarse continúa y la IA puede corregir las opciones en la siguiente solicitud.
|
|
337
|
+
|
|
338
|
+
Los informes de Playtest completados ya no muestran logs y señales duplicados. No se requiere configuración ni migración.`,"pt-br":`Os agentes de IA agora podem verificar a conexão com o Studio, o place atual, o estado Edit ou Play, o status de publicação e a disponibilidade de captura de tela e dos recursos de imagem ou malha antes de iniciar o trabalho. Se algo precisar de atenção, o WEPPY explica o que verificar sem alterar as configurações do Studio nem os dados do jogo.
|
|
339
|
+
|
|
340
|
+
Antes de uploads pelo Open Cloud, usuários Pro podem verificar a autenticação da API key salva, as permissões Assets Read e Write, o Creator de destino, o formato e o tamanho do arquivo. Essa verificação não envia nem modifica assets.
|
|
341
|
+
|
|
342
|
+
Em scripts grandes, os agentes de IA podem ler apenas as linhas necessárias em vez de carregar todo o código a cada vez. O recurso está disponível no Basic e ajuda a IA a se concentrar na área que será alterada.
|
|
343
|
+
|
|
344
|
+
Se uma solicitação incluir opções que a operação selecionada não usa, o WEPPY exibe um aviso. O trabalho que pode ser executado continua, e a IA pode corrigir as opções na próxima solicitação.
|
|
345
|
+
|
|
346
|
+
Relatórios de Playtest concluídos não exibem mais logs e sinais duplicados. Nenhuma configuração ou migração é necessária.`,ja:`AIエージェントは作業を始める前に、Studioの接続、現在のplace、EditまたはPlay状態、公開状態、画面キャプチャ、画像・メッシュ機能の準備状況を確認できるようになりました。確認が必要な項目がある場合、WEPPYはStudioの設定やゲームデータを変更せずに確認方法を案内します。
|
|
347
|
+
|
|
348
|
+
Open Cloudでアップロードする前に、Proユーザーは保存済みAPI Keyの認証状態、Assets Read・Write権限、Creatorの対象、ファイル形式、ファイルサイズを確認できます。この確認だけでassetがアップロードされたり変更されたりすることはありません。
|
|
349
|
+
|
|
350
|
+
大きなスクリプトでは、毎回ソース全体を読み込まず、必要な行だけを読み取れるようになりました。Basicでも利用でき、AIが変更対象の周辺に集中して確認できます。
|
|
351
|
+
|
|
352
|
+
選択した操作で使われないオプションがリクエストに含まれている場合、WEPPYが警告を表示します。実行可能な作業は続行され、AIは次のリクエストでオプションを修正できます。
|
|
353
|
+
|
|
354
|
+
完了したPlaytestレポートに同じログやシグナルが重複して表示される問題も修正しました。追加の設定や移行は必要ありません。`,id:`AI Agent kini dapat memeriksa koneksi Studio, place saat ini, status Edit atau Play, status publikasi, serta kesiapan tangkapan layar dan fitur gambar atau mesh sebelum mulai bekerja. Jika ada yang perlu diperhatikan, WEPPY menjelaskan apa yang harus diperiksa tanpa mengubah pengaturan Studio atau data game.
|
|
355
|
+
|
|
356
|
+
Sebelum upload Open Cloud, pengguna Pro dapat memeriksa autentikasi API key tersimpan, izin Assets Read dan Write, Creator tujuan, format file, dan ukuran file. Pemeriksaan ini tidak mengunggah atau mengubah asset.
|
|
357
|
+
|
|
358
|
+
Untuk script besar, AI Agent dapat membaca hanya baris yang diperlukan tanpa memuat seluruh source setiap kali. Fitur ini tersedia di Basic dan membantu AI fokus pada bagian yang akan diubah.
|
|
359
|
+
|
|
360
|
+
Jika permintaan menyertakan opsi yang tidak digunakan oleh operasi yang dipilih, WEPPY menampilkan peringatan. Pekerjaan yang dapat dijalankan tetap berlanjut, dan AI dapat memperbaiki opsi pada permintaan berikutnya.
|
|
361
|
+
|
|
362
|
+
Laporan Playtest yang selesai tidak lagi menampilkan log dan sinyal duplikat. Tidak diperlukan pengaturan atau migrasi.`,de:`KI-Agents können vor Arbeitsbeginn die Studio-Verbindung, den aktuellen Place, den Edit- oder Play-Status, den Veröffentlichungsstatus sowie die Bereitschaft für Bildschirmaufnahmen und Bild- oder Mesh-Funktionen prüfen. Wenn etwas beachtet werden muss, erklärt WEPPY die erforderliche Prüfung, ohne Studio-Einstellungen oder Spieldaten zu ändern.
|
|
363
|
+
|
|
364
|
+
Vor Open-Cloud-Uploads können Pro-Nutzer die Authentifizierung des gespeicherten API Keys, die Berechtigungen Assets Read und Write, das Creator-Ziel, das Dateiformat und die Dateigröße prüfen. Diese Prüfung lädt keine Assets hoch und ändert keine bestehenden Assets.
|
|
365
|
+
|
|
366
|
+
Bei großen Skripten können KI-Agents nur die benötigten Zeilen lesen, statt jedes Mal den gesamten Quelltext zu laden. Diese Funktion ist in Basic verfügbar und hilft der KI, sich auf den zu ändernden Bereich zu konzentrieren.
|
|
367
|
+
|
|
368
|
+
Enthält eine Anfrage Optionen, die von der ausgewählten Aktion nicht verwendet werden, zeigt WEPPY eine Warnung an. Ausführbare Arbeiten werden fortgesetzt und die KI kann die Optionen bei der nächsten Anfrage korrigieren.
|
|
369
|
+
|
|
370
|
+
Abgeschlossene Playtest-Berichte zeigen keine doppelten Logs und Signale mehr. Es sind keine zusätzlichen Einstellungen oder Migrationen erforderlich.`,"fr-fr":`Les agents IA peuvent désormais vérifier la connexion à Studio, la place actuelle, l'état Edit ou Play, l'état de publication ainsi que la disponibilité de la capture d'écran et des fonctions d'image ou de maillage avant de commencer. Si un point demande votre attention, WEPPY indique quoi vérifier sans modifier les réglages de Studio ni les données du jeu.
|
|
371
|
+
|
|
372
|
+
Avant un upload Open Cloud, les utilisateurs Pro peuvent vérifier l'authentification de l'API key enregistrée, les autorisations Assets Read et Write, le Creator ciblé, le format et la taille du fichier. Cette vérification n'envoie ni ne modifie aucun asset.
|
|
373
|
+
|
|
374
|
+
Pour les scripts volumineux, les agents IA peuvent lire uniquement les lignes nécessaires au lieu de charger tout le code source à chaque fois. Cette fonction est disponible dans Basic et aide l'IA à se concentrer sur la zone à modifier.
|
|
375
|
+
|
|
376
|
+
Si une requête contient des options qui ne sont pas utilisées par l'opération choisie, WEPPY affiche un avertissement. Les opérations exécutables continuent et l'IA peut corriger les options lors de la requête suivante.
|
|
377
|
+
|
|
378
|
+
Les rapports Playtest terminés n'affichent plus de logs ni de signaux en double. Aucun réglage ni aucune migration n'est nécessaire.`},severity:"info",category:"release"},{id:"2026-07-18-sync-file-format-update",date:"2026-07-18",title:{en:"Review changes before applying the Sync update",ko:"Sync 업데이트 전 변경 내용을 확인하세요",es:"Revisa los cambios antes de aplicar la actualización de Sync","pt-br":"Revise as alterações antes de aplicar a atualização do Sync",ja:"Syncアップデートを適用する前に変更内容を確認してください",id:"Tinjau perubahan sebelum menerapkan pembaruan Sync",de:"Änderungen vor dem Sync-Update prüfen","fr-fr":"Vérifiez les changements avant d’appliquer la mise à jour Sync"},body:{en:`The Sync file format has changed. Existing Sync projects are not changed automatically. Open the Sync page in WEPPY Dashboard to review the files that would change, then apply the update when you are ready.
|
|
315
379
|
|
|
316
380
|
Before updating, make sure the place file contains your latest work first. If a problem occurs, use the saved Roblox Studio place file as the original copy and start a fresh Sync.
|
|
317
381
|
|
|
@@ -615,136 +679,4 @@ Vous pouvez aussi exporter des objets sélectionnés dans Roblox Studio en fichi
|
|
|
615
679
|
|
|
616
680
|
Les uploads Roblox nécessitent une API key Roblox Open Cloud et un Creator ID. L'API key est chiffrée sur votre ordinateur. WEPPY ne l'enregistre pas dans un service externe et ne l'envoie pas à un serveur WEPPY séparé ; le serveur MCP local l'utilise uniquement pour les demandes d'upload Roblox Open Cloud.
|
|
617
681
|
|
|
618
|
-
Assets est encore expérimental. D'autres catégories seront ajoutées progressivement.`},severity:"info",category:"release"},{id:"2026-05-24-polar-payment",date:"2026-05-24",title:{en:"WEPPY Roblox AI Toolkit Pro checkout now uses Polar",ko:"WEPPY Roblox AI Toolkit Pro 기본 결제 방식이 Polar로 변경되었습니다",es:"El checkout de WEPPY Roblox AI Toolkit Pro ahora usa Polar","pt-br":"O checkout do WEPPY Roblox AI Toolkit Pro agora usa Polar",ja:"WEPPY Roblox AI Toolkit Proの標準決済がPolarに変わりました",id:"Checkout WEPPY Roblox AI Toolkit Pro kini menggunakan Polar",de:"Der Checkout von WEPPY Roblox AI Toolkit Pro verwendet jetzt Polar","fr-fr":"Le checkout de WEPPY Roblox AI Toolkit Pro utilise maintenant Polar"},body:{en:`The default checkout provider for WEPPY Roblox AI Toolkit Pro has changed from Gumroad to Polar.
|
|
619
|
-
|
|
620
|
-
If you already purchased through Gumroad, you can keep using your current Gumroad license. You do not need to buy Pro again or move your payment method.
|
|
621
|
-
|
|
622
|
-
If you cancel your Gumroad payment and later want to subscribe again, the new payment link will take you to Polar.
|
|
623
|
-
|
|
624
|
-
We are sorry for any confusion or extra work caused by this change. We will continue keeping existing Gumroad purchases usable.`,ko:`WEPPY Roblox AI Toolkit Pro의 기본 결제 방식이 Gumroad에서 Polar로 변경되었습니다.
|
|
625
|
-
|
|
626
|
-
기존에 Gumroad에서 구매하신 분들은 현재 사용 중인 Gumroad 라이선스를 그대로 계속 사용할 수 있습니다. 별도로 다시 구매하거나 결제 방식을 옮기실 필요는 없습니다.
|
|
627
|
-
|
|
628
|
-
다만 Gumroad 결제를 취소한 뒤 다시 결제하려는 경우에는 새 결제 링크가 Polar로 안내됩니다.
|
|
629
|
-
|
|
630
|
-
결제 방식 변경으로 혼란이나 번거로움을 드려 죄송합니다. 기존 Gumroad 구매자분들도 불편 없이 계속 사용할 수 있도록 유지하겠습니다.`,es:`El proveedor de checkout predeterminado de WEPPY Roblox AI Toolkit Pro cambió de Gumroad a Polar.
|
|
631
|
-
|
|
632
|
-
Si ya compraste a través de Gumroad, puedes seguir usando tu licencia actual de Gumroad. No tienes que volver a comprar Pro ni mover tu método de pago.
|
|
633
|
-
|
|
634
|
-
Si cancelas tu pago de Gumroad y más adelante quieres suscribirte de nuevo, el nuevo enlace de pago te llevará a Polar.
|
|
635
|
-
|
|
636
|
-
Sentimos cualquier confusión o trabajo extra causado por este cambio. Seguiremos manteniendo utilizables las compras existentes de Gumroad.`,"pt-br":`O provedor de checkout padrão do WEPPY Roblox AI Toolkit Pro mudou de Gumroad para Polar.
|
|
637
|
-
|
|
638
|
-
Se você já comprou pelo Gumroad, pode continuar usando sua licença atual do Gumroad. Não é preciso comprar o Pro novamente nem mover sua forma de pagamento.
|
|
639
|
-
|
|
640
|
-
Se você cancelar seu pagamento no Gumroad e depois quiser assinar novamente, o novo link de pagamento levará você para o Polar.
|
|
641
|
-
|
|
642
|
-
Pedimos desculpas por qualquer confusão ou trabalho extra causado por essa mudança. Vamos continuar mantendo as compras existentes do Gumroad utilizáveis.`,ja:`WEPPY Roblox AI Toolkit Proの標準決済プロバイダーがGumroadからPolarに変わりました。
|
|
643
|
-
|
|
644
|
-
すでにGumroadで購入済みの方は、現在のGumroadライセンスをそのまま使い続けられます。Proを再購入したり、支払い方法を移行したりする必要はありません。
|
|
645
|
-
|
|
646
|
-
ただし、Gumroadの支払いをキャンセルしたあとで再度購読したい場合、新しい決済リンクはPolarに案内されます。
|
|
647
|
-
|
|
648
|
-
この変更により混乱やお手数をおかけして申し訳ありません。既存のGumroad購入者の方も引き続き利用できるよう維持します。`,id:`Provider checkout default untuk WEPPY Roblox AI Toolkit Pro berubah dari Gumroad ke Polar.
|
|
649
|
-
|
|
650
|
-
Jika Anda sudah membeli melalui Gumroad, Anda tetap bisa memakai lisensi Gumroad yang sedang digunakan. Anda tidak perlu membeli Pro lagi atau memindahkan metode pembayaran.
|
|
651
|
-
|
|
652
|
-
Namun, jika Anda membatalkan pembayaran Gumroad lalu ingin berlangganan lagi nanti, link pembayaran baru akan mengarah ke Polar.
|
|
653
|
-
|
|
654
|
-
Maaf atas kebingungan atau langkah tambahan yang ditimbulkan oleh perubahan ini. Kami akan tetap menjaga agar pembelian Gumroad yang sudah ada dapat terus digunakan.`,de:`Der Standard-Checkout-Anbieter für WEPPY Roblox AI Toolkit Pro wurde von Gumroad auf Polar umgestellt.
|
|
655
|
-
|
|
656
|
-
Wenn Sie bereits über Gumroad gekauft haben, können Sie Ihre aktuelle Gumroad-Lizenz weiter verwenden. Sie müssen Pro nicht erneut kaufen und Ihre Zahlungsmethode nicht umstellen.
|
|
657
|
-
|
|
658
|
-
Wenn Sie Ihre Gumroad-Zahlung kündigen und später erneut abonnieren möchten, führt der neue Zahlungslink zu Polar.
|
|
659
|
-
|
|
660
|
-
Wir entschuldigen uns für mögliche Verwirrung oder zusätzlichen Aufwand durch diese Änderung. Bestehende Gumroad-Käufe bleiben weiterhin nutzbar.`,"fr-fr":`Le fournisseur de checkout par défaut de WEPPY Roblox AI Toolkit Pro est passé de Gumroad à Polar.
|
|
661
|
-
|
|
662
|
-
Si vous avez déjà acheté via Gumroad, vous pouvez continuer à utiliser votre licence Gumroad actuelle. Vous n'avez pas besoin de racheter Pro ni de changer de moyen de paiement.
|
|
663
|
-
|
|
664
|
-
Si vous annulez votre paiement Gumroad et souhaitez vous réabonner plus tard, le nouveau lien de paiement vous dirigera vers Polar.
|
|
665
|
-
|
|
666
|
-
Nous sommes désolés pour toute confusion ou démarche supplémentaire causée par ce changement. Les achats Gumroad existants resteront utilisables.`},severity:"info",category:"notice",links:[{url:{en:"https://weppyai.com/en/plans/",ko:"https://weppyai.com/ko/plans/",es:"https://weppyai.com/es/plans/","pt-br":"https://weppyai.com/pt-br/plans/",ja:"https://weppyai.com/ja/plans/",id:"https://weppyai.com/id/plans/",de:"https://weppyai.com/de/plans/","fr-fr":"https://weppyai.com/fr-fr/plans/"},label:{en:"Plans page",ko:"요금제 페이지",es:"Página de planes","pt-br":"Página de planos",ja:"プランページ",id:"Halaman paket",de:"Tarifseite","fr-fr":"Page des forfaits"}}]},{id:"2026-05-16-ai-agent-plugin",date:"2026-05-16",title:{en:"WEPPY AI Agent Plugin is now available for Claude Code and Codex",ko:"Claude Code와 Codex용 WEPPY AI Agent Plugin을 추가했습니다",es:"WEPPY AI Agent Plugin ya está disponible para Claude Code y Codex","pt-br":"WEPPY AI Agent Plugin já está disponível para Claude Code e Codex",ja:"Claude CodeとCodex向けのWEPPY AI Agent Pluginを追加しました",id:"WEPPY AI Agent Plugin kini tersedia untuk Claude Code dan Codex",de:"WEPPY AI Agent Plugin ist jetzt für Claude Code und Codex verfügbar","fr-fr":"WEPPY AI Agent Plugin est maintenant disponible pour Claude Code et Codex"},body:{en:`WEPPY AI Agent Plugin is now available for Claude Code and Codex. You can still use WEPPY by registering only the MCP server, but the plugin also gives the agent WEPPY-specific skills so it can handle Roblox Studio work with better context.
|
|
667
|
-
|
|
668
|
-
The plugin includes two skill guides: one for Roblox Studio MCP work such as choosing Studio actions, UI Studio, Playtest, and logs, and one for Roblox Sync such as Studio-local Sync, bidirectional Sync, conflict handling, and Roblox Explorer context.
|
|
669
|
-
|
|
670
|
-
For now, AI Agent Plugin support is limited to Claude Code and Codex. Other agents will be supported as they add plugin installation support.
|
|
671
|
-
|
|
672
|
-
If you already use Claude Code or Codex, run the install command again from the Install page, or follow the manual setup guide for your agent below.`,ko:`Claude Code와 Codex에서 사용할 수 있는 WEPPY AI Agent Plugin을 추가했습니다. 기존처럼 MCP 서버만 등록해도 WEPPY를 사용할 수 있지만, 이번 plugin은 agent가 Roblox Studio 작업을 더 정확히 다룰 수 있도록 WEPPY 전용 스킬을 함께 제공합니다.
|
|
673
|
-
|
|
674
|
-
포함된 스킬은 두 가지입니다. 하나는 Studio 액션 선택, UI Studio, Playtest, 로그 확인을 다루는 Roblox Studio MCP 작업 가이드이고, 다른 하나는 Studio-local Sync, 양방향 Sync, 충돌 처리, Roblox Explorer 문맥을 다루는 Roblox Sync 가이드입니다.
|
|
675
|
-
|
|
676
|
-
현재 AI Agent Plugin은 Claude Code와 Codex만 지원합니다. 다른 Agent는 해당 Agent에서 플러그인 설치 기능을 제공하는 대로 지원할 예정입니다.
|
|
677
|
-
|
|
678
|
-
Claude Code나 Codex 사용자라면 Install 페이지를 참고해 설치 커맨드를 한 번 더 실행하거나, 아래 Agent별 설치 가이드를 참고해 수동 설치할 수 있습니다.`,es:`WEPPY AI Agent Plugin ya está disponible para Claude Code y Codex. Puedes seguir usando WEPPY registrando solo el servidor MCP, pero el plugin también entrega al agente skills específicas de WEPPY para que trabaje con Roblox Studio con mejor contexto.
|
|
679
|
-
|
|
680
|
-
Incluye dos guías de skills: una para trabajo MCP en Roblox Studio, como elegir acciones de Studio, UI Studio, Playtest y revisar logs; y otra para Roblox Sync, como Studio-local Sync, Sync bidireccional, manejo de conflictos y contexto de Roblox Explorer.
|
|
681
|
-
|
|
682
|
-
Por ahora, AI Agent Plugin solo es compatible con Claude Code y Codex. Otros agentes se admitirán cuando incorporen instalación de plugins.
|
|
683
|
-
|
|
684
|
-
Si ya usas Claude Code o Codex, vuelve a ejecutar el comando desde la página Install, o sigue la guía manual de tu agente abajo.`,"pt-br":`WEPPY AI Agent Plugin já está disponível para Claude Code e Codex. Você ainda pode usar o WEPPY registrando apenas o servidor MCP, mas o plugin também entrega skills específicas do WEPPY ao agente para que ele trabalhe com Roblox Studio com mais contexto.
|
|
685
|
-
|
|
686
|
-
O plugin inclui duas guias de skills: uma para trabalho MCP no Roblox Studio, como escolher ações do Studio, UI Studio, Playtest e conferir logs; e outra para Roblox Sync, como Studio-local Sync, Sync bidirecional, resolução de conflitos e contexto do Roblox Explorer.
|
|
687
|
-
|
|
688
|
-
Por enquanto, o AI Agent Plugin é compatível apenas com Claude Code e Codex. Outros agentes serão atendidos quando oferecerem instalação de plugins.
|
|
689
|
-
|
|
690
|
-
Se você já usa Claude Code ou Codex, execute novamente o comando na página Install ou siga abaixo a guia manual do seu agente.`,ja:`Claude CodeとCodexで使えるWEPPY AI Agent Pluginを追加しました。これまで通りMCPサーバーを登録するだけでもWEPPYは使えますが、このpluginはエージェントにWEPPY専用のスキルを渡し、Roblox Studioでの作業をより正確な文脈で扱えるようにします。
|
|
691
|
-
|
|
692
|
-
含まれるスキルは2つです。1つはStudioアクションの選択、UI Studio、Playtest、ログ確認を扱うRoblox Studio MCP作業ガイドです。もう1つはStudio-local Sync、双方向Sync、競合処理、Roblox Explorerの文脈を扱うRoblox Syncガイドです。
|
|
693
|
-
|
|
694
|
-
現在、AI Agent PluginはClaude CodeとCodexのみ対応しています。他のAgentは、それぞれのAgentでpluginインストール機能が提供され次第対応する予定です。
|
|
695
|
-
|
|
696
|
-
Claude CodeまたはCodexを使っている場合は、Installページのコマンドをもう一度実行するか、下のAgent別セットアップガイドに従って手動でインストールできます。`,id:`WEPPY AI Agent Plugin kini tersedia untuk Claude Code dan Codex. Anda tetap bisa memakai WEPPY hanya dengan mendaftarkan MCP server, tetapi plugin ini juga memberi agent skill khusus WEPPY agar pekerjaan Roblox Studio ditangani dengan konteks yang lebih tepat.
|
|
697
|
-
|
|
698
|
-
Plugin ini berisi dua panduan skill: panduan kerja Roblox Studio MCP untuk memilih aksi Studio, UI Studio, Playtest, dan memeriksa log; serta panduan Roblox Sync untuk Studio-local Sync, Sync dua arah, penanganan konflik, dan konteks Roblox Explorer.
|
|
699
|
-
|
|
700
|
-
Saat ini AI Agent Plugin hanya mendukung Claude Code dan Codex. Agent lain akan didukung ketika masing-masing agent menyediakan fitur instalasi plugin.
|
|
701
|
-
|
|
702
|
-
Jika Anda menggunakan Claude Code atau Codex, jalankan kembali perintah dari halaman Install, atau ikuti panduan manual per agent di bawah.`,de:`WEPPY AI Agent Plugin ist jetzt für Claude Code und Codex verfügbar. Sie können WEPPY weiterhin nur über die MCP-Serverregistrierung verwenden, aber das Plugin gibt dem Agent zusätzlich WEPPY-spezifische Skills, damit er Roblox Studio-Aufgaben mit besserem Kontext bearbeiten kann.
|
|
703
|
-
|
|
704
|
-
Das Plugin enthält zwei Skill-Guides: einen für Roblox Studio MCP-Arbeit wie Studio-Aktionen auswählen, UI Studio, Playtest und Logs prüfen, und einen für Roblox Sync wie Studio-local Sync, bidirektionalen Sync, Konfliktbehandlung und Roblox Explorer-Kontext.
|
|
705
|
-
|
|
706
|
-
Aktuell unterstützt AI Agent Plugin nur Claude Code und Codex. Weitere Agents werden unterstützt, sobald sie Plugin-Installation anbieten.
|
|
707
|
-
|
|
708
|
-
Wenn Sie Claude Code oder Codex verwenden, führen Sie den Installationsbefehl auf der Install-Seite erneut aus oder folgen Sie unten dem manuellen Setup-Guide für Ihren Agent.`,"fr-fr":`WEPPY AI Agent Plugin est maintenant disponible pour Claude Code et Codex. Vous pouvez toujours utiliser WEPPY en enregistrant seulement le serveur MCP, mais le plugin fournit aussi à l'agent des skills propres à WEPPY pour mieux traiter le travail dans Roblox Studio.
|
|
709
|
-
|
|
710
|
-
Le plugin inclut deux guides de skills : un guide pour le travail Roblox Studio MCP, comme le choix des actions Studio, UI Studio, Playtest et la lecture des logs ; et un guide Roblox Sync pour Studio-local Sync, Sync bidirectionnel, la gestion des conflits et le contexte Roblox Explorer.
|
|
711
|
-
|
|
712
|
-
Pour l'instant, AI Agent Plugin prend seulement en charge Claude Code et Codex. Les autres agents seront pris en charge lorsqu'ils proposeront l'installation de plugins.
|
|
713
|
-
|
|
714
|
-
Si vous utilisez Claude Code ou Codex, relancez la commande depuis la page Install, ou suivez ci-dessous le guide manuel correspondant à votre agent.`},severity:"info",category:"release",links:[{url:{en:"https://weppyai.com/en/install/",ko:"https://weppyai.com/ko/install/",es:"https://weppyai.com/es/install/","pt-br":"https://weppyai.com/pt-br/install/",ja:"https://weppyai.com/ja/install/",id:"https://weppyai.com/id/install/",de:"https://weppyai.com/de/install/","fr-fr":"https://weppyai.com/fr-fr/install/"},label:{en:"Install page",ko:"Install 페이지",es:"Página Install","pt-br":"Página Install",ja:"Installページ",id:"Halaman Install",de:"Install-Seite","fr-fr":"Page Install"}},{url:{en:"https://weppyai.com/en/docs/agents/claude-code/",ko:"https://weppyai.com/ko/docs/agents/claude-code/",es:"https://weppyai.com/es/docs/agents/claude-code/","pt-br":"https://weppyai.com/pt-br/docs/agents/claude-code/",ja:"https://weppyai.com/ja/docs/agents/claude-code/",id:"https://weppyai.com/id/docs/agents/claude-code/",de:"https://weppyai.com/de/docs/agents/claude-code/","fr-fr":"https://weppyai.com/fr-fr/docs/agents/claude-code/"},label:{en:"Claude Code guide",ko:"Claude Code 설치 가이드",es:"Guía de Claude Code","pt-br":"Guia do Claude Code",ja:"Claude Codeセットアップガイド",id:"Panduan Claude Code",de:"Claude Code Guide","fr-fr":"Guide Claude Code"}},{url:{en:"https://weppyai.com/en/docs/agents/codex-cli/",ko:"https://weppyai.com/ko/docs/agents/codex-cli/",es:"https://weppyai.com/es/docs/agents/codex-cli/","pt-br":"https://weppyai.com/pt-br/docs/agents/codex-cli/",ja:"https://weppyai.com/ja/docs/agents/codex-cli/",id:"https://weppyai.com/id/docs/agents/codex-cli/",de:"https://weppyai.com/de/docs/agents/codex-cli/","fr-fr":"https://weppyai.com/fr-fr/docs/agents/codex-cli/"},label:{en:"Codex CLI guide",ko:"Codex CLI 설치 가이드",es:"Guía de Codex CLI","pt-br":"Guia do Codex CLI",ja:"Codex CLIセットアップガイド",id:"Panduan Codex CLI",de:"Codex CLI Guide","fr-fr":"Guide Codex CLI"}},{url:{en:"https://weppyai.com/en/docs/agents/codex-app/",ko:"https://weppyai.com/ko/docs/agents/codex-app/",es:"https://weppyai.com/es/docs/agents/codex-app/","pt-br":"https://weppyai.com/pt-br/docs/agents/codex-app/",ja:"https://weppyai.com/ja/docs/agents/codex-app/",id:"https://weppyai.com/id/docs/agents/codex-app/",de:"https://weppyai.com/de/docs/agents/codex-app/","fr-fr":"https://weppyai.com/fr-fr/docs/agents/codex-app/"},label:{en:"Codex App guide",ko:"Codex App 설치 가이드",es:"Guía de Codex App","pt-br":"Guia do Codex App",ja:"Codex Appセットアップガイド",id:"Panduan Codex App",de:"Codex App Guide","fr-fr":"Guide Codex App"}}]},{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.
|
|
715
|
-
|
|
716
|
-
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.
|
|
717
|
-
|
|
718
|
-
The inspection results, captured screens, and suggested improvements are all viewable directly on the UI Studio page in the dashboard.
|
|
719
|
-
|
|
720
|
-
Just ask as usual: "Build me a UI."`,ko:`AI 에이전트가 Roblox 인게임 UI(ScreenGui · Frame · TextLabel 같은 화면 요소)를 직접 만들고 수정할 수 있는 UI Studio가 추가되었습니다.
|
|
721
|
-
|
|
722
|
-
새 UI를 만들기 시작하면 AI가 먼저 목적·화면·타겟 디바이스 같은 요구사항을 가이드 질문으로 정리한 뒤 UI 트리를 구성합니다. 작업 중에는 현재 화면을 캡처해 결과를 직접 확인할 수 있고, 터치 타겟 크기·텍스트 대비·세이프존 같은 항목을 점검해 AI에게 개선 포인트를 제안하므로 결과물의 완성도가 자연스럽게 올라갑니다.
|
|
723
|
-
|
|
724
|
-
점검 결과와 캡처된 화면, 제안된 개선 포인트는 대시보드의 UI Studio 페이지에서 직접 확인하실 수 있습니다.
|
|
725
|
-
|
|
726
|
-
평소처럼 "UI 만들어줘" 하고 요청하시면 됩니다.`,es:`Se añadió UI Studio: los agentes de IA pueden crear y editar la UI en el juego de Roblox (elementos de pantalla como ScreenGui, Frame y TextLabel) directamente.
|
|
727
|
-
|
|
728
|
-
Al iniciar una UI nueva, la IA primero ordena los requisitos —propósito, pantalla y dispositivos objetivo— mediante preguntas guiadas y luego compone el árbol de UI. Durante el trabajo se puede capturar la pantalla actual para verificar el resultado, y se inspeccionan aspectos como el tamaño de los objetivos táctiles, el contraste del texto y las zonas seguras para sugerir mejoras a la IA, por lo que el acabado del resultado mejora de forma natural.
|
|
729
|
-
|
|
730
|
-
Los resultados de la inspección, las pantallas capturadas y las mejoras sugeridas se pueden consultar directamente en la página UI Studio del dashboard.
|
|
731
|
-
|
|
732
|
-
Pide como siempre: «Hazme una UI».`,"pt-br":`O UI Studio foi adicionado: agentes de IA podem criar e editar a UI no jogo do Roblox (elementos de tela como ScreenGui, Frame e TextLabel) diretamente.
|
|
733
|
-
|
|
734
|
-
Ao iniciar uma UI nova, a IA primeiro organiza os requisitos — objetivo, tela e dispositivos-alvo — por meio de perguntas guiadas e, em seguida, monta a árvore de UI. Durante o trabalho é possível capturar a tela atual para verificar o resultado, e itens como tamanho de alvos de toque, contraste de texto e safe zones são inspecionados para sugerir melhorias à IA, então o acabamento do resultado melhora de forma natural.
|
|
735
|
-
|
|
736
|
-
Os resultados da inspeção, as telas capturadas e as melhorias sugeridas podem ser consultados diretamente na página UI Studio do dashboard.
|
|
737
|
-
|
|
738
|
-
Peça como de costume: "Crie uma UI para mim".`,ja:`AIエージェントがRobloxのゲーム内UI(ScreenGui・Frame・TextLabelなどの画面要素)を直接作成・編集できるUI Studioが追加されました。
|
|
739
|
-
|
|
740
|
-
新しいUIを作り始めると、AIはまず目的・画面・対象デバイスといった要件をガイド付きの質問で整理してから、UIツリーを組み立てます。作業中は現在の画面をキャプチャして結果を確認でき、タッチターゲットのサイズ・テキストのコントラスト・セーフゾーンなどの項目を点検してAIに改善のヒントを提案するため、成果物の完成度が自然と高まります。
|
|
741
|
-
|
|
742
|
-
点検結果やキャプチャされた画面、提案された改善ポイントは、ダッシュボードのUI Studioページから直接確認できます。
|
|
743
|
-
|
|
744
|
-
いつものように「UIを作って」とお願いするだけでOKです。`,id:`UI Studio kini hadir: agen AI dapat membuat dan mengedit UI dalam game Roblox (elemen layar seperti ScreenGui, Frame, dan TextLabel) secara langsung.
|
|
745
|
-
|
|
746
|
-
Saat memulai UI baru, AI lebih dulu merapikan kebutuhan — tujuan, layar, dan perangkat target — melalui pertanyaan terpandu, lalu menyusun pohon UI. Selama pengerjaan, layar saat ini dapat ditangkap untuk memeriksa hasilnya, dan hal-hal seperti ukuran target sentuh, kontras teks, serta safe zone diperiksa untuk diusulkan perbaikan kepada AI, sehingga kerapian hasilnya meningkat secara alami.
|
|
747
|
-
|
|
748
|
-
Hasil pemeriksaan, layar yang ditangkap, dan saran perbaikan dapat dilihat langsung di halaman UI Studio pada dashboard.
|
|
749
|
-
|
|
750
|
-
Minta seperti biasa: "Buatkan UI."`},severity:"info",category:"release"}],Jl="weppy-dashboard.whatsNew.readIds";function Gp(){try{const i=localStorage.getItem(Jl);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function zv(i){try{localStorage.setItem(Jl,JSON.stringify([...i]))}catch{}}let di=Gp(),Vp=di;const Wl=new Set;function Xp(){Vp=new Set(di);for(const i of Wl)i()}const Ml={subscribe(i){return Wl.add(i),()=>{Wl.delete(i)}},getSnapshot(){return Vp},markRead(i){let n=!1;for(const r of i)di.has(r)||(di.add(r),n=!0);n&&(zv(di),Xp())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===Jl&&(di=Gp(),Xp())});function Hv(){const i=R.useSyncExternalStore(Ml.subscribe,Ml.getSnapshot),n=Mv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:Ml.markRead}}const Lv="_header_1do17_2",_v="_row1_1do17_17",Nv="_contextGroups_1do17_25",Ov="_projectGroup_1do17_33",qv="_studioGroup_1do17_34",Bv="_groupTitleRow_1do17_52",Wv="_groupLabel_1do17_59",Fv="_groupIcon_1do17_73",Kv="_projectName_1do17_78",Yv="_placeChips_1do17_90",Gv="_metaActions_1do17_99",Vv="_placeChip_1do17_90",Xv="_placeChipStatic_1do17_122",$v="_placeChipMuted_1do17_123",Qv="_placeChipActive_1do17_127",Zv="_placeChipInactive_1do17_134",Jv="_placeChipId_1do17_145",eb="_placeChipClient_1do17_160",tb="_placeChipState_1do17_166",ob="_placeChipBadge_1do17_172",ab="_placeDot_1do17_180",ib="_placeChipName_1do17_188",sb="_row2_1do17_196",nb="_pathRow_1do17_208",rb="_auxiliaryPath_1do17_209",lb="_pathLabel_1do17_221",db="_projectPath_1do17_232",ub="_changeButton_1do17_242",cb="_iconButton_1do17_276",be={header:Lv,row1:_v,contextGroups:Nv,projectGroup:Ov,studioGroup:qv,groupTitleRow:Bv,groupLabel:Wv,groupIcon:Fv,projectName:Kv,placeChips:Yv,metaActions:Gv,placeChip:Vv,placeChipStatic:Xv,placeChipMuted:$v,placeChipActive:Qv,placeChipInactive:Zv,placeChipId:Jv,placeChipClient:eb,placeChipState:tb,placeChipBadge:ob,placeDot:ab,placeChipName:ib,row2:sb,pathRow:nb,auxiliaryPath:rb,pathLabel:lb,projectPath:db,changeButton:ub,iconButton:cb},pb="_bellWrapper_tae21_2",gb="_unreadDot_tae21_8",up={bellWrapper:pb,unreadDot:gb};function hb(){const{t:i}=Uo(),{unreadCount:n}=Hv(),{trackEvent:r}=us(),{pathname:d,search:u}=Yt(),p=ds(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return x.jsx(Ft,{text:i("header.whatsNew.tooltip","What's New"),children:x.jsxs("span",{className:up.bellWrapper,children:[x.jsx(Ea,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&x.jsx("span",{className:up.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function $p(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>mb(u,p,d))}function Nb(i,n,r){return $p(i,n,r)[0]}function mb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function cp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function yb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function pp(i,n){return i??n}function fb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Sb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function vb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function gp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function bb(i,n){const r=i.studioState??"unknown",d={edit:n("connection.targets.studioState.edit","Edit"),running:n("connection.targets.studioState.running","Running"),paused:n("connection.targets.studioState.paused","Paused"),unknown:n("connection.targets.studioState.unknown","Unknown")},u=i.playtestMode&&i.playtestMode!=="unknown"?`/${i.playtestMode}`:"";return`${d[r]}${u}`}function Pb(){var M,ye;const{pathname:i,search:n}=Yt(),{level:r,status:d}=_n(),{t:u}=Uo(),{trackEvent:p}=us(),[g,y]=R.useState(null),[h,v]=R.useState(null),[P,w]=R.useState(null),[D,U]=R.useState(!1),B=u("header.placeNotConnected","Place not connected"),z=(d==null?void 0:d.studioRoutingMode)??"recentPriority",N=(d==null?void 0:d.pinnedTargetClientId)??null,te=$p((d==null?void 0:d.pluginClients)??[],z,N),K=te[0],$=fb(i),G=Sb(i),he=ds(i,n);R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){y(null);return}try{const ue=await Et.get("/connection-info");F||y(ue)}catch{F||y(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){v(null),U(!1);return}v(null),U(!1);try{const ue=await Uv();F||(v(ue),U(!1))}catch{F||(v(null),U(!0))}}return ie(),()=>{F=!0}},[$,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){w(null);return}try{const ue=await jv();F||w(ue)}catch{F||w(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=yb(g)??"",E=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",Q=E==="ready"?(h==null?void 0:h.projectRoot)??"":E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Pe=E==="ready"?(h==null?void 0:h.projectRoot)??"":$?"":De,ce=$||E==="ready"?E==="ready"?cp(Pe)||u("header.unknownProject","Unknown project"):E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):cp(Pe)||u("header.unknownProject","Unknown project"),He=pp((ye=(M=d==null?void 0:d.pluginClients)==null?void 0:M[0])==null?void 0:ye.placeName,B),ve=P!=null&&P.pluginConnected?P.activePlaceId:(P==null?void 0:P.lastActivePlaceId)??null,Te=[...(P==null?void 0:P.places)??[]].sort((F,ie)=>{const ue=F.placeId===ve,we=ie.placeId===ve;return ue!==we?ue?-1:1:F.isConnected!==ie.isConnected?F.isConnected?-1:1:F.placeName.localeCompare(ie.placeName)}),Le=te.length>0?Te.filter(F=>!te.some(ie=>ie.placeId!==void 0&&ie.placeId===F.placeId)):Te,et=$?E==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):E==="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"),ot=u("header.manageProjectRoot.tooltip","Open Project Root controls"),_e=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),O=Te.find(F=>F.placeId===ve)??null,de=vb(i),V=h!=null&&h.projectSyncRoot&&O?`${h.projectSyncRoot}/${O.placeDirName}`:null,C=de==="playtest"?O!=null&&O.testsPath?{label:u("header.testFiles.label","Test Files"),value:O.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&V?{label:u("header.placeData.label","Place Data"),value:V,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return x.jsx(x.Fragment,{children:x.jsxs("header",{className:be.header,children:[x.jsxs("div",{className:be.row1,children:[x.jsxs("div",{className:be.contextGroups,children:[x.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[x.jsxs("div",{className:be.groupTitleRow,children:[x.jsxs("span",{className:be.groupLabel,children:[x.jsx(Lf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),x.jsx(Ft,{text:et,children:x.jsx("h1",{className:be.projectName,children:ce})}),x.jsx(Ft,{text:ot,children:x.jsx(Ea,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...he}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),x.jsxs("div",{className:be.pathRow,children:[x.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),x.jsx("span",{className:be.projectPath,title:Q,children:Q})]})]}),x.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[x.jsx(Ft,{text:_e,children:x.jsxs("span",{className:be.groupLabel,children:[x.jsx(eS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),x.jsxs("div",{className:be.placeChips,children:[te.map(F=>{const ie=F.targetAlias,ue=pp(F.placeName,B),we=F.connectionState??"connected",ke=te.filter(yo=>yo.placeId!==void 0&&yo.placeId===F.placeId).length>1,je=z==="pinned"&&N===F.clientId?u("connection.routing.pinnedBadge","Pinned"):z==="recentPriority"&&(K==null?void 0:K.clientId)===F.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=gp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}"),{studioId:ie,connectionId:F.clientId,placeName:ue,placeId:F.placeId!==void 0?String(F.placeId):"-",state:we,runtimeState:bb(F,u),routing:je});return x.jsx(Ft,{text:gt,children:x.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),x.jsx("span",{className:be.placeChipName,children:ue}),F.placeId!==void 0?x.jsx("span",{className:be.placeChipId,children:F.placeId}):null,x.jsx("span",{className:be.placeChipState,children:we}),ke?x.jsx("span",{className:be.placeChipClient,children:ie}):null,je!=="-"?x.jsx("span",{className:be.placeChipBadge,children:je}):null]})},F.clientId)}),te.length===0&&Le.length===0?x.jsx(Ft,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:x.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:x.jsx("span",{className:be.placeChipName,children:He})})}):Le.map(F=>{const ie=F.placeId===ve,ue=!!(P!=null&&P.pluginConnected)&&F.isConnected,we=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),ke=gp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:F.placeName,placeId:String(F.placeId),state:we}),je=[be.placeChip,be.placeChipStatic,ie&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return x.jsx(Ft,{text:ke,children:x.jsxs("span",{className:je,children:[ie&&ue?x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,x.jsx("span",{className:be.placeChipName,children:F.placeName}),x.jsx("span",{className:be.placeChipId,children:F.placeId})]})},`${F.placeId}:${F.placeDirName}`)})]})]})]}),x.jsxs("div",{className:be.metaActions,children:[!G&&x.jsx(hb,{}),x.jsx(Ft,{text:u("sidebar.controls","Controls"),children:x.jsx(Ea,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...he}),children:x.jsx(Wp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),x.jsx(Ft,{text:u("sidebar.settings","Settings"),children:x.jsx(Ea,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...he}),children:x.jsx(rS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),x.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":C?"visible":"empty","aria-hidden":C?void 0:!0,children:C?x.jsx(Ft,{text:C.tooltip,children:x.jsxs("div",{className:be.auxiliaryPath,children:[x.jsx("span",{className:be.pathLabel,children:C.label}),x.jsx("span",{className:be.projectPath,title:C.value,children:C.value})]})}):null})]})})}const wb="_layout_ya8ln_2",Cb="_mainShell_ya8ln_8",kb="_content_ya8ln_17",xb="_loading_ya8ln_25",In={layout:wb,mainShell:Cb,content:kb,loading:xb};function Rb(){const{pathname:i,search:n}=Yt(),{trackPageView:r}=us();return R.useEffect(()=>{r(ds(i,n))},[i,n,r]),null}function Ab(){const{t:i}=Uo();return x.jsx("div",{className:In.loading,children:i("common.loading","Loading...")})}function Ib(){return x.jsx(Zy,{children:x.jsx(lf,{children:x.jsxs(qy,{children:[x.jsx(uf,{}),x.jsx(Rb,{}),x.jsxs("div",{className:In.layout,children:[x.jsx(Tv,{}),x.jsxs("div",{className:In.mainShell,children:[x.jsx(Pb,{}),x.jsx("main",{className:In.content,children:x.jsx(R.Suspense,{fallback:x.jsx(Ab,{}),children:x.jsx(ny,{})})})]})]})]})})})}function hp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Db=my([{path:"/",element:x.jsx(Ib,{}),children:[...Fp.map(hp),...ql.map(hp),{path:"changelog/:id",lazy:()=>Kt(()=>import("./ChangelogDetailPage-DtMfQXpn.js"),__vite__mapDeps([42,1,9,10,8,3,4,43]))},{path:"settings",lazy:()=>Kt(()=>import("./SettingsPage-BzmeWDML.js"),__vite__mapDeps([44,2,3,4,5,1,8,38,39,14,15,16,32,33,45]))}]}]);qh.createRoot(document.getElementById("root")).render(x.jsx(Cy,{router:Db}));export{Ta as A,Mb as B,zb as C,Ql as D,qp as E,Hb as F,Hv as G,Mv as H,Wf as I,Un as J,Ea as L,eS as M,jb as N,oS as P,Bp as R,$y as S,bS as T,gS as X,Et as a,Tb as b,$l as c,Yt as d,us as e,_n as f,jv as g,SS as h,Ke as i,x as j,Ft as k,df as l,Hy as m,ds as n,Ln as o,Tf as p,rS as q,R as r,$p as s,Ub as t,Uo as u,Uv as v,_b as w,Lb as x,Nb as y,Np as z};
|
|
682
|
+
Assets est encore expérimental. D'autres catégories seront ajoutées progressivement.`},severity:"info",category:"release"}],Jl="weppy-dashboard.whatsNew.readIds";function Vp(){try{const i=localStorage.getItem(Jl);if(!i)return new Set;const n=JSON.parse(i);return Array.isArray(n)?new Set(n.filter(r=>typeof r=="string")):new Set}catch{return new Set}}function zv(i){try{localStorage.setItem(Jl,JSON.stringify([...i]))}catch{}}let di=Vp(),Gp=di;const Wl=new Set;function Xp(){Gp=new Set(di);for(const i of Wl)i()}const Ml={subscribe(i){return Wl.add(i),()=>{Wl.delete(i)}},getSnapshot(){return Gp},markRead(i){let n=!1;for(const r of i)di.has(r)||(di.add(r),n=!0);n&&(zv(di),Xp())}};typeof window<"u"&&window.addEventListener("storage",i=>{i.key===Jl&&(di=Vp(),Xp())});function Hv(){const i=R.useSyncExternalStore(Ml.subscribe,Ml.getSnapshot),n=Mv.filter(r=>!i.has(r.id)).length;return{readSet:i,unreadCount:n,markRead:Ml.markRead}}const Lv="_header_1do17_2",_v="_row1_1do17_17",Nv="_contextGroups_1do17_25",Ov="_projectGroup_1do17_33",qv="_studioGroup_1do17_34",Bv="_groupTitleRow_1do17_52",Wv="_groupLabel_1do17_59",Fv="_groupIcon_1do17_73",Kv="_projectName_1do17_78",Yv="_placeChips_1do17_90",Vv="_metaActions_1do17_99",Gv="_placeChip_1do17_90",Xv="_placeChipStatic_1do17_122",$v="_placeChipMuted_1do17_123",Qv="_placeChipActive_1do17_127",Zv="_placeChipInactive_1do17_134",Jv="_placeChipId_1do17_145",eb="_placeChipClient_1do17_160",tb="_placeChipState_1do17_166",ob="_placeChipBadge_1do17_172",ab="_placeDot_1do17_180",ib="_placeChipName_1do17_188",sb="_row2_1do17_196",nb="_pathRow_1do17_208",rb="_auxiliaryPath_1do17_209",lb="_pathLabel_1do17_221",db="_projectPath_1do17_232",ub="_changeButton_1do17_242",cb="_iconButton_1do17_276",be={header:Lv,row1:_v,contextGroups:Nv,projectGroup:Ov,studioGroup:qv,groupTitleRow:Bv,groupLabel:Wv,groupIcon:Fv,projectName:Kv,placeChips:Yv,metaActions:Vv,placeChip:Gv,placeChipStatic:Xv,placeChipMuted:$v,placeChipActive:Qv,placeChipInactive:Zv,placeChipId:Jv,placeChipClient:eb,placeChipState:tb,placeChipBadge:ob,placeDot:ab,placeChipName:ib,row2:sb,pathRow:nb,auxiliaryPath:rb,pathLabel:lb,projectPath:db,changeButton:ub,iconButton:cb},pb="_bellWrapper_tae21_2",gb="_unreadDot_tae21_8",up={bellWrapper:pb,unreadDot:gb};function hb(){const{t:i}=Uo(),{unreadCount:n}=Hv(),{trackEvent:r}=us(),{pathname:d,search:u}=Yt(),p=ds(d,u),g=n>0?`${i("header.whatsNew","What's New")} (${n})`:i("header.whatsNew","What's New");return x.jsx(Ft,{text:i("header.whatsNew.tooltip","What's New"),children:x.jsxs("span",{className:up.bellWrapper,children:[x.jsx(Ea,{to:"/whats-new","aria-label":g,className:be.iconButton,onClick:()=>r("dashboard_click_event",{click_target:"top_header_notification_bell",placement:"top_header",...p}),children:"🔔"}),n>0&&x.jsx("span",{className:up.unreadDot,"data-testid":"unread-dot","aria-hidden":"true"})]})})}function $p(i,n,r){const d=n==="pinned"?r:null;return[...i].sort((u,p)=>mb(u,p,d))}function Nb(i,n,r){return $p(i,n,r)[0]}function mb(i,n,r){if(r){const h=i.clientId===r,v=n.clientId===r;if(h!==v)return h?-1:1}const d=i.lastRoutedAt,u=n.lastRoutedAt,p=d!==void 0;if(p!==(u!==void 0))return p?-1:1;if(d!==void 0&&u!==void 0&&d!==u)return u-d;const y=(i.connectedAt??0)-(n.connectedAt??0);return y!==0?y:i.clientId.localeCompare(n.clientId)}function cp(i){if(!i)return"";const n=i.split(/[\\/]/).filter(Boolean);return n[n.length-1]??""}function yb(i){var d,u;const n=((d=i==null?void 0:i.mcpInstances)==null?void 0:d.filter(p=>!p.isServer&&p.aiClientName))??[];if(n.length===0){const p=((u=i==null?void 0:i.mcpInstances)==null?void 0:u.find(g=>!!g.aiClientName))??null;return(p==null?void 0:p.projectRoot)??(p==null?void 0:p.cwd)??null}n.sort((p,g)=>(g.lastCommandAt??g.connectedAt)-(p.lastCommandAt??p.connectedAt));const r=n[0];return r.projectRoot??r.cwd??null}function pp(i,n){return i??n}function fb(i){const n=i.replace(/^\//,"").split("/")[0];return n===""||n==="overview"}function Sb(i){return i.replace(/^\//,"").split("/")[0]==="whats-new"}function vb(i){return i.replace(/^\//,"").split("/")[0]||"overview"}function gp(i,n){return Object.entries(n).reduce((r,[d,u])=>r.split(`{${d}}`).join(u||"-"),i)}function bb(i,n){const r=i.studioState??"unknown",d={edit:n("connection.targets.studioState.edit","Edit"),running:n("connection.targets.studioState.running","Running"),paused:n("connection.targets.studioState.paused","Paused"),unknown:n("connection.targets.studioState.unknown","Unknown")},u=i.playtestMode&&i.playtestMode!=="unknown"?`/${i.playtestMode}`:"";return`${d[r]}${u}`}function Pb(){var M,ye;const{pathname:i,search:n}=Yt(),{level:r,status:d}=_n(),{t:u}=Uo(),{trackEvent:p}=us(),[g,y]=R.useState(null),[h,v]=R.useState(null),[P,w]=R.useState(null),[D,U]=R.useState(!1),B=u("header.placeNotConnected","Place not connected"),z=(d==null?void 0:d.studioRoutingMode)??"recentPriority",N=(d==null?void 0:d.pinnedTargetClientId)??null,te=$p((d==null?void 0:d.pluginClients)??[],z,N),K=te[0],$=fb(i),V=Sb(i),he=ds(i,n);R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){y(null);return}try{const ue=await Et.get("/connection-info");F||y(ue)}catch{F||y(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){v(null),U(!1);return}v(null),U(!1);try{const ue=await Uv();F||(v(ue),U(!1))}catch{F||(v(null),U(!0))}}return ie(),()=>{F=!0}},[$,r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]),R.useEffect(()=>{let F=!1;async function ie(){if(r==="disconnected"){w(null);return}try{const ue=await jv();F||w(ue)}catch{F||w(null)}}return ie(),()=>{F=!0}},[r,d==null?void 0:d.sessionId,d==null?void 0:d.connectedClients]);const De=yb(g)??"",E=r==="disconnected"?"blocked":h?"ready":D?"error":"loading",Q=E==="ready"?(h==null?void 0:h.projectRoot)??"":E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"),Pe=E==="ready"?(h==null?void 0:h.projectRoot)??"":$?"":De,ce=$||E==="ready"?E==="ready"?cp(Pe)||u("header.unknownProject","Unknown project"):E==="loading"?u("header.currentProject.loading","Loading project root..."):u("header.currentProject.unavailable","Project root unavailable"):cp(Pe)||u("header.unknownProject","Unknown project"),He=pp((ye=(M=d==null?void 0:d.pluginClients)==null?void 0:M[0])==null?void 0:ye.placeName,B),ve=P!=null&&P.pluginConnected?P.activePlaceId:(P==null?void 0:P.lastActivePlaceId)??null,Te=[...(P==null?void 0:P.places)??[]].sort((F,ie)=>{const ue=F.placeId===ve,we=ie.placeId===ve;return ue!==we?ue?-1:1:F.isConnected!==ie.isConnected?F.isConnected?-1:1:F.placeName.localeCompare(ie.placeName)}),Le=te.length>0?Te.filter(F=>!te.some(ie=>ie.placeId!==void 0&&ie.placeId===F.placeId)):Te,et=$?E==="loading"?u("header.currentProject.loading.tooltip","Project root information is still loading"):E==="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"),ot=u("header.manageProjectRoot.tooltip","Open Project Root controls"),_e=u("header.activeStudio.tooltip","Connected Studio targets that MCP can route requests to. Studio Routing changes the priority for requests without a named Studio target."),O=Te.find(F=>F.placeId===ve)??null,de=vb(i),G=h!=null&&h.projectSyncRoot&&O?`${h.projectSyncRoot}/${O.placeDirName}`:null,C=de==="playtest"?O!=null&&O.testsPath?{label:u("header.testFiles.label","Test Files"),value:O.testsPath,tooltip:u("header.testFiles.tooltip","Current playtest files directory for the selected place")}:null:["sync","changelog","ui-studio"].includes(de)&&G?{label:u("header.placeData.label","Place Data"),value:G,tooltip:u("header.placeData.tooltip","Current place data directory")}:null;return x.jsx(x.Fragment,{children:x.jsxs("header",{className:be.header,children:[x.jsxs("div",{className:be.row1,children:[x.jsxs("div",{className:be.contextGroups,children:[x.jsxs("section",{className:be.projectGroup,"aria-label":u("header.projectGroup.label","Project"),children:[x.jsxs("div",{className:be.groupTitleRow,children:[x.jsxs("span",{className:be.groupLabel,children:[x.jsx(Lf,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.projectGroup.label","Project")]}),x.jsx(Ft,{text:et,children:x.jsx("h1",{className:be.projectName,children:ce})}),x.jsx(Ft,{text:ot,children:x.jsx(Ea,{to:"/controls?section=project-root",className:be.changeButton,onClick:()=>p("dashboard_click_event",{click_target:"project_root_manage",placement:"top_header",...he}),children:u("header.manageProjectRoot","Manage Project Root")})})]}),x.jsxs("div",{className:be.pathRow,children:[x.jsx("span",{className:be.pathLabel,children:u("header.projectRoot.label","Project Root")}),x.jsx("span",{className:be.projectPath,title:Q,children:Q})]})]}),x.jsxs("section",{className:be.studioGroup,"aria-label":u("header.activeStudio.label","Active Studio"),children:[x.jsx(Ft,{text:_e,children:x.jsxs("span",{className:be.groupLabel,children:[x.jsx(eS,{size:14,strokeWidth:1.75,"aria-hidden":"true",focusable:"false",className:be.groupIcon}),u("header.activeStudio.label","Active Studio")]})}),x.jsxs("div",{className:be.placeChips,children:[te.map(F=>{const ie=F.targetAlias,ue=pp(F.placeName,B),we=F.connectionState??"connected",ke=te.filter(yo=>yo.placeId!==void 0&&yo.placeId===F.placeId).length>1,je=z==="pinned"&&N===F.clientId?u("connection.routing.pinnedBadge","Pinned"):z==="recentPriority"&&(K==null?void 0:K.clientId)===F.clientId?u("connection.routing.priorityBadge","Priority"):"-",gt=gp(u("header.studioTarget.tooltip","Studio ID: {studioId} · Connection ID: {connectionId} · Place: {placeName} · Place ID: {placeId} · State: {state} · Runtime: {runtimeState} · Routing: {routing}"),{studioId:ie,connectionId:F.clientId,placeName:ue,placeId:F.placeId!==void 0?String(F.placeId):"-",state:we,runtimeState:bb(F,u),routing:je});return x.jsx(Ft,{text:gt,children:x.jsxs("span",{className:`${be.placeChip} ${be.placeChipStatic} ${be.placeChipActive}`,children:[x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}),x.jsx("span",{className:be.placeChipName,children:ue}),F.placeId!==void 0?x.jsx("span",{className:be.placeChipId,children:F.placeId}):null,x.jsx("span",{className:be.placeChipState,children:we}),ke?x.jsx("span",{className:be.placeChipClient,children:ie}):null,je!=="-"?x.jsx("span",{className:be.placeChipBadge,children:je}):null]})},F.clientId)}),te.length===0&&Le.length===0?x.jsx(Ft,{text:u("header.activeStudio.emptyTooltip","No Studio plugin is connected. Open Roblox Studio and connect the WEPPY Plugin."),children:x.jsx("span",{className:`${be.placeChip} ${be.placeChipMuted}`,children:x.jsx("span",{className:be.placeChipName,children:He})})}):Le.map(F=>{const ie=F.placeId===ve,ue=!!(P!=null&&P.pluginConnected)&&F.isConnected,we=ue?u("header.places.active","Active"):u("header.places.inactive","Inactive"),ke=gp(u("header.storedPlace.tooltip","Stored project place: {placeName} · Place ID: {placeId} · State: {state}"),{placeName:F.placeName,placeId:String(F.placeId),state:we}),je=[be.placeChip,be.placeChipStatic,ie&&ue?be.placeChipActive:be.placeChipInactive].filter(Boolean).join(" ");return x.jsx(Ft,{text:ke,children:x.jsxs("span",{className:je,children:[ie&&ue?x.jsx("span",{className:be.placeDot,"aria-hidden":"true"}):null,x.jsx("span",{className:be.placeChipName,children:F.placeName}),x.jsx("span",{className:be.placeChipId,children:F.placeId})]})},`${F.placeId}:${F.placeDirName}`)})]})]})]}),x.jsxs("div",{className:be.metaActions,children:[!V&&x.jsx(hb,{}),x.jsx(Ft,{text:u("sidebar.controls","Controls"),children:x.jsx(Ea,{to:"/controls","aria-label":u("sidebar.controls","Controls"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_controls",placement:"top_header",...he}),children:x.jsx(Wp,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})}),x.jsx(Ft,{text:u("sidebar.settings","Settings"),children:x.jsx(Ea,{to:"/settings","aria-label":u("sidebar.settings","Settings"),className:be.iconButton,onClick:()=>p("dashboard_click_event",{click_target:"top_header_settings",placement:"top_header",...he}),children:x.jsx(rS,{size:18,strokeWidth:1.75,"aria-hidden":"true",focusable:"false"})})})]})]}),x.jsx("div",{className:be.row2,"data-testid":"top-header-auxiliary-slot","data-state":C?"visible":"empty","aria-hidden":C?void 0:!0,children:C?x.jsx(Ft,{text:C.tooltip,children:x.jsxs("div",{className:be.auxiliaryPath,children:[x.jsx("span",{className:be.pathLabel,children:C.label}),x.jsx("span",{className:be.projectPath,title:C.value,children:C.value})]})}):null})]})})}const wb="_layout_ya8ln_2",Cb="_mainShell_ya8ln_8",kb="_content_ya8ln_17",xb="_loading_ya8ln_25",In={layout:wb,mainShell:Cb,content:kb,loading:xb};function Rb(){const{pathname:i,search:n}=Yt(),{trackPageView:r}=us();return R.useEffect(()=>{r(ds(i,n))},[i,n,r]),null}function Ab(){const{t:i}=Uo();return x.jsx("div",{className:In.loading,children:i("common.loading","Loading...")})}function Ib(){return x.jsx(Zy,{children:x.jsx(lf,{children:x.jsxs(qy,{children:[x.jsx(uf,{}),x.jsx(Rb,{}),x.jsxs("div",{className:In.layout,children:[x.jsx(Tv,{}),x.jsxs("div",{className:In.mainShell,children:[x.jsx(Pb,{}),x.jsx("main",{className:In.content,children:x.jsx(R.Suspense,{fallback:x.jsx(Ab,{}),children:x.jsx(ny,{})})})]})]})]})})})}function hp(i){return i.route==="/"?{index:!0,lazy:i.lazy}:{path:i.route.slice(1),lazy:i.lazy}}const Db=my([{path:"/",element:x.jsx(Ib,{}),children:[...Fp.map(hp),...ql.map(hp),{path:"changelog/:id",lazy:()=>Kt(()=>import("./ChangelogDetailPage-CVWXUACL.js"),__vite__mapDeps([42,1,9,10,8,3,4,43]))},{path:"settings",lazy:()=>Kt(()=>import("./SettingsPage-BosBDJck.js"),__vite__mapDeps([44,2,3,4,5,1,8,38,39,14,15,16,32,33,45]))}]}]);qh.createRoot(document.getElementById("root")).render(x.jsx(Cy,{router:Db}));export{Ta as A,Mb as B,zb as C,Ql as D,qp as E,Hb as F,Hv as G,Mv as H,Wf as I,Un as J,Ea as L,eS as M,jb as N,oS as P,Bp as R,$y as S,bS as T,gS as X,Et as a,Tb as b,$l as c,Yt as d,us as e,_n as f,jv as g,SS as h,Ke as i,x as j,Ft as k,df as l,Hy as m,ds as n,Ln as o,Tf as p,rS as q,R as r,$p as s,Ub as t,Uo as u,Uv as v,_b as w,Lb as x,Nb as y,Np as z};
|