react-toolkits 0.8.88 → 0.8.89

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/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/ContextProvider/index.tsx","../src/locales/zh_CN.ts","../src/hooks/i18n.ts","../src/components/FilterFormWrapper/index.tsx","../src/utils/request.ts","../src/stores/token.ts","../src/utils/storage.ts","../src/components/GameSelect/index.tsx","../src/components/Highlight/index.tsx","../src/hooks/permission.ts","../src/components/PermissionButton/index.tsx","../src/components/QueryList/utils.ts","../src/stores/queryList.ts","../src/components/QueryList/constants.ts","../src/components/QueryList/index.tsx","../src/hooks/modal.tsx","../src/hooks/formModal.tsx","../src/pages/NotFound/index.tsx","../src/pages/OperationLogList/index.tsx","../src/constants/index.ts","../src/pages/SignIn/index.tsx","../src/features/permission/hooks/index.ts","../src/features/permission/components/PermissionCollapse/index.tsx","../src/features/permission/components/PermissionListV1/index.tsx","../src/features/permission/components/PermissionListV2/index.tsx","../src/features/permission/components/PermissionList/index.tsx","../src/features/permission/types/index.ts","../src/features/permission/index.ts","../src/pages/permission/UserList/index.tsx","../src/pages/permission/RoleList/index.tsx","../src/pages/permission/RoleDetail/index.tsx","../src/pages/permission/index.tsx","../src/index.ts","../src/components/DynamicTags/index.tsx","../src/components/InfiniteList/index.tsx","../src/components/Layout/index.tsx","../src/components/NavMenu/index.tsx","../src/components/NavMenu/store.ts","../src/components/UserWidget/index.tsx","../src/components/PermissionGuard/index.tsx","../src/utils/router.tsx"],"names":["createContext","useContext","createStore","jsx","useToolkitsContext","ToolkitsContext","defaultState","contextStore","ContextProvider","ContextProvider_default","init_ContextProvider","__esmMin","children","props","config","locale","zh_CN_default","init_zh_CN","get","has","template","useTranslation","key","data","init_i18n","Button","Space","theme","jsxs","FilterFormWrapper","FilterFormWrapper_default","init_FilterFormWrapper","extras","isConfirming","onConfirm","onReset","token","t","style","item","pick","qs","request","url","opts","body","params","headers","responseType","isGlobal","rest","parsed","queryParams","options","queryString","useTokenStore","game","useGameStore","isJsonBody","requestOpts","response","RequestError","responseInterceptor","json","init_request","init_GameSelect","init_token","__publicField","jwtDecode","useSWRImmutable","create","persist","useTokenValidation","skip","usePermissionApiV2","set","store","state","mixedStorage","init_storage","name","value","Select","Typography","useSWRConfig","createJSONStorage","Text","GameSelect","GameSelect_default","switching","id","matchGame","isPermissionApiV2","prevState","gameFilter","games","isLoading","setGame","setSwitching","mutate","onGameChange","useEffect","useState","flushSync","createRoot","renderToString","node","container","root","resolve","splitByTags","Highlight","Highlight_default","init_Highlight","str","regex","part","texts","htmlString","setHtmlString","result","text","index","useSWR","usePermissions","codes","isValidating","acc","curr","usePermission","code","init_permission","Tooltip","PermissionButton","PermissionButton_default","init_PermissionButton","showLoading","disabled","restProps","genSwrKey","payload","action","getParams","getBody","method","onePage","query","page","size","formValues","serialize","deepSortObject","deserialize","init_utils","obj","sortedKeys","sortedObj","useQueryListStore","init_queryList","swrKeyMap","propsMap","payloadMap","getSwrkKey","prevKey","nextKey","getPayload","defaultSize","swrKey","setPayload","updateSwrKey","defaultProps","init_constants","Form","Result","Spin","Table","forwardRef","useImperativeHandle","useRef","QueryListAction","InternalQueryList","QueryList","QueryList_default","init_QueryList","ref","internalProps","form","refreshInterval","extra","renderForm","afterSuccess","getTotal","getDataSource","onTableChange","tableProps","internalForm","accessible","listAction","setProps","removeFromStore","shouldPoll","originalData","setOriginalData","listData","formRenderer","currentPage","currentSize","Modal","useMemo","useModal","content","modalProps","uuid","modalStore","useModalStore","open","confirmLoading","setConfirmLoading","isRenderFunction","show","hide","internalModal","init_modal","useFormModal","formProps","internalExtraValues","setInternalExtraValues","hanldeConfirm","values","afterClose","modal","operation","initialValues","extraValues","init_formModal","NotFound_exports","__export","NotFound_default","useNavigate","NotFound","init_NotFound","navigate","notFoundRedirectUrl","OperationLogList_exports","OperationLogList_default","Card","Col","Input","Row","dayjs","Option","Paragraph","OperationLogList","init_OperationLogList","columns","SSO_URL","SignIn_exports","SignIn_default","Alert","Divider","Navigate","useLocation","useSearchParams","logoUrl","SignIn","init_SignIn","init_background","searchParams","location","setToken","signInPageTitle","localeDropdownMenu","signInSuccessRedirectUrl","idaasRedirectUrl","background_default","useSWRMutation","useAllPermissions","useAllPermissionsV2","useAllRoles","useRole","useCreateRole","arg","useUpdateRole","useRemoveRole","useCreateUser","useUpdateUser","useRemoveUser","init_hooks","Checkbox","Collapse","useCallback","PermissionCollapse","PermissionCollapse_default","init_PermissionCollapse","permissions","readonly","expand","onChange","activeKey","setActiveKey","checkedMap","setCheckedMap","internalValue","setInternalValue","onCollapseChange","getCheckedValue","checkedValue","tempValue","onCheckChange","e","category","permission","Skeleton","PermissionListV1","PermissionListV1_default","init_PermissionListV1","error","Empty","PermissionListV2","PermissionListV2_default","init_PermissionListV2","gameList","setGameList","globalPermissions","gamePermissions","list","addGame","prev","removeGame","_","i","newValue","selectedValue","pev","temp","gameId","Fragment","PermissionList","PermissionList_default","init_PermissionList","init_types","UserList_exports","UserList_default","UserAddOutlined","App","Tag","produce","Link","useCreateModal","message","roles","refresh","role","useUpdateUserModal","update","draft","UserList","init_UserList","remove","showCreateModal","createModal","showUpdateModal","updateModal","RoleList_exports","RoleList_default","UsergroupAddOutlined","useUpdateModal","RoleList","init_RoleList","match","viewable","RoleDetail_exports","RoleDetail_default","Breadcrumb","Descriptions","useParams","RoleDetail","init_RoleDetail","permission_exports","permission_default","lazy","Route","Routes","Permission","PlusOutlined","DynamicTags","initialTags","addable","removable","addCallback","removeCallback","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","handleClose","removedTag","newTags","tag","showInput","handleInputChange","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","DynamicTags_default","useSWRInfinite","InfiniteList","getRowKey","hasMore","transformArg","isValid","setIsValid","setFormValues","getKey","pageIndex","previousPageData","rowKey","args","setSize","isListValidating","dataSource","isLoadingMore","isReachingEnd","isEmpty","loadMore","InfiniteList_default","Antd","Suspense","Menu","memo","useNavStore","keys","withLink","label","route","checkChildren","child","transformItems","items","isPass","flatItems","keypath","NavMenu","menuItems","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","onOpenChange","latestOpenKey","NavMenu_default","LogoutOutlined","UserOutlined","Dropdown","UserWidget","clearToken","getUser","user","logoutRedirectUrl","UserWidget_default","Header","Sider","Content","ContentGuard","hideGameSelect","Layout","colorBgContainer","colorBorder","appTitle","layoutHeaderExtras","Layout_default","PermissionGuard","PermissionGuard_default","withLayout","WrappedComponent","withBaseRoutes","routes","sharedProps"],"mappings":"gRAEA,OAAS,iBAAAA,GAAe,cAAAC,OAAkB,QAC1C,OAAS,eAAAC,OAAmB,UAsDnB,cAAAC,OAAA,oBAfF,SAASC,GAAqB,CACnC,OAAOH,GAAWI,EAAe,CACnC,CA5CA,IA2BMC,GAUOC,EAEPF,GAOAG,GAgBCC,GA9DPC,EAAAC,EAAA,kBA2BML,GAA6B,CACjC,SAAU,GACV,UAAW,CAAC,EACZ,eAAgB,GAChB,mBAAoB,GACpB,iBAAkB,GAClB,SAAU,EACZ,EAGaC,EAAeL,GAA0B,IAAMI,EAAY,EAElED,GAAkBL,GAA4BM,EAAY,EAO1DE,GAAgE,CAAC,CAAE,SAAAI,EAAU,GAAGC,CAAM,IAAM,CAGhG,IAAMC,EAAS,CACb,GAHmBV,EAAmB,EAItC,GAAGS,EACH,SAAUA,EAAM,UAAY,EAC9B,EAEA,OAAAN,EAAa,SAASO,CAAM,EAErBX,GAACE,GAAgB,SAAhB,CAAyB,MAAOS,EAAS,SAAAF,EAAS,CAC5D,EAEAJ,GAAgB,YAAc,0BAEvBC,GAAQD,KC9Df,IAEMO,GAyFCC,GA3FPC,GAAAN,EAAA,kBAEMI,GAAiB,CACrB,OAAQ,CACN,cAAe,qEACf,KAAM,eACN,aAAc,2BACd,UAAW,eACX,OAAQ,eACR,KAAM,eACN,OAAQ,eACR,UAAW,eACX,KAAM,eACN,KAAM,eACN,KAAM,eACN,SAAU,qBACV,SAAU,eACV,MAAO,eACP,OAAQ,eACR,MAAO,eACP,QAAS,eACT,SAAU,eACV,IAAK,eACL,OAAQ,cACV,EACA,OAAQ,CACN,MAAO,2BACP,WAAY,iCACZ,gBAAiB,qBACjB,cAAe,6FACf,QAAS,cACX,EACA,SAAU,CACR,SAAU,mDACV,WAAY,0BACd,EACA,kBAAmB,CACjB,YAAa,eACb,UAAW,cACb,EACA,UAAW,CACT,YAAa,eACb,WAAY,cACd,EACA,WAAY,CACV,MAAO,2BACP,YAAa,gCACf,EACA,YAAa,CACX,YAAa,gCACf,EACA,WAAY,CACV,YAAa,cACf,EACA,SAAU,CACR,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,cAAe,sEACf,mBAAoB,sCACtB,EACA,SAAU,CACR,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,mBAAoB,uCACpB,YAAa,2BACb,cAAe,sEACf,mBAAoB,sCACtB,EACA,eAAgB,CACd,kBAAmB,mDACnB,iBAAkB,uCAClB,iBAAkB,2BAClB,uBAAwB,uCACxB,sBAAuB,uCACvB,WAAY,eACZ,QAAS,sCACX,EACA,WAAY,CACV,MAAO,0BACT,EACA,aAAc,CACZ,YAAa,qBACb,aAAc,iCACd,aAAc,0BAChB,CACF,EAEOC,GAAQD,KC3Ff,OAAS,OAAAG,GAAK,OAAAC,GAAK,YAAAC,OAAgB,YAmB5B,SAASC,GAAiB,CAC/B,GAAM,CAAE,OAAAN,EAASC,EAAM,EAAIZ,EAAmB,EAE9C,MAAO,CAACkB,EAAoBC,IAC1BJ,GAAIJ,EAAQO,CAAG,EAAIF,GAASF,GAAIH,EAAQO,CAAa,CAAC,EAAEC,CAAI,EAAID,CACpE,CAxBA,IAAAE,EAAAb,EAAA,kBACAD,IACAO,OCDA,OAAS,UAAAQ,GAAQ,SAAAC,GAAO,SAAAC,OAAa,OA8B7B,cAAAxB,GAEE,QAAAyB,OAFF,oBA/BR,IAYMC,GAkCCC,GA9CPC,GAAApB,EAAA,kBAGAa,IASMK,GAAqBhB,GAAkC,CAC3D,GAAM,CAAE,OAAAmB,EAAQ,aAAAC,EAAc,UAAAC,EAAW,QAAAC,EAAS,SAAAvB,CAAS,EAAIC,EACzD,CAAE,MAAAuB,CAAM,EAAIT,GAAM,SAAS,EAC3BU,EAAIhB,EAAe,EAEnBiB,EAAQ,CACZ,SAAU,OACV,WAAYF,EAAM,eAClB,YAAaA,EAAM,UACnB,YAAaA,EAAM,SACnB,YAAaA,EAAM,YACnB,aAAcA,EAAM,eACpB,QAAS,GACT,aAAc,EAChB,EAEA,OACEjC,GAAC,OAAI,MAAOmC,EACV,SAAAV,GAAC,OAAI,UAAU,OACb,UAAAzB,GAAC,OAAI,UAAU,SAAU,SAAAS,EAAS,EAClCT,GAAC,OAAI,UAAU,OACb,SAAAyB,GAACF,GAAA,CACC,UAAAvB,GAACsB,GAAA,CAAO,KAAK,UAAU,QAASQ,EAAc,QAASC,EACpD,SAAAG,EAAE,+BAA+B,EACpC,EACAlC,GAACsB,GAAA,CAAO,QAASU,EAAU,SAAAE,EAAE,6BAA6B,EAAE,EAC3DL,GAAQ,IAAIO,GAAQpC,GAAC,QAAqB,SAAAoC,EAAK,UAAhBA,EAAK,GAAoB,CAAO,GAClE,EACF,GACF,EACF,CAEJ,EAEOT,GAAQD,KC7Cf,OAAS,QAAAW,OAAY,YAErB,OAAOC,OAAQ,eAuCf,eAAsBC,EAAiBC,EAAaC,EAAuB,CAAC,EAAgC,CAC1GA,EAAO,OAAO,OAAOA,EAAM,CAAE,aAAcA,EAAK,cAAgB,MAAO,CAAC,EACxE,GAAI,CAAE,KAAAC,EAAM,OAAAC,EAAQ,QAAAC,EAAS,aAAAC,EAAc,SAAAC,EAAU,GAAGC,CAAK,EAAIN,EAE3DO,EAASV,GAAG,SAASE,CAAG,EACxBS,EAAc,OAAO,OAAO,CAAC,EAAGD,EAAO,MAAOL,CAAM,EACpDO,EAA4B,CAChC,SAAU,GACV,gBAAiB,GACjB,OAAQ,GACR,OAAQ,EACV,EACMC,EAAcb,GAAG,UAAUW,EAAaC,CAAO,EACrDV,EAAMW,EAAc,GAAGH,EAAO,GAAG,IAAIG,CAAW,GAAKX,EAErDI,EAAU,IAAI,QAAQA,CAAO,EAE7B,IAAMX,EAAQmB,GAAe,SAAS,GAAG,MAMzC,GAJInB,GACFW,EAAQ,IAAI,gBAAiB,UAAUX,CAAK,EAAE,EAG5C7B,EAAa,SAAS,EAAE,mBAC1B,GAAI0C,GAAY1C,EAAa,SAAS,EAAE,SACtCwC,EAAQ,IAAI,SAAU,QAAQ,MACzB,CACL,IAAMS,EAAOC,GAAa,SAAS,EAAE,KACjCD,GACFT,EAAQ,IAAI,SAAUS,EAAK,EAAE,CAEjC,CAGER,IAAiB,OACnBD,EAAQ,OAAO,SAAU,0BAA0B,EAC1CC,IAAiB,QAC1BD,EAAQ,OAAO,SAAU,kBAAkB,EAG7C,IAAMW,EAAa,CAAC,EAAEb,GAAQ,OAAOA,GAAS,UAAY,EAAEA,aAAgB,WAExEa,GACFX,EAAQ,IAAI,eAAgB,kBAAkB,EAGhD,IAAMY,EAAc,OAAO,OAAOT,EAAM,CACtC,QAAAH,EACA,KAAMW,EAAa,KAAK,UAAUb,CAAI,EAAIA,CAC5C,CAAC,EAEKe,EAAW,MAAM,MAAMjB,EAAKgB,CAAW,EAE7C,GAAI,CAACC,EAAS,GACZ,MAAM,IAAIC,GAAa,CAAE,OAAQD,EAAS,MAAO,CAAC,EAGpD,IAAME,EAAsBvD,EAAa,SAAS,EAAE,oBAEpD,GAAI,OAAOuD,GAAwB,WACjC,OAAO,MAAMA,EAAoBF,EAAUhB,CAAI,EAC1C,CACL,IAAIrB,EAEJ,GAAIyB,IAAiB,OACnBzB,EAAQ,MAAMqC,EAAS,KAAK,UACnBZ,IAAiB,OAAQ,CAClC,IAAMe,EAAQ,MAAMH,EAAS,KAAK,EAClC,GAAIG,EAAK,OAAS,GAAKA,EAAK,SAAW,EACrCxC,EAAOwC,EAAK,SAEZ,OAAM,IAAIF,GAAa,CACrB,KAAME,EAAK,KACX,OAAQH,EAAS,OACjB,QAASG,EAAK,GAChB,CAAC,CAEL,MACExC,EAAQ,MAAMqC,EAAS,KAAK,EAG9B,MAAO,CACL,GAAGpB,GAAKoB,EAAU,CAAC,UAAW,SAAU,aAAc,KAAK,CAAC,EAC5D,KAAArC,CACF,CACF,CACF,CAhIA,IAQasC,GARbG,EAAArD,EAAA,kBAIAD,IACAuD,KACAC,KAEaL,GAAN,cAA2B,KAAM,CAItC,YAAYjB,EAA2D,CACrE,MAAMA,GAAM,OAAO,EAJrBuB,GAAA,eACAA,GAAA,aAIE,KAAK,OAASvB,EAAK,OACnB,KAAK,KAAOA,EAAK,IACnB,CACF,ICjBA,OAAS,aAAAwB,OAAiB,aAC1B,OAAOC,OAAqB,gBAC5B,OAAS,UAAAC,OAAc,UACvB,OAAS,WAAAC,OAAe,qBAyCjB,SAASC,GAAmBC,EAAO,GAAO,CAC/C,GAAM,CAAE,mBAAAC,CAAmB,EAAItE,EAAmB,EAElDiE,GACGI,EAAwF,KAAhFC,EAAqB,4BAA8B,0BAC3D/B,GACCD,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM,CACJ,YAAa,CAAC,QAAQ,CACxB,EACA,SAAU,EACZ,CAAC,EACH,CACE,SAAU,EACZ,CACF,CACF,CA7DA,IAmBaY,EAnBbW,GAAAvD,EAAA,kBAIAD,IACAsD,IAcaT,EAAgBe,GAAmB,EAC9CC,GACE,CAACI,EAAKzD,EAAK0D,KAAW,CACpB,MAAO,GACP,QAAS,IAAM,CACb,GAAI,CACF,OAAOR,GAAUlD,EAAI,EAAE,KAAK,CAC9B,MAAY,CACV,OAAO,IACT,CACF,EACA,SAAUkB,GAASuC,EAAI,CAAE,MAAAvC,CAAM,CAAC,EAChC,WAAY,IAAM,CAChBlB,EAAI,EAAE,SAAS,EAAE,EACjB0D,EAAM,QAAQ,aAAa,CAC7B,CACF,GACA,CACE,KAAM,QACN,WAAYC,IAAU,CAAE,MAAOA,EAAM,KAAM,GAC3C,cAAe,EACjB,CACF,CACF,IC1CA,IAGaC,GAHbC,GAAApE,EAAA,kBAGamE,GAA6B,CACxC,QAAUE,GACD,eAAe,QAAQA,CAAI,GAAK,aAAa,QAAQA,CAAI,EAElE,QAAS,CAACA,EAAcC,IAAkB,CACxC,eAAe,QAAQD,EAAMC,CAAK,EAClC,aAAa,QAAQD,EAAMC,CAAK,CAClC,EACA,WAAY,MAAOD,GAAiB,CAClC,eAAe,WAAWA,CAAI,EAC9B,aAAa,WAAWA,CAAI,CAC9B,CACF,ICfA,OAAS,UAAAE,GAAQ,SAAAxD,GAAO,cAAAyD,OAAkB,OAC1C,OAAS,gBAAAC,OAAoB,MAC7B,OAAS,UAAAd,OAAc,UACvB,OAAS,qBAAAe,GAAmB,WAAAd,OAAe,qBAmHvC,OACE,OAAApE,GADF,QAAAyB,OAAA,oBAtHJ,IASQ0D,GAmBK7B,GA8DP8B,GA4CCC,GAtIPvB,GAAAtD,EAAA,kBAIAa,IACA0C,KACAa,KACArE,KAEM,CAAE,KAAA4E,IAASH,IAmBJ1B,GAAea,GAAkB,EAC5CC,GACE,CAACI,EAAKzD,KAAS,CACb,KAAM,KACN,MAAO,CAAC,EACR,UAAW,GACX,UAAW,GACX,aAAcuE,GAAa,CACzBd,EAAI,CAAE,UAAAc,CAAU,CAAC,CACnB,EACA,QAASC,GAAM,CACb,IAAMC,GAAazE,EAAI,EAAE,OAAS,CAAC,GAAG,KAAKqB,GAAQA,EAAK,KAAOmD,CAAE,EACjEf,EAAI,CAAE,KAAMgB,GAAa,IAAK,CAAC,CACjC,EACA,WAAY,IAAM,CAChB,IAAMvD,EAAQmB,EAAc,SAAS,EAAE,MACjCqC,EAAoBrF,EAAa,SAAS,EAAE,mBAE9C6B,GAASwD,IACXjB,EAAI,CAAE,UAAW,EAAK,CAAC,EAEvB,MAAM,wBAAyB,CAC7B,OAAQ,MACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAUvC,CAAK,EAChC,CACF,CAAC,EACE,KAAKwB,GAAY,CAChB,GAAIA,EAAS,GACX,OAAOA,EAAS,KAAK,EAEvB,MAAM,IAAI,MAAM,8BAA8B,CAChD,CAAC,EACA,KAAMG,GAAsD,CAC3DY,EAAI,CAAE,MAAOZ,EAAK,IAAK,CAAC,CAC1B,CAAC,EACA,QAAQ,IAAM,CACbY,EAAI,CAAE,UAAW,EAAM,CAAC,CAC1B,CAAC,EAEP,CACF,GACA,CACE,KAAM,OACN,QAASU,GAAkB,IAAMP,EAAY,EAC7C,WAAYD,IAAU,CAAE,KAAMA,EAAM,IAAK,EAC3C,CACF,CACF,EAEAtB,EAAc,UAAU,CAACsB,EAAOgB,IAAc,CACxChB,EAAM,QAAUgB,EAAU,OAE5B,WAAW,IAAM,CACfpC,GAAa,SAAS,EAAE,WAAW,CACrC,EAAG,GAAG,CAEV,CAAC,EAEDF,EAAc,QAAQ,UAAU,EAE1BgC,GAAa,IAAM,CACvB,IAAMlD,EAAIhB,EAAe,EACnB,CAAE,WAAAyE,CAAW,EAAI1F,EAAmB,EACpC,CAAE,KAAAoD,EAAM,MAAAuC,EAAO,UAAAC,EAAW,QAAAC,EAAS,aAAAC,CAAa,EAAIzC,GAAa,EACjE,CAAE,OAAA0C,CAAO,EAAIf,GAAa,EAE1B/B,GAAW0C,GAAS,CAAC,IACvB,OAAOxD,GAAQuD,IAAavD,CAAI,GAAK,EAAI,GACzC,IAAIA,IAAS,CACb,MAAOA,EAAK,KACZ,MAAOA,EAAK,EACd,EAAE,EAEE6D,EAAe,MAAOV,GAAe,CACzCQ,EAAa,EAAI,EAEjBD,EAAQP,CAAE,EACV,MAAMS,EACJ7E,GACS,EAAE,OAAOA,GAAQ,UAAYA,EAAI,WAAW,uBAAuB,GAE5E,OACA,CAAE,WAAY,EAAM,CACtB,EACA4E,EAAa,EAAK,CACpB,EAEA,OACEtE,GAACF,GAAA,CACC,UAAAvB,GAACmF,GAAA,CAAM,SAAAjD,EAAE,kBAAkB,EAAE,EAC7BlC,GAAC+E,GAAA,CACC,WAAU,GACV,iBAAiB,QACjB,MAAO1B,GAAM,GACb,YAAanB,EAAE,wBAAwB,EACvC,QAAS2D,EACT,MAAO,CAAE,MAAO,OAAQ,EACxB,QAAS3C,EACT,SAAU+C,EACZ,GACF,CAEJ,EAEOZ,GAAQD,KCrIf,OAAS,aAAAc,GAAW,YAAAC,OAAgB,QACpC,OAAS,aAAAC,OAAiB,YAC1B,OAAS,cAAAC,OAAkB,mBA4ClB,cAAArG,OAAA,oBArCT,SAASsG,GAAeC,EAAkC,CACxD,IAAMC,EAAY,SAAS,cAAc,KAAK,EACxCC,EAAOJ,GAAWG,CAAS,EAEjC,OAAO,IAAI,QAAQE,GAAW,CAC5B,WAAW,IAAM,CACfN,GAAU,IAAM,CACdK,EAAK,OAAOF,CAAI,CAClB,CAAC,EACDG,EAAQF,EAAU,SAAS,CAC7B,CAAC,CACH,CAAC,CACH,CAtBA,IAKMG,GAuBAC,GAsBCC,GAlDPC,GAAAtG,EAAA,kBAKMmG,GAAeI,GAAgB,CACnC,IAAMC,EAAQ,YACd,OAAOD,EAAI,MAAMC,CAAK,EAAE,OAAOC,GAAQA,IAAS,EAAE,CACpD,EAoBML,GAAalG,GAA+B,CAChD,GAAM,CAAE,MAAAwG,EAAO,SAAAzG,CAAS,EAAIC,EACtB,CAACyG,EAAYC,CAAa,EAAIjB,GAAiB,EAAE,EAEvD,OAAAD,GAAU,IAAM,CACdI,GAAe7F,CAAQ,EAAE,KAAKsG,GAAO,CACnC,IAAMM,EAASV,GAAYI,CAAG,EAE9B,QAAWO,KAAQJ,EACjB,QAASK,EAAQ,EAAGA,EAAQF,EAAO,OAAQE,IAEzCF,EAAOE,CAAK,EAAIF,EAAOE,CAAK,EAAE,QAAQ,OAAOD,CAAI,EAAG,iCAAiCA,CAAI,SAAS,EAItGF,EAAcC,EAAO,KAAK,EAAE,CAAC,CAC/B,CAAC,CACH,EAAG,CAAC5G,EAAUyG,CAAK,CAAC,EAEblH,GAAC,OAAI,wBAAyB,CAAE,OAAQmH,CAAW,EAAG,CAC/D,EAEON,GAAQD,KCjDf,OAAOY,OAAY,MAMZ,SAASC,GAAeC,EAAiB5E,EAAoBnC,EAA2B,CAC7F,GAAM,CAAE,mBAAA4D,CAAmB,EAAItE,EAAmB,EAC5C,CAAE,KAAAmB,EAAM,aAAAuG,EAAc,UAAA9B,CAAU,EAAI2B,GACxCE,EAAM,OAAS,EAAI,CAACnD,EAAqB,4BAA8B,0BAA2BmD,CAAK,EAAI,KAC3G,CAAC,CAAClF,CAAG,IACHD,EAA+BC,EAAK,CAClC,OAAQ,OACR,KAAM,CACJ,YAAakF,CACf,EACA,SAAA5E,CACF,CAAC,EAAE,KAAKW,GACFA,EAAS,MAAM,QACViE,EAAM,OACX,CAACE,EAAKC,KACJD,EAAIC,CAAI,EAAI,GACLD,GAET,CAAC,CACH,EAGKF,EAAM,OACX,CAACE,EAAKC,KACJD,EAAIC,CAAI,EAAKpE,EAAS,OAAmCoE,CAAI,GAAK,GAC3DD,GAET,CAAC,CACH,CACD,EACH,CACE,kBAAmB,GACnB,GAAGjH,CACL,CACF,EAEA,MAAO,CAAE,KAAAS,EAAM,aAAAuG,EAAc,UAAA9B,CAAU,CACzC,CAEO,SAASiC,EAAcC,EAA0BjF,EAAoBnC,EAA2B,CACrG,GAAM,CAAE,KAAAS,EAAM,aAAAuG,EAAc,UAAA9B,CAAU,EAAI4B,GAAeM,EAAO,CAACA,CAAI,EAAI,CAAC,EAAGjF,EAAUnC,CAAM,EAE7F,OAAIoH,IAAS,OACJ,CACL,WAAY,GACZ,aAAc,GACd,UAAW,EACb,EAGK,CACL,WAAY3G,IAAO2G,CAAI,GAAK,GAC5B,aAAAJ,EACA,UAAA9B,CACF,CACF,CA9DA,IAAAmC,EAAAxH,EAAA,kBAEAD,IACAsD,MCFA,OAAS,UAAAvC,GAAQ,WAAA2G,OAAe,OAkB1B,cAAAjI,OAAA,oBAnBN,IAYMkI,GA8BCC,EA1CPC,GAAA5H,EAAA,kBAGAa,IACA2G,IAQME,GAAiExH,GAAS,CAC9E,GAAM,CAAE,SAAAD,EAAU,KAAAsH,EAAM,YAAAM,EAAa,SAAAvF,EAAU,SAAAwF,EAAU,GAAGC,CAAU,EAAI7H,EACpE,CAAE,KAAAU,EAAM,UAAAyE,CAAU,EAAI4B,GAAe,MAAM,QAAQM,CAAI,EAAIA,EAAO,CAACA,CAAI,EAAGjF,CAAQ,EAClFZ,EAAIhB,EAAe,EAEzB,OAAI2E,EAEA7F,GAACsB,GAAA,CAAO,QAAS+G,EAAa,SAAU,CAACA,EAAc,GAAGE,EACvD,SAAA9H,EACH,EAIC,OAAO,OAAOW,GAAQ,CAAC,CAAC,GAAG,KAAK,OAAO,EAW1CpB,GAACsB,GAAA,CAAO,SAAUgH,EAAW,GAAGC,EAC7B,SAAA9H,EACH,EAXET,GAACiI,GAAA,CAAQ,YAAa,GAAO,MAAO/F,EAAE,sBAAsB,EAC1D,SAAAlC,GAACsB,GAAA,CAAO,SAAQ,GAAE,GAAGiH,EAClB,SAAA9H,EACH,EACF,CASN,EAEO0H,EAAQD,KCzCf,OAAO5F,OAAQ,eAsCR,SAASkG,GAAU9H,EAAuB+H,EAA4B,CAC3E,GAAM,CAAE,OAAAC,EAAQ,UAAAC,EAAW,QAAAC,EAAS,OAAAC,EAAQ,QAAAC,CAAQ,EAAIpI,EAClD,CAAE,IAAA8B,EAAK,MAAAuG,CAAM,EAAIzG,GAAG,SAASoG,CAAM,EACnC,CAAE,KAAAM,EAAM,KAAAC,EAAM,WAAAC,CAAW,EAAIT,GAAW,CAAC,EAEzC9F,EAAS,OAAO,OACpBoG,EACA,OAAOJ,GAAc,WACjBA,IAAY,CACV,KAAAK,EACA,KAAAC,EACA,WAAAC,CACF,CAAC,EACDL,IAAW,MACTC,EACEI,EACA,CACE,GAAGA,EACH,KAAAF,EACA,KAAAC,CACF,EACF,CAAC,CACT,EAEMvG,EACJ,OAAOkG,GAAY,WACfA,IAAU,CAAE,KAAAI,EAAM,KAAAC,EAAM,WAAAC,CAAW,CAAC,EACpCL,IAAW,OACTC,EACEI,EACA,CACE,GAAGA,EACH,KAAAF,EACA,KAAAC,CACF,EACF,OAER,OAAOE,GAAU,CACf,IAAA3G,EACA,KAAAE,EACA,OAAAC,CACF,CAAC,CACH,CAjFA,IAWMyG,GAmBOD,GAMAE,GApCbC,GAAA9I,EAAA,kBAWM4I,GAAkBG,GAA0B,CAChD,GAAI,OAAOA,GAAQ,UAAYA,IAAQ,KACrC,OAAOA,EAGT,GAAI,MAAM,QAAQA,CAAG,EACnB,OAAOA,EAAI,IAAIH,EAAc,EAG/B,IAAMI,EAAa,OAAO,KAAKD,CAAG,EAAE,KAAK,EACnClC,EAAkC,CAAC,EAEzC,OAAAmC,EAAW,QAAQrI,GAAO,CACxBkG,EAAOlG,CAAG,EAAIiI,GAAgBG,EAAgCpI,CAAG,CAAC,CACpE,CAAC,EAEMkG,CACT,EAEa8B,GAAaI,GAAsB,CAE9C,IAAME,EAAYL,GAAeG,CAAG,EACpC,OAAO,KAAK,UAAUE,CAAS,CACjC,EAEaJ,GAAelI,GAAgB,KAAK,MAAMA,CAAG,ICnC1D,OAAS,UAAA6E,OAAc,MAEvB,OAAS,UAAA7B,OAAc,UAHvB,IAiCauF,EAjCbC,GAAAnJ,EAAA,kBAKA8I,KA4BaI,EAAoBvF,GAAuB,CAACK,EAAKzD,KAAS,CACrE,UAAW,IAAI,IACf,WAAY,IAAI,IAChB,SAAU,IAAI,IACd,WAAW2H,EAAQ,CACjB,GAAM,CAAE,UAAAkB,CAAU,EAAI7I,EAAI,EAC1B,OAAO6I,EAAU,IAAIlB,CAAM,GAAK,IAClC,EACA,aAAaA,EAAQvH,EAAK,CACxB,GAAM,CAAE,SAAA0I,EAAU,WAAAC,EAAY,UAAAF,EAAW,WAAAG,CAAW,EAAIhJ,EAAI,EACtDiJ,EAAUD,EAAWrB,CAAM,EAEjC,GAAI,CAACmB,EAAS,IAAInB,CAAM,EACtB,MAAM,IAAI,MAAM,eAAeA,CAAM,kCAAkC,EAGzE,GAAIvH,IAAQ,KACVyI,EAAU,IAAIlB,EAAQ,IAAI,EAC1B1C,GAAOgE,EAAS,OAAW,EAAK,UACvB7I,IAAQ,OAAW,CAC5B,IAAM8I,EAAUzB,GAAUqB,EAAS,IAAInB,CAAM,EAAqBoB,EAAW,IAAIpB,CAAM,CAAC,EAEpFsB,IAAYC,EACdzF,EAAI,CAAE,UAAW,IAAI,IAAIoF,CAAS,EAAE,IAAIlB,EAAQuB,CAAO,CAAE,CAAC,EAE1DjE,GAAOgE,EAAS,OAAW,EAAI,CAEnC,MACExF,EAAI,CAAE,UAAW,IAAI,IAAIoF,CAAS,EAAE,IAAIlB,EAAQvH,CAAG,CAAE,CAAC,CAE1D,EACA,WAAWuH,EAAQ,CACjB,GAAM,CAAE,WAAAoB,CAAW,EAAI/I,EAAI,EAC3B,OAAO+I,EAAW,IAAIpB,CAAM,CAC9B,EACA,WAAWA,EAAQD,EAAS,CAC1B,GAAM,CAAE,WAAAqB,EAAY,WAAAI,EAAY,SAAAL,CAAS,EAAI9I,EAAI,EAC3C,CAAE,YAAAoJ,CAAY,EAAIN,EAAS,IAAInB,CAAM,GAAK,CAAC,EACjDlE,EAAI,CACF,WAAY,IAAI,IAAIsF,CAAU,EAAE,IAAIpB,EAAQ,CAC1C,KAAM,EACN,KAAMyB,EACN,GAAID,EAAWxB,CAAM,GAAK,CAAC,EAC3B,GAAGD,CACL,CAAC,CACH,CAAC,CACH,EACA,OAAQ,CAACC,EAAQtH,EAAMqB,IAAS,CAC9B,GAAM,CAAE,UAAAmH,CAAU,EAAI7I,EAAI,EACpBqJ,EAASR,EAAU,IAAIlB,CAAM,EACnC1C,GAAOoE,EAAQhJ,EAAMqB,CAAI,CAC3B,EACA,QAAQiG,EAAQM,EAAM,CACpB,GAAM,CAAE,WAAAqB,EAAY,aAAAC,EAAc,WAAAR,CAAW,EAAI/I,EAAI,EACrDsJ,EAAW3B,EAAQ,CAAE,KAAMM,GAAQc,EAAW,IAAIpB,CAAM,GAAG,IAAK,CAAC,EACjE4B,EAAa5B,CAAM,CACrB,EACA,gBAAgBA,EAAQ,CACtB3H,EAAI,EAAE,UAAU,OAAO2H,CAAM,EAC7B3H,EAAI,EAAE,WAAW,OAAO2H,CAAM,EAC9B3H,EAAI,EAAE,SAAS,OAAO2H,CAAM,CAC9B,EACA,SAASA,EAAQhI,EAAO,CACtB,GAAM,CAAE,SAAAmJ,CAAS,EAAI9I,EAAI,EACzByD,EAAI,CAAE,SAAU,IAAI,IAAIqF,CAAQ,EAAE,IAAInB,EAAQhI,CAAK,CAAE,CAAC,CACxD,CACF,EAAE,ICnGF,IACa6J,GADbC,GAAAhK,EAAA,kBACa+J,GAAe,CAC1B,OAAQ,MACR,YAAa,GACb,gBAAiB,EACjB,SAAW9G,GAAkBA,EAAS,MACtC,cAAgBA,GAAkBA,EAAS,IAC7C,ICLA,OAAS,QAAAgH,GAAM,UAAAC,GAAQ,QAAAC,GAAM,SAAAC,OAAa,OAG1C,OAAS,cAAAC,GAAY,aAAA3E,GAAW,uBAAA4E,GAAqB,UAAAC,GAAQ,YAAA5E,OAAgB,QAC7E,OAAOqB,OAAY,MAwLb,cAAAxH,GAyBF,QAAAyB,OAzBE,oBA9LN,IAkBYuJ,GA4CNC,GAsLAC,GAQCC,GA5PPC,GAAA5K,EAAA,kBAOAa,IACA2G,IAEA2B,KAGA9F,IACAjC,KACA4I,KACAlB,KAEY0B,QACVA,EAAA,QAAU,UACVA,EAAA,MAAQ,QACRA,EAAA,KAAO,OACPA,EAAA,KAAO,OAJGA,QAAA,IA4CNC,GAAoB,CACxBvK,EACA2K,IACG,CACH,IAAMC,EAAgB,CAAE,GAAGf,GAAc,GAAG7J,CAAM,EAE5C,CACJ,OAAAgI,EACA,KAAAX,EACA,QAAAnF,EACA,SAAAE,EACA,QAAAgG,EACA,OAAAD,EACA,KAAA0C,EACA,QAAA3C,EACA,UAAAD,EACA,YAAAwB,EACA,gBAAAqB,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,SAAAC,EACA,cAAAC,EACA,cAAAC,EACA,GAAGC,CACL,EAAIT,EAEEpJ,EAAIhB,EAAe,EACrB,CAAC8K,CAAY,EAAIvB,GAAK,QAAgB,EAC1CuB,EAAeT,GAAQS,EACvB,GAAM,CAAE,WAAAC,EAAY,UAAApG,EAAU,EAAIiC,EAAcC,EAAMjF,CAAQ,EACxDoJ,EAAanB,GAAwB,MAAoB,EACzD,CAAE,SAAAoB,EAAU,WAAAjC,EAAY,WAAAG,EAAY,WAAAN,EAAY,aAAAO,EAAc,gBAAA8B,EAAgB,EAAI1C,EAAkB,EACpG2C,EAAatB,GAAO,EAAK,EACzB,CAACuB,EAAcC,EAAe,EAAIpG,GAAmB,EAErD,CAAE,KAAA/E,GAAM,aAAAuG,EAAa,EAAIH,GAC7BuC,EAAWrB,CAAM,EACjB,MAAMvH,GAAO,CACX,GAAM,CAAE,IAAAqB,GAAK,OAAAG,GAAQ,KAAAD,EAAK,EAAI2G,GAAYlI,CAAG,EACvCsH,GAAUyB,EAAWxB,CAAM,EAC3BjF,GAAW,MAAMlB,EAAkBC,GAAK,CAC5C,OAAAqG,EACA,KAAAnG,GACA,OAAAC,GACA,SAAAG,EACA,QAAS,OAAOF,GAAY,WAAaA,EAAQ6F,EAAO,EAAI7F,CAC9D,CAAC,EAED,OAAA2J,GAAgB9I,GAAS,IAAI,EAEtB,CACL,WAAYoI,EAAcpI,GAAS,IAAI,EACvC,MAAOmI,EAASnI,GAAS,IAAI,GAAK,CACpC,CACF,EACA,CACE,aAAc,CACZ,WAAY,CAAC,EACb,MAAO,CACT,EACA,mBAAoB,GACpB,kBAAmB,GACnB,gBAAiB4I,EAAW,QAAUb,EAAkB,EACxD,UAAUgB,EAAU,CAClBH,EAAW,QAAU,GACrBV,IAAeO,EAAW,QAASM,CAAQ,CAC7C,EACA,SAAU,CACRH,EAAW,QAAU,EACvB,CACF,CACF,EAEMtK,GAAY,SAAY,CAC5BmK,EAAW,QAAU,UACrB7B,EAAW3B,EAAQ,CAAE,KAAM,EAAG,WAAYsD,EAAa,eAAe,CAAE,CAAC,EAEzE,GAAI,CACF,MAAMA,EAAa,eAAe,EAClC1B,EAAa5B,CAAM,CACrB,MAAgB,CACd4B,EAAa5B,EAAQ,IAAI,CAC3B,CACF,EAEM1G,GAAU,SAAY,CAC1BkK,EAAW,QAAU,QACrBF,EAAa,YAAY,EACzB3B,EAAW3B,EAAQ,CAAE,KAAM,EAAG,WAAYsD,EAAa,eAAe,CAAE,CAAC,EAEzE,GAAI,CACF,MAAMA,EAAa,eAAe,CAAE,aAAc,EAAK,CAAC,EACxD1B,EAAa5B,CAAM,CACrB,MAAgB,CACd4B,EAAa5B,EAAQ,IAAI,CAC3B,CACF,EA6BA,GA3BAxC,GAAU,KACRiG,EAASzD,EAAQ4C,CAAa,EAEvB,IAAM,CAEXc,GAAgB1D,CAAM,CACxB,GACC,CAAC,CAAC,EAELxC,GAAU,IAAM,EACD,SAAY,CACnB+F,IACF5B,EAAW3B,EAAQ,CAAE,KAAM,EAAG,KAAMyB,EAAa,WAAY6B,EAAa,eAAe,CAAE,CAAC,EAC5F,MAAMA,EAAa,eAAe,CAAE,aAAc,EAAK,CAAC,EACxD1B,EAAa5B,CAAM,EAEvB,GAEK,CACP,EAAG,CAACuD,CAAU,CAAC,EAEfnB,GAAoBO,EAAK,KAAO,CAC9B,KAAAjK,GACA,aAAAkL,EACA,aAAAN,CACF,EAAE,EAEEnG,GACF,OACE7F,GAAC2K,GAAA,CACC,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,GACV,EACF,EAIJ,GAAI,CAACsB,EACH,OAAOjM,GAAC0K,GAAA,CAAO,OAAQ,IAAK,SAAUxI,EAAE,sBAAsB,EAAG,EAGnE,IAAMuK,GAAef,EACnB1L,GAAC2B,GAAA,CAAkB,aAAcgG,GAAc,QAAS3F,GAAS,UAAWD,GACzE,SAAA2J,EAAWM,CAAY,EAC1B,EAGAhM,GAACyK,GAAA,CAAK,KAAMuB,EAAc,EAG5B,OACEvK,GAAC,OACE,UAAAgL,GACAhB,GAASzL,GAAC,OAAI,UAAU,YAAa,SAAAyL,EAAM,CAAE,KAAMO,EAAc,KAAMM,CAAa,CAAC,EAAE,EACxFtM,GAAC4K,GAAA,CACE,GAAGmB,EACJ,WAAY3K,GAAK,WACjB,QAASuG,GACT,WACEmB,EACI,GACA,CACE,gBAAiB,GACjB,gBAAiB,GACjB,QAASoB,EAAWxB,CAAM,GAAG,KAC7B,SAAUwB,EAAWxB,CAAM,GAAG,MAAQyB,EACtC,MAAO/I,GAAK,MACZ,SAAU,MAAOsL,EAAqBC,KAAwB,CAC5DT,EAAW,QAAU,OACrB7B,EAAW3B,EAAQ,CAAE,KAAMgE,EAAa,KAAMC,EAAY,CAAC,EAC3DrC,EAAa5B,CAAM,CACrB,CACF,EAEN,SAAUoD,EACZ,GACF,CAEJ,EAEMZ,GAAYL,GAAWI,EAAiB,EAQvCE,GAAQD,KC3Pf,OAAS,SAAA0B,OAAa,OACtB,OAAS,WAAAC,GAAS,YAAA1G,OAAgC,QAClD,OAAS,UAAAhC,OAAc,UAkEnB,cAAAnE,OAAA,oBA/BG,SAAS8M,GAASpM,EAAsB,CAC7C,GAAM,CAAE,QAAAqM,EAAS,UAAAhL,EAAW,GAAGiL,CAAW,EAAItM,EACxCuM,EAAOJ,GAAQ,IAAM,EAAEtH,GAAI,CAAC,CAAC,EAC7B2H,EAAaC,GAAc,EAC3BC,EAAOF,EAAW,QAAQD,CAAI,EAC9B,CAACI,EAAgBC,CAAiB,EAAInH,GAAS,EAAK,EAEpDoH,EAAmB,OAAOR,GAAY,WAEtCS,EAAO,IAAM,CACjBN,EAAW,KAAKD,CAAI,CACtB,EAEMQ,EAAO,IAAM,CACjBP,EAAW,KAAKD,CAAI,CACtB,EAeMS,EACJ1N,GAAC4M,GAAA,CAAO,GAAGI,EAAY,KAAMI,EAAM,eAAgBC,EAAgB,KAVxD,SAAY,CACvB,GAAI,CACFC,EAAkB,EAAI,EACtB,MAAMvL,IAAY,CACpB,QAAE,CACAuL,EAAkB,EAAK,CACzB,CACF,EAGiF,SAdxC,IAAM,CAC7CG,EAAK,CACP,EAaK,SAAAF,EAAmBR,EAAQ,CAAE,KAAAU,CAAK,CAAC,EAAIV,EAC1C,EAGF,MAAO,CACL,KAAAE,EACA,KAAAO,EACA,KAAAC,EACA,MAAOC,CACT,CACF,CAhFA,IAaaP,GAuBT5H,GApCJoI,GAAAnN,EAAA,kBAaa2M,GAAgBhJ,GAAmB,CAACK,EAAKzD,KAAS,CAC7D,KAAM,IAAI,IACV,QAASkM,GAAQlM,EAAI,EAAE,KAAK,IAAIkM,CAAI,GAAK,GACzC,KAAKA,EAAM,CACTzI,EAAI,CAAE,KAAM,IAAI,IAAIzD,EAAI,EAAE,IAAI,EAAE,IAAIkM,EAAM,EAAI,CAAE,CAAC,CACnD,EACA,KAAKA,EAAM,CACTzI,EAAI,CAAE,KAAM,IAAI,IAAIzD,EAAI,EAAE,IAAI,EAAE,IAAIkM,EAAM,EAAK,CAAE,CAAC,CACpD,EACA,SAAU,CACRzI,EAAI,CAAE,KAAM,IAAI,GAAM,CAAC,CACzB,CACF,EAAE,EAWEe,GAAK,ICnCT,OAAS,QAAAkF,OAAY,OAErB,OAAS,YAAAtE,OAAgB,QA6CnB,cAAAnG,OAAA,oBAvBC,SAAS4N,GACdlN,EACA,CACA,GAAM,CAAE,QAAAqM,EAAS,KAAAxB,EAAM,UAAAsC,EAAW,UAAA9L,EAAW,GAAGiL,CAAW,EAAItM,EACzD,CAACoN,EAAqBC,CAAsB,EAAI5H,GAAsB,CAAC,CAAgB,EACzF,CAAC6F,CAAY,EAAIvB,GAAK,QAAgB,EAC1CuB,EAAeT,GAAQS,EAEvB,IAAMuB,EAAmB,OAAOR,GAAY,WAEtCiB,EAAgB,SAAY,CAChC,IAAMC,EAAS,MAAMjC,EAAa,eAAe,EACjD,MAAMjK,IAAYkM,EAAQH,CAAkC,EAC5DL,EAAK,CACP,EAEMS,EAAa,IAAM,CACvBlC,EAAa,YAAY,CAC3B,EAEM,CAAE,KAAAiB,EAAM,KAAAO,EAAM,KAAAC,EAAM,MAAAU,CAAM,EAAIrB,GAAS,CAC3C,GAAGE,EACH,QAASoB,GACPpO,GAACyK,GAAA,CAAM,GAAGoD,EAAW,KAAM7B,EACxB,SAAAuB,EAAmBR,EAAQe,EAAoCM,CAAS,EAAIrB,EAC/E,EAEF,UAAWiB,EACX,WAAAE,CACF,CAAC,EAoBD,MAAO,CACL,KAAAjB,EACA,KApBa,CAAC,CACd,cAAAoB,EACA,YAAAC,CACF,EAGI,CAAC,IAAM,CACLA,GACFP,EAAuBO,CAAW,EAGhCD,GACFrC,EAAa,eAAeqC,CAAa,EAG3Cb,EAAK,CACP,EAKE,KAAAC,EACA,MAAAU,CACF,CACF,CAhFA,IAAAI,GAAA/N,EAAA,kBAKAmN,OCLA,IAAAa,GAAA,GAAAC,GAAAD,GAAA,aAAAE,KAAA,OAAS,UAAApN,GAAQ,UAAAoJ,OAAc,OAC/B,OAAS,eAAAiE,OAAmB,mBAiBhB,cAAA3O,OAAA,oBAlBZ,IAKM4O,GA4BCF,GAjCPG,GAAArO,EAAA,kBAEAD,IACAc,IAEMuN,GAAW,IAAM,CACrB,IAAME,EAAWH,GAAY,EACvBzM,EAAIhB,EAAe,EACnB,CAAE,oBAAA6N,CAAoB,EAAI9O,EAAmB,EAEnD,OACED,GAAC,OAAI,UAAU,4CACb,SAAAA,GAAC0K,GAAA,CACC,OAAO,MACP,MAAM,MACN,SAAUxI,EAAE,mBAAmB,EAC/B,MACE6M,GACE/O,GAACsB,GAAA,CACC,KAAK,UACL,QAAS,IAAM,CACbwN,EAASC,CAAmB,CAC9B,EAEC,SAAA7M,EAAE,qBAAqB,EAC1B,EAGN,EACF,CAEJ,EAEOwM,GAAQE,KCjCf,IAAAI,GAAA,GAAAP,GAAAO,GAAA,aAAAC,KAAA,OAAS,QAAAC,GAAM,OAAAC,GAAK,QAAA1E,GAAM,SAAA2E,GAAO,OAAAC,GAAK,UAAAtK,GAAQ,cAAAC,OAAkB,OAEhE,OAAOsK,OAAW,QAiDN,cAAAtP,EAiEM,QAAAyB,OAjEN,oBAnDZ,IAQQ8N,GACAC,GAEFC,GA4HCR,GAvIPS,GAAAlP,EAAA,kBAIA4K,KAEA/J,KAEM,CAAE,OAAAkO,IAAWxK,IACb,CAAE,UAAAyK,IAAcxK,GAEhByK,GAAuB,IAAM,CACjC,IAAMvN,EAAIhB,EAAe,EAEnByO,EAA6C,CACjD,CACE,IAAK,KACL,MAAO,KACP,UAAW,KACX,MAAO,GACT,EACA,CACE,IAAK,WACL,MAAOzN,EAAE,iBAAiB,EAC1B,UAAW,QACX,MAAO,GACT,EACA,CACE,IAAK,QACL,MAAOA,EAAE,cAAc,EACvB,UAAW,QACX,MAAO,GACT,EACA,CACE,IAAK,SACL,MAAOA,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,GACT,EACA,CACE,IAAK,QACL,MAAOA,EAAE,cAAc,EACvB,UAAW,OACb,EACA,CACE,IAAK,UACL,MAAOA,EAAE,gBAAgB,EACzB,UAAW,UACX,OAAO4C,EAAe,CACpB,OACE9E,EAACwP,GAAA,CACC,SAAAxP,EAAC,OAAI,UAAU,yBAA0B,SAAA8E,EAAM,EACjD,CAEJ,CACF,EACA,CACE,IAAK,WACL,MAAO5C,EAAE,iBAAiB,EAC1B,UAAW,WACX,OAAO4C,EAAe,CACpB,OACE9E,EAACwP,GAAA,CACC,SAAAxP,EAAC,OAAI,UAAU,yBAA0B,SAAA8E,EAAM,EACjD,CAEJ,CACF,EACA,CACE,IAAK,gBACL,MAAO5C,EAAE,qBAAqB,EAC9B,UAAW,QACX,MAAO,IACP,OAAO4C,EAAe,CACpB,OAAOwK,GAAMxK,CAAK,EAAE,OAAO,qBAAqB,CAClD,CACF,CACF,EAEA,OACE9E,EAACkP,GAAA,CAAK,MAAM,2BACV,SAAAlP,EAACmL,GAAA,CAaC,YAAY,QACZ,OAAO,KACP,QAASwE,EACT,OAAO,wBACP,UAAW,CAAC,CAAE,KAAA3G,EAAM,KAAAC,EAAM,WAAAC,CAAW,KAAO,CAAE,GAAGA,EAAY,KAAAF,EAAM,KAAAC,CAAK,GACxE,SAAUxF,GAAYA,EAAS,MAC/B,cAAeA,GAAYA,EAAS,KACpC,WAAY8H,GACVvL,EAACyK,GAAA,CAAK,KAAMc,EACV,SAAA9J,GAAC4N,GAAA,CAAI,OAAQ,GACX,UAAArP,EAACmP,GAAA,CAAI,KAAM,EACT,SAAAnP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,iBAAiB,EAAG,KAAK,QAC3C,SAAAlC,EAACoP,GAAA,CAAM,WAAU,GAAC,EACpB,EACF,EACApP,EAACmP,GAAA,CAAI,KAAM,EACT,SAAAnP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,cAAc,EAAG,KAAK,QACxC,SAAAlC,EAACoP,GAAA,CAAM,WAAU,GAAC,EACpB,EACF,EACApP,EAACmP,GAAA,CACC,SAAAnP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,eAAe,EAAG,KAAK,SACzC,SAAAT,GAACsD,GAAA,CAAO,WAAU,GAAC,MAAO,CAAE,MAAO,OAAQ,EACzC,UAAA/E,EAACuP,GAAA,CAAO,MAAM,MAAM,eAAG,EACvBvP,EAACuP,GAAA,CAAO,MAAM,OAAO,gBAAI,GAC3B,EACF,EACF,EACAvP,EAACmP,GAAA,CAAI,KAAM,EACT,SAAAnP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,cAAc,EAAG,KAAK,QACxC,SAAAlC,EAACoP,GAAA,CAAM,WAAU,GAAC,EACpB,EACF,GACF,EACF,EAEJ,EACF,CAEJ,EAEOH,GAAQQ,6gmDCvIf,IAAaG,GAAbpF,GAAAhK,EAAA,kBAAaoP,GAAU,4ECAvB,IAAAC,GAAA,GAAApB,GAAAoB,GAAA,aAAAC,KAAA,OAAS,SAAAC,GAAO,UAAAzO,GAAQ,WAAA0O,GAAS,QAAAvF,GAAM,SAAA2E,GAAO,SAAA7N,GAAO,cAAAyD,OAAkB,OAEvE,OAAS,YAAAiL,GAAU,eAAAC,GAAa,mBAAAC,OAAuB,mBACvD,OAAOjM,OAAqB,gBAE5B,OAAOkM,OAAa,sBA2BP,cAAApQ,EAUL,QAAAyB,OAVK,oBAhCb,IAYM4O,GA8ECP,GA1FPQ,GAAA9P,EAAA,kBAIA+P,KAEAhQ,IACAiK,KACAnJ,IACA0C,KACAF,IAEMwM,GAAa,IAAM,CACvB,GAAM,CAACG,CAAY,EAAIL,GAAgB,EACjCM,EAAWP,GAAY,EACvB,CAAE,MAAAjO,EAAO,SAAAyO,CAAS,EAAItN,EAAc,EACpClB,EAAIhB,EAAe,EACnB,CAAE,gBAAAyP,EAAiB,mBAAAC,EAAoB,yBAAAC,EAA0B,iBAAAC,CAAiB,EAAI7Q,EAAmB,EAa/G,OAXAiE,GACEsM,EAAa,IAAI,QAAQ,EAAI,kCAAkCA,EAAa,IAAI,QAAQ,CAAC,GAAK,KAC9FhO,GAAOD,EAA2BC,CAAG,EACrC,CACE,SAAU,GACV,UAAWpB,GAAQ,CACjBsP,EAAStP,EAAK,KAAK,KAAK,CAC1B,CACF,CACF,EAEIa,EACE4O,EACK7Q,EAACiQ,GAAA,CAAS,QAAO,GAAC,GAAIY,EAA0B,EAGlD7Q,EAACiQ,GAAA,CAAS,QAAO,GAAC,GAAG,IAAI,EAIhCxO,GAAC,OAAI,UAAU,kCACZ,UAAAmP,GAAsB5Q,EAAC,OAAI,UAAU,gCAAiC,SAAA4Q,EAAmB,EAC1F5Q,EAAC,OAAI,UAAU,yBACb,SAAAyB,GAACF,GAAA,CAAM,MAAM,SACX,UAAAvB,EAAC,OAAI,IAAKoQ,GAAS,UAAU,OAAO,IAAI,OAAO,EAC9CO,GACH,EACF,EACA3Q,EAAC,OAAI,UAAU,sDACb,SAAAA,EAAC,OAAI,IAAK+Q,GAAe,IAAI,aAAa,UAAU,UAAU,EAChE,EACA/Q,EAAC,OAAI,UAAU,mDACb,SAAAA,EAAC,OAAI,UAAU,mDACb,SAAAA,EAAC,OAAI,UAAU,wBACb,SAAAyB,GAAC,OAAI,UAAU,+BACb,UAAAzB,EAAC,OAAI,UAAU,OACZ,SAAAyQ,EAAS,OAAO,SAAWzQ,EAAC+P,GAAA,CAAM,OAAM,GAAC,SAAQ,GAAC,QAAS7N,EAAE,sBAAsB,EAAG,KAAK,QAAQ,EACtG,EACAlC,EAACgF,GAAW,MAAX,CAAiB,MAAO,EAAI,SAAA9C,EAAE,gBAAgB,EAAE,EACjDlC,EAAC,OAAI,UAAU,OACb,SAAAyB,GAACgJ,GAAA,CAAK,OAAO,WAAW,aAAa,MACnC,UAAAzK,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,iBAAiB,EAAG,KAAK,WAAW,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EAChF,SAAAlC,EAACoP,GAAA,EAAM,EACT,EACApP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,iBAAiB,EAAG,KAAK,WAAW,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EAChF,SAAAlC,EAACoP,GAAM,SAAN,EAAe,EAClB,EACApP,EAACyK,GAAK,KAAL,CACC,SAAAzK,EAACsB,GAAA,CAAO,MAAK,GAAC,KAAK,UAAU,MAAM,QAAQ,SAAS,SACjD,SAAAY,EAAE,eAAe,EACpB,EACF,GACF,EACF,EACAlC,EAACgQ,GAAA,CAAQ,MAAK,GAAC,OAAM,GAClB,SAAA9N,EAAE,mBAAmB,EACxB,EACAlC,EAAC,OAAI,UAAU,mCACb,SAAAyB,GAACH,GAAA,CAAO,MAAK,GAAC,MAAM,QAAQ,KAAM,GAAGsO,EAAO,kBAAkBkB,CAAgB,GAAI,OAAO,QACvF,UAAA9Q,EAAC,OAAI,IAAKoQ,GAAS,UAAU,wBAAwB,IAAI,OAAO,EAC/DlO,EAAE,wBAAwB,GAC7B,EACF,GACF,EACF,EACF,EACF,GACF,CAEJ,EAEO4N,GAAQO,KC1Ff,OAAO7I,OAAY,MACnB,OAAOwJ,OAAoB,eAOpB,SAASC,IAAoB,CAClC,OAAOzJ,GAAO,kCAAmChF,GAC/CD,EAA8BC,EAAK,CAAE,SAAU,EAAK,CAAC,EAAE,KAAKiB,GAAYA,EAAS,IAAI,CACvF,CACF,CAEO,SAASyN,IAAsB,CACpC,OAAO1J,GAAO,qCAAsChF,GAClDD,EAGGC,EAAK,CAAE,SAAU,EAAK,CAAC,EAAE,KAAKiB,GAAYA,EAAS,IAAI,CAC5D,CACF,CAEO,SAAS0N,IAAc,CAC5B,GAAM,CAAE,WAAAlF,CAAW,EAAInE,EAAc,SAAU,EAAI,EACnD,OAAON,GAAOyE,EAAa,wBAA0B,KAAMzJ,GACzDD,EAAwBC,EAAK,CAAE,SAAU,EAAK,CAAC,EAAE,KAAKiB,GAAYA,EAAS,IAAI,CACjF,CACF,CAEO,SAAS2N,GAAQvM,EAAc,CACpC,GAAM,CAAE,mBAAAN,CAAmB,EAAItE,EAAmB,EAClD,OAAOuH,GAAO,qBAAqBjD,EAAqB,SAAW,MAAM,SAASM,CAAI,GAAKrC,GACzFD,EAAyBC,EAAK,CAAE,SAAU,EAAK,CAAC,EAAE,KAAKiB,GAAYA,EAAS,IAAI,CAClF,CACF,CAEO,SAAS4N,IAAgB,CAC9B,GAAM,CAAE,mBAAA9M,CAAmB,EAAItE,EAAmB,EAElD,OAAO+Q,GACLzM,EAAqB,6BAA+B,2BACpD,CACE/B,EACA,CACE,IAAA8O,CACF,IAIA/O,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM8O,EACN,SAAU,EACZ,CAAC,CACL,CACF,CAEO,SAASC,IAAgB,CAC9B,GAAM,CAAE,mBAAAhN,CAAmB,EAAItE,EAAmB,EAElD,OAAO+Q,GACLzM,EAAqB,6BAA+B,2BACpD,CACE/B,EACA,CACE,IAAA8O,CACF,IAIA/O,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM8O,EACN,SAAU,EACZ,CAAC,CACL,CACF,CAEO,SAASE,IAAgB,CAC9B,OAAOR,GACL,2BACA,CACExO,EACA,CACE,IAAA8O,CACF,IAIA/O,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM8O,EACN,SAAU,EACZ,CAAC,CACL,CACF,CAEO,SAASG,IAAgB,CAC9B,OAAOT,GACL,2BACA,CACExO,EACA,CACE,IAAA8O,CACF,IAIA/O,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM8O,EACN,SAAU,EACZ,CAAC,CACL,CACF,CAEO,SAASI,IAAgB,CAC9B,OAAOV,GACL,2BACA,CACExO,EACA,CACE,IAAA8O,CACF,IAIA/O,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM8O,EACN,SAAU,EACZ,CAAC,CACL,CACF,CAEO,SAASK,IAAgB,CAC9B,OAAOX,GACL,2BACA,CACExO,EACA,CACE,IAAA8O,CACF,IAIA/O,EAAQC,EAAK,CACX,OAAQ,OACR,KAAM8O,EACN,SAAU,EACZ,CAAC,CACL,CACF,CAzJA,IAAAM,GAAApR,EAAA,kBAEAD,IAEAyH,IACAnE,MCLA,OAAS,YAAAgO,GAAU,OAAA1C,GAAK,YAAA2C,GAAU,OAAAzC,OAAW,OAG7C,OAAS,eAAA0C,GAAa,aAAA7L,GAAW,YAAAC,OAAgB,QA+EvC,cAAAnG,OAAA,oBAlFV,IAeMgS,GAuGCC,GAtHPC,GAAA1R,EAAA,kBAIAa,IAWM2Q,GAAkDtR,GAAS,CAC/D,GAAM,CAAE,YAAAyR,EAAa,SAAAC,EAAU,OAAAC,EAAQ,MAAAvN,EAAO,SAAAwN,CAAS,EAAI5R,EACrD,CAAC6R,EAAWC,CAAY,EAAIrM,GAAmB,CAAC,CAAC,EACjD,CAACsM,EAAYC,CAAa,EAAIvM,GAAkC,CAAC,CAAC,EAClE,CAACwM,EAAeC,CAAgB,EAAIzM,GAAmBrB,GAAS,CAAC,CAAC,EAClE5C,EAAIhB,EAAe,EAEnB2R,EAAmBd,GAAa5Q,GAA2B,CAC/DqR,EAAarR,CAAe,CAC9B,EAAG,CAAC,CAAC,EAEC2R,EAAkB,CAACC,EAAuBrL,IAAoB,CAClE,IAAIsL,EAAsB,CAAC,EAE3B,OAAID,EACFC,EAAY,CAAC,GAAG,IAAI,IAAIL,EAAc,OAAOjL,CAAK,CAAC,CAAC,GAEpDsL,EAAYL,EAAc,MAAM,EAEhCjL,EAAM,QAAQK,GAAQ,CACpB,IAAMR,EAAQyL,EAAU,UAAU5Q,GAAQA,IAAS2F,CAAI,EACnDR,EAAQ,IACVyL,EAAU,OAAOzL,EAAO,CAAC,CAE7B,CAAC,GAGIyL,CACT,EAEMC,EAAgB,CAACC,EAAwBxL,IAAoB,CACjE,IAAMqL,EAAeD,EAAgBI,EAAE,OAAO,QAASxL,CAAK,EAC5DkL,EAAiBG,CAAY,EAC7BT,IAAWS,CAAY,CACzB,EAEA,OAAA7M,GAAU,IAAM,CACd0M,EAAiB9N,GAAS,CAAC,CAAC,CAC9B,EAAG,CAACA,CAAK,CAAC,EAEVoB,GAAU,IAAM,CACVmM,GACFG,GAAcL,GAAe,CAAC,GAAG,IAAI,CAAC,CAAE,SAAAgB,CAAS,IAAMA,CAAQ,CAAC,CAEpE,EAAG,CAACd,EAAQF,CAAW,CAAC,EAExBjM,GAAU,IAAM,CACd,IAAM6M,GAAgBZ,GAAe,CAAC,GAAG,OACvC,CAACvK,EAAKC,KACJD,EAAIC,EAAK,QAAQ,EAAIA,EAAK,YAAY,MAAMzF,GAAQuQ,GAAe,SAASvQ,EAAK,KAAK,CAAC,EAChFwF,GAET,CAAC,CACH,EAEA8K,EAAcK,CAAY,CAC5B,EAAG,CAACJ,EAAeR,CAAW,CAAC,EAG7BnS,GAAC8R,GAAA,CACC,MAAO,CAAE,MAAO,MAAO,EACvB,YAAY,SACZ,UAAWS,EACX,OAAQJ,GAAe,CAAC,GAAG,IAAI/P,IAAS,CACtC,IAAKA,EAAK,SACV,MAAOA,EAAK,SACZ,MAAO,CAACgQ,GACNpS,GAAC6R,GAAA,CACC,QAASY,EAAWrQ,EAAK,QAAQ,EACjC,SAAU8Q,GAAK,CACbD,EACEC,EACA9Q,EAAK,YAAY,IAAIgR,GAAcA,EAAW,KAAK,CACrD,CACF,EAEC,SAAAlR,EAAE,kBAAkB,EACvB,EAEF,SACElC,GAAC6R,GAAS,MAAT,CAAe,MAAO,CAAE,MAAO,MAAO,EAAG,MAAOc,EAAe,SAAUP,EACxE,SAAApS,GAACqP,GAAA,CAAI,OAAQ,CAAC,GAAI,EAAE,EAAG,MAAO,CAAE,MAAO,MAAO,EAC3C,SAAAjN,EAAK,YAAY,IAAIgR,GACpBpT,GAACmP,GAAA,CAA2B,KAAM,EAChC,SAAAnP,GAAC6R,GAAA,CACC,MAAOuB,EAAW,MAClB,SAAUF,GAAK,CACbD,EAAcC,EAAG,CAACE,EAAW,KAAK,CAAC,CACrC,EAEC,SAAAA,EAAW,MACd,GARQA,EAAW,KASrB,CACD,EACH,EACF,CAEJ,EAAE,EACF,SAAUP,EACZ,CAEJ,EAEOZ,GAAQD,KCtHf,OAAS,YAAAqB,GAAU,cAAArO,OAAkB,OAuB7B,cAAAhF,OAAA,oBAvBR,IAQQmF,GAOFmO,GA0BCC,GAzCPC,GAAAhT,EAAA,kBAEAa,IACAuQ,KAEAM,MAGM,CAAE,KAAA/M,IAASH,IAOXsO,GAA8C5S,GAAS,CAC3D,GAAM,CAAE,OAAA2R,EAAS,GAAM,MAAAvN,EAAO,SAAAsN,EAAU,SAAAE,CAAS,EAAI5R,EAC/C,CAAE,KAAMyR,EAAa,UAAAtM,EAAW,MAAA4N,CAAM,EAAIxC,GAAkB,EAC5D/O,EAAIhB,EAAe,EAEzB,OAAIuS,EAEAzT,GAAC,OAAI,UAAU,sBACb,SAAAA,GAACmF,GAAA,CAAK,KAAK,SAAU,SAAAjD,EAAE,kCAAkC,EAAE,EAC7D,EAKFlC,GAACqT,GAAA,CAAS,OAAM,GAAC,QAASxN,EACxB,SAAA7F,GAACiS,GAAA,CACC,MAAOnN,EACP,YAAaqN,EACb,SAAUC,EACV,OAAQC,EACR,SAAUC,EACZ,EACF,CAEJ,EAEOiB,GAAQD,KCzCf,OAAS,UAAAhS,GAAQ,QAAA4N,GAAM,WAAAc,GAAS,SAAA0D,GAAO,UAAA3O,GAAQ,YAAAsO,GAAU,SAAA9R,GAAO,cAAAyD,OAAkB,OAElF,OAAS,aAAAkB,GAAW,YAAAC,OAAgB,QAsC5B,cAAAnG,EAsCI,QAAAyB,OAtCJ,oBAxCR,IASQ0D,GACAoK,GAOFoE,GAoICC,GArJPC,GAAArT,EAAA,kBAGAa,IACAuQ,KAEAM,MAGM,CAAE,KAAA/M,IAASH,IACX,CAAE,OAAAuK,IAAWxK,GAOb4O,GAA8CjT,GAAS,CAC3D,GAAM,CAAE,OAAA2R,EAAS,GAAM,MAAAvN,EAAO,SAAAsN,EAAU,SAAAE,CAAS,EAAI5R,EAC/C,CAAE,KAAM,CAAE,WAAA0S,EAAY,KAAMxN,CAAM,EAAI,CAAC,EAAG,UAAAC,EAAW,MAAA4N,CAAM,EAAIvC,GAAoB,EACnF,CAAC4C,EAAUC,CAAW,EAAI5N,GAAsD,CAAC,CAAC,EAClF6N,EAAoBZ,GAAY,OAAOhR,GAAQA,EAAK,SAAS,EAC7D6R,EAAkBb,GAAY,OAAOhR,GAAQ,CAACA,EAAK,SAAS,EAC5DF,EAAIhB,EAAe,EAczB,GAZAgF,GAAU,IAAM,CACd,IAAMgO,EAAoD,CAAC,EAE3D,OAAO,KAAKpP,GAAS,CAAC,CAAC,EAAE,QAAQ3D,GAAO,CAClCA,IAAQ,UACV+S,EAAK,KAAK,CAAE,OAAQ/S,EAAK,YAAa2D,IAAQ3D,CAAG,GAAK,CAAC,CAAE,CAAC,CAE9D,CAAC,EAED4S,EAAYG,CAAI,CAClB,EAAG,CAACpP,CAAK,CAAC,EAEN2O,EACF,OACEzT,EAAC,OAAI,UAAU,sBACb,SAAAA,EAACmF,GAAA,CAAK,KAAK,SAAU,SAAAjD,EAAE,kCAAkC,EAAE,EAC7D,EAIJ,IAAMiS,EAAU,IAAM,CACpBJ,EAAYK,GAAQ,CAAC,GAAGA,EAAM,CAAE,OAAQ,GAAI,YAAa,CAAC,CAAE,CAAC,CAAC,CAChE,EAEMC,EAAc9M,GAAkB,CACpCwM,EAAYK,GAAQA,EAAK,OAAO,CAACE,EAAGC,IAAMA,IAAMhN,CAAK,CAAC,CACxD,EAEA,OACE9F,GAAC,OAAI,UAAU,uBACb,UAAAzB,EAAC,OAAI,UAAU,QACb,SAAAA,EAACgQ,GAAA,CAAQ,OAAM,GAAE,SAAA9N,EAAE,iCAAiC,EAAE,EACxD,EACAlC,EAACqT,GAAA,CAAS,OAAM,GAAC,QAASxN,EACxB,SAAA7F,EAACiS,GAAA,CACC,MAAOnN,GAAO,OACd,SAAUsN,EACV,YAAa4B,EACb,OAAQ3B,EACR,SAAUmC,GAAY,CACpBlC,IAAW,CACT,GAAGxN,EACH,OAAQ0P,CACV,CAAC,CACH,EACF,EACF,EACAxU,EAAC,OAAI,UAAU,QACb,SAAAA,EAACgQ,GAAA,CAAQ,OAAM,GAAE,SAAA9N,EAAE,iCAAiC,EAAE,EACxD,EACC4R,EAAS,IAAI,CAAC1R,EAAMmF,IACnBvH,EAACkP,GAAA,CACC,MACEzN,GAACF,GAAA,CACC,UAAAvB,EAACmF,GAAA,CAAM,SAAAjD,EAAE,aAAa,EAAE,EACvBkQ,EACCpS,EAACmF,GAAA,CAAM,SAAAS,GAAO,KAAKvC,GAAQA,EAAK,KAAOjB,EAAK,MAAM,GAAG,KAAK,EAE1DpC,EAAC+E,GAAA,CACC,SAAUqN,EACV,MAAO0B,EAASvM,CAAK,EAAE,QAAU,OACjC,MAAO,CAAE,MAAO,OAAQ,EACxB,YAAarF,EAAE,sCAAsC,EACrD,SAAUuS,GAAiB,CACzBV,EAAYW,GAAO,CACjB,IAAMC,EAAOD,EAAI,MAAM,EACvB,OAAAC,EAAKpN,CAAK,EAAE,OAASkN,EACdE,CACT,CAAC,CACH,EAEC,SAAA/O,GAAO,IAAIvC,GACVrD,EAACuP,GAAA,CAAqB,MAAOlM,EAAK,GAAI,SAAUyQ,EAAS,KAAK,CAAC,CAAE,OAAAc,CAAO,IAAMA,IAAWvR,EAAK,EAAE,EAC7F,SAAAA,EAAK,MADKA,EAAK,EAElB,CACD,EACH,GAEJ,EAGF,UAAU,OACV,MACE,CAAC+O,GACCpS,EAACsB,GAAA,CACC,KAAK,OACL,QAAS,IAAM,CACb+S,EAAW9M,CAAK,CAClB,EAEC,SAAArF,EAAE,2BAA2B,EAChC,EAIH,SAAA4R,EAASvM,CAAK,EAAE,OACfvH,EAACqT,GAAA,CAAS,OAAM,GAAC,QAASxN,EACxB,SAAA7F,EAACiS,GAAA,CACC,MAAOnN,IAAQgP,EAASvM,CAAK,EAAE,MAAM,EACrC,SAAU6K,EACV,OAAQC,EACR,YAAa4B,EACb,SAAUO,GAAY,CACpBlC,IAAW,CACT,GAAGxN,EACH,CAACgP,EAASvM,CAAK,EAAE,MAAM,EAAGiN,CAC5B,CAAC,CACH,EACF,EACF,EAEAxU,EAAC0T,GAAA,CAAM,YAAaxR,EAAE,uCAAuC,EAAG,GA/B7DqF,CAiCP,CACD,EACA,CAAC6K,GACApS,EAACsB,GAAA,CAAO,MAAK,GAAC,KAAK,SAAS,QAAS6S,EAClC,SAAAjS,EAAE,wBAAwB,EAC7B,GAEJ,CAEJ,EAEO0R,GAAQD,KChIX,mBAAAkB,GAEI,OAAA7U,OAFJ,oBArBJ,IAgBM8U,GAeCC,GA/BPC,GAAAxU,EAAA,kBACAD,IAEAiT,KACAK,KAYMiB,GAA2CpU,GAA+B,CAC9E,GAAM,CAAE,MAAAoE,CAAM,EAAIpE,EACZ,CAAE,mBAAA6D,CAAmB,EAAItE,EAAmB,EAElD,OACED,GAAA6U,GAAA,CACG,SAAAtQ,EACCvE,GAAC4T,GAAA,CAAkB,GAAGlT,EAAO,MAAOoE,EAAgC,EAEpE9E,GAACuT,GAAA,CAAkB,GAAG7S,EAAO,MAAOoE,EAAgC,EAExE,CAEJ,EAEOiQ,GAAQD,KC/Bf,IAAAG,GAAAzU,EAAA,oBCAA,IAAAwH,GAAAxH,EAAA,kBAAAwU,KAEApD,KACAqD,OCHA,IAAAC,GAAA,GAAAzG,GAAAyG,GAAA,YAAAxM,GAAA,YAAAyM,KAAA,OAAS,mBAAAC,OAAuB,oBAEhC,OAAS,OAAAC,GAAK,QAAAnG,GAAM,OAAAC,GAAK,QAAA1E,GAAM,SAAA2E,GAAO,OAAAC,GAAK,UAAAtK,GAAQ,SAAAxD,GAAO,OAAA+T,OAAW,OACrE,OAAS,WAAAC,OAAe,QAExB,OAAS,QAAAC,OAAY,mBA2Bf,mBAAAX,GAEI,OAAA7U,EAFJ,QAAAyB,OAAA,oBAbN,SAASgU,IAAiB,CACxB,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAI,OAAO,EACzBlR,EAASsN,GAAc,EACvB,CAAE,KAAMkE,EAAO,UAAA9P,CAAU,EAAIsL,GAAY,EACzC,CAAE,QAAAyE,CAAQ,EAAIlM,EAAkB,EAChCxH,EAAIhB,EAAe,EAEzB,OAAO0M,GAA4D,CACjE,MAAO1L,EAAE,sBAAsB,EAC/B,UAAW,CACT,SAAU,CAAE,KAAM,MAAO,CAC3B,EACA,QACET,GAAAoT,GAAA,CACE,UAAA7U,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,aAAa,EAAG,KAAK,OAAO,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EACxE,SAAAlC,EAACoP,GAAA,EAAM,EACT,EACApP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,aAAa,EAAG,KAAK,QACvC,SAAAlC,EAAC+E,GAAA,CAAO,WAAU,GAAC,KAAK,WAAW,QAASc,EACxC,UAAA8P,GAAS,CAAC,GAAG,IAAIE,GACjB7V,EAACuP,GAAA,CAAO,MAAOsG,EAAK,KACjB,SAAAA,EAAK,MADuBA,EAAK,EAEpC,CACD,EACH,EACF,GACF,EAEF,MAAM,UAAU5H,EAAQ,CACtB,MAAM9J,EAAO,QAAQ8J,CAAM,EAC3B2H,EAAQlN,GAAQ,CAAC,EACjBgN,EAAQ,QAAQxT,EAAE,6BAA6B,CAAC,CAClD,CACF,CAAC,CACH,CAEA,SAAS4T,IAAqB,CAC5B,GAAM,CAAE,QAAAJ,CAAQ,EAAIL,GAAI,OAAO,EACzBU,EAASrE,GAAc,EACvB,CAAE,KAAMiE,EAAO,UAAA9P,CAAU,EAAIsL,GAAY,EACzC,CAAE,OAAAnL,CAAO,EAAI0D,EAAkB,EAC/BxH,EAAIhB,EAAe,EAEzB,OAAO0M,GAA4E,CACjF,MAAO1L,EAAE,sBAAsB,EAC/B,UAAW,CACT,SAAU,CAAE,KAAM,MAAO,CAC3B,EACA,QACET,GAAAoT,GAAA,CACE,UAAA7U,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,aAAa,EAAG,KAAK,OAAO,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EACxE,SAAAlC,EAACoP,GAAA,CAAM,SAAQ,GAAC,EAClB,EACApP,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,aAAa,EAAG,KAAK,QACvC,SAAAlC,EAAC+E,GAAA,CACC,WAAU,GACV,KAAK,WACL,QAASc,EACT,QAAS8P,GAAO,IAAIE,IAAS,CAC3B,MAAOA,EAAK,KACZ,MAAOA,EAAK,IACd,EAAE,EACJ,EACF,GACF,EAEF,MAAM,UAAU5H,EAAQK,EAAa,CACnC,MAAMyH,EAAO,QAAQ9H,CAAM,EAC3BjI,EACE0C,GACA0L,GACSmB,GAAQnB,EAAM4B,GAAS,CAC5B,GAAIA,GAAO,WAAY,CACrB,IAAMzO,EAAQyO,EAAM,YAAY,UAAU5T,GAAQA,EAAK,KAAOkM,GAAa,EAAE,EACzE/G,IAAU,KACZyO,EAAM,WAAWzO,CAAK,EAAE,MAAQ0G,EAAO,MAE3C,CACF,CAAC,EAEH,CAAE,WAAY,EAAM,CACtB,EACAyH,EAAQ,QAAQxT,EAAE,6BAA6B,CAAC,CAClD,CACF,CAAC,CACH,CAxGA,IAeQqN,GAEK7G,GAyFPuN,GA+ICd,GAzPPe,GAAA1V,EAAA,kBAMAsG,KACAsB,KACAgD,KAEApD,KACAuG,KACAlN,IACAsI,MAEM,CAAE,OAAA4F,IAAWxK,IAEN2D,GAAS,yBAyFhBuN,GAAe,IAAM,CACzB,GAAM,CAAE,MAAA9H,EAAO,QAAAuH,CAAQ,EAAIL,GAAI,OAAO,EAChCc,EAASxE,GAAc,EACvB,CAAE,OAAA3L,CAAO,EAAI0D,EAAkB,EAC/B,CAAE,KAAM0M,EAAiB,MAAOC,CAAY,EAAIZ,GAAe,EAC/D,CAAE,KAAMa,EAAiB,MAAOC,CAAY,EAAIT,GAAmB,EACnE5T,EAAIhB,EAAe,EAEnByO,EAA0C,CAC9C,CACE,MAAOzN,EAAE,aAAa,EACtB,UAAW,OACX,IAAK,MACP,EACA,CACE,MAAO,KACP,UAAW,KACX,IAAK,IACP,EACA,CACE,MAAOA,EAAE,aAAa,EACtB,UAAW,QACX,IAAK,QACL,MAAO,MACP,OAAO4C,EAAiB,CACtB,OACE9E,EAACqP,GAAA,CAAI,OAAQ,CAAC,EAAG,CAAC,EACd,UAAAvK,GAAS,CAAC,GAAG,IAAK1C,GAClBpC,EAACmP,GAAA,CACE,SAAA/M,IAAS,OACRpC,EAACsV,GAAA,CAAI,MAAM,OAAQ,SAAAlT,EAAK,EAExBpC,EAACsV,GAAA,CAAI,MAAM,UACT,SAAAtV,EAACwV,GAAA,CAAK,GAAI,oBAAoBpT,CAAI,GAAK,SAAAA,EAAK,EAC9C,GANMA,CAQV,CACD,EACH,CAEJ,CACF,EACA,CACE,MAAOF,EAAE,qBAAqB,EAC9B,UAAW,QACX,IAAK,OACP,EACA,CACE,MAAOA,EAAE,kBAAkB,EAC3B,MAAO,IACP,MAAO,SACP,OAAS4C,GACPrD,GAACF,GAAA,CACC,UAAAvB,EAACmI,EAAA,CACC,SAAQ,GACR,KAAK,QACL,KAAK,OACL,KAAK,SACL,QAAS,IAAM,CACbmO,EAAgB,CACd,cAAe,CACb,KAAMxR,EAAM,KACZ,MAAOA,EAAM,KACf,EACA,YAAa,CACX,GAAIA,EAAM,EACZ,CACF,CAAC,CACH,EAEC,SAAA5C,EAAE,eAAe,EACpB,EACAlC,EAACmI,EAAA,CACC,SAAQ,GACR,OAAM,GACN,KAAK,QACL,KAAK,SACL,KAAK,OACL,QAAS,IAAM,CACbgG,EAAM,QAAQ,CACZ,MAAOjM,EAAE,sBAAsB,EAC/B,QACElC,EAAC6G,GAAA,CAAU,MAAO,CAAC/B,EAAM,IAAI,EAAI,SAAA5C,EAAE,yBAA0B,CAAE,KAAM4C,EAAM,IAAK,CAAC,EAAE,EAErF,MAAM,MAAO,CACX,MAAMqR,EAAO,QAAQ,CACnB,GAAIrR,EAAM,GACV,KAAMA,EAAM,IACd,CAAC,EACDkB,EAAO0C,GAAQ0L,GACNmB,GAAQnB,EAAM4B,GAAS,CAC5B,IAAMzO,EAAQyO,GAAO,YAAY,UAAU5T,GAAQA,EAAK,KAAO0C,EAAM,EAAE,EACnEyC,GACFyO,GAAO,YAAY,OAAOzO,EAAO,CAAC,CAEtC,CAAC,CACF,EACDmO,EAAQ,QAAQxT,EAAE,6BAA6B,CAAC,CAClD,CACF,CAAC,CACH,EAEC,SAAAA,EAAE,eAAe,EACpB,GACF,CAEJ,CACF,EAEA,OACET,GAAAoT,GAAA,CACE,UAAA7U,EAACkP,GAAA,CACC,MAAOhN,EAAE,aAAa,EACtB,MACElC,EAACmI,EAAA,CACC,SAAQ,GACR,KAAK,UACL,KAAMnI,EAACoV,GAAA,EAAgB,EACvB,KAAK,SACL,QAAS,IAAM,CACbgB,EAAgB,CAClB,EAEC,SAAAlU,EAAE,sBAAsB,EAC3B,EAGF,SAAAlC,EAACmL,GAAA,CACC,SAAQ,GACR,KAAK,SACL,OAAQzC,GACR,OAAO,KACP,QAASiH,EACT,SAAUlM,GAAYA,EAAS,MAC/B,cAAeA,GAAYA,EAAS,KACtC,EACF,EACC4S,EACAE,GACH,CAEJ,EAEOpB,GAAQc,KCzPf,IAAAO,GAAA,GAAA/H,GAAA+H,GAAA,aAAAC,KAAA,OAAS,wBAAAC,OAA4B,oBAErC,OAAS,OAAArB,GAAK,QAAAnG,GAAM,QAAAzE,GAAM,SAAA2E,GAAO,SAAA7N,OAAa,OAC9C,OAAS,WAAAgU,OAAe,QACxB,OAAS,QAAAC,OAAY,mBAwCf,mBAAAX,GAEI,OAAA7U,EAFJ,QAAAyB,OAAA,oBA5CN,IAiBMiH,GAEA+M,GAsCAkB,GAkDAC,GA0ICH,GArPPI,GAAArW,EAAA,kBAKAD,IACAuG,KACAsB,KACAgD,KAEApD,KACAuG,KACAlN,IACA2G,IACA2B,KACA9F,IAEM6E,GAAS,yBAET+M,GAAiB,IAAM,CAC3B,GAAM,CAAE,QAAAC,CAAQ,EAAIL,GAAI,OAAO,EACzB,CAAE,QAAAO,CAAQ,EAAIlM,EAAkB,EAChCvF,EAASkN,GAAc,EACvBnP,EAAIhB,EAAe,EAEnBa,EAAY,MAAOkM,GAAyF,CAChH,MAAM9J,EAAO,QAAQ,CACnB,KAAM,QAAQ8J,EAAO,IAAI,GACzB,YAAaA,EAAO,WACtB,CAAC,EACD2H,EAAQlN,GAAQ,CAAC,EACjBgN,EAAQ,QAAQxT,EAAE,6BAA6B,CAAC,CAClD,EAEA,OAAO0L,GAGJ,CACD,MAAO1L,EAAE,sBAAsB,EAC/B,MAAO,OACP,UAAW,CACT,OAAQ,UACV,EACA,QACET,GAAAoT,GAAA,CACE,UAAA7U,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,aAAa,EAAG,KAAK,OAAO,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EACxE,SAAAlC,EAACoP,GAAA,CAAM,YAAY,QAAQ,EAC7B,EACApP,EAACyK,GAAK,KAAL,CAAU,KAAK,cACd,SAAAzK,EAAC+U,GAAA,EAAe,EAClB,GACF,EAEF,UAAAhT,CACF,CAAC,CACH,EAEM4U,GAAiB,IAAM,CAC3B,GAAM,CAAE,QAAAjB,CAAQ,EAAIL,GAAI,OAAO,EACzB,CAAE,OAAArP,CAAO,EAAI0D,EAAkB,EAC/BqM,EAASxE,GAAc,EACvBrP,EAAIhB,EAAe,EAEzB,OAAO0M,GAQL,CACA,MAAO1L,EAAE,sBAAsB,EAC/B,MAAO,OACP,QACET,GAAAoT,GAAA,CACE,UAAA7U,EAACyK,GAAK,KAAL,CAAU,MAAOvI,EAAE,aAAa,EAAG,KAAK,OAAO,MAAO,CAAC,CAAE,SAAU,EAAK,CAAC,EACxE,SAAAlC,EAACoP,GAAA,CAAM,SAAQ,GAAC,YAAY,QAAQ,EACtC,EACApP,EAACyK,GAAK,KAAL,CAAU,KAAK,cACd,SAAAzK,EAAC+U,GAAA,EAAe,EAClB,GACF,EAEF,UAAW,MAAO9G,EAAQK,IAAgB,CACxC,MAAMyH,EAAO,QAAQ,CACnB,GAAIzH,GAAa,GACjB,KAAM,QAAQL,EAAO,IAAI,GACzB,YAAaA,EAAO,WACtB,CAAC,EACDjI,EACE0C,GACA0L,GACEmB,GAAQnB,EAAM4B,GAAS,CACrB,IAAMc,EAAQd,GAAO,YAAY,KAAK5T,GAAQA,EAAK,KAAOkM,GAAa,EAAE,EAErEwI,IACFA,EAAM,YAAc7I,EAAO,YAE/B,CAAC,EACH,CAAE,WAAY,EAAM,CACtB,EACAyH,EAAQ,QAAQxT,EAAE,6BAA6B,CAAC,CAClD,CACF,CAAC,CACH,EAEM0U,GAAW,IAAM,CACrB,GAAM,CAAE,WAAYG,CAAS,EAAIjP,EAAc,SAAU,EAAI,EACvD,CAAE,MAAAqG,EAAO,QAAAuH,CAAQ,EAAIL,GAAI,OAAO,EAChC,CAAE,mBAAA9Q,CAAmB,EAAItE,EAAmB,EAC5CkW,EAAS3E,GAAc,EACvB,CAAE,OAAAxL,CAAO,EAAI0D,EAAkB,EAC/B,CAAE,KAAM0M,EAAiB,MAAOC,CAAY,EAAIZ,GAAe,EAC/D,CAAE,KAAMa,EAAiB,MAAOC,CAAY,EAAII,GAAe,EAC/DzU,EAAIhB,EAAe,EAEnByO,EAA0C,CAC9C,CACE,MAAOzN,EAAE,aAAa,EACtB,IAAK,OACL,OAAO4C,EAAqB,CAC1B,OAAIiS,EAEA/W,EAACwV,GAAA,CAAK,GAAI,GAAG1Q,EAAM,IAAI,GAAI,SAAS,OACjC,SAAAA,EAAM,KACT,EAGK9E,EAAA6U,GAAA,CAAG,SAAA/P,EAAM,KAAK,CAEzB,CACF,EACA,CACE,MAAO,KACP,UAAW,KACX,IAAK,IACP,EACA,CACE,MAAO5C,EAAE,qBAAqB,EAC9B,UAAW,QACX,IAAK,OACP,EACA,CACE,MAAOA,EAAE,kBAAkB,EAC3B,MAAO,IACP,MAAO,SACP,OAAS4C,GAELrD,GAACF,GAAA,CAAM,KAAK,QACV,UAAAvB,EAACmI,EAAA,CACC,SAAQ,GACR,KAAK,SACL,KAAK,QACL,KAAK,OACL,QAAS,SAAY,CACnB,GAAM,CAAE,KAAM0N,CAAK,EAAI,MAAMtT,EAC3B,yBAAyBgC,EAAqB,KAAO,EAAE,SAASO,EAAM,IAAI,GAC1E,CAAE,SAAU,EAAK,CACnB,EACAwR,EAAgB,CACd,cAAe,CACb,YAAaT,GAAM,YACnB,KAAMA,GAAM,KAAK,QAAQ,SAAU,EAAE,CACvC,EACA,YAAa,CACX,GAAIA,GAAM,EACZ,CACF,CAAC,CACH,EAEC,SAAA3T,EAAE,aAAa,EAClB,EACAlC,EAACmI,EAAA,CACC,SAAQ,GACR,OAAM,GACN,KAAK,SACL,KAAK,QACL,KAAK,OACL,QAAS,IAAM,CACbgG,EAAM,QAAQ,CACZ,MAAOjM,EAAE,sBAAsB,EAC/B,QACElC,EAAC6G,GAAA,CAAU,MAAO,CAAC/B,EAAM,IAAI,EAAI,SAAA5C,EAAE,yBAA0B,CAAE,KAAM4C,EAAM,IAAK,CAAC,EAAE,EAErF,MAAM,MAAO,CACX,MAAMqR,EAAO,QAAQ,CACnB,GAAIrR,EAAM,GACV,KAAMA,EAAM,IACd,CAAC,EACDkB,EAAO0C,GAAQ0L,GACNmB,GAAQnB,EAAM4B,GAAS,CAC5B,IAAMzO,EAAQyO,GAAO,YAAY,UAAU5T,GAAQA,EAAK,KAAO0C,EAAM,EAAE,EACnEyC,GACFyO,GAAO,YAAY,OAAOzO,EAAO,CAAC,CAEtC,CAAC,CACF,EACDmO,EAAQ,QAAQxT,EAAE,6BAA6B,CAAC,CAClD,CACF,CAAC,CACH,EAEC,SAAAA,EAAE,eAAe,EACpB,GACF,CAGN,CACF,EAEA,OACET,GAAAoT,GAAA,CACE,UAAA7U,EAACkP,GAAA,CACC,MAAOhN,EAAE,aAAa,EACtB,MACElC,EAACmI,EAAA,CACC,SAAQ,GACR,KAAK,UACL,KAAK,SACL,KAAMnI,EAAC0W,GAAA,EAAqB,EAC5B,QAAS,IAAM,CACbN,EAAgB,CAClB,EAEC,SAAAlU,EAAE,sBAAsB,EAC3B,EAGF,SAAAlC,EAACmL,GAAA,CACC,SAAQ,GACR,OAAO,OACP,QAASwE,EACT,KAAK,SACL,OAAQjH,GACR,SAAUjF,GAAYA,EAAS,MAC/B,cAAeA,GAAYA,EAAS,KACtC,EACF,EACC4S,EACAE,GACH,CAEJ,EAEOE,GAAQG,KCrPf,IAAAI,GAAA,GAAAvI,GAAAuI,GAAA,aAAAC,KAAA,OAAS,cAAAC,GAAY,QAAAhI,GAAM,gBAAAiI,GAAc,YAAA9D,OAAgB,OACzD,OAAS,QAAAmC,GAAM,aAAA4B,OAAiB,mBAU5B,mBAAAvC,GAMe,OAAA7U,GAUT,QAAAyB,OAhBN,oBAXJ,IAKM4V,GAkCCJ,GAvCPK,GAAA9W,EAAA,kBAEAwH,KACA3G,IAEMgW,GAAa,IAAM,CACvB,IAAM1U,EAASyU,GAAU,EACnB,CAAE,KAAAhW,EAAM,UAAAyE,CAAU,EAAIuL,GAAQzO,EAAO,IAAc,EACnDT,EAAIhB,EAAe,EAEzB,OACEO,GAAAoT,GAAA,CACE,UAAA7U,GAACkX,GAAA,CACC,MAAO,CAAE,aAAc,EAAG,EAC1B,MAAO,CACL,CACE,IAAK,IACL,MAAOlX,GAACwV,GAAA,CAAK,GAAG,KAAM,SAAAtT,EAAE,aAAa,EAAE,CACzC,EACA,CACE,IAAK,IACL,MAAOS,EAAO,IAChB,CACF,EACF,EACA3C,GAACkP,GAAA,CAAK,MAAOhN,EAAE,kBAAkB,EAC/B,SAAAT,GAAC4R,GAAA,CAAS,QAASxN,EACjB,UAAApE,GAAC0V,GAAA,CAAa,OAAQ,EAAG,OAAO,WAC9B,UAAAnX,GAACmX,GAAa,KAAb,CAAkB,MAAOjV,EAAE,aAAa,EAAI,SAAAd,GAAM,KAAK,EACxDpB,GAACmX,GAAa,KAAb,CAAkB,MAAM,KAAM,SAAA/V,GAAM,GAAG,EACxCpB,GAACmX,GAAa,KAAb,CAAkB,MAAOjV,EAAE,qBAAqB,EAAI,SAAAd,GAAM,MAAM,GACnE,EACApB,GAAC+U,GAAA,CAAe,SAAQ,GAAC,MAAO3T,GAAM,YAAa,GACrD,EACF,GACF,CAEJ,EAEO6V,GAAQI,KCvCf,IAAAE,GAAA,GAAA9I,GAAA8I,GAAA,aAAAC,KAAA,OAAS,QAAAC,OAAY,QACrB,OAAS,YAAAxH,GAAU,SAAAyH,GAAO,UAAAC,OAAc,mBAQpC,OACwB,OAAA3X,EADxB,QAAAyB,OAAA,oBATJ,IAGMwU,GACAW,GACAS,GAEAO,GAWCJ,GAlBPxP,GAAAxH,EAAA,kBAGMyV,GAAWwB,GAAK,IAAM,qCAAoB,EAC1Cb,GAAWa,GAAK,IAAM,qCAAoB,EAC1CJ,GAAaI,GAAK,IAAM,qCAAsB,EAE9CG,GAAa,IAEfnW,GAACkW,GAAA,CACC,UAAA3X,EAAC0X,GAAA,CAAM,MAAK,GAAC,QAAS1X,EAACiQ,GAAA,CAAS,GAAG,OAAO,EAAI,EAC9CjQ,EAAC0X,GAAA,CAAM,KAAK,OAAO,QAAS1X,EAACiW,GAAA,EAAS,EAAI,EAC1CjW,EAAC0X,GAAA,CAAM,KAAK,OAAO,QAAS1X,EAAC4W,GAAA,EAAS,EAAI,EAC1C5W,EAAC0X,GAAA,CAAM,KAAK,aAAa,QAAS1X,EAACqX,GAAA,EAAW,EAAI,GACpD,EAIGG,GAAQI,KCjBfrX,ICIAc,IALA,OAAS,gBAAAwW,OAAoB,oBAE7B,OAAS,SAAAzI,GAAO,SAAA7N,GAAO,OAAA+T,GAAK,SAAA9T,OAAa,OAEzC,OAAS,aAAA0E,GAAW,UAAA6E,GAAQ,YAAA5E,OAAgB,QAiG9B,cAAAnG,GAmDJ,QAAAyB,OAnDI,oBApFd,IAAMqW,GAAoCpX,GAAS,CACjD,GAAM,CAAE,YAAAqX,EAAa,QAAAC,EAAS,UAAAC,EAAW,YAAAC,EAAa,eAAAC,CAAe,EAAIzX,EACnEwB,EAAIhB,EAAe,EACnB,CAAE,MAAAe,CAAM,EAAIT,GAAM,SAAS,EAC3B,CAAC4W,EAAMC,CAAO,EAAIlS,GAAmB,CAAC,CAAC,EACvC,CAACmS,EAAcC,CAAe,EAAIpS,GAAS,EAAK,EAChD,CAACqS,EAAYC,CAAa,EAAItS,GAAS,EAAE,EACzC,CAACuS,EAAgBC,CAAiB,EAAIxS,GAAS,EAAE,EACjD,CAACyS,EAAgBC,CAAiB,EAAI1S,GAAiB,EAAE,EACzD2S,EAAW/N,GAAiB,IAAI,EAChCgO,EAAehO,GAAiB,IAAI,EAE1C7E,GAAU,IAAM,CACdmS,EAAQN,GAAe,CAAC,CAAC,CAC3B,EAAG,CAACA,CAAW,CAAC,EAEhB7R,GAAU,IAAM,CACVoS,GACFQ,EAAS,SAAS,MAAM,CAE5B,EAAG,CAACR,CAAY,CAAC,EAEjBpS,GAAU,IAAM,CACd6S,EAAa,SAAS,MAAM,CAC9B,EAAG,CAACP,CAAU,CAAC,EAEf,IAAMQ,EAAc,MAAOC,GAAuB,CAGhD,GAFgB,MAAMd,IAAiBc,CAAU,EAEpC,CACX,IAAMC,EAAUd,EAAK,OAAOe,IAAOA,KAAQF,CAAU,EACrDZ,EAAQa,CAAO,CACjB,CACF,EAEME,EAAY,IAAM,CACtBb,EAAgB,EAAI,CACtB,EAEMc,EAAqBnG,GAAqC,CAC9DuF,EAAcvF,EAAE,OAAO,KAAK,CAC9B,EAEMoG,EAAqB,SAAY,CACjCd,GAAcJ,EAAK,QAAQI,CAAU,IAAM,IAC7B,MAAMN,IAAcM,CAAU,GAG5CH,EAAQ,CAAC,GAAGD,EAAMI,CAAU,CAAC,EAIjCD,EAAgB,EAAK,EACrBE,EAAc,EAAE,CAClB,EAEMc,GAAyBrG,GAAqC,CAClE2F,EAAkB3F,EAAE,OAAO,KAAK,CAClC,EAEMsG,EAAyB,IAAM,CACnC,IAAMN,EAAU,CAAC,GAAGd,CAAI,EACxBc,EAAQR,CAAc,EAAIE,EAC1BP,EAAQa,CAAO,EACfP,EAAkB,EAAE,EACpBF,EAAc,EAAE,CAClB,EAEMgB,EAA+B,CACnC,MAAO,GACP,cAAe,KACjB,EAEMC,EAA8B,CAClC,WAAYzX,EAAM,iBAClB,YAAa,QACf,EAEA,OACER,GAACF,GAAA,CAAM,KAAI,GAAC,KAAM,CAAC,EAAG,CAAC,EACrB,UAAAvB,GAACuB,GAAA,CAAM,KAAI,GAAC,KAAM,CAAC,EAAG,CAAC,EACpB,SAAA6W,EAAK,IAAI,CAACe,EAAK5R,IACVmR,IAAmBnR,EAEnBvH,GAACoP,GAAA,CACC,IAAK2J,EAEL,KAAK,QACL,MAAOU,EACP,MAAOb,EACP,SAAUW,GACV,OAAQC,EACR,aAAcA,GANTL,CAOP,EAKFnZ,GAACsV,GAAA,CAEC,SAAU2C,EACV,MAAO,CAAE,WAAY,MAAO,EAC5B,QAAS,MAAM/E,GAAK,CAClBA,EAAE,eAAe,EACjB,MAAM8F,EAAYG,CAAG,CACvB,EAEA,SAAAnZ,GAAC,QACC,cAAekT,GAAK,CACd3L,IAAU,IACZoR,EAAkBpR,CAAK,EACvBsR,EAAkBM,CAAG,EACrBjG,EAAE,eAAe,EAErB,EAEC,SAAAiG,EACH,GAlBKA,CAmBP,CAEH,EACH,EACCnB,IACEM,EACCtY,GAACoP,GAAA,CACC,IAAK0J,EACL,KAAK,OACL,KAAK,QACL,MAAOW,EACP,MAAOjB,EACP,SAAUa,EACV,OAAQC,EACR,aAAcA,EAChB,EAEA7X,GAAC6T,GAAA,CAAI,MAAOoE,EAAc,QAASN,EACjC,UAAApZ,GAAC6X,GAAA,EAAa,EAAE,OACT3V,EAAE,YAAY,GACvB,IAEN,CAEJ,EAEOyX,GAAQ7B,GD5JflW,KAEAkC,KAEAgD,KEDAzF,IACA2G,IACAnE,IACAjC,KATA,OAAS,UAAAN,GAAQ,QAAAmJ,GAAM,UAAAC,GAAQ,QAAAC,GAAM,SAAAC,OAAa,OAElD,OAAOtI,OAAQ,eAEf,OAAS,aAAA4D,GAAW,YAAAC,OAAgB,QACpC,OAAOyT,OAAoB,eA6HrB,OAgBF,YAAA/E,GAhBE,OAAA7U,GAgBF,QAAAyB,OAhBE,oBApGN,IAAMoY,GACJnZ,GACG,CACH,GAAM,CACJ,KAAAqH,EACA,OAAAW,EACA,OAAA7G,EACA,QAAAe,EACA,SAAAE,EACA,UAAAgX,EACA,cAAAjO,EACA,QAAAkO,EACA,WAAArO,EACA,aAAAsO,EACA,GAAGjO,CACL,EAAIrL,EACEwB,EAAIhB,EAAe,EACnB,CAACqK,CAAI,EAAId,GAAK,QAAgB,EAC9B,CAAE,WAAAwB,EAAY,UAAApG,CAAU,EAAIiC,EAAcC,CAAI,EAC9C,CAACkS,EAASC,CAAU,EAAI/T,GAAS,EAAK,EACtC,CAAC+C,EAAYiR,CAAa,EAAIhU,GAAiB,EAE/CiU,EAAS,CAACC,EAAmBC,IAA+B,CAChE,GAAI,CAACL,EAAS,OAAO,KAErB,IAAMM,GAASF,IAAc,EAAIP,EAAUQ,CAAgB,EAAI,OACzDE,GAAOR,EAAa9Q,EAAsBqR,EAAM,EAGtD,OAFoBjY,GAAG,UAAUkY,EAAI,EAEhB,GAAG9R,CAAM,IAAIpG,GAAG,UAAUkY,EAAI,CAAC,GAAK9R,CAC3D,EAEM,CACJ,KAAAtH,EACA,KAAA6H,EACA,QAAAwR,EACA,aAAcC,EAChB,EAAId,GACFQ,EACA9I,GACE/O,EAAkB+O,EAAK,CACrB,QAAS,OAAO1O,GAAY,WAAaA,EAAQ2I,CAAI,EAAI3I,EACzD,SAAAE,CACF,CAAC,EAAE,KAAKW,GAAYA,EAAS,IAAI,EACnC,CACE,mBAAoB,GACpB,kBAAmB,GACnB,oBAAqB,EACvB,CACF,EAEMkX,EAAa9O,EAAczK,CAAI,EAC/BwZ,EAAgBF,IAAqBzR,EAAO,GAAK7H,GAAQ,OAAOA,EAAK6H,EAAO,CAAC,EAAM,IACnF4R,EAAgB,OAAOd,EAAY,IAAc,CAACA,EAAQ3Y,CAAI,EAAI,GAClE0Z,EAAU,CAACH,GAAcA,EAAW,SAAW,EAE/C5Y,EAAY,SAAY,CAC5B,IAAMkM,EAAS,MAAM1C,EAAK,eAAe,EACzC4O,EAAclM,CAAM,EAEpB,GAAI,CACF,MAAM1C,EAAK,eAAe,EAC1BkP,EAAQ,CAAC,EACTP,EAAW,EAAI,CACjB,MAAY,CACVO,EAAQ,CAAC,EACTP,EAAW,EAAK,CAClB,CACF,EAEMa,EAAW,IAAM,CACrBN,EAAQxR,EAAO,CAAC,CAClB,EAEMjH,GAAU,SAAY,CAC1B,GAAI,CACFuJ,EAAK,YAAY,EACjB,MAAMA,EAAK,eAAe,CAAE,aAAc,EAAK,CAAC,EAChDkP,EAAQ,CAAC,CACX,MAAY,CACVA,EAAQ,CAAC,CACX,CACF,EAgBA,OAdAvU,GAAU,IAAM,CACV+F,GACFV,EACG,eAAe,CAAE,aAAc,EAAK,CAAC,EACrC,KAAK0C,GAAU,CACdkM,EAAclM,CAAM,EACpBiM,EAAW,EAAI,CACjB,CAAC,EACA,MAAM,IAAM,CACXA,EAAW,EAAK,CAClB,CAAC,CAEP,EAAG,CAACjO,CAAU,CAAC,EAEXpG,EAEA7F,GAAC2K,GAAA,CACC,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,GACV,EACF,EAICsB,EAKHxK,GAAAoT,GAAA,CACG,UAAAnJ,EACC1L,GAAC2B,GAAA,CACC,OAAQE,GAAQ,IAAI4J,IAAU,CAC5B,IAAKA,EAAM,IACX,SAAU,OAAOA,EAAM,UAAa,WAAaA,EAAM,SAASF,CAAI,EAAIE,EAAM,QAChF,EAAE,EACF,QAASzJ,GACT,UAAWD,EAEV,SAAA2J,EAAWH,CAAI,EAClB,EAEAvL,GAACyK,GAAA,CAAK,KAAMc,EAAM,EAEpBvL,GAAC4K,GAAA,CAAO,GAAGmB,EAAY,WAAY4O,EAAY,QAASC,EAAe,WAAY,GAAO,EACzF,CAACE,GACA9a,GAACsB,GAAA,CACC,MAAK,GACL,QAASsZ,EACT,KAAK,OACL,SAAS,SACT,SAAUA,GAAiBC,EAC3B,QAASE,EAER,SACG7Y,EADH0Y,EACK,2BACFC,EACI,4BACA,2BAHwB,EAIlC,GAEJ,EApCO7a,GAAC0K,GAAA,CAAO,OAAQ,IAAK,SAAUxI,EAAE,sBAAsB,EAAG,CAsCrE,EAEO8Y,GAAQnB,GCnLfxY,IACAd,IACAuD,KAPA,UAAYmX,OAAU,OACtB,OAAS,QAAA/L,GAAM,WAAAc,GAAS,SAAA0D,GAAO,SAAAnS,OAAa,OAE5C,OAAS,YAAA2Z,OAAgB,QACzB,OAAO9K,OAAa,sBCSpBpI,IACAzH,IAbA,OAAS,QAAA4a,OAAY,OASrB,OAAS,QAAAC,GAAM,aAAAlV,GAAW,WAAA2G,OAAe,QACzC,OAAS,QAAA2I,GAAM,eAAAtF,OAAmB,mBCXlC,OAAS,UAAA/L,OAAc,UACvB,OAAS,qBAAAe,GAAmB,WAAAd,OAAe,qBASpC,IAAMiX,GAAclX,GAAiB,EAC1CC,GACEI,IAAQ,CACN,SAAU,CAAC,EACX,YAAa8W,GAAQ9W,EAAI,CAAE,SAAU8W,CAAK,CAAC,EAC3C,aAAc,CAAC,EACf,gBAAiBA,GAAQ9W,EAAI,CAAE,aAAc8W,CAAK,CAAC,CACrD,GACA,CACE,KAAM,MACN,QAASpW,GAAkB,IAAM,YAAY,EAC7C,WAAYR,IAAU,CACpB,SAAUA,EAAM,SAChB,aAAcA,EAAM,YACtB,EACF,CACF,CACF,EDcW,cAAA1E,OAAA,oBAFX,IAAMub,GAAW,CAACC,EAAmBC,IAC/BA,EACKzb,GAACwV,GAAA,CAAK,GAAIiG,EAAQ,SAAAD,EAAM,EAG1BA,EAGT,SAASE,GAAcjb,EAAyB0R,EAAgD,CAC9F,OAAQ1R,GAAY,CAAC,GAAG,KAAKkb,GACvBA,IAAU,KACL,GACGA,EAA0B,OAAS,UACtC,GAEFA,EAA4C,SACxCD,GAAeC,EAA4C,UAAY,CAAC,EAAGxJ,CAAW,EAEtF,CAACA,GAAe,CAAEwJ,EAAwB,MAAQxJ,EAAawJ,EAAwB,IAAc,CAGjH,CACH,CAEA,SAASC,GAAeC,EAAsB1J,EAAuC,CACnF,IAAM9K,EAAqB,CAAC,EAE5B,QAASkN,EAAI,EAAGA,EAAIsH,EAAM,OAAQtH,IAChC,GAAIsH,EAAMtH,CAAC,IAAM,KACflN,EAAOkN,CAAC,EAAI,aACFsH,EAAMtH,CAAC,EAAsB,OAAS,UAChDlN,EAAOkN,CAAC,EAAI,CAAE,GAAGsH,EAAMtH,CAAC,CAAE,UAErBsH,EAAMtH,CAAC,EAAwC,SAAU,CAC5D,GAAM,CAAE,SAAA9T,EAAU,GAAG8H,CAAU,EAAIsT,EAAMtH,CAAC,EAE1ClN,EAAOkN,CAAC,EAAImH,GAAcjb,GAAY,CAAC,EAAG0R,CAAW,EAChD,CACC,GAAG5J,EACH,SAAUqT,GAAenb,GAAY,CAAC,EAAG0R,CAAW,CACtD,EACA,IACN,KAAO,CACL,GAAM,CAAE,MAAAsJ,EAAO,MAAAD,EAAO,KAAAzT,EAAM,GAAGQ,CAAU,EAAIsT,EAAMtH,CAAC,EAC9CuH,EAAS,CAAC/T,GAAQ,CAACoK,GAAeA,EAAYpK,CAAI,EAExDV,EAAOkN,CAAC,EAAIuH,EACP,CACC,GAAGvT,EACH,MAAOgT,GAASC,EAAOC,CAAK,CAC9B,EACA,IACN,CAIJ,OAAOpU,CACT,CAGA,SAAS0U,GACPF,EACAxU,EAAyD,CAAC,EAC1D2U,EAAoB,CAAC,EACrB,CACA,QAAW5Z,KAAQyZ,EAAO,CACxB,IAAMpb,EAAY2B,GAA4C,SAE9D,GAAI,MAAM,QAAQ3B,CAAQ,EAAG,CAC3B,IAAM6a,EACHlZ,EAA6B,OAAS,SAAWA,EAAM,IAAM,CAAC,GAAG4Z,EAAS5Z,EAAM,GAAa,EAAI4Z,EACpGD,GAAUtb,EAAU4G,EAAQiU,CAAI,CAClC,MAAWlZ,GACTiF,EAAO,KAAK,OAAO,OAAOjF,EAAuB,CAAE,QAAA4Z,CAAQ,CAAC,CAAC,CAEjE,CAEA,OAAO3U,CACT,CAEA,IAAM4U,GAAUb,GAAK,UAAmB,CACtC,IAAM3K,EAAWP,GAAY,EACvB,CAAE,UAAAgM,CAAU,EAAIjc,EAAmB,EACnCkc,EAAetP,GAAQ,IAAMkP,GAAUG,GAAa,CAAC,CAAC,EAAG,CAACA,CAAS,CAAC,EACpExU,EAAQyU,EAAa,IAAI/Z,GAAQA,EAAK,IAAI,EAAE,OAAO,OAAO,EAC1D,CAAE,KAAM+P,CAAY,EAAI1K,GAAeC,EAAO,GAAM,CAAE,SAAU,EAAK,CAAC,EACtE0U,EAAgBvP,GAAQ,IAAM+O,GAAeM,GAAa,CAAC,EAAG/J,CAAW,EAAG,CAAC+J,EAAW/J,CAAW,CAAC,EACpG,CAAE,SAAAkK,EAAU,aAAAC,EAAc,YAAAC,EAAa,gBAAAC,CAAgB,EAAInB,GAAY,EAEvEoB,EAA0CnB,GAAQ,CACtD,IAAMoB,EAAgBpB,GAAM,KAAKna,GAAOkb,GAAU,QAAQlb,CAAG,IAAM,EAAE,EAC/D2V,EAAQqF,EAAa,KAAK/Z,GAAQsa,IAAkBta,EAAK,GAAG,EAClEma,EAAazF,GAAO,SAAW,CAAC4F,CAAa,CAAc,CAC7D,EAEA,OAAAxW,GAAU,IAAM,CACd,IAAM4Q,EAAQqF,EAAa,KAAK/Z,GAAQqO,EAAS,WAAarO,EAAK,KAAK,EAExE,GAAI0U,EAAO,CACT,IAAM3V,EAAM2V,EAAM,IACZkF,EAAUlF,EAAM,QACtB0F,EAAgB,CAACrb,CAAG,CAAC,EACrBob,EAAYP,CAAO,CACrB,CACF,EAAG,CAACG,EAAc1L,CAAQ,CAAC,EAGzBzQ,GAACmb,GAAA,CACC,MAAO,CAAE,YAAa,MAAO,EAC7B,MAAOiB,EACP,KAAK,SACL,SAAUC,EACV,aAAcC,EACd,aAAcG,EAChB,CAEJ,CAAC,EAEG,QAAQ,IAAI,WAAa,gBAC3BR,GAAQ,YAAc,WAGxB,IAAOU,GAAQV,GE5Jf5a,IACA0C,KACAxD,IAPA,OAAS,kBAAAqc,GAAgB,gBAAAC,OAAoB,oBAE7C,OAAS,YAAAC,GAAU,SAAAvb,OAAa,OAEhC,OAAS,eAAAoN,OAAmB,mBAiBpB,cAAA3O,GA+BE,QAAAyB,OA/BF,oBAZR,IAAMsb,GAAiB,IAAM,CAC3B,IAAMjO,EAAWH,GAAY,EACvB,CAAE,WAAAqO,EAAY,QAAAC,CAAQ,EAAI7Z,EAAc,EACxC8Z,EAAOD,EAAQ,EACf/a,EAAIhB,EAAe,EACnB,CAAE,kBAAAic,CAAkB,EAAIld,EAAmB,EAE3C4b,EAA4B,CAChC,CACE,IAAK,IACL,MAEE7b,GAAC,KACC,UAAQ,qBACR,QAAS,IAAM,CACbgd,EAAW,EACPG,GACFrO,EAASqO,CAAiB,CAE9B,EAEC,SAAAjb,EAAE,wBAAwB,EAC7B,EAEF,KAAMlC,GAAC4c,GAAA,EAAe,CACxB,CACF,EAEA,OACE5c,GAAC,OAAI,UAAQ,cACX,SAAAA,GAAC8c,GAAA,CACC,KAAM,CACJ,WAAY,GACZ,MAAAjB,CACF,EACA,UAAU,cAGV,SAAA7b,GAAC,KACC,QAASkT,GAAK,CACZA,EAAE,eAAe,CACnB,EAEA,SAAAzR,GAACF,GAAA,CAAM,MAAM,SACX,UAAAvB,GAAC,QAAM,SAAAkd,GAAM,YAAY,EACzBld,GAAC6c,GAAA,CAAa,MAAO,CAAE,SAAU,MAAO,EAAG,GAC7C,EACF,EACF,EACF,CAEJ,EAEOO,GAAQL,GHxCT,cAAA/c,EA8CE,QAAAyB,OA9CF,oBAXN,GAAM,CAAE,KAAAkJ,GAAM,MAAAnJ,EAAM,EAAIyZ,GAClB,CAAE,OAAAoC,GAAQ,MAAAC,GAAO,QAAAC,EAAQ,EAAS,UAElCC,GAAsC9c,GAAS,CACnD,GAAM,CAAE,SAAAD,CAAS,EAAIC,EACf,CAAE,mBAAA6D,EAAoB,eAAAkZ,CAAe,EAAIxd,EAAmB,EAC5D,CAAE,KAAAoD,EAAM,UAAAwC,EAAW,UAAAP,CAAU,EAAIhC,GAAa,EAC9CpB,EAAIhB,EAAe,EAEzB,OAAI2E,GAAaP,EAEbtF,EAAC2K,GAAA,CACC,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,GACV,EACF,EAIApG,GAAsB,CAACkZ,GAAkB,CAACpa,EAE1CrD,EAACkP,GAAA,CACC,SAAAlP,EAAC0T,GAAA,CAAM,MAAOA,GAAM,uBAAwB,YAAaxR,EAAE,yBAAyB,EAAG,EACzF,EAIGzB,CACT,EAEMid,GAAgChd,GAAS,CAC7C,GAAM,CAAE,SAAAD,CAAS,EAAIC,EACf,CACJ,MAAO,CAAE,iBAAAid,EAAkB,YAAAC,CAAY,CACzC,EAAIpc,GAAM,SAAS,EACb,CAAE,SAAAqc,EAAU,mBAAAtZ,EAAoB,eAAAkZ,EAAgB,mBAAA7M,EAAoB,mBAAAkN,CAAmB,EAAI7d,EAAmB,EAEpH,OACEwB,GAAM,UAAL,CAAY,SAAQ,GAAC,UAAU,WAC9B,UAAAA,GAAC6b,GAAA,CACC,MAAO,IACP,MAAO,CACL,SAAU,OACV,OAAQ,QACR,SAAU,QACV,KAAM,EACN,IAAK,EACL,OAAQ,EACR,iBAAkB,EAClB,iBAAkB,QAClB,iBAAkBM,CACpB,EACA,MAAM,QAEN,UAAAnc,GAAC,OAAI,UAAU,8BACb,UAAAzB,EAAC,OAAI,IAAKoQ,GAAS,IAAI,OAAO,UAAU,UAAU,EAClDpQ,EAAC,OAAI,UAAU,OAAQ,SAAA6d,EAAS,GAClC,EACA7d,EAAC2c,GAAA,EAAQ,GACX,EACAlb,GAAM,UAAL,CAAY,UAAU,QACrB,UAAAzB,EAACqd,GAAA,CACC,MAAO,CACL,QAAS,SACT,WAAYM,EACZ,kBAAmB,EACnB,kBAAmB,QACnB,kBAAmBC,CACrB,EAEA,SAAAnc,GAAC,OAAI,UAAU,2CACb,UAAAzB,EAAC,OAAK,SAAAuE,GAAsB,CAACkZ,GAAkBzd,EAACqF,GAAA,EAAW,EAAG,EAC9D5D,GAACF,GAAA,CAAM,KAAK,QAAQ,MAAOvB,EAACgQ,GAAA,CAAQ,KAAK,WAAW,EACjD,UAAA8N,GAAoB,IAAIrS,GAASzL,EAAC,QAAsB,SAAAyL,EAAM,UAAlBA,EAAM,GAAqB,CAAO,EAC9EmF,EACD5Q,EAACod,GAAA,EAAW,GACd,GACF,EACF,EACApd,EAACud,GAAA,CAAQ,UAAU,sBACjB,SAAAvd,EAACkb,GAAA,CACC,SACElb,EAAC2K,GAAA,CACC,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,OACV,EACF,EAGF,SAAA3K,EAACwd,GAAA,CAAc,SAAA/c,EAAS,EAC1B,EACF,GACF,GACF,CAEJ,EAEOsd,GAAQL,GHlGftV,KOdA/G,IACA2G,IAHA,OAAS,UAAA0C,GAAQ,QAAAC,OAAY,OAgBvB,OAeG,YAAAkK,GAfH,OAAA7U,OAAA,oBAPN,IAAMge,GAA+Dtd,GAAS,CAC5E,GAAM,CAAE,KAAAqH,EAAM,SAAAtH,CAAS,EAAIC,EACrB,CAAE,WAAAuL,EAAY,aAAAtE,CAAa,EAAIG,EAAcC,CAAI,EACjD7F,EAAIhB,EAAe,EAEzB,OAAIyG,EAEA3H,GAAC2K,GAAA,CACC,MAAO,CACL,QAAS,OACT,eAAgB,SAChB,WAAY,SACZ,OAAQ,GACV,EACF,EAICsB,EAIEjM,GAAA6U,GAAA,CAAG,SAAApU,EAAS,EAHVT,GAAC0K,GAAA,CAAO,OAAO,MAAM,SAAUxI,EAAE,sBAAsB,EAAG,CAIrE,EAEO+b,GAAQD,GPdf5S,KAGAmD,KACAlN,IACAsM,KACA3F,IACA6G,KACAa,KACAY,KACAtI,KACA2B,KAEA5F,KAIAF,IQjCAtD,IAHA,OAAS,QAAAkX,OAAY,QACrB,OAAS,SAAAC,GAAO,UAAAC,OAAc,mBAepB,cAAA3X,EAcJ,QAAAyB,OAdI,oBAVV,IAAMmN,GAAW6I,GAAK,IAAM,qCAA2B,EACjDhI,GAAmBgI,GAAK,IAAM,qCAAmC,EACjEpH,GAASoH,GAAK,IAAM,qCAAyB,EAC7CG,GAAaH,GAAK,IAAM,qCAA6B,EAE9CyG,GAAa,CAACC,EAAiCzd,IAC9B,IAExBV,EAACM,GAAA,CAAiB,GAAGI,EACnB,SAAAV,EAAC+d,GAAA,CACC,SAAA/d,EAACme,EAAA,EAAiB,EACpB,EACF,EAOC,SAASC,GAAeC,EAAmB3d,EAAuD,CAevG,MAdgC,IAAM,CACpC,IAAM4d,EAAc,OAAO,OAAO,CAAC,EAAG5d,EAAO,CAAE,eAAgB,EAAK,CAAC,EAErE,OACEe,GAACkW,GAAA,CACE,UAAA0G,EACDre,EAAC0X,GAAA,CAAM,KAAK,iBAAiB,UAAWwG,GAAWzO,GAAkB6O,CAAW,EAAG,EACnFte,EAAC0X,GAAA,CAAM,KAAK,gBAAgB,UAAWwG,GAAWtG,GAAY0G,CAAW,EAAG,EAC5Ete,EAAC0X,GAAA,CAAM,KAAK,WAAW,QAAS1X,EAACqQ,GAAA,EAAO,EAAI,EAC5CrQ,EAAC0X,GAAA,CAAM,KAAK,IAAI,QAAS1X,EAAC4O,GAAA,EAAS,EAAI,GACzC,CAEJ,CAGF,CRHAhK","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FC, Key, PropsWithChildren, ReactNode } from 'react'\nimport { createContext, useContext } from 'react'\nimport { createStore } from 'zustand'\nimport type { Locale } from '../../types'\nimport type { RequestOptions } from '../../utils/request'\nimport type { Game } from '../GameSelect'\nimport type { NavMenuItem } from '../NavMenu'\n\nexport interface ContextState {\n appTitle: ReactNode\n signInPageTitle?: ReactNode\n menuItems: NavMenuItem[]\n hideGameSelect: boolean\n usePermissionApiV2: boolean // 使用 V2 版本的权限接口\n gameFilter?: (game: Game) => boolean\n locale?: Locale\n localeDropdownMenu?: ReactNode\n signInSuccessRedirectUrl?: string // 登录成功后的重定向地址\n notFoundRedirectUrl?: string // 404 重定向地址\n logoutRedirectUrl?: string // 退出登录后的重定向地址\n idaasRedirectUrl: string // IDAAS 重定向地址\n layoutHeaderExtras?: { key: Key; children: ReactNode }[]\n isGlobal?: boolean // 用于设置 HTPP 请求内的 APP-ID header 的值,为 true 时的值为 “global”,为 false 时值为当前游戏的 ID。\n responseInterceptor?: (response: Response, opts: RequestOptions) => Promise<any>\n}\n\nconst defaultState: ContextState = {\n appTitle: '',\n menuItems: [],\n hideGameSelect: false,\n usePermissionApiV2: false,\n idaasRedirectUrl: '',\n isGlobal: false,\n}\n\n// 全局的上下文。因为 ContextProvider 支持嵌套,所以 toolkitContextStore 的值等同于最内层的 ContextProvider 包含的上下文。\nexport const contextStore = createStore<ContextState>(() => defaultState)\n\nconst ToolkitsContext = createContext<ContextState>(defaultState)\n\n// 最接近的祖先 ContextProvider 内包含的上下文。\nexport function useToolkitsContext() {\n return useContext(ToolkitsContext)\n}\n\nconst ContextProvider: FC<PropsWithChildren<Partial<ContextState>>> = ({ children, ...props }) => {\n const parentConfig = useToolkitsContext()\n\n const config = {\n ...parentConfig,\n ...props,\n isGlobal: props.isGlobal ?? false,\n }\n\n contextStore.setState(config)\n\n return <ToolkitsContext.Provider value={config}>{children}</ToolkitsContext.Provider>\n}\n\nContextProvider.displayName = 'ToolkitsContextProvider'\n\nexport default ContextProvider\n","import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员。',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n },\n SignIn: {\n title: '登录方式',\n thirdParty: '第三方登录',\n signInWithIDass: 'IDass 登录',\n notRegistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserWidget: {\n signOutText: '登出',\n },\n UserList: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n RoleList: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n","import { get, has, template } from 'lodash-es'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport zh_CN from '../locales/zh_CN'\nimport type { Locale } from '../types'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const { locale = zh_CN } = useToolkitsContext()\n\n return (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Button, Space, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\n\nexport interface FilterFormWrapperProps extends PropsWithChildren {\n onConfirm?: () => void | Promise<void>\n onReset?: () => void\n extras?: { key: Key; children: ReactNode }[]\n isConfirming?: boolean\n}\n\nconst FilterFormWrapper = (props: FilterFormWrapperProps) => {\n const { extras, isConfirming, onConfirm, onReset, children } = props\n const { token } = theme.useToken()\n const t = useTranslation()\n\n const style = {\n maxWidth: 'none',\n background: token.colorFillAlter,\n borderWidth: token.lineWidth,\n borderStyle: token.lineType,\n borderColor: token.colorBorder,\n borderRadius: token.borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <div style={style}>\n <div className=\"flex\">\n <div className=\"flex-1\">{children}</div>\n <div className=\"ml-8\">\n <Space>\n <Button type=\"primary\" loading={isConfirming} onClick={onConfirm}>\n {t('FilterFormWrapper.confirmText')}\n </Button>\n <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>\n {extras?.map(item => <span key={item.key}>{item.children}</span>)}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { pick } from 'lodash-es'\nimport type { StringifyOptions } from 'query-string'\nimport qs from 'query-string'\nimport { contextStore } from '../components/ContextProvider'\nimport { useGameStore } from '../components/GameSelect'\nimport { useTokenStore } from '../stores/token'\n\nexport class RequestError extends Error {\n status!: number\n code?: number\n\n constructor(opts: { message?: string; status: number; code?: number }) {\n super(opts?.message)\n this.status = opts.status\n this.code = opts.code\n }\n}\n\ntype JsonResponse<T> = (\n | {\n code: number\n status?: never\n }\n | {\n code?: never\n status: number\n }\n) & {\n data: T\n msg: string\n}\n\nexport interface RequestOptions extends Omit<RequestInit, 'body'> {\n body?: Record<string | number, any> | FormData | null\n params?: Record<string | number, any> | URLSearchParams | null\n responseType?: 'json' | 'blob' | 'text'\n isGlobal?: boolean\n}\n\nexport type RequestResponse<T> = Pick<Response, 'headers' | 'status' | 'statusText' | 'url'> & { data: T }\n\nexport async function request<T = any>(url: string, opts: RequestOptions = {}): Promise<RequestResponse<T>> {\n opts = Object.assign(opts, { responseType: opts.responseType ?? 'json' })\n let { body, params, headers, responseType, isGlobal, ...rest } = opts\n\n const parsed = qs.parseUrl(url)\n const queryParams = Object.assign({}, parsed.query, params)\n const options: StringifyOptions = {\n skipNull: true,\n skipEmptyString: true,\n strict: true,\n encode: true,\n }\n const queryString = qs.stringify(queryParams, options)\n url = queryString ? `${parsed.url}?${queryString}` : url\n\n headers = new Headers(headers)\n\n const token = useTokenStore?.getState()?.token\n\n if (token) {\n headers.set('Authorization', `Bearer ${token}`)\n }\n\n if (contextStore.getState().usePermissionApiV2) {\n if (isGlobal || contextStore.getState().isGlobal) {\n headers.set('App-ID', 'global')\n } else {\n const game = useGameStore.getState().game\n if (game) {\n headers.set('App-ID', game.id)\n }\n }\n }\n\n if (responseType === 'blob') {\n headers.append('Accept', 'application/octet-stream')\n } else if (responseType === 'json') {\n headers.append('Accept', 'application/json')\n }\n\n const isJsonBody = !!(body && typeof body === 'object' && !(body instanceof FormData))\n\n if (isJsonBody) {\n headers.set('Content-Type', 'application/json')\n }\n\n const requestOpts = Object.assign(rest, {\n headers,\n body: isJsonBody ? JSON.stringify(body) : body,\n }) as RequestInit\n\n const response = await fetch(url, requestOpts)\n\n if (!response.ok) {\n throw new RequestError({ status: response.status })\n }\n\n const responseInterceptor = contextStore.getState().responseInterceptor\n\n if (typeof responseInterceptor === 'function') {\n return await responseInterceptor(response, opts)\n } else {\n let data: T\n\n if (responseType === 'blob') {\n data = (await response.blob()) as T\n } else if (responseType === 'json') {\n const json = (await response.json()) as JsonResponse<T>\n if (json.code === 0 || json.status === 0) {\n data = json.data\n } else {\n throw new RequestError({\n code: json.code,\n status: response.status,\n message: json.msg,\n })\n }\n } else {\n data = (await response.text()) as T\n }\n\n return {\n ...pick(response, ['headers', 'status', 'statusText', 'url']),\n data,\n }\n }\n}\n","import { jwtDecode } from 'jwt-decode'\nimport useSWRImmutable from 'swr/immutable'\nimport { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport { request } from '../utils/request'\n\ninterface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenState {\n token: string\n getUser: () => UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nexport const useTokenStore = create<TokenState>()(\n persist(\n (set, get, store) => ({\n token: '',\n getUser: () => {\n try {\n return jwtDecode(get().token) as UserInfo\n } catch (_) {\n return null\n }\n },\n setToken: token => set({ token }),\n clearToken: () => {\n get().setToken('')\n store.persist.clearStorage()\n },\n }),\n {\n name: 'token',\n partialize: state => ({ token: state.token }),\n skipHydration: true,\n },\n ),\n)\n\nexport function useTokenValidation(skip = false) {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n useSWRImmutable(\n !skip ? (usePermissionApiV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check') : null,\n (url: string) =>\n request(url, {\n method: 'POST',\n body: {\n permissions: ['100001'],\n },\n isGlobal: true,\n }),\n {\n suspense: true,\n },\n )\n}\n","import type { StateStorage } from 'zustand/middleware'\n\n// 通过 SessionStorage 隔离数据,防止多开页面时的数据冲突\nexport const mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem: async (name: string) => {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n","import { Select, Space, Typography } from 'antd'\nimport { useSWRConfig } from 'swr'\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { mixedStorage } from '../../utils/storage'\nimport { contextStore, useToolkitsContext } from '../ContextProvider'\n\nconst { Text } = Typography\n\nexport interface Game {\n id: string\n name: string\n area: 'cn' | 'global'\n Ctime: string\n}\n\nexport interface GameState {\n game: Game | null\n games: Game[]\n isLoading: boolean\n setGame: (id: string) => void\n fetchGames: () => void\n switching: boolean // 切换游戏中\n setSwitching: (switching: boolean) => void\n}\n\nexport const useGameStore = create<GameState>()(\n persist(\n (set, get) => ({\n game: null,\n games: [],\n isLoading: false,\n switching: false,\n setSwitching: switching => {\n set({ switching })\n },\n setGame: id => {\n const matchGame = (get().games ?? []).find(item => item.id === id)\n set({ game: matchGame ?? null })\n },\n fetchGames: () => {\n const token = useTokenStore.getState().token\n const isPermissionApiV2 = contextStore.getState().usePermissionApiV2\n\n if (token && isPermissionApiV2) {\n set({ isLoading: true })\n\n fetch('/api/usystem/game/all', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n })\n .then(response => {\n if (response.ok) {\n return response.json()\n }\n throw new Error('Network response was not ok.')\n })\n .then((json: { code: number; data: Game[]; msg: string }) => {\n set({ games: json.data })\n })\n .finally(() => {\n set({ isLoading: false })\n })\n }\n },\n }),\n {\n name: 'game',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({ game: state.game }),\n },\n ),\n)\n\nuseTokenStore.subscribe((state, prevState) => {\n if (state.token !== prevState.token) {\n // FIXME: 因为请求会在 Mock Service Worker 启动前发出,所以这里需要延迟一段时间\n setTimeout(() => {\n useGameStore.getState().fetchGames()\n }, 400)\n }\n})\n\nuseTokenStore.persist.rehydrate()\n\nconst GameSelect = () => {\n const t = useTranslation()\n const { gameFilter } = useToolkitsContext()\n const { game, games, isLoading, setGame, setSwitching } = useGameStore()\n const { mutate } = useSWRConfig()\n\n const options = (games ?? [])\n ?.filter(item => gameFilter?.(item) ?? true)\n ?.map(item => ({\n label: item.name,\n value: item.id,\n }))\n\n const onGameChange = async (id: string) => {\n setSwitching(true)\n // 清除 SWR 缓存\n setGame(id)\n await mutate(\n key => {\n return !(typeof key === 'string' && key.startsWith('/api/usystem/game/all'))\n },\n undefined,\n { revalidate: false },\n )\n setSwitching(false)\n }\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={game?.id}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n style={{ width: '200px' }}\n options={options}\n onChange={onGameChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nconst splitByTags = (str: string) => {\n const regex = /(<[^>]*>)/\n return str.split(regex).filter(part => part !== '')\n}\n\nfunction renderToString(node: ReactNode): Promise<string> {\n const container = document.createElement('div')\n const root = createRoot(container)\n\n return new Promise(resolve => {\n setTimeout(() => {\n flushSync(() => {\n root.render(node)\n })\n resolve(container.innerHTML)\n })\n })\n}\n\nexport interface HighlightTextsProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightTextsProps) => {\n const { texts, children } = props\n const [htmlString, setHtmlString] = useState<string>('')\n\n useEffect(() => {\n renderToString(children).then(str => {\n const result = splitByTags(str)\n\n for (const text of texts) {\n for (let index = 0; index < result.length; index++) {\n // TODO: 忽略 HTML tag\n result[index] = result[index].replace(String(text), `<span style='color: #DC143C;'>${text}</span>`)\n }\n }\n\n setHtmlString(result.join(''))\n })\n }, [children, texts])\n\n return <div dangerouslySetInnerHTML={{ __html: htmlString }}></div>\n}\n\nexport default Highlight\n","import type { SWRConfiguration } from 'swr'\nimport useSWR from 'swr'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport { request } from '../utils/request'\n\ntype PermissionCheckResult = { has_all: true } | { [k: string]: boolean }\n\nexport function usePermissions(codes: string[], isGlobal?: boolean, config?: SWRConfiguration) {\n const { usePermissionApiV2 } = useToolkitsContext()\n const { data, isValidating, isLoading } = useSWR(\n codes.length > 0 ? [usePermissionApiV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check', codes] : null,\n ([url]) =>\n request<PermissionCheckResult>(url, {\n method: 'POST',\n body: {\n permissions: codes,\n },\n isGlobal,\n }).then(response => {\n if (response.data?.has_all) {\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = true\n return acc\n },\n {} as Record<string, boolean>,\n )\n }\n\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = (response.data as Record<string, boolean>)?.[curr] ?? false\n return acc\n },\n {} as Record<string, boolean>,\n )\n }),\n {\n revalidateOnFocus: false,\n ...config,\n },\n )\n\n return { data, isValidating, isLoading }\n}\n\nexport function usePermission(code: string | undefined, isGlobal?: boolean, config?: SWRConfiguration) {\n const { data, isValidating, isLoading } = usePermissions(code ? [code] : [], isGlobal, config)\n\n if (code === undefined) {\n return {\n accessible: true,\n isValidating: false,\n isLoading: false,\n }\n }\n\n return {\n accessible: data?.[code] ?? false,\n isValidating,\n isLoading,\n }\n}\n","import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermissions } from '../../hooks/permission'\n\nexport interface PermissionButtonProps extends ButtonProps {\n code: string | string[]\n showLoading?: boolean\n isGlobal?: boolean\n}\n\nconst PermissionButton: FC<PropsWithChildren<PermissionButtonProps>> = props => {\n const { children, code, showLoading, isGlobal, disabled, ...restProps } = props\n const { data, isLoading } = usePermissions(Array.isArray(code) ? code : [code], isGlobal)\n const t = useTranslation()\n\n if (isLoading) {\n return (\n <Button loading={showLoading} disabled={!showLoading} {...restProps}>\n {children}\n </Button>\n )\n }\n\n if (!Object.values(data ?? {})?.some(Boolean)) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n <Button disabled {...restProps}>\n {children}\n </Button>\n </Tooltip>\n )\n }\n\n return (\n <Button disabled={disabled} {...restProps}>\n {children}\n </Button>\n )\n}\n\nexport default PermissionButton\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport qs from 'query-string'\nimport type { QueryListProps } from '.'\nimport type { QueryListPayload } from '../../stores/queryList'\n\ninterface SwrKeyObject {\n url: string\n params?: Record<string, any>\n body?: Record<string, any>\n}\n\nconst deepSortObject = (obj: unknown): unknown => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepSortObject)\n }\n\n const sortedKeys = Object.keys(obj).sort()\n const result: Record<string, unknown> = {}\n\n sortedKeys.forEach(key => {\n result[key] = deepSortObject((obj as Record<string, unknown>)[key])\n })\n\n return result\n}\n\nexport const serialize = (obj: SwrKeyObject) => {\n // 因为键的顺序会影响序列化结果,所以需要先排序。\n const sortedObj = deepSortObject(obj)\n return JSON.stringify(sortedObj)\n}\n\nexport const deserialize = (key: string) => JSON.parse(key) as SwrKeyObject\n\n// 生成 SWR 的 key,用于缓存请求结果。\nexport function genSwrKey(props: QueryListProps, payload?: QueryListPayload) {\n const { action, getParams, getBody, method, onePage } = props\n const { url, query } = qs.parseUrl(action)\n const { page, size, formValues } = payload ?? {}\n\n const params = Object.assign(\n query,\n typeof getParams === 'function'\n ? getParams?.({\n page,\n size,\n formValues,\n })\n : method === 'GET'\n ? onePage\n ? formValues\n : {\n ...formValues,\n page,\n size,\n }\n : {},\n )\n\n const body =\n typeof getBody === 'function'\n ? getBody?.({ page, size, formValues })\n : method === 'POST'\n ? onePage\n ? formValues\n : {\n ...formValues,\n page,\n size,\n }\n : undefined\n\n return serialize({\n url,\n body,\n params,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { mutate } from 'swr'\nimport type { MutatorCallback, MutatorOptions } from 'swr/_internal'\nimport { create } from 'zustand'\nimport type { QueryListDataType, QueryListProps } from '../components/QueryList'\nimport { genSwrKey } from '../components/QueryList/utils'\n\ntype QueryListMutator = <Item = any>(\n action: string,\n data?: QueryListDataType<Item> | Promise<QueryListDataType<Item>> | MutatorCallback<QueryListDataType<Item>>,\n opts?: MutatorOptions<QueryListDataType<Item>>,\n) => void\n\nexport interface QueryListPayload<FormValues = any> {\n page?: number\n size?: number\n formValues?: FormValues\n}\n\nexport interface QueryListState {\n swrKeyMap: Map<string, string | null>\n payloadMap: Map<string, QueryListPayload>\n propsMap: Map<string, QueryListProps>\n getSwrkKey(action: string): string | null\n updateSwrKey(action: string, key?: string | null): void\n getPayload: (action: string) => QueryListPayload | undefined\n setPayload(action: string, payload: Partial<QueryListPayload>): void\n mutate: QueryListMutator\n refresh(action: string, page?: number): void\n removeFromStore(action: string): void\n setProps: (action: string, props: QueryListProps) => void\n}\n\nexport const useQueryListStore = create<QueryListState>((set, get) => ({\n swrKeyMap: new Map(),\n payloadMap: new Map(),\n propsMap: new Map(),\n getSwrkKey(action) {\n const { swrKeyMap } = get()\n return swrKeyMap.get(action) ?? null\n },\n updateSwrKey(action, key) {\n const { propsMap, payloadMap, swrKeyMap, getSwrkKey } = get()\n const prevKey = getSwrkKey(action)\n\n if (!propsMap.has(action)) {\n throw new Error(`The action \"${action}\" is not registered in QueryList`)\n }\n\n if (key === null) {\n swrKeyMap.set(action, null)\n mutate(prevKey, undefined, false)\n } else if (key === undefined) {\n const nextKey = genSwrKey(propsMap.get(action) as QueryListProps, payloadMap.get(action))\n\n if (prevKey !== nextKey) {\n set({ swrKeyMap: new Map(swrKeyMap).set(action, nextKey) })\n } else {\n mutate(prevKey, undefined, true)\n }\n } else {\n set({ swrKeyMap: new Map(swrKeyMap).set(action, key) })\n }\n },\n getPayload(action) {\n const { payloadMap } = get()\n return payloadMap.get(action)\n },\n setPayload(action, payload) {\n const { payloadMap, getPayload, propsMap } = get()\n const { defaultSize } = propsMap.get(action) ?? {}\n set({\n payloadMap: new Map(payloadMap).set(action, {\n page: 1,\n size: defaultSize,\n ...(getPayload(action) ?? {}),\n ...payload,\n }),\n })\n },\n mutate: (action, data, opts) => {\n const { swrKeyMap } = get()\n const swrKey = swrKeyMap.get(action)\n mutate(swrKey, data, opts)\n },\n refresh(action, page) {\n const { setPayload, updateSwrKey, payloadMap } = get()\n setPayload(action, { page: page ?? payloadMap.get(action)?.page })\n updateSwrKey(action)\n },\n removeFromStore(action) {\n get().swrKeyMap.delete(action)\n get().payloadMap.delete(action)\n get().propsMap.delete(action)\n },\n setProps(action, props) {\n const { propsMap } = get()\n set({ propsMap: new Map(propsMap).set(action, props) })\n },\n}))\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const defaultProps = {\n method: 'GET',\n defaultSize: 10,\n refreshInterval: 0,\n getTotal: (response: any) => response.total,\n getDataSource: (response: any) => response.list,\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'\nimport useSWR from 'swr'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\nimport type { QueryListPayload } from '../../stores/queryList'\nimport { useQueryListStore } from '../../stores/queryList'\nimport type { ListResponse } from '../../types'\nimport type { RequestOptions } from '../../utils/request'\nimport { request } from '../../utils/request'\nimport FilterFormWrapper from '../FilterFormWrapper'\nimport { defaultProps } from './constants'\nimport { deserialize } from './utils'\n\nexport enum QueryListAction {\n Confirm = 'confirm',\n Reset = 'reset',\n Jump = 'jump',\n Init = 'init',\n}\n\nexport interface QueryListDataType<Item> {\n dataSource: Item[]\n total: number\n}\n\nexport interface QueryListRef<Item = any, Values = any, Response = any> {\n data: QueryListDataType<Item>\n internalForm: FormInstance<Values>\n originalData: Response | undefined\n}\n\nexport interface QueryListProps<Item = any, Values = any, Response = any>\n extends Pick<\n TableProps<Item>,\n 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered' | 'components'\n > {\n code?: string\n isGlobal?: boolean\n action: string\n method?: string\n refreshInterval?: number\n // 无分页\n onePage?: boolean\n defaultSize?: number\n headers?: RequestOptions['headers'] | ((payload: QueryListPayload<Values> | undefined) => RequestOptions['headers'])\n form?: FormInstance<Values>\n getBody?: (payload: QueryListPayload<Values>) => RequestOptions['body']\n getParams?: (payload: QueryListPayload<Values>) => RequestOptions['params']\n renderForm?: (internalForm: FormInstance<Values>) => ReactNode\n extra?: (opts: { form: FormInstance<Values>; data: Response | undefined }) => ReactNode\n onTableChange?: TableProps<Item>['onChange']\n afterSuccess?: (action: QueryListAction, data: QueryListDataType<Item>) => void\n // 默认的接口返回类型为 ListResponse<Item>,当符合时无需设置 getTotal、getDataSource 就可以让组件正确获取 total 与 dataSource。\n getTotal?: (response: Response) => number\n getDataSource?: (response: Response) => Item[]\n}\n\nconst InternalQueryList = <Item extends object, Values extends object | undefined, Response = ListResponse<Item>>(\n props: QueryListProps<Item, Values, Response>,\n ref: Ref<QueryListRef<Item, Values, Response>>,\n) => {\n const internalProps = { ...defaultProps, ...props }\n\n const {\n action,\n code,\n headers,\n isGlobal,\n onePage,\n method,\n form,\n getBody,\n getParams,\n defaultSize,\n refreshInterval,\n extra,\n renderForm,\n afterSuccess,\n getTotal,\n getDataSource,\n onTableChange,\n ...tableProps\n } = internalProps\n\n const t = useTranslation()\n let [internalForm] = Form.useForm<Values>()\n internalForm = form || internalForm\n const { accessible, isLoading } = usePermission(code, isGlobal)\n const listAction = useRef<QueryListAction>(QueryListAction.Init)\n const { setProps, getPayload, setPayload, getSwrkKey, updateSwrKey, removeFromStore } = useQueryListStore()\n const shouldPoll = useRef(false)\n const [originalData, setOriginalData] = useState<Response>()\n\n const { data, isValidating } = useSWR(\n getSwrkKey(action),\n async key => {\n const { url, params, body } = deserialize(key)\n const payload = getPayload(action)\n const response = await request<Response>(url, {\n method,\n body,\n params,\n isGlobal,\n headers: typeof headers === 'function' ? headers(payload) : headers,\n })\n\n setOriginalData(response.data)\n\n return {\n dataSource: getDataSource(response.data),\n total: getTotal(response.data) ?? 0,\n }\n },\n {\n fallbackData: {\n dataSource: [],\n total: 0,\n },\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n refreshInterval: shouldPoll.current ? refreshInterval : 0,\n onSuccess(listData) {\n shouldPoll.current = true\n afterSuccess?.(listAction.current, listData)\n },\n onError() {\n shouldPoll.current = false\n },\n },\n )\n\n const onConfirm = async () => {\n listAction.current = QueryListAction.Confirm\n setPayload(action, { page: 1, formValues: internalForm.getFieldsValue() })\n\n try {\n await internalForm.validateFields()\n updateSwrKey(action)\n } catch (error) {\n updateSwrKey(action, null)\n }\n }\n\n const onReset = async () => {\n listAction.current = QueryListAction.Reset\n internalForm.resetFields()\n setPayload(action, { page: 1, formValues: internalForm.getFieldsValue() })\n\n try {\n await internalForm.validateFields({ validateOnly: true })\n updateSwrKey(action)\n } catch (error) {\n updateSwrKey(action, null)\n }\n }\n\n useEffect(() => {\n setProps(action, internalProps)\n\n return () => {\n // 组件卸载时清除缓存\n removeFromStore(action)\n }\n }, [])\n\n useEffect(() => {\n const init = async () => {\n if (accessible) {\n setPayload(action, { page: 1, size: defaultSize, formValues: internalForm.getFieldsValue() })\n await internalForm.validateFields({ validateOnly: true })\n updateSwrKey(action)\n }\n }\n\n init()\n }, [accessible])\n\n useImperativeHandle(ref, () => ({\n data,\n originalData,\n internalForm,\n }))\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const formRenderer = renderForm ? (\n <FilterFormWrapper isConfirming={isValidating} onReset={onReset} onConfirm={onConfirm}>\n {renderForm(internalForm)}\n </FilterFormWrapper>\n ) : (\n // 消除 Antd 的警告\n <Form form={internalForm} />\n )\n\n return (\n <div>\n {formRenderer}\n {extra && <div className=\"mt-2 mb-4\">{extra({ form: internalForm, data: originalData })}</div>}\n <Table\n {...tableProps}\n dataSource={data.dataSource}\n loading={isValidating}\n pagination={\n onePage\n ? false\n : {\n showSizeChanger: true,\n showQuickJumper: true,\n current: getPayload(action)?.page,\n pageSize: getPayload(action)?.size ?? defaultSize,\n total: data.total,\n onChange: async (currentPage: number, currentSize: number) => {\n listAction.current = QueryListAction.Jump\n setPayload(action, { page: currentPage, size: currentSize })\n updateSwrKey(action)\n },\n }\n }\n onChange={onTableChange}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends object,\n Values extends object | undefined,\n Response = ListResponse<Item>,\n>(\n props: QueryListProps<Item, Values, Response> & { ref?: Ref<QueryListRef<Item, Values, Response>> },\n) => ReactElement\n\nexport default QueryList\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { create } from 'zustand'\n\ninterface ModalState {\n open: Map<number, boolean>\n getOpen: (uuid: number) => boolean\n show: (uuid: number) => void\n hide: (uuid: number) => void\n hideAll: () => void\n}\n\nexport const useModalStore = create<ModalState>((set, get) => ({\n open: new Map(),\n getOpen: uuid => get().open.get(uuid) ?? false,\n show(uuid) {\n set({ open: new Map(get().open).set(uuid, true) })\n },\n hide(uuid) {\n set({ open: new Map(get().open).set(uuid, false) })\n },\n hideAll() {\n set({ open: new Map() })\n },\n}))\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n}\n\nlet id = 0\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, ...modalProps } = props\n const uuid = useMemo(() => ++id, [])\n const modalStore = useModalStore()\n const open = modalStore.getOpen(uuid)\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n const isRenderFunction = typeof content === 'function'\n\n const show = () => {\n modalStore.show(uuid)\n }\n\n const hide = () => {\n modalStore.hide(uuid)\n }\n\n const onCancel: ModalProps['onCancel'] = () => {\n hide()\n }\n\n const onOk = async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } finally {\n setConfirmLoading(false)\n }\n }\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? content({ hide }) : content}\n </Modal>\n )\n\n return {\n uuid,\n show,\n hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport type { UseModalOperation, UseModalProps } from './modal'\nimport { useModal } from './modal'\n\ntype RecursivePartial<T> = NonNullable<T> extends object\n ? {\n [P in keyof T]?: NonNullable<T[P]> extends (infer U)[]\n ? RecursivePartial<U>[]\n : NonNullable<T[P]> extends object\n ? RecursivePartial<T[P]>\n : T[P]\n }\n : T\n\nexport interface UseFormModalProps<Values, ExtraValues>\n extends Omit<UseModalProps, 'afterClose' | 'onConfirm' | 'content'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n}\n\nexport function useFormModal<Values, ExtraValues extends NonNullable<unknown> = NonNullable<unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n) {\n const { content, form, formProps, onConfirm, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n let [internalForm] = Form.useForm<Values>()\n internalForm = form || internalForm\n\n const isRenderFunction = typeof content === 'function'\n\n const hanldeConfirm = async () => {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues as ExtraValues)\n hide()\n }\n\n const afterClose = () => {\n internalForm.resetFields()\n }\n\n const { uuid, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? content(internalExtraValues as ExtraValues, operation) : content}\n </Form>\n ),\n onConfirm: hanldeConfirm,\n afterClose,\n })\n\n const onShow = ({\n initialValues,\n extraValues,\n }: {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n } = {}) => {\n if (extraValues) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n }\n\n return {\n uuid,\n show: onShow,\n hide,\n modal,\n }\n}\n","import { Button, Result } from 'antd'\nimport { useNavigate } from 'react-router-dom'\nimport { useToolkitsContext } from '../../components/ContextProvider'\nimport { useTranslation } from '../../hooks/i18n'\n\nconst NotFound = () => {\n const navigate = useNavigate()\n const t = useTranslation()\n const { notFoundRedirectUrl } = useToolkitsContext()\n\n return (\n <div className=\"h-screen flex justify-center items-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n notFoundRedirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(notFoundRedirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Col, Form, Input, Row, Select, Typography } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\nimport QueryList from '../../components/QueryList'\nimport type { OperationLogListItem } from '../../features/log'\nimport { useTranslation } from '../../hooks/i18n'\n\nconst { Option } = Select\nconst { Paragraph } = Typography\n\nconst OperationLogList: FC = () => {\n const t = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'id',\n title: 'ID',\n dataIndex: 'id',\n width: 100,\n },\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return (\n <Paragraph>\n <pre className=\"max-h-32 overflow-auto\">{value}</pre>\n </Paragraph>\n )\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return (\n <Paragraph>\n <pre className=\"max-h-32 overflow-auto\">{value}</pre>\n </Paragraph>\n )\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n {\n List: OperationLogListItem[]\n Total: number\n }\n >\n tableLayout=\"fixed\"\n rowKey=\"id\"\n columns={columns}\n action=\"/api/usystem/log/list\"\n getParams={({ page, size, formValues }) => ({ ...formValues, page, size })}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n renderForm={form => (\n <Form form={form}>\n <Row gutter={10}>\n <Col span={4}>\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n </Col>\n <Col span={4}>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n </Col>\n <Col>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear style={{ width: '100px' }}>\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n </Col>\n <Col span={4}>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default OperationLogList\n","export const SSO_URL = 'https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1'\n","import { Alert, Button, Divider, Form, Input, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { Navigate, useLocation, useSearchParams } from 'react-router-dom'\nimport useSWRImmutable from 'swr/immutable'\nimport backgroundUrl from '../../assets/background.svg'\nimport logoUrl from '../../assets/logo.png'\nimport { useToolkitsContext } from '../../components/ContextProvider'\nimport { SSO_URL } from '../../constants'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { request } from '../../utils/request'\n\nconst SignIn: FC = () => {\n const [searchParams] = useSearchParams()\n const location = useLocation()\n const { token, setToken } = useTokenStore()\n const t = useTranslation()\n const { signInPageTitle, localeDropdownMenu, signInSuccessRedirectUrl, idaasRedirectUrl } = useToolkitsContext()\n\n useSWRImmutable(\n searchParams.has('ticket') ? `/api/usystem/user/login?ticket=${searchParams.get('ticket')}` : null,\n url => request<{ token: string }>(url),\n {\n suspense: true,\n onSuccess: data => {\n setToken(data.data.token)\n },\n },\n )\n\n if (token) {\n if (signInSuccessRedirectUrl) {\n return <Navigate replace to={signInSuccessRedirectUrl} />\n }\n\n return <Navigate replace to=\"/\" />\n }\n\n return (\n <div className=\"w-screen h-screen relative flex\">\n {localeDropdownMenu && <div className=\"absolute top-16 right-16 z-10\">{localeDropdownMenu}</div>}\n <div className=\"absolute left-14 top-6\">\n <Space align=\"center\">\n <img src={logoUrl} className=\"w-12\" alt=\"logo\" />\n {signInPageTitle}\n </Space>\n </div>\n <div className=\"flex-1 flex justify-center items-center bg-slate-50\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-10/12\" />\n </div>\n <div className=\"w-[650px] relative top-0 left-0 right-0 bottom-0\">\n <div className=\"absolute top-1/2 -translate-y-1/2 left-0 right-0\">\n <div className=\"-translate-y-10 px-36\">\n <div className=\"flex flex-col justify-center\">\n <div className=\"h-10\">\n {location.state?.notUser && <Alert banner closable message={t('SignIn.notRegistered')} type=\"error\" />}\n </div>\n <Typography.Title level={2}>{t('SignIn.welcome')}</Typography.Title>\n <div className=\"mt-4\">\n <Form layout=\"vertical\" autoComplete=\"off\">\n <Form.Item label={t('global.username')} name=\"username\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.password')} name=\"password\" rules={[{ required: true }]}>\n <Input.Password />\n </Form.Item>\n <Form.Item>\n <Button block type=\"primary\" shape=\"round\" htmlType=\"submit\">\n {t('global.signIn')}\n </Button>\n </Form.Item>\n </Form>\n </div>\n <Divider plain dashed>\n {t('SignIn.thirdParty')}\n </Divider>\n <div className=\"flex justify-center items-center\">\n <Button block shape=\"round\" href={`${SSO_URL}/login?service=${idaasRedirectUrl}`} target=\"_self\">\n <img src={logoUrl} className=\"w-[18px] mr-2 -mb-0.5\" alt=\"logo\" />\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n","import useSWR from 'swr'\nimport useSWRMutation from 'swr/mutation'\nimport { useToolkitsContext } from '../../../components/ContextProvider'\nimport type { Game } from '../../../components/GameSelect'\nimport { usePermission } from '../../../hooks/permission'\nimport { request } from '../../../utils/request'\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllPermissions() {\n return useSWR('/api/usystem/user/allPermssions', url =>\n request<PermissionEnumItem[]>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useAllPermissionsV2() {\n return useSWR('/api/usystem/user/allPermissionsV2', url =>\n request<{\n game: Game[]\n permission: PermissionEnumItem[]\n }>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useAllRoles() {\n const { accessible } = usePermission('200005', true)\n return useSWR(accessible ? '/api/usystem/role/all' : null, url =>\n request<RoleEnumItem[]>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useRole(name: string) {\n const { usePermissionApiV2 } = useToolkitsContext()\n return useSWR(`/api/usystem/role/${usePermissionApiV2 ? 'infoV2' : 'info'}?name=${name}`, (url: string) =>\n request<RoleV1 | RoleV2>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useCreateRole() {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return useSWRMutation(\n usePermissionApiV2 ? '/api/usystem/role/createV2' : '/api/usystem/role/create',\n (\n url: string,\n {\n arg,\n }: {\n arg: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useUpdateRole() {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return useSWRMutation(\n usePermissionApiV2 ? '/api/usystem/role/updateV2' : '/api/usystem/role/update',\n (\n url: string,\n {\n arg,\n }: {\n arg: { id: number; name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useRemoveRole() {\n return useSWRMutation(\n '/api/usystem/role/delete',\n (\n url,\n {\n arg,\n }: {\n arg: { id: number; name: string }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useCreateUser() {\n return useSWRMutation(\n '/api/usystem/user/create',\n (\n url,\n {\n arg,\n }: {\n arg: { name: string; roles: string[] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useUpdateUser() {\n return useSWRMutation(\n '/api/usystem/user/update',\n (\n url,\n {\n arg,\n }: {\n arg: { id: string; name: string; roles: string[] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useRemoveUser() {\n return useSWRMutation(\n '/api/usystem/user/delete',\n (\n url,\n {\n arg,\n }: {\n arg: { id: string; name: string }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n","import { Checkbox, Col, Collapse, Row } from 'antd'\nimport type { CheckboxChangeEvent } from 'antd/es/checkbox'\nimport type { FC } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport type { PermissionEnumItem } from '../../types'\n\ninterface PermissionCollapseProps {\n expand?: boolean\n permissions?: PermissionEnumItem[]\n readonly?: boolean\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst PermissionCollapse: FC<PermissionCollapseProps> = props => {\n const { permissions, readonly, expand, value, onChange } = props\n const [activeKey, setActiveKey] = useState<string[]>([])\n const [checkedMap, setCheckedMap] = useState<Record<string, boolean>>({})\n const [internalValue, setInternalValue] = useState<string[]>(value ?? [])\n const t = useTranslation()\n\n const onCollapseChange = useCallback((key: string | string[]) => {\n setActiveKey(key as string[])\n }, [])\n\n const getCheckedValue = (checkedValue: boolean, codes: string[]) => {\n let tempValue: string[] = []\n\n if (checkedValue) {\n tempValue = [...new Set(internalValue.concat(codes))]\n } else {\n tempValue = internalValue.slice()\n\n codes.forEach(code => {\n const index = tempValue.findIndex(item => item === code)\n if (index > -1) {\n tempValue.splice(index, 1)\n }\n })\n }\n\n return tempValue\n }\n\n const onCheckChange = (e: CheckboxChangeEvent, codes: string[]) => {\n const checkedValue = getCheckedValue(e.target.checked, codes)\n setInternalValue(checkedValue)\n onChange?.(checkedValue)\n }\n\n useEffect(() => {\n setInternalValue(value ?? [])\n }, [value])\n\n useEffect(() => {\n if (expand) {\n setActiveKey((permissions ?? []).map(({ category }) => category))\n }\n }, [expand, permissions])\n\n useEffect(() => {\n const checkedValue = (permissions ?? []).reduce(\n (acc, curr) => {\n acc[curr.category] = curr.permissions.every(item => internalValue?.includes(item.value))\n return acc\n },\n {} as Record<string, boolean>,\n )\n\n setCheckedMap(checkedValue)\n }, [internalValue, permissions])\n\n return (\n <Collapse\n style={{ width: '100%' }}\n collapsible=\"header\"\n activeKey={activeKey}\n items={(permissions ?? []).map(item => ({\n key: item.category,\n label: item.category,\n extra: !readonly && (\n <Checkbox\n checked={checkedMap[item.category]}\n onChange={e => {\n onCheckChange(\n e,\n item.permissions.map(permission => permission.value),\n )\n }}\n >\n {t('global.selectAll')}\n </Checkbox>\n ),\n children: (\n <Checkbox.Group style={{ width: '100%' }} value={internalValue} disabled={readonly}>\n <Row gutter={[10, 10]} style={{ width: '100%' }}>\n {item.permissions.map(permission => (\n <Col key={permission.value} span={6}>\n <Checkbox\n value={permission.value}\n onChange={e => {\n onCheckChange(e, [permission.value])\n }}\n >\n {permission.label}\n </Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n ),\n }))}\n onChange={onCollapseChange}\n />\n )\n}\n\nexport default PermissionCollapse\n","import { Skeleton, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport { useAllPermissions } from '../../hooks'\nimport type { RoleV1 } from '../../types'\nimport PermissionCollapse from '../PermissionCollapse'\nimport type { PermissionListPropsBase } from '../PermissionList'\n\nconst { Text } = Typography\n\ninterface PermissionListV1Props extends PermissionListPropsBase {\n value?: RoleV1['permissions']\n onChange?: (checkedValue: RoleV1['permissions']) => void\n}\n\nconst PermissionListV1: FC<PermissionListV1Props> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permissions, isLoading, error } = useAllPermissions()\n const t = useTranslation()\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n return (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value}\n permissions={permissions}\n readonly={readonly}\n expand={expand}\n onChange={onChange}\n />\n </Skeleton>\n )\n}\n\nexport default PermissionListV1\n","import { Button, Card, Divider, Empty, Select, Skeleton, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport { useAllPermissionsV2 } from '../../hooks'\nimport type { RoleV2 } from '../../types'\nimport PermissionCollapse from '../PermissionCollapse'\nimport type { PermissionListPropsBase } from '../PermissionList'\n\nconst { Text } = Typography\nconst { Option } = Select\n\ninterface PermissionListV2Props extends PermissionListPropsBase {\n value?: RoleV2['permissions']\n onChange?: (checkedValue: RoleV2['permissions']) => void\n}\n\nconst PermissionListV2: FC<PermissionListV2Props> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: { permission, game: games } = {}, isLoading, error } = useAllPermissionsV2()\n const [gameList, setGameList] = useState<{ gameId: string; permissions: string[] }[]>([])\n const globalPermissions = permission?.filter(item => item.is_common)\n const gamePermissions = permission?.filter(item => !item.is_common)\n const t = useTranslation()\n\n useEffect(() => {\n const list: { gameId: string; permissions: string[] }[] = []\n\n Object.keys(value ?? {}).forEach(key => {\n if (key !== 'global') {\n list.push({ gameId: key, permissions: value?.[key] ?? [] })\n }\n })\n\n setGameList(list)\n }, [value])\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n const addGame = () => {\n setGameList(prev => [...prev, { gameId: '', permissions: [] }])\n }\n\n const removeGame = (index: number) => {\n setGameList(prev => prev.filter((_, i) => i !== index))\n }\n\n return (\n <div className=\"flex flex-col w-full\">\n <div className=\"mb-12\">\n <Divider dashed>{t('PermissionList.baseSectionTitle')}</Divider>\n </div>\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.global}\n readonly={readonly}\n permissions={globalPermissions}\n expand={expand}\n onChange={newValue => {\n onChange?.({\n ...value,\n global: newValue,\n })\n }}\n />\n </Skeleton>\n <div className=\"my-12\">\n <Divider dashed>{t('PermissionList.gameSectionTitle')}</Divider>\n </div>\n {gameList.map((item, index) => (\n <Card\n title={\n <Space>\n <Text>{t('global.game')}</Text>\n {readonly ? (\n <Text>{games?.find(game => game.id === item.gameId)?.name}</Text>\n ) : (\n <Select\n disabled={readonly}\n value={gameList[index].gameId || undefined}\n style={{ width: '160px' }}\n placeholder={t('PermissionList.gameSelectPlaceholder')}\n onChange={selectedValue => {\n setGameList(pev => {\n const temp = pev.slice()\n temp[index].gameId = selectedValue\n return temp\n })\n }}\n >\n {games?.map(game => (\n <Option key={game.id} value={game.id} disabled={gameList.some(({ gameId }) => gameId === game.id)}>\n {game.name}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n }\n key={index}\n className=\"mb-6\"\n extra={\n !readonly && (\n <Button\n type=\"link\"\n onClick={() => {\n removeGame(index)\n }}\n >\n {t('PermissionList.removeText')}\n </Button>\n )\n }\n >\n {gameList[index].gameId ? (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.[gameList[index].gameId]}\n readonly={readonly}\n expand={expand}\n permissions={gamePermissions}\n onChange={newValue => {\n onChange?.({\n ...value,\n [gameList[index].gameId]: newValue,\n })\n }}\n />\n </Skeleton>\n ) : (\n <Empty description={t('PermissionList.gameSectionDescription')} />\n )}\n </Card>\n ))}\n {!readonly && (\n <Button block type=\"dashed\" onClick={addGame}>\n {t('PermissionList.addText')}\n </Button>\n )}\n </div>\n )\n}\n\nexport default PermissionListV2\n","import type { FC } from 'react'\nimport { useToolkitsContext } from '../../../../components/ContextProvider'\nimport type { RoleV1, RoleV2 } from '../../types'\nimport PermissionListV1 from '../PermissionListV1'\nimport PermissionListV2 from '../PermissionListV2'\n\nexport interface PermissionListPropsBase {\n expand?: boolean\n readonly?: boolean\n}\n\ninterface PermissionListProps extends PermissionListPropsBase {\n value?: RoleV1['permissions'] | RoleV2['permissions']\n onChange?: (checkedValue: RoleV1['permissions'] | RoleV2['permissions']) => void\n}\n\nconst PermissionList: FC<PermissionListProps> = (props: PermissionListProps) => {\n const { value } = props\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return (\n <>\n {usePermissionApiV2 ? (\n <PermissionListV2 {...props} value={value as RoleV2['permissions']} />\n ) : (\n <PermissionListV1 {...props} value={value as RoleV1['permissions']} />\n )}\n </>\n )\n}\n\nexport default PermissionList\n","export interface PermissionEnumItem {\n category: string\n is_common?: boolean\n permissions: {\n label: string\n value: string\n route: string\n }[]\n}\n\nexport interface RoleEnumItem {\n id: string\n name: string\n}\n\nexport interface RoleListItem {\n id: number\n name: string\n ctime: string\n}\n\nexport interface RoleV1 {\n id: number\n name: string\n ctime: string\n permissions: string[]\n}\n\nexport interface RoleV2 {\n id: number\n name: string\n ctime: string\n permissions: Record<string, string[]>\n}\n\nexport interface UserListItem {\n id: string\n name: string\n ctime: string\n roles: string[]\n}\n","import PermissionList from './components/PermissionList'\n\nexport * from './hooks'\nexport * from './types'\nexport { PermissionList }\n","import { UserAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Col, Form, Input, Row, Select, Space, Tag } from 'antd'\nimport { produce } from 'immer'\nimport type { FC } from 'react'\nimport { Link } from 'react-router-dom'\nimport Highlight from '../../../components/Highlight'\nimport PermissionButton from '../../../components/PermissionButton'\nimport QueryList from '../../../components/QueryList'\nimport type { UserListItem } from '../../../features/permission'\nimport { useAllRoles, useCreateUser, useRemoveUser, useUpdateUser } from '../../../features/permission'\nimport { useFormModal } from '../../../hooks/formModal'\nimport { useTranslation } from '../../../hooks/i18n'\nimport { useQueryListStore } from '../../../stores/queryList'\n\nconst { Option } = Select\n\nexport const action = '/api/usystem/user/list'\n\nfunction useCreateModal() {\n const { message } = App.useApp()\n const create = useCreateUser()\n const { data: roles, isLoading } = useAllRoles()\n const { refresh } = useQueryListStore()\n const t = useTranslation()\n\n return useFormModal<{ id: string; name: string; roles: string[] }>({\n title: t('UserList.createTitle'),\n formProps: {\n labelCol: { flex: '80px' },\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select allowClear mode=\"multiple\" loading={isLoading}>\n {(roles ?? []).map(role => (\n <Option value={role.name} key={role.id}>\n {role.name}\n </Option>\n ))}\n </Select>\n </Form.Item>\n </>\n ),\n async onConfirm(values) {\n await create.trigger(values)\n refresh(action, 1)\n message.success(t('UserList.createSuccessfully'))\n },\n })\n}\n\nfunction useUpdateUserModal() {\n const { message } = App.useApp()\n const update = useUpdateUser()\n const { data: roles, isLoading } = useAllRoles()\n const { mutate } = useQueryListStore()\n const t = useTranslation()\n\n return useFormModal<{ id: string; name: string; roles: string[] }, { id: string }>({\n title: t('UserList.updateTitle'),\n formProps: {\n labelCol: { flex: '80px' },\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input readOnly />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n mode=\"multiple\"\n loading={isLoading}\n options={roles?.map(role => ({\n label: role.name,\n value: role.name,\n }))}\n />\n </Form.Item>\n </>\n ),\n async onConfirm(values, extraValues) {\n await update.trigger(values)\n mutate<UserListItem>(\n action,\n prev => {\n return produce(prev, draft => {\n if (draft?.dataSource) {\n const index = draft.dataSource?.findIndex(item => item.id === extraValues?.id)\n if (index !== -1) {\n draft.dataSource[index].roles = values.roles\n }\n }\n })\n },\n { revalidate: false },\n )\n message.success(t('UserList.updateSuccessfully'))\n },\n })\n}\n\nconst UserList: FC = () => {\n const { modal, message } = App.useApp()\n const remove = useRemoveUser()\n const { mutate } = useQueryListStore()\n const { show: showCreateModal, modal: createModal } = useCreateModal()\n const { show: showUpdateModal, modal: updateModal } = useUpdateUserModal()\n const t = useTranslation()\n\n const columns: TableColumnsType<UserListItem> = [\n {\n title: t('global.name'),\n dataIndex: 'name',\n key: 'name',\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.role'),\n dataIndex: 'roles',\n key: 'roles',\n width: '40%',\n render(value: string[]) {\n return (\n <Row gutter={[4, 4]}>\n {(value || []).map((item: string) => (\n <Col key={item}>\n {item === 'root' ? (\n <Tag color=\"#f50\">{item}</Tag>\n ) : (\n <Tag color=\"#ff5a00\">\n <Link to={`/permission/role/${item}`}>{item}</Link>\n </Tag>\n )}\n </Col>\n ))}\n </Row>\n )\n },\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'Ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (value: UserListItem) => (\n <Space>\n <PermissionButton\n isGlobal\n size=\"small\"\n type=\"link\"\n code=\"100003\"\n onClick={() => {\n showUpdateModal({\n initialValues: {\n name: value.name,\n roles: value.roles,\n },\n extraValues: {\n id: value.id,\n },\n })\n }}\n >\n {t('global.update')}\n </PermissionButton>\n <PermissionButton\n isGlobal\n danger\n size=\"small\"\n code=\"100004\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('UserList.deleteTitle'),\n content: (\n <Highlight texts={[value.name]}>{t('UserList.deleteContent', { user: value.name })}</Highlight>\n ),\n async onOk() {\n await remove.trigger({\n id: value.id,\n name: value.name,\n })\n mutate(action, prev => {\n return produce(prev, draft => {\n const index = draft?.dataSource?.findIndex(item => item.id === value.id)\n if (index) {\n draft?.dataSource?.splice(index, 1)\n }\n })\n })\n message.success(t('UserList.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </PermissionButton>\n </Space>\n ),\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.user')}\n extra={\n <PermissionButton\n isGlobal\n type=\"primary\"\n icon={<UserAddOutlined />}\n code=\"100002\"\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('UserList.createTitle')}\n </PermissionButton>\n }\n >\n <QueryList<UserListItem, undefined, { List: UserListItem[]; Total: number }>\n isGlobal\n code=\"100001\"\n action={action}\n rowKey=\"id\"\n columns={columns}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default UserList\n","import { UsergroupAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Form, Input, Space } from 'antd'\nimport { produce } from 'immer'\nimport { Link } from 'react-router-dom'\nimport { useToolkitsContext } from '../../../components/ContextProvider'\nimport Highlight from '../../../components/Highlight'\nimport PermissionButton from '../../../components/PermissionButton'\nimport QueryList from '../../../components/QueryList'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../../../features/permission'\nimport { PermissionList, useCreateRole, useRemoveRole, useUpdateRole } from '../../../features/permission'\nimport { useFormModal } from '../../../hooks/formModal'\nimport { useTranslation } from '../../../hooks/i18n'\nimport { usePermission } from '../../../hooks/permission'\nimport { useQueryListStore } from '../../../stores/queryList'\nimport { request } from '../../../utils/request'\n\nconst action = '/api/usystem/role/list'\n\nconst useCreateModal = () => {\n const { message } = App.useApp()\n const { refresh } = useQueryListStore()\n const create = useCreateRole()\n const t = useTranslation()\n\n const onConfirm = async (values: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) => {\n await create.trigger({\n name: `role_${values.name}`,\n permissions: values.permissions,\n })\n refresh(action, 1)\n message.success(t('RoleList.createSuccessfully'))\n }\n\n return useFormModal<{\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }>({\n title: t('RoleList.createTitle'),\n width: '50vw',\n formProps: {\n layout: 'vertical',\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input addonBefore=\"role_\" />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n ),\n onConfirm,\n })\n}\n\nconst useUpdateModal = () => {\n const { message } = App.useApp()\n const { mutate } = useQueryListStore()\n const update = useUpdateRole()\n const t = useTranslation()\n\n return useFormModal<\n {\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n },\n {\n id: number\n }\n >({\n title: t('RoleList.updateTitle'),\n width: '50vw',\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input readOnly addonBefore=\"role_\" />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n ),\n onConfirm: async (values, extraValues) => {\n await update.trigger({\n id: extraValues?.id as number,\n name: `role_${values.name}`,\n permissions: values.permissions,\n })\n mutate(\n action,\n prev =>\n produce(prev, draft => {\n const match = draft?.dataSource?.find(item => item.id === extraValues?.id)\n\n if (match) {\n match.permissions = values.permissions\n }\n }),\n { revalidate: false },\n )\n message.success(t('RoleList.updateSuccessfully'))\n },\n })\n}\n\nconst RoleList = () => {\n const { accessible: viewable } = usePermission('200005', true)\n const { modal, message } = App.useApp()\n const { usePermissionApiV2 } = useToolkitsContext()\n const remove = useRemoveRole()\n const { mutate } = useQueryListStore()\n const { show: showCreateModal, modal: createModal } = useCreateModal()\n const { show: showUpdateModal, modal: updateModal } = useUpdateModal()\n const t = useTranslation()\n\n const columns: TableColumnsType<RoleListItem> = [\n {\n title: t('global.name'),\n key: 'name',\n render(value: RoleListItem) {\n if (viewable) {\n return (\n <Link to={`${value.name}`} relative=\"path\">\n {value.name}\n </Link>\n )\n } else {\n return <>{value.name}</>\n }\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (value: RoleListItem) => {\n return (\n <Space size=\"small\">\n <PermissionButton\n isGlobal\n code=\"200003\"\n size=\"small\"\n type=\"link\"\n onClick={async () => {\n const { data: role } = await request<RoleV1 | RoleV2>(\n `/api/usystem/role/info${usePermissionApiV2 ? 'V2' : ''}?name=${value.name}`,\n { isGlobal: true },\n )\n showUpdateModal({\n initialValues: {\n permissions: role?.permissions,\n name: role?.name.replace(/^role_/, ''),\n },\n extraValues: {\n id: role?.id,\n },\n })\n }}\n >\n {t('global.edit')}\n </PermissionButton>\n <PermissionButton\n isGlobal\n danger\n code=\"200004\"\n size=\"small\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('RoleList.deleteTitle'),\n content: (\n <Highlight texts={[value.name]}>{t('RoleList.deleteContent', { role: value.name })}</Highlight>\n ),\n async onOk() {\n await remove.trigger({\n id: value.id,\n name: value.name,\n })\n mutate(action, prev => {\n return produce(prev, draft => {\n const index = draft?.dataSource?.findIndex(item => item.id === value.id)\n if (index) {\n draft?.dataSource?.splice(index, 1)\n }\n })\n })\n message.success(t('RoleList.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </PermissionButton>\n </Space>\n )\n },\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.role')}\n extra={\n <PermissionButton\n isGlobal\n type=\"primary\"\n code=\"200002\"\n icon={<UsergroupAddOutlined />}\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('RoleList.createTitle')}\n </PermissionButton>\n }\n >\n <QueryList<RoleListItem, undefined, { List: RoleListItem[]; Total: number }>\n isGlobal\n rowKey=\"name\"\n columns={columns}\n code=\"200001\"\n action={action}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default RoleList\n","import { Breadcrumb, Card, Descriptions, Skeleton } from 'antd'\nimport { Link, useParams } from 'react-router-dom'\nimport { PermissionList, useRole } from '../../../features/permission'\nimport { useTranslation } from '../../../hooks/i18n'\n\nconst RoleDetail = () => {\n const params = useParams()\n const { data, isLoading } = useRole(params.name as string)\n const t = useTranslation()\n\n return (\n <>\n <Breadcrumb\n style={{ marginBottom: 24 }}\n items={[\n {\n key: '1',\n title: <Link to=\"..\">{t('global.role')}</Link>,\n },\n {\n key: '2',\n title: params.name,\n },\n ]}\n />\n <Card title={t('RoleDetail.title')}>\n <Skeleton loading={isLoading}>\n <Descriptions column={3} layout=\"vertical\">\n <Descriptions.Item label={t('global.name')}>{data?.name}</Descriptions.Item>\n <Descriptions.Item label=\"ID\">{data?.id}</Descriptions.Item>\n <Descriptions.Item label={t('global.creationTime')}>{data?.ctime}</Descriptions.Item>\n </Descriptions>\n <PermissionList readonly value={data?.permissions} />\n </Skeleton>\n </Card>\n </>\n )\n}\n\nexport default RoleDetail\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nconst UserList = lazy(() => import('./UserList'))\nconst RoleList = lazy(() => import('./RoleList'))\nconst RoleDetail = lazy(() => import('./RoleDetail'))\n\nconst Permission = () => {\n return (\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n )\n}\n\nexport default Permission\n","import type { ContextState } from './components/ContextProvider'\nimport ContextProvider, { contextStore, useToolkitsContext } from './components/ContextProvider'\nimport type { DynamicTagsProps } from './components/DynamicTags'\nimport DynamicTags from './components/DynamicTags'\nimport type { FilterFormWrapperProps } from './components/FilterFormWrapper'\nimport FilterFormWrapper from './components/FilterFormWrapper'\nimport type { Game, GameState } from './components/GameSelect'\nimport GameSelect, { useGameStore } from './components/GameSelect'\nimport type { HighlightTextsProps } from './components/Highlight'\nimport Highlight from './components/Highlight'\nimport type { InfiniteListProps } from './components/InfiniteList'\nimport InfiniteList from './components/InfiniteList'\nimport Layout from './components/Layout'\nimport type { NavMenuItem } from './components/NavMenu'\nimport NavMenu from './components/NavMenu'\nimport type { PermissionButtonProps } from './components/PermissionButton'\nimport PermissionButton from './components/PermissionButton'\nimport type { PermissionGuardProps } from './components/PermissionGuard'\nimport PermissionGuard from './components/PermissionGuard'\nimport type { QueryListProps, QueryListRef } from './components/QueryList'\nimport QueryList, { QueryListAction } from './components/QueryList'\nimport UserWidget from './components/UserWidget'\nimport type { UseFormModalProps } from './hooks/formModal'\nimport { useFormModal } from './hooks/formModal'\nimport { useTranslation } from './hooks/i18n'\nimport { useModal, useModalStore } from './hooks/modal'\nimport { usePermission, usePermissions } from './hooks/permission'\nimport NotFound from './pages/NotFound'\nimport OperationLogList from './pages/OperationLogList'\nimport SignIn from './pages/SignIn'\nimport Permission from './pages/permission'\nimport { useQueryListStore } from './stores/queryList'\nimport type { TokenState } from './stores/token'\nimport { useTokenStore, useTokenValidation } from './stores/token'\nimport './styles/index.css'\nimport type { Locale } from './types'\nimport type { RequestOptions, RequestResponse } from './utils/request'\nimport { RequestError, request } from './utils/request'\nimport { withBaseRoutes, withLayout } from './utils/router'\nimport { mixedStorage } from './utils/storage'\n\nexport {\n ContextProvider,\n DynamicTags,\n FilterFormWrapper,\n GameSelect,\n Highlight,\n InfiniteList,\n Layout,\n NavMenu,\n NotFound,\n OperationLogList,\n Permission,\n PermissionButton,\n PermissionGuard,\n QueryList,\n QueryListAction,\n RequestError,\n SignIn,\n UserWidget,\n contextStore,\n mixedStorage,\n request,\n useFormModal,\n useGameStore,\n useModal,\n useModalStore,\n usePermission,\n usePermissions,\n useQueryListStore,\n useTokenStore,\n useTokenValidation,\n useToolkitsContext,\n useTranslation,\n withBaseRoutes,\n withLayout,\n type ContextState,\n type DynamicTagsProps,\n type FilterFormWrapperProps,\n type Game,\n type GameState,\n type HighlightTextsProps,\n type InfiniteListProps,\n type Locale,\n type NavMenuItem,\n type PermissionButtonProps,\n type PermissionGuardProps,\n type QueryListProps,\n type QueryListRef,\n type RequestOptions,\n type RequestResponse,\n type TokenState,\n type UseFormModalProps,\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, CSSProperties, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const t = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n const tagInputStyle: CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n style={tagInputStyle}\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n style={{ userSelect: 'none' }}\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n &nbsp;{t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport qs from 'query-string'\nimport type { Key, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport useSWRInfinite from 'swr/infinite'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\nimport { request } from '../../utils/request'\nimport FilterFormWrapper from '../FilterFormWrapper'\n\ninterface InfiniteListExtra<Values> {\n key: Key\n children: ReactNode | ((form: FormInstance<Values>) => ReactNode)\n}\n\nexport interface InfiniteListProps<Item, Values, Response>\n extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'> {\n action: string\n getRowKey: (response: Response) => any\n getDataSource: (data: Response[] | undefined) => Item[]\n code?: string\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n renderForm?: (form: FormInstance<Values>) => ReactNode\n transformArg: (values: Values, rowKey?: string) => Record<any, any>\n hasMore?: (data: Response[] | undefined) => boolean\n isGlobal?: boolean\n extras?: InfiniteListExtra<Values>[]\n}\n\nconst InfiniteList = <Item extends object, Values extends object | undefined = undefined, Response = any>(\n props: InfiniteListProps<Item, Values, Response>,\n) => {\n const {\n code,\n action,\n extras,\n headers,\n isGlobal,\n getRowKey,\n getDataSource,\n hasMore,\n renderForm,\n transformArg,\n ...tableProps\n } = props\n const t = useTranslation()\n const [form] = Form.useForm<Values>()\n const { accessible, isLoading } = usePermission(code)\n const [isValid, setIsValid] = useState(false)\n const [formValues, setFormValues] = useState<Values>()\n\n const getKey = (pageIndex: number, previousPageData: Response) => {\n if (!isValid) return null\n\n const rowKey = pageIndex !== 0 ? getRowKey(previousPageData) : undefined\n const args = transformArg(formValues as Values, rowKey)\n const queryString = qs.stringify(args)\n\n return queryString ? `${action}?${qs.stringify(args)}` : action\n }\n\n const {\n data,\n size,\n setSize,\n isValidating: isListValidating,\n } = useSWRInfinite(\n getKey,\n arg =>\n request<Response>(arg, {\n headers: typeof headers === 'function' ? headers(form) : headers,\n isGlobal,\n }).then(response => response.data),\n {\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n revalidateFirstPage: false,\n },\n )\n\n const dataSource = getDataSource(data)\n const isLoadingMore = isListValidating || (size > 0 && data && typeof data[size - 1] === 'undefined')\n const isReachingEnd = typeof hasMore !== 'undefined' ? !hasMore(data) : true\n const isEmpty = !dataSource || dataSource.length === 0\n\n const onConfirm = async () => {\n const values = await form.getFieldsValue()\n setFormValues(values)\n\n try {\n await form.validateFields()\n setSize(1)\n setIsValid(true)\n } catch (_) {\n setSize(0)\n setIsValid(false)\n }\n }\n\n const loadMore = () => {\n setSize(size + 1)\n }\n\n const onReset = async () => {\n try {\n form.resetFields()\n await form.validateFields({ validateOnly: true })\n setSize(1)\n } catch (_) {\n setSize(0)\n }\n }\n\n useEffect(() => {\n if (accessible) {\n form\n .validateFields({ validateOnly: true })\n .then(values => {\n setFormValues(values)\n setIsValid(true)\n })\n .catch(() => {\n setIsValid(false)\n })\n }\n }, [accessible])\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <>\n {renderForm ? (\n <FilterFormWrapper\n extras={extras?.map(extra => ({\n key: extra.key,\n children: typeof extra.children === 'function' ? extra.children(form) : extra.children,\n }))}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {renderForm(form)}\n </FilterFormWrapper>\n ) : (\n <Form form={form} />\n )}\n <Table {...tableProps} dataSource={dataSource} loading={isLoadingMore} pagination={false} />\n {!isEmpty && (\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n )}\n </>\n )\n}\n\nexport default InfiniteList\n","import * as Antd from 'antd'\nimport { Card, Divider, Empty, Space } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Suspense } from 'react'\nimport logoUrl from '../../assets/logo.png'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useToolkitsContext } from '../ContextProvider'\nimport GameSelect, { useGameStore } from '../GameSelect'\nimport NavMenu from '../NavMenu'\nimport UserWidget from '../UserWidget'\n\nconst { Spin, theme } = Antd\nconst { Header, Sider, Content } = Antd.Layout\n\nconst ContentGuard: FC<PropsWithChildren> = props => {\n const { children } = props\n const { usePermissionApiV2, hideGameSelect } = useToolkitsContext()\n const { game, isLoading, switching } = useGameStore()\n const t = useTranslation()\n\n if (isLoading || switching) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (usePermissionApiV2 && !hideGameSelect && !game) {\n return (\n <Card>\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n </Card>\n )\n }\n\n return children\n}\n\nconst Layout: FC<PropsWithChildren> = props => {\n const { children } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { appTitle, usePermissionApiV2, hideGameSelect, localeDropdownMenu, layoutHeaderExtras } = useToolkitsContext()\n\n return (\n <Antd.Layout hasSider className=\"h-screen\">\n <Sider\n width={256}\n style={{\n overflow: 'auto',\n height: '100vh',\n position: 'fixed',\n left: 0,\n top: 0,\n bottom: 0,\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }}\n theme=\"light\"\n >\n <div className=\"flex items-center px-6 py-4\">\n <img src={logoUrl} alt=\"logo\" className=\"w-8 h-8\" />\n <div className=\"ml-2\">{appTitle}</div>\n </div>\n <NavMenu />\n </Sider>\n <Antd.Layout className=\"ml-64\">\n <Header\n style={{\n padding: '0 24px',\n background: colorBgContainer,\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: colorBorder,\n }}\n >\n <div className=\"flex justify-between items-center h-full\">\n <div>{usePermissionApiV2 && !hideGameSelect && <GameSelect />}</div>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {layoutHeaderExtras?.map(extra => <span key={extra.key}>{extra.children}</span>)}\n {localeDropdownMenu}\n <UserWidget />\n </Space>\n </div>\n </Header>\n <Content className=\"p-6 bg-gray-50 over\">\n <Suspense\n fallback={\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '200px',\n }}\n />\n }\n >\n <ContentGuard>{children}</ContentGuard>\n </Suspense>\n </Content>\n </Antd.Layout>\n </Antd.Layout>\n )\n}\n\nexport default Layout\n","import type { MenuProps } from 'antd'\nimport { Menu } from 'antd'\nimport type {\n ItemType,\n MenuDividerType,\n MenuItemGroupType,\n MenuItemType,\n SubMenuType,\n} from 'antd/es/menu/hooks/useItems'\nimport type { ReactNode } from 'react'\nimport { memo, useEffect, useMemo } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\nimport { usePermissions } from '../../hooks/permission'\nimport { useToolkitsContext } from '../ContextProvider'\nimport { useNavStore } from '../NavMenu/store'\n\n// 扩展 antd Menu 的类型,使其支持一些我们想要的自定义字段。\ntype MenuItemType2 = Merge<\n MenuItemType,\n {\n // 权限编号\n code?: string\n // 前端路由地址\n route?: string\n }\n>\n\ntype SubMenuType2 = Merge<\n SubMenuType,\n {\n children?: NavMenuItem[]\n }\n>\n\ntype MenuItemGroupType2 = Merge<MenuItemGroupType, { children?: NavMenuItem[] }>\n\nexport type NavMenuItem = MenuItemType2 | SubMenuType2 | MenuItemGroupType2 | MenuDividerType | null\n\nconst withLink = (label?: ReactNode, route?: string): ReactNode => {\n if (route) {\n return <Link to={route}>{label}</Link>\n }\n\n return label\n}\n\nfunction checkChildren(children: NavMenuItem[], permissions?: Record<string, boolean>): boolean {\n return (children ?? []).some(child => {\n if (child === null) {\n return false\n } else if ((child as MenuDividerType).type === 'divider') {\n return true\n } else {\n if ((child as SubMenuType2 | MenuItemGroupType2).children) {\n return checkChildren((child as SubMenuType2 | MenuItemGroupType2).children ?? [], permissions)\n } else {\n return !permissions || !(child as MenuItemType2).code || permissions[(child as MenuItemType2).code as string]\n }\n }\n })\n}\n\nfunction transformItems(items: NavMenuItem[], permissions?: Record<string, boolean>) {\n const result: ItemType[] = []\n\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null) {\n result[i] = null\n } else if ((items[i] as MenuDividerType).type === 'divider') {\n result[i] = { ...items[i] } as MenuDividerType\n } else {\n if ((items[i] as SubMenuType2 | MenuItemGroupType2).children) {\n const { children, ...restProps } = items[i] as SubMenuType2 | MenuItemGroupType2\n\n result[i] = checkChildren(children ?? [], permissions)\n ? ({\n ...restProps,\n children: transformItems(children ?? [], permissions),\n } as SubMenuType | MenuItemGroupType)\n : null\n } else {\n const { route, label, code, ...restProps } = items[i] as MenuItemType2\n const isPass = !code || !permissions || permissions[code]\n\n result[i] = isPass\n ? ({\n ...restProps,\n label: withLink(label, route),\n } as MenuItemType)\n : null\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nfunction flatItems(\n items: NavMenuItem[],\n result: Merge<MenuItemType2, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n) {\n for (const item of items) {\n const children = (item as SubMenuType2 | MenuItemGroupType2)?.children as NavMenuItem[]\n\n if (Array.isArray(children)) {\n const keys =\n (item as MenuItemGroupType2)!.type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, keys)\n } else if (item) {\n result.push(Object.assign(item as MenuItemType2, { keypath }))\n }\n }\n\n return result\n}\n\nconst NavMenu = memo(function NavMenu() {\n const location = useLocation()\n const { menuItems } = useToolkitsContext()\n const flattenItems = useMemo(() => flatItems(menuItems ?? []), [menuItems])\n const codes = flattenItems.map(item => item.code).filter(Boolean) as string[]\n const { data: permissions } = usePermissions(codes, true, { suspense: true })\n const internalItems = useMemo(() => transformItems(menuItems ?? [], permissions), [menuItems, permissions])\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n const onOpenChange: MenuProps['onOpenChange'] = keys => {\n const latestOpenKey = keys?.find(key => openKeys?.indexOf(key) === -1)\n const match = flattenItems.find(item => latestOpenKey === item.key)\n setOpenKeys((match?.keypath ?? [latestOpenKey]) as string[])\n }\n\n useEffect(() => {\n const match = flattenItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n setSelectedKeys([key])\n setOpenKeys(keypath)\n }\n }, [flattenItems, location])\n\n return (\n <Menu\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={onOpenChange}\n />\n )\n})\n\nif (process.env.NODE_ENV === 'development') {\n NavMenu.displayName = 'NavMenu'\n}\n\nexport default NavMenu\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n set => ({\n openKeys: [],\n setOpenKeys: keys => set({ openKeys: keys }),\n selectedKeys: [],\n setSelectedKeys: keys => set({ selectedKeys: keys }),\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n },\n ),\n)\n","import { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { useToolkitsContext } from '../ContextProvider'\n\nconst UserWidget: FC = () => {\n const navigate = useNavigate()\n const { clearToken, getUser } = useTokenStore()\n const user = getUser()\n const t = useTranslation()\n const { logoutRedirectUrl } = useToolkitsContext()\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n label: (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/anchor-is-valid\n <a\n data-cy=\"user-widget-logout\"\n onClick={() => {\n clearToken()\n if (logoutRedirectUrl) {\n navigate(logoutRedirectUrl)\n }\n }}\n >\n {t('UserWidget.signOutText')}\n </a>\n ),\n icon: <LogoutOutlined />,\n },\n ]\n\n return (\n <div data-cy=\"user-widget\">\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/anchor-is-valid */}\n <a\n onClick={e => {\n e.preventDefault()\n }}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserWidget\n","import { Result, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\n\nexport interface PermissionGuardProps {\n code: string\n}\n\nconst PermissionGuard: FC<PropsWithChildren<PermissionGuardProps>> = props => {\n const { code, children } = props\n const { accessible, isValidating } = usePermission(code)\n const t = useTranslation()\n\n if (isValidating) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status=\"403\" subTitle={t('global.noEntitlement')} />\n }\n\n return <>{children}</>\n}\n\nexport default PermissionGuard\n","import type { ComponentType, ReactNode } from 'react'\nimport { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\nimport type { ContextState } from '../components/ContextProvider'\nimport ContextProvider from '../components/ContextProvider'\nimport Layout from '../components/Layout'\n\nconst NotFound = lazy(() => import('../pages/NotFound'))\nconst OperationLogList = lazy(() => import('../pages/OperationLogList'))\nconst SignIn = lazy(() => import('../pages/SignIn'))\nconst Permission = lazy(() => import('../pages/permission'))\n\nexport const withLayout = (WrappedComponent: ComponentType, props?: Partial<ContextState>) => {\n const ComponentWithLayout = () => {\n return (\n <ContextProvider {...props}>\n <Layout>\n <WrappedComponent />\n </Layout>\n </ContextProvider>\n )\n }\n\n return ComponentWithLayout\n}\n\nexport function withBaseRoutes(routes: ReactNode, props?: Partial<Omit<ContextState, 'hideGameSelect'>>) {\n const ComponentWithBaseRoutes = () => {\n const sharedProps = Object.assign({}, props, { hideGameSelect: true })\n\n return (\n <Routes>\n {routes}\n <Route path=\"/operation_log\" Component={withLayout(OperationLogList, sharedProps)} />\n <Route path=\"/permission/*\" Component={withLayout(Permission, sharedProps)} />\n <Route path=\"/sign_in\" element={<SignIn />} />\n <Route path=\"*\" element={<NotFound />} />\n </Routes>\n )\n }\n\n return ComponentWithBaseRoutes\n}\n"]}
1
+ {"version":3,"sources":["../src/components/ContextProvider/index.tsx","../src/locales/zh_CN.ts","../src/hooks/i18n.ts","../src/components/FilterFormWrapper/index.tsx","../src/utils/request.ts","../src/stores/token.ts","../src/utils/storage.ts","../src/components/GameSelect/index.tsx","../src/components/Highlight/index.tsx","../src/hooks/permission.ts","../src/components/PermissionButton/index.tsx","../src/components/QueryList/utils.ts","../src/stores/queryList.ts","../src/components/QueryList/constants.ts","../src/components/QueryList/index.tsx","../src/hooks/modal.tsx","../src/hooks/formModal.tsx","../src/pages/NotFound/index.tsx","../src/pages/OperationLogList/index.tsx","../src/constants/index.ts","../src/pages/SignIn/index.tsx","../src/features/permission/hooks/index.ts","../src/features/permission/components/PermissionCollapse/index.tsx","../src/features/permission/components/PermissionListV1/index.tsx","../src/features/permission/components/PermissionListV2/index.tsx","../src/features/permission/components/PermissionList/index.tsx","../src/features/permission/types/index.ts","../src/features/permission/index.ts","../src/pages/permission/UserList/index.tsx","../src/pages/permission/RoleList/index.tsx","../src/pages/permission/RoleDetail/index.tsx","../src/pages/permission/index.tsx","../src/index.ts","../src/components/DynamicTags/index.tsx","../src/components/InfiniteList/index.tsx","../src/components/Layout/index.tsx","../src/components/NavMenu/index.tsx","../src/components/NavMenu/store.ts","../src/components/UserWidget/index.tsx","../src/components/PermissionGuard/index.tsx","../src/utils/router.tsx"],"names":["createContext","useContext","createStore","jsx","useToolkitsContext","ToolkitsContext","defaultState","contextStore","ContextProvider","ContextProvider_default","init_ContextProvider","__esmMin","children","props","config","locale","zh_CN_default","init_zh_CN","get","has","template","useTranslation","key","data","init_i18n","Button","Space","theme","jsxs","FilterFormWrapper","FilterFormWrapper_default","init_FilterFormWrapper","extras","isConfirming","onConfirm","onReset","token","t","style","item","pick","qs","request","url","opts","body","params","headers","responseType","isGlobal","rest","parsed","queryParams","options","queryString","useTokenStore","game","useGameStore","isJsonBody","requestOpts","response","RequestError","responseInterceptor","json","init_request","init_GameSelect","init_token","__publicField","jwtDecode","useSWRImmutable","create","persist","useTokenValidation","skip","usePermissionApiV2","set","store","state","mixedStorage","init_storage","name","value","Select","Typography","useSWRConfig","createJSONStorage","Text","GameSelect","GameSelect_default","switching","id","matchGame","isPermissionApiV2","prevState","gameFilter","games","isLoading","setGame","setSwitching","mutate","onGameChange","useEffect","useState","flushSync","createRoot","renderToString","node","container","root","resolve","splitByTags","Highlight","Highlight_default","init_Highlight","str","regex","part","texts","htmlString","setHtmlString","result","text","index","useSWR","usePermissions","codes","isValidating","acc","curr","usePermission","code","init_permission","Tooltip","PermissionButton","PermissionButton_default","init_PermissionButton","showLoading","disabled","restProps","genSwrKey","payload","action","getParams","getBody","method","onePage","query","page","size","formValues","serialize","deepSortObject","deserialize","init_utils","obj","sortedKeys","sortedObj","useQueryListStore","init_queryList","swrKeyMap","propsMap","payloadMap","getSwrkKey","prevKey","nextKey","getPayload","defaultSize","swrKey","setPayload","updateSwrKey","defaultProps","init_constants","Form","Result","Spin","Table","forwardRef","useImperativeHandle","useRef","QueryListAction","InternalQueryList","QueryList","QueryList_default","init_QueryList","ref","internalProps","form","refreshInterval","extra","renderForm","afterSuccess","getTotal","getDataSource","onTableChange","tableProps","internalForm","accessible","listAction","setProps","removeFromStore","shouldPoll","originalData","setOriginalData","listData","formRenderer","currentPage","currentSize","Modal","useMemo","useModal","content","modalProps","uuid","modalStore","useModalStore","open","confirmLoading","setConfirmLoading","isRenderFunction","show","hide","internalModal","init_modal","useFormModal","formProps","internalExtraValues","setInternalExtraValues","hanldeConfirm","values","afterClose","modal","operation","initialValues","extraValues","init_formModal","NotFound_exports","__export","NotFound_default","useNavigate","NotFound","init_NotFound","navigate","notFoundRedirectUrl","OperationLogList_exports","OperationLogList_default","Card","Col","Input","Row","dayjs","Option","Paragraph","OperationLogList","init_OperationLogList","columns","SSO_URL","SignIn_exports","SignIn_default","Alert","Divider","Navigate","useLocation","useSearchParams","logoUrl","SignIn","init_SignIn","init_background","searchParams","location","setToken","signInPageTitle","localeDropdownMenu","signInSuccessRedirectUrl","idaasRedirectUrl","background_default","useSWRMutation","useAllPermissions","useAllPermissionsV2","useAllRoles","useRole","useCreateRole","arg","useUpdateRole","useRemoveRole","useCreateUser","useUpdateUser","useRemoveUser","init_hooks","Checkbox","Collapse","useCallback","PermissionCollapse","PermissionCollapse_default","init_PermissionCollapse","permissions","readonly","expand","onChange","activeKey","setActiveKey","checkedMap","setCheckedMap","internalValue","setInternalValue","onCollapseChange","getCheckedValue","checkedValue","tempValue","onCheckChange","e","category","permission","Skeleton","PermissionListV1","PermissionListV1_default","init_PermissionListV1","error","Empty","PermissionListV2","PermissionListV2_default","init_PermissionListV2","gameList","setGameList","globalPermissions","gamePermissions","list","addGame","prev","removeGame","_","i","newValue","selectedValue","pev","temp","gameId","Fragment","PermissionList","PermissionList_default","init_PermissionList","init_types","UserList_exports","UserList_default","UserAddOutlined","App","Tag","produce","Link","useCreateModal","message","roles","refresh","role","useUpdateUserModal","update","draft","UserList","init_UserList","remove","showCreateModal","createModal","showUpdateModal","updateModal","RoleList_exports","RoleList_default","UsergroupAddOutlined","useUpdateModal","RoleList","init_RoleList","match","viewable","RoleDetail_exports","RoleDetail_default","Breadcrumb","Descriptions","useParams","RoleDetail","init_RoleDetail","permission_exports","permission_default","lazy","Route","Routes","Permission","PlusOutlined","DynamicTags","initialTags","addable","removable","addCallback","removeCallback","tags","setTags","inputVisible","setInputVisible","inputValue","setInputValue","editInputIndex","setEditInputIndex","editInputValue","setEditInputValue","inputRef","editInputRef","handleClose","removedTag","newTags","tag","showInput","handleInputChange","handleInputConfirm","handleEditInputChange","handleEditInputConfirm","tagInputStyle","tagPlusStyle","DynamicTags_default","useSWRInfinite","InfiniteList","getRowKey","hasMore","transformArg","isValid","setIsValid","setFormValues","getKey","pageIndex","previousPageData","rowKey","args","setSize","isListValidating","dataSource","isLoadingMore","isReachingEnd","isEmpty","loadMore","InfiniteList_default","Antd","Suspense","Menu","memo","useNavStore","keys","withLink","label","route","checkChildren","child","transformItems","items","isPass","flatItems","keypath","NavMenu","menuItems","flattenItems","internalItems","openKeys","selectedKeys","setOpenKeys","setSelectedKeys","onOpenChange","latestOpenKey","NavMenu_default","LogoutOutlined","UserOutlined","Dropdown","UserWidget","clearToken","getUser","user","logoutRedirectUrl","UserWidget_default","Header","Sider","Content","ContentGuard","hideGameSelect","Layout","colorBgContainer","colorBorder","appTitle","layoutHeaderExtras","Layout_default","PermissionGuard","PermissionGuard_default","withLayout","WrappedComponent","withBaseRoutes","routes","sharedProps"],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FC, Key, PropsWithChildren, ReactNode } from 'react'\nimport { createContext, useContext } from 'react'\nimport { createStore } from 'zustand'\nimport type { Locale } from '../../types'\nimport type { RequestOptions } from '../../utils/request'\nimport type { Game } from '../GameSelect'\nimport type { NavMenuItem } from '../NavMenu'\n\nexport interface ContextState {\n appTitle: ReactNode\n signInPageTitle?: ReactNode\n menuItems: NavMenuItem[]\n hideGameSelect: boolean\n usePermissionApiV2: boolean // 使用 V2 版本的权限接口\n gameFilter?: (game: Game) => boolean\n locale?: Locale\n localeDropdownMenu?: ReactNode\n signInSuccessRedirectUrl?: string // 登录成功后的重定向地址\n notFoundRedirectUrl?: string // 404 重定向地址\n logoutRedirectUrl?: string // 退出登录后的重定向地址\n idaasRedirectUrl: string // IDAAS 重定向地址\n layoutHeaderExtras?: { key: Key; children: ReactNode }[]\n isGlobal?: boolean // 用于设置 HTPP 请求内的 APP-ID header 的值,为 true 时的值为 “global”,为 false 时值为当前游戏的 ID。\n responseInterceptor?: (response: Response, opts: RequestOptions) => Promise<any>\n}\n\nconst defaultState: ContextState = {\n appTitle: '',\n menuItems: [],\n hideGameSelect: false,\n usePermissionApiV2: false,\n idaasRedirectUrl: '',\n isGlobal: false,\n}\n\n// 全局的上下文。因为 ContextProvider 支持嵌套,所以 toolkitContextStore 的值等同于最内层的 ContextProvider 包含的上下文。\nexport const contextStore = createStore<ContextState>(() => defaultState)\n\nconst ToolkitsContext = createContext<ContextState>(defaultState)\n\n// 最接近的祖先 ContextProvider 内包含的上下文。\nexport function useToolkitsContext() {\n return useContext(ToolkitsContext)\n}\n\nconst ContextProvider: FC<PropsWithChildren<Partial<ContextState>>> = ({ children, ...props }) => {\n const parentConfig = useToolkitsContext()\n\n const config = {\n ...parentConfig,\n ...props,\n isGlobal: props.isGlobal ?? false,\n }\n\n contextStore.setState(config)\n\n return <ToolkitsContext.Provider value={config}>{children}</ToolkitsContext.Provider>\n}\n\nContextProvider.displayName = 'ToolkitsContextProvider'\n\nexport default ContextProvider\n","import type { Locale } from '../types'\n\nconst locale: Locale = {\n global: {\n noEntitlement: '无权限,请联系管理员。',\n name: '名称',\n creationTime: '创建时间',\n operation: '操作',\n update: '更新',\n edit: '编辑',\n delete: '删除',\n selectAll: '全选',\n game: '游戏',\n user: '用户',\n role: '角色',\n username: '用户名',\n password: '密码',\n label: '标签',\n method: '方法',\n route: '路由',\n request: '请求',\n response: '响应',\n add: '添加',\n signIn: '登录',\n },\n SignIn: {\n title: '登录方式',\n thirdParty: '第三方登录',\n signInWithIDass: 'IDass 登录',\n notRegistered: '您还未在平台注册,请联系管理员',\n welcome: '欢迎',\n },\n NotFound: {\n subTitle: '访问的页面不存在',\n buttonText: '返回首页',\n },\n FilterFormWrapper: {\n confirmText: '查询',\n resetText: '重置',\n },\n FormModal: {\n confirmText: '确认',\n cancelText: '取消',\n },\n GameSelect: {\n label: '当前游戏',\n placeholder: '请选择游戏',\n },\n RequireGame: {\n description: '请选择游戏',\n },\n UserWidget: {\n signOutText: '登出',\n },\n UserList: {\n createTitle: '创建用户',\n createSuccessfully: '用户创建成功',\n updateTitle: '更新用户',\n updateSuccessfully: '用户更新成功',\n deleteTitle: '删除用户',\n deleteContent: '确定要删除用户 <%= user %> 吗?',\n deleteSuccessfully: '用户删除成功',\n },\n RoleList: {\n createTitle: '创建角色',\n createSuccessfully: '角色创建成功',\n updateTitle: '更新角色',\n updateSuccessfully: '角色更新成功',\n deleteTitle: '删除角色',\n deleteContent: '确定要删除角色 <%= role %> 吗?',\n deleteSuccessfully: '角色删除成功',\n },\n PermissionList: {\n failedDescription: '获取权限列表失败',\n baseSectionTitle: '平台基础权限',\n gameSectionTitle: '游戏权限',\n gameSectionDescription: '请先选择游戏',\n gameSelectPlaceholder: '请先选择游戏',\n removeText: '移除',\n addText: '添加游戏权限',\n },\n RoleDetail: {\n title: '角色详情',\n },\n InfiniteList: {\n loadingText: '加载中',\n reachEndText: '已经到底了',\n loadMoreText: '加载更多',\n },\n}\n\nexport default locale\n","import { get, has, template } from 'lodash-es'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport zh_CN from '../locales/zh_CN'\nimport type { Locale } from '../types'\n\ntype Join<K, P> = K extends string | number\n ? P extends string | number\n ? `${K}${'' extends P ? '' : '.'}${P}`\n : never\n : never\n\ntype Paths<T, D extends number = 10> = [D] extends [never]\n ? never\n : T extends object\n ? {\n [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never\n }[keyof T]\n : ''\n\nexport function useTranslation() {\n const { locale = zh_CN } = useToolkitsContext()\n\n return (key: Paths<Locale>, data?: Record<string, unknown>) =>\n has(locale, key) ? template(get(locale, key as string))(data) : key\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Button, Space, theme } from 'antd'\nimport type { Key, PropsWithChildren, ReactNode } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\n\nexport interface FilterFormWrapperProps extends PropsWithChildren {\n onConfirm?: () => void | Promise<void>\n onReset?: () => void\n extras?: { key: Key; children: ReactNode }[]\n isConfirming?: boolean\n}\n\nconst FilterFormWrapper = (props: FilterFormWrapperProps) => {\n const { extras, isConfirming, onConfirm, onReset, children } = props\n const { token } = theme.useToken()\n const t = useTranslation()\n\n const style = {\n maxWidth: 'none',\n background: token.colorFillAlter,\n borderWidth: token.lineWidth,\n borderStyle: token.lineType,\n borderColor: token.colorBorder,\n borderRadius: token.borderRadiusLG,\n padding: 24,\n marginBottom: 24,\n }\n\n return (\n <div style={style}>\n <div className=\"flex\">\n <div className=\"flex-1\">{children}</div>\n <div className=\"ml-8\">\n <Space>\n <Button type=\"primary\" loading={isConfirming} onClick={onConfirm}>\n {t('FilterFormWrapper.confirmText')}\n </Button>\n <Button onClick={onReset}>{t('FilterFormWrapper.resetText')}</Button>\n {extras?.map(item => <span key={item.key}>{item.children}</span>)}\n </Space>\n </div>\n </div>\n </div>\n )\n}\n\nexport default FilterFormWrapper\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { pick } from 'lodash-es'\nimport type { StringifyOptions } from 'query-string'\nimport qs from 'query-string'\nimport { contextStore } from '../components/ContextProvider'\nimport { useGameStore } from '../components/GameSelect'\nimport { useTokenStore } from '../stores/token'\n\nexport class RequestError extends Error {\n status!: number\n code?: number\n\n constructor(opts: { message?: string; status: number; code?: number }) {\n super(opts?.message)\n this.status = opts.status\n this.code = opts.code\n }\n}\n\ntype JsonResponse<T> = (\n | {\n code: number\n status?: never\n }\n | {\n code?: never\n status: number\n }\n) & {\n data: T\n msg: string\n}\n\nexport interface RequestOptions extends Omit<RequestInit, 'body'> {\n body?: Record<string | number, any> | FormData | null\n params?: Record<string | number, any> | URLSearchParams | null\n responseType?: 'json' | 'blob' | 'text'\n isGlobal?: boolean\n}\n\nexport type RequestResponse<T> = Pick<Response, 'headers' | 'status' | 'statusText' | 'url'> & { data: T }\n\nexport async function request<T = any>(url: string, opts: RequestOptions = {}): Promise<RequestResponse<T>> {\n opts = Object.assign(opts, { responseType: opts.responseType ?? 'json' })\n let { body, params, headers, responseType, isGlobal, ...rest } = opts\n\n const parsed = qs.parseUrl(url)\n const queryParams = Object.assign({}, parsed.query, params)\n const options: StringifyOptions = {\n skipNull: true,\n skipEmptyString: true,\n strict: true,\n encode: true,\n }\n const queryString = qs.stringify(queryParams, options)\n url = queryString ? `${parsed.url}?${queryString}` : url\n\n headers = new Headers(headers)\n\n const token = useTokenStore?.getState()?.token\n\n if (token) {\n headers.set('Authorization', `Bearer ${token}`)\n }\n\n if (contextStore.getState().usePermissionApiV2) {\n if (isGlobal || contextStore.getState().isGlobal) {\n headers.set('App-ID', 'global')\n } else {\n const game = useGameStore.getState().game\n if (game) {\n headers.set('App-ID', game.id)\n }\n }\n }\n\n if (responseType === 'blob') {\n headers.append('Accept', 'application/octet-stream')\n } else if (responseType === 'json') {\n headers.append('Accept', 'application/json')\n }\n\n const isJsonBody = !!(body && typeof body === 'object' && !(body instanceof FormData))\n\n if (isJsonBody) {\n headers.set('Content-Type', 'application/json')\n }\n\n const requestOpts = Object.assign(rest, {\n headers,\n body: isJsonBody ? JSON.stringify(body) : body,\n }) as RequestInit\n\n const response = await fetch(url, requestOpts)\n\n if (!response.ok) {\n throw new RequestError({ status: response.status })\n }\n\n const responseInterceptor = contextStore.getState().responseInterceptor\n\n if (typeof responseInterceptor === 'function') {\n return await responseInterceptor(response, opts)\n } else {\n let data: T\n\n if (responseType === 'blob') {\n data = (await response.blob()) as T\n } else if (responseType === 'json') {\n const json = (await response.json()) as JsonResponse<T>\n if (json.code === 0 || json.status === 0) {\n data = json.data\n } else {\n throw new RequestError({\n code: json.code,\n status: response.status,\n message: json.msg,\n })\n }\n } else {\n data = (await response.text()) as T\n }\n\n return {\n ...pick(response, ['headers', 'status', 'statusText', 'url']),\n data,\n }\n }\n}\n","import { jwtDecode } from 'jwt-decode'\nimport useSWRImmutable from 'swr/immutable'\nimport { create } from 'zustand'\nimport { persist } from 'zustand/middleware'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport { request } from '../utils/request'\n\ninterface UserInfo {\n authorityId: string\n exp: number\n}\n\nexport interface TokenState {\n token: string\n getUser: () => UserInfo | null\n setToken: (token: string) => void\n clearToken: () => void\n}\n\nexport const useTokenStore = create<TokenState>()(\n persist(\n (set, get, store) => ({\n token: '',\n getUser: () => {\n try {\n return jwtDecode(get().token) as UserInfo\n } catch (_) {\n return null\n }\n },\n setToken: token => set({ token }),\n clearToken: () => {\n get().setToken('')\n store.persist.clearStorage()\n },\n }),\n {\n name: 'token',\n partialize: state => ({ token: state.token }),\n skipHydration: true,\n },\n ),\n)\n\nexport function useTokenValidation(skip = false) {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n useSWRImmutable(\n !skip ? (usePermissionApiV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check') : null,\n (url: string) =>\n request(url, {\n method: 'POST',\n body: {\n permissions: ['100001'],\n },\n isGlobal: true,\n }),\n {\n suspense: true,\n },\n )\n}\n","import type { StateStorage } from 'zustand/middleware'\n\n// 通过 SessionStorage 隔离数据,防止多开页面时的数据冲突\nexport const mixedStorage: StateStorage = {\n getItem: (name: string): string | null => {\n return sessionStorage.getItem(name) || localStorage.getItem(name)\n },\n setItem: (name: string, value: string) => {\n sessionStorage.setItem(name, value)\n localStorage.setItem(name, value)\n },\n removeItem: async (name: string) => {\n sessionStorage.removeItem(name)\n localStorage.removeItem(name)\n },\n}\n","import { Select, Space, Typography } from 'antd'\nimport { useSWRConfig } from 'swr'\nimport { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { mixedStorage } from '../../utils/storage'\nimport { contextStore, useToolkitsContext } from '../ContextProvider'\n\nconst { Text } = Typography\n\nexport interface Game {\n id: string\n name: string\n area: 'cn' | 'global'\n Ctime: string\n}\n\nexport interface GameState {\n game: Game | null\n games: Game[]\n isLoading: boolean\n setGame: (id: string) => void\n fetchGames: () => void\n switching: boolean // 切换游戏中\n setSwitching: (switching: boolean) => void\n}\n\nexport const useGameStore = create<GameState>()(\n persist(\n (set, get) => ({\n game: null,\n games: [],\n isLoading: false,\n switching: false,\n setSwitching: switching => {\n set({ switching })\n },\n setGame: id => {\n const matchGame = (get().games ?? []).find(item => item.id === id)\n set({ game: matchGame ?? null })\n },\n fetchGames: () => {\n const token = useTokenStore.getState().token\n const isPermissionApiV2 = contextStore.getState().usePermissionApiV2\n\n if (token && isPermissionApiV2) {\n set({ isLoading: true })\n\n fetch('/api/usystem/game/all', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n })\n .then(response => {\n if (response.ok) {\n return response.json()\n }\n throw new Error('Network response was not ok.')\n })\n .then((json: { code: number; data: Game[]; msg: string }) => {\n set({ games: json.data })\n })\n .finally(() => {\n set({ isLoading: false })\n })\n }\n },\n }),\n {\n name: 'game',\n storage: createJSONStorage(() => mixedStorage),\n partialize: state => ({ game: state.game }),\n },\n ),\n)\n\nuseTokenStore.subscribe((state, prevState) => {\n if (state.token !== prevState.token) {\n // FIXME: 因为请求会在 Mock Service Worker 启动前发出,所以这里需要延迟一段时间\n setTimeout(() => {\n useGameStore.getState().fetchGames()\n }, 400)\n }\n})\n\nuseTokenStore.persist.rehydrate()\n\nconst GameSelect = () => {\n const t = useTranslation()\n const { gameFilter } = useToolkitsContext()\n const { game, games, isLoading, setGame, setSwitching } = useGameStore()\n const { mutate } = useSWRConfig()\n\n const options = (games ?? [])\n ?.filter(item => gameFilter?.(item) ?? true)\n ?.map(item => ({\n label: item.name,\n value: item.id,\n }))\n\n const onGameChange = async (id: string) => {\n setSwitching(true)\n // 清除 SWR 缓存\n setGame(id)\n await mutate(\n key => {\n return !(typeof key === 'string' && key.startsWith('/api/usystem/game/all'))\n },\n undefined,\n { revalidate: false },\n )\n setSwitching(false)\n }\n\n return (\n <Space>\n <Text>{t('GameSelect.label')}</Text>\n <Select\n showSearch\n optionFilterProp=\"label\"\n value={game?.id}\n placeholder={t('GameSelect.placeholder')}\n loading={isLoading}\n style={{ width: '200px' }}\n options={options}\n onChange={onGameChange}\n />\n </Space>\n )\n}\n\nexport default GameSelect\n","import type { PropsWithChildren, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport { flushSync } from 'react-dom'\nimport { createRoot } from 'react-dom/client'\n\nconst splitByTags = (str: string) => {\n const regex = /(<[^>]*>)/\n return str.split(regex).filter(part => part !== '')\n}\n\nfunction renderToString(node: ReactNode): Promise<string> {\n const container = document.createElement('div')\n const root = createRoot(container)\n\n return new Promise(resolve => {\n setTimeout(() => {\n flushSync(() => {\n root.render(node)\n })\n resolve(container.innerHTML)\n })\n })\n}\n\nexport interface HighlightTextsProps extends PropsWithChildren {\n texts: Array<string | number>\n}\n\nconst Highlight = (props: HighlightTextsProps) => {\n const { texts, children } = props\n const [htmlString, setHtmlString] = useState<string>('')\n\n useEffect(() => {\n renderToString(children).then(str => {\n const result = splitByTags(str)\n\n for (const text of texts) {\n for (let index = 0; index < result.length; index++) {\n // TODO: 忽略 HTML tag\n result[index] = result[index].replace(String(text), `<span style='color: #DC143C;'>${text}</span>`)\n }\n }\n\n setHtmlString(result.join(''))\n })\n }, [children, texts])\n\n return <div dangerouslySetInnerHTML={{ __html: htmlString }}></div>\n}\n\nexport default Highlight\n","import type { SWRConfiguration } from 'swr'\nimport useSWR from 'swr'\nimport { useToolkitsContext } from '../components/ContextProvider'\nimport { request } from '../utils/request'\n\ntype PermissionCheckResult = { has_all: true } | { [k: string]: boolean }\n\nexport function usePermissions(codes: string[], isGlobal?: boolean, config?: SWRConfiguration) {\n const { usePermissionApiV2 } = useToolkitsContext()\n const { data, isValidating, isLoading } = useSWR(\n codes.length > 0 ? [usePermissionApiV2 ? '/api/usystem/user/checkV2' : '/api/usystem/user/check', codes] : null,\n ([url]) =>\n request<PermissionCheckResult>(url, {\n method: 'POST',\n body: {\n permissions: codes,\n },\n isGlobal,\n }).then(response => {\n if (response.data?.has_all) {\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = true\n return acc\n },\n {} as Record<string, boolean>,\n )\n }\n\n return codes.reduce(\n (acc, curr) => {\n acc[curr] = (response.data as Record<string, boolean>)?.[curr] ?? false\n return acc\n },\n {} as Record<string, boolean>,\n )\n }),\n {\n revalidateOnFocus: false,\n ...config,\n },\n )\n\n return { data, isValidating, isLoading }\n}\n\nexport function usePermission(code: string | undefined, isGlobal?: boolean, config?: SWRConfiguration) {\n const { data, isValidating, isLoading } = usePermissions(code ? [code] : [], isGlobal, config)\n\n if (code === undefined) {\n return {\n accessible: true,\n isValidating: false,\n isLoading: false,\n }\n }\n\n return {\n accessible: data?.[code] ?? false,\n isValidating,\n isLoading,\n }\n}\n","import type { ButtonProps } from 'antd'\nimport { Button, Tooltip } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermissions } from '../../hooks/permission'\n\nexport interface PermissionButtonProps extends ButtonProps {\n code: string | string[]\n showLoading?: boolean\n isGlobal?: boolean\n}\n\nconst PermissionButton: FC<PropsWithChildren<PermissionButtonProps>> = props => {\n const { children, code, showLoading, isGlobal, disabled, ...restProps } = props\n const { data, isLoading } = usePermissions(Array.isArray(code) ? code : [code], isGlobal)\n const t = useTranslation()\n\n if (isLoading) {\n return (\n <Button loading={showLoading} disabled={!showLoading} {...restProps}>\n {children}\n </Button>\n )\n }\n\n if (!Object.values(data ?? {})?.some(Boolean)) {\n return (\n <Tooltip defaultOpen={false} title={t('global.noEntitlement')}>\n <Button disabled {...restProps}>\n {children}\n </Button>\n </Tooltip>\n )\n }\n\n return (\n <Button disabled={disabled} {...restProps}>\n {children}\n </Button>\n )\n}\n\nexport default PermissionButton\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport qs from 'query-string'\nimport type { QueryListProps } from '.'\nimport type { QueryListPayload } from '../../stores/queryList'\n\ninterface SwrKeyObject {\n url: string\n params?: Record<string, any>\n body?: Record<string, any>\n}\n\nconst deepSortObject = (obj: unknown): unknown => {\n if (typeof obj !== 'object' || obj === null) {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepSortObject)\n }\n\n const sortedKeys = Object.keys(obj).sort()\n const result: Record<string, unknown> = {}\n\n sortedKeys.forEach(key => {\n result[key] = deepSortObject((obj as Record<string, unknown>)[key])\n })\n\n return result\n}\n\nexport const serialize = (obj: SwrKeyObject) => {\n // 因为键的顺序会影响序列化结果,所以需要先排序。\n const sortedObj = deepSortObject(obj)\n return JSON.stringify(sortedObj)\n}\n\nexport const deserialize = (key: string) => JSON.parse(key) as SwrKeyObject\n\n// 生成 SWR 的 key,用于缓存请求结果。\nexport function genSwrKey(props: QueryListProps, payload?: QueryListPayload) {\n const { action, getParams, getBody, method, onePage } = props\n const { url, query } = qs.parseUrl(action)\n const { page, size, formValues } = payload ?? {}\n\n const params = Object.assign(\n query,\n typeof getParams === 'function'\n ? getParams?.({\n page,\n size,\n formValues,\n })\n : method === 'GET'\n ? onePage\n ? formValues\n : {\n ...formValues,\n page,\n size,\n }\n : {},\n )\n\n const body =\n typeof getBody === 'function'\n ? getBody?.({ page, size, formValues })\n : method === 'POST'\n ? onePage\n ? formValues\n : {\n ...formValues,\n page,\n size,\n }\n : undefined\n\n return serialize({\n url,\n body,\n params,\n })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { mutate } from 'swr'\nimport type { MutatorCallback, MutatorOptions } from 'swr/_internal'\nimport { create } from 'zustand'\nimport type { QueryListDataType, QueryListProps } from '../components/QueryList'\nimport { genSwrKey } from '../components/QueryList/utils'\n\ntype QueryListMutator = <Item = any>(\n action: string,\n data?: QueryListDataType<Item> | Promise<QueryListDataType<Item>> | MutatorCallback<QueryListDataType<Item>>,\n opts?: MutatorOptions<QueryListDataType<Item>>,\n) => void\n\nexport interface QueryListPayload<FormValues = any> {\n page?: number\n size?: number\n formValues?: FormValues\n}\n\nexport interface QueryListState {\n swrKeyMap: Map<string, string | null>\n payloadMap: Map<string, QueryListPayload>\n propsMap: Map<string, QueryListProps>\n getSwrkKey(action: string): string | null\n updateSwrKey(action: string, key?: string | null): void\n getPayload: (action: string) => QueryListPayload | undefined\n setPayload(action: string, payload: Partial<QueryListPayload>): void\n mutate: QueryListMutator\n refresh(action: string, page?: number): void\n removeFromStore(action: string): void\n setProps: (action: string, props: QueryListProps) => void\n}\n\nexport const useQueryListStore = create<QueryListState>((set, get) => ({\n swrKeyMap: new Map(),\n payloadMap: new Map(),\n propsMap: new Map(),\n getSwrkKey(action) {\n const { swrKeyMap } = get()\n return swrKeyMap.get(action) ?? null\n },\n updateSwrKey(action, key) {\n const { propsMap, payloadMap, swrKeyMap, getSwrkKey } = get()\n const prevKey = getSwrkKey(action)\n\n if (!propsMap.has(action)) {\n throw new Error(`The action \"${action}\" is not registered in QueryList`)\n }\n\n if (key === null) {\n swrKeyMap.set(action, null)\n mutate(prevKey, undefined, false)\n } else if (key === undefined) {\n const nextKey = genSwrKey(propsMap.get(action) as QueryListProps, payloadMap.get(action))\n\n if (prevKey !== nextKey) {\n set({ swrKeyMap: new Map(swrKeyMap).set(action, nextKey) })\n } else {\n mutate(prevKey, undefined, true)\n }\n } else {\n set({ swrKeyMap: new Map(swrKeyMap).set(action, key) })\n }\n },\n getPayload(action) {\n const { payloadMap } = get()\n return payloadMap.get(action)\n },\n setPayload(action, payload) {\n const { payloadMap, getPayload, propsMap } = get()\n const { defaultSize } = propsMap.get(action) ?? {}\n set({\n payloadMap: new Map(payloadMap).set(action, {\n page: 1,\n size: defaultSize,\n ...(getPayload(action) ?? {}),\n ...payload,\n }),\n })\n },\n mutate: (action, data, opts) => {\n const { swrKeyMap } = get()\n const swrKey = swrKeyMap.get(action)\n mutate(swrKey, data, opts)\n },\n refresh(action, page) {\n const { setPayload, updateSwrKey, payloadMap } = get()\n setPayload(action, { page: page ?? payloadMap.get(action)?.page })\n updateSwrKey(action)\n },\n removeFromStore(action) {\n get().swrKeyMap.delete(action)\n get().payloadMap.delete(action)\n get().propsMap.delete(action)\n },\n setProps(action, props) {\n const { propsMap } = get()\n set({ propsMap: new Map(propsMap).set(action, props) })\n },\n}))\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nexport const defaultProps = {\n method: 'GET',\n defaultSize: 10,\n refreshInterval: 0,\n getTotal: (response: any) => response.total,\n getDataSource: (response: any) => response.list,\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FormInstance } from 'antd'\nimport { Form, Result, Spin, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport type { ReactElement, ReactNode, Ref } from 'react'\nimport { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'\nimport useSWR from 'swr'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\nimport type { QueryListPayload } from '../../stores/queryList'\nimport { useQueryListStore } from '../../stores/queryList'\nimport type { ListResponse } from '../../types'\nimport type { RequestOptions } from '../../utils/request'\nimport { request } from '../../utils/request'\nimport FilterFormWrapper from '../FilterFormWrapper'\nimport { defaultProps } from './constants'\nimport { deserialize } from './utils'\n\nexport enum QueryListAction {\n Confirm = 'confirm',\n Reset = 'reset',\n Jump = 'jump',\n Init = 'init',\n}\n\nexport interface QueryListDataType<Item> {\n dataSource: Item[]\n total: number\n}\n\nexport interface QueryListRef<Item = any, Values = any, Response = any> {\n data: QueryListDataType<Item>\n internalForm: FormInstance<Values>\n originalData: Response | undefined\n}\n\nexport interface QueryListProps<Item = any, Values = any, Response = any>\n extends Pick<\n TableProps<Item>,\n 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered' | 'components'\n > {\n code?: string\n isGlobal?: boolean\n action: string\n method?: string\n refreshInterval?: number\n // 无分页\n onePage?: boolean\n defaultSize?: number\n headers?: RequestOptions['headers'] | ((payload: QueryListPayload<Values> | undefined) => RequestOptions['headers'])\n form?: FormInstance<Values>\n getBody?: (payload: QueryListPayload<Values>) => RequestOptions['body']\n getParams?: (payload: QueryListPayload<Values>) => RequestOptions['params']\n renderForm?: (form: FormInstance<Values>) => ReactNode\n extra?: (opts: { form: FormInstance<Values>; data: Response | undefined }) => ReactNode\n onTableChange?: TableProps<Item>['onChange']\n afterSuccess?: (action: QueryListAction, data: QueryListDataType<Item>) => void\n // 默认的接口返回类型为 ListResponse<Item>,当符合时无需设置 getTotal、getDataSource 就可以让组件正确获取 total 与 dataSource。\n getTotal?: (response: Response) => number\n getDataSource?: (response: Response, form: FormInstance<Values>) => Item[]\n}\n\nconst InternalQueryList = <Item extends object, Values extends object | undefined, Response = ListResponse<Item>>(\n props: QueryListProps<Item, Values, Response>,\n ref: Ref<QueryListRef<Item, Values, Response>>,\n) => {\n const internalProps = { ...defaultProps, ...props }\n\n const {\n action,\n code,\n headers,\n isGlobal,\n onePage,\n method,\n form,\n getBody,\n getParams,\n defaultSize,\n refreshInterval,\n extra,\n renderForm,\n afterSuccess,\n getTotal,\n getDataSource,\n onTableChange,\n ...tableProps\n } = internalProps\n\n const t = useTranslation()\n let [internalForm] = Form.useForm<Values>()\n internalForm = form || internalForm\n const { accessible, isLoading } = usePermission(code, isGlobal)\n const listAction = useRef<QueryListAction>(QueryListAction.Init)\n const { setProps, getPayload, setPayload, getSwrkKey, updateSwrKey, removeFromStore } = useQueryListStore()\n const shouldPoll = useRef(false)\n const [originalData, setOriginalData] = useState<Response>()\n\n const { data, isValidating } = useSWR(\n getSwrkKey(action),\n async key => {\n const { url, params, body } = deserialize(key)\n const payload = getPayload(action)\n const response = await request<Response>(url, {\n method,\n body,\n params,\n isGlobal,\n headers: typeof headers === 'function' ? headers(payload) : headers,\n })\n\n setOriginalData(response.data)\n\n return {\n dataSource: getDataSource(response.data, internalForm),\n total: getTotal(response.data) ?? 0,\n }\n },\n {\n fallbackData: {\n dataSource: [],\n total: 0,\n },\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n refreshInterval: shouldPoll.current ? refreshInterval : 0,\n onSuccess(listData) {\n shouldPoll.current = true\n afterSuccess?.(listAction.current, listData)\n },\n onError() {\n shouldPoll.current = false\n },\n },\n )\n\n const onConfirm = async () => {\n listAction.current = QueryListAction.Confirm\n setPayload(action, { page: 1, formValues: internalForm.getFieldsValue() })\n\n try {\n await internalForm.validateFields()\n updateSwrKey(action)\n } catch (error) {\n updateSwrKey(action, null)\n }\n }\n\n const onReset = async () => {\n listAction.current = QueryListAction.Reset\n internalForm.resetFields()\n setPayload(action, { page: 1, formValues: internalForm.getFieldsValue() })\n\n try {\n await internalForm.validateFields({ validateOnly: true })\n updateSwrKey(action)\n } catch (error) {\n updateSwrKey(action, null)\n }\n }\n\n useEffect(() => {\n setProps(action, internalProps)\n\n return () => {\n // 组件卸载时清除缓存\n removeFromStore(action)\n }\n }, [])\n\n useEffect(() => {\n const init = async () => {\n if (accessible) {\n setPayload(action, { page: 1, size: defaultSize, formValues: internalForm.getFieldsValue() })\n await internalForm.validateFields({ validateOnly: true })\n updateSwrKey(action)\n }\n }\n\n init()\n }, [accessible])\n\n useImperativeHandle(ref, () => ({\n data,\n originalData,\n internalForm,\n }))\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n const formRenderer = renderForm ? (\n <FilterFormWrapper isConfirming={isValidating} onReset={onReset} onConfirm={onConfirm}>\n {renderForm(internalForm)}\n </FilterFormWrapper>\n ) : (\n // 消除 Antd 的警告\n <Form form={internalForm} />\n )\n\n return (\n <div>\n {formRenderer}\n {extra && <div className=\"mt-2 mb-4\">{extra({ form: internalForm, data: originalData })}</div>}\n <Table\n {...tableProps}\n dataSource={data.dataSource}\n loading={isValidating}\n pagination={\n onePage\n ? false\n : {\n showSizeChanger: true,\n showQuickJumper: true,\n current: getPayload(action)?.page,\n pageSize: getPayload(action)?.size ?? defaultSize,\n total: data.total,\n onChange: async (currentPage: number, currentSize: number) => {\n listAction.current = QueryListAction.Jump\n setPayload(action, { page: currentPage, size: currentSize })\n updateSwrKey(action)\n },\n }\n }\n onChange={onTableChange}\n />\n </div>\n )\n}\n\nconst QueryList = forwardRef(InternalQueryList) as <\n Item extends object,\n Values extends object | undefined,\n Response = ListResponse<Item>,\n>(\n props: QueryListProps<Item, Values, Response> & { ref?: Ref<QueryListRef<Item, Values, Response>> },\n) => ReactElement\n\nexport default QueryList\n","import type { ModalProps } from 'antd'\nimport { Modal } from 'antd'\nimport { useMemo, useState, type ReactNode } from 'react'\nimport { create } from 'zustand'\n\ninterface ModalState {\n open: Map<number, boolean>\n getOpen: (uuid: number) => boolean\n show: (uuid: number) => void\n hide: (uuid: number) => void\n hideAll: () => void\n}\n\nexport const useModalStore = create<ModalState>((set, get) => ({\n open: new Map(),\n getOpen: uuid => get().open.get(uuid) ?? false,\n show(uuid) {\n set({ open: new Map(get().open).set(uuid, true) })\n },\n hide(uuid) {\n set({ open: new Map(get().open).set(uuid, false) })\n },\n hideAll() {\n set({ open: new Map() })\n },\n}))\n\nexport interface UseModalOperation {\n hide: () => void\n}\n\nexport interface UseModalProps extends Omit<ModalProps, 'open' | 'confirmLoading' | 'onOk' | 'onCancel'> {\n content?: ReactNode | ((operation: UseModalOperation) => ReactNode)\n onConfirm?: () => void | Promise<void>\n}\n\nlet id = 0\n\nexport function useModal(props: UseModalProps) {\n const { content, onConfirm, ...modalProps } = props\n const uuid = useMemo(() => ++id, [])\n const modalStore = useModalStore()\n const open = modalStore.getOpen(uuid)\n const [confirmLoading, setConfirmLoading] = useState(false)\n\n const isRenderFunction = typeof content === 'function'\n\n const show = () => {\n modalStore.show(uuid)\n }\n\n const hide = () => {\n modalStore.hide(uuid)\n }\n\n const onCancel: ModalProps['onCancel'] = () => {\n hide()\n }\n\n const onOk = async () => {\n try {\n setConfirmLoading(true)\n await onConfirm?.()\n } finally {\n setConfirmLoading(false)\n }\n }\n\n const internalModal = (\n <Modal {...modalProps} open={open} confirmLoading={confirmLoading} onOk={onOk} onCancel={onCancel}>\n {isRenderFunction ? content({ hide }) : content}\n </Modal>\n )\n\n return {\n uuid,\n show,\n hide,\n modal: internalModal,\n }\n}\n","import type { FormInstance, FormProps } from 'antd'\nimport { Form } from 'antd'\nimport type { ReactNode } from 'react'\nimport { useState } from 'react'\nimport type { UseModalOperation, UseModalProps } from './modal'\nimport { useModal } from './modal'\n\ntype RecursivePartial<T> = NonNullable<T> extends object\n ? {\n [P in keyof T]?: NonNullable<T[P]> extends (infer U)[]\n ? RecursivePartial<U>[]\n : NonNullable<T[P]> extends object\n ? RecursivePartial<T[P]>\n : T[P]\n }\n : T\n\nexport interface UseFormModalProps<Values, ExtraValues>\n extends Omit<UseModalProps, 'afterClose' | 'onConfirm' | 'content'> {\n formProps?: Omit<FormProps, 'form'>\n form?: FormInstance<Values>\n content?: ReactNode | ((extraValues: ExtraValues, operation: UseModalOperation) => ReactNode)\n onConfirm?: (values: Values, extraValues: ExtraValues) => void | Promise<void>\n}\n\nexport function useFormModal<Values, ExtraValues extends NonNullable<unknown> = NonNullable<unknown>>(\n props: UseFormModalProps<Values, ExtraValues>,\n) {\n const { content, form, formProps, onConfirm, ...modalProps } = props\n const [internalExtraValues, setInternalExtraValues] = useState<ExtraValues>({} as ExtraValues)\n let [internalForm] = Form.useForm<Values>()\n internalForm = form || internalForm\n\n const isRenderFunction = typeof content === 'function'\n\n const hanldeConfirm = async () => {\n const values = await internalForm.validateFields()\n await onConfirm?.(values, internalExtraValues as ExtraValues)\n hide()\n }\n\n const afterClose = () => {\n internalForm.resetFields()\n }\n\n const { uuid, show, hide, modal } = useModal({\n ...modalProps,\n content: operation => (\n <Form {...formProps} form={internalForm}>\n {isRenderFunction ? content(internalExtraValues as ExtraValues, operation) : content}\n </Form>\n ),\n onConfirm: hanldeConfirm,\n afterClose,\n })\n\n const onShow = ({\n initialValues,\n extraValues,\n }: {\n initialValues?: RecursivePartial<Values>\n extraValues?: ExtraValues\n } = {}) => {\n if (extraValues) {\n setInternalExtraValues(extraValues)\n }\n\n if (initialValues) {\n internalForm.setFieldsValue(initialValues)\n }\n\n show()\n }\n\n return {\n uuid,\n show: onShow,\n hide,\n modal,\n }\n}\n","import { Button, Result } from 'antd'\nimport { useNavigate } from 'react-router-dom'\nimport { useToolkitsContext } from '../../components/ContextProvider'\nimport { useTranslation } from '../../hooks/i18n'\n\nconst NotFound = () => {\n const navigate = useNavigate()\n const t = useTranslation()\n const { notFoundRedirectUrl } = useToolkitsContext()\n\n return (\n <div className=\"h-screen flex justify-center items-center\">\n <Result\n status=\"404\"\n title=\"404\"\n subTitle={t('NotFound.subTitle')}\n extra={\n notFoundRedirectUrl && (\n <Button\n type=\"primary\"\n onClick={() => {\n navigate(notFoundRedirectUrl)\n }}\n >\n {t('NotFound.buttonText')}\n </Button>\n )\n }\n />\n </div>\n )\n}\n\nexport default NotFound\n","import { Card, Col, Form, Input, Row, Select, Typography } from 'antd'\nimport type { ColumnsType } from 'antd/es/table'\nimport dayjs from 'dayjs'\nimport type { FC } from 'react'\nimport QueryList from '../../components/QueryList'\nimport type { OperationLogListItem } from '../../features/log'\nimport { useTranslation } from '../../hooks/i18n'\n\nconst { Option } = Select\nconst { Paragraph } = Typography\n\nconst OperationLogList: FC = () => {\n const t = useTranslation()\n\n const columns: ColumnsType<OperationLogListItem> = [\n {\n key: 'id',\n title: 'ID',\n dataIndex: 'id',\n width: 100,\n },\n {\n key: 'username',\n title: t('global.username'),\n dataIndex: 'uname',\n width: 100,\n },\n {\n key: 'label',\n title: t('global.label'),\n dataIndex: 'label',\n width: 150,\n },\n {\n key: 'method',\n title: t('global.method'),\n dataIndex: 'method',\n width: 100,\n },\n {\n key: 'route',\n title: t('global.route'),\n dataIndex: 'route',\n },\n {\n key: 'request',\n title: t('global.request'),\n dataIndex: 'request',\n render(value: string) {\n return (\n <Paragraph>\n <pre className=\"max-h-32 overflow-auto\">{value}</pre>\n </Paragraph>\n )\n },\n },\n {\n key: 'response',\n title: t('global.response'),\n dataIndex: 'response',\n render(value: string) {\n return (\n <Paragraph>\n <pre className=\"max-h-32 overflow-auto\">{value}</pre>\n </Paragraph>\n )\n },\n },\n {\n key: 'creation_time',\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n width: 200,\n render(value: string) {\n return dayjs(value).format('YYYY-MM-DD HH:mm:ss')\n },\n },\n ]\n\n return (\n <Card title=\"操作日志\">\n <QueryList<\n OperationLogListItem,\n {\n uname?: string\n route?: string\n method?: 'get' | 'post'\n label?: string\n },\n {\n List: OperationLogListItem[]\n Total: number\n }\n >\n tableLayout=\"fixed\"\n rowKey=\"id\"\n columns={columns}\n action=\"/api/usystem/log/list\"\n getParams={({ page, size, formValues }) => ({ ...formValues, page, size })}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n renderForm={form => (\n <Form form={form}>\n <Row gutter={10}>\n <Col span={4}>\n <Form.Item label={t('global.username')} name=\"uname\">\n <Input allowClear />\n </Form.Item>\n </Col>\n <Col span={4}>\n <Form.Item label={t('global.route')} name=\"route\">\n <Input allowClear />\n </Form.Item>\n </Col>\n <Col>\n <Form.Item label={t('global.method')} name=\"method\">\n <Select allowClear style={{ width: '100px' }}>\n <Option value=\"get\">GET</Option>\n <Option value=\"post\">POST</Option>\n </Select>\n </Form.Item>\n </Col>\n <Col span={4}>\n <Form.Item label={t('global.label')} name=\"label\">\n <Input allowClear />\n </Form.Item>\n </Col>\n </Row>\n </Form>\n )}\n />\n </Card>\n )\n}\n\nexport default OperationLogList\n","export const SSO_URL = 'https://idaas.ifunplus.cn/enduser/api/application/plugin_FunPlus/sso/v1'\n","import { Alert, Button, Divider, Form, Input, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { Navigate, useLocation, useSearchParams } from 'react-router-dom'\nimport useSWRImmutable from 'swr/immutable'\nimport backgroundUrl from '../../assets/background.svg'\nimport logoUrl from '../../assets/logo.png'\nimport { useToolkitsContext } from '../../components/ContextProvider'\nimport { SSO_URL } from '../../constants'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { request } from '../../utils/request'\n\nconst SignIn: FC = () => {\n const [searchParams] = useSearchParams()\n const location = useLocation()\n const { token, setToken } = useTokenStore()\n const t = useTranslation()\n const { signInPageTitle, localeDropdownMenu, signInSuccessRedirectUrl, idaasRedirectUrl } = useToolkitsContext()\n\n useSWRImmutable(\n searchParams.has('ticket') ? `/api/usystem/user/login?ticket=${searchParams.get('ticket')}` : null,\n url => request<{ token: string }>(url),\n {\n suspense: true,\n onSuccess: data => {\n setToken(data.data.token)\n },\n },\n )\n\n if (token) {\n if (signInSuccessRedirectUrl) {\n return <Navigate replace to={signInSuccessRedirectUrl} />\n }\n\n return <Navigate replace to=\"/\" />\n }\n\n return (\n <div className=\"w-screen h-screen relative flex\">\n {localeDropdownMenu && <div className=\"absolute top-16 right-16 z-10\">{localeDropdownMenu}</div>}\n <div className=\"absolute left-14 top-6\">\n <Space align=\"center\">\n <img src={logoUrl} className=\"w-12\" alt=\"logo\" />\n {signInPageTitle}\n </Space>\n </div>\n <div className=\"flex-1 flex justify-center items-center bg-slate-50\">\n <img src={backgroundUrl} alt=\"background\" className=\"w-10/12\" />\n </div>\n <div className=\"w-[650px] relative top-0 left-0 right-0 bottom-0\">\n <div className=\"absolute top-1/2 -translate-y-1/2 left-0 right-0\">\n <div className=\"-translate-y-10 px-36\">\n <div className=\"flex flex-col justify-center\">\n <div className=\"h-10\">\n {location.state?.notUser && <Alert banner closable message={t('SignIn.notRegistered')} type=\"error\" />}\n </div>\n <Typography.Title level={2}>{t('SignIn.welcome')}</Typography.Title>\n <div className=\"mt-4\">\n <Form layout=\"vertical\" autoComplete=\"off\">\n <Form.Item label={t('global.username')} name=\"username\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.password')} name=\"password\" rules={[{ required: true }]}>\n <Input.Password />\n </Form.Item>\n <Form.Item>\n <Button block type=\"primary\" shape=\"round\" htmlType=\"submit\">\n {t('global.signIn')}\n </Button>\n </Form.Item>\n </Form>\n </div>\n <Divider plain dashed>\n {t('SignIn.thirdParty')}\n </Divider>\n <div className=\"flex justify-center items-center\">\n <Button block shape=\"round\" href={`${SSO_URL}/login?service=${idaasRedirectUrl}`} target=\"_self\">\n <img src={logoUrl} className=\"w-[18px] mr-2 -mb-0.5\" alt=\"logo\" />\n {t('SignIn.signInWithIDass')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n )\n}\n\nexport default SignIn\n","import useSWR from 'swr'\nimport useSWRMutation from 'swr/mutation'\nimport { useToolkitsContext } from '../../../components/ContextProvider'\nimport type { Game } from '../../../components/GameSelect'\nimport { usePermission } from '../../../hooks/permission'\nimport { request } from '../../../utils/request'\nimport type { PermissionEnumItem, RoleEnumItem, RoleV1, RoleV2 } from '../types'\n\nexport function useAllPermissions() {\n return useSWR('/api/usystem/user/allPermssions', url =>\n request<PermissionEnumItem[]>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useAllPermissionsV2() {\n return useSWR('/api/usystem/user/allPermissionsV2', url =>\n request<{\n game: Game[]\n permission: PermissionEnumItem[]\n }>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useAllRoles() {\n const { accessible } = usePermission('200005', true)\n return useSWR(accessible ? '/api/usystem/role/all' : null, url =>\n request<RoleEnumItem[]>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useRole(name: string) {\n const { usePermissionApiV2 } = useToolkitsContext()\n return useSWR(`/api/usystem/role/${usePermissionApiV2 ? 'infoV2' : 'info'}?name=${name}`, (url: string) =>\n request<RoleV1 | RoleV2>(url, { isGlobal: true }).then(response => response.data),\n )\n}\n\nexport function useCreateRole() {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return useSWRMutation(\n usePermissionApiV2 ? '/api/usystem/role/createV2' : '/api/usystem/role/create',\n (\n url: string,\n {\n arg,\n }: {\n arg: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useUpdateRole() {\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return useSWRMutation(\n usePermissionApiV2 ? '/api/usystem/role/updateV2' : '/api/usystem/role/update',\n (\n url: string,\n {\n arg,\n }: {\n arg: { id: number; name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useRemoveRole() {\n return useSWRMutation(\n '/api/usystem/role/delete',\n (\n url,\n {\n arg,\n }: {\n arg: { id: number; name: string }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useCreateUser() {\n return useSWRMutation(\n '/api/usystem/user/create',\n (\n url,\n {\n arg,\n }: {\n arg: { name: string; roles: string[] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useUpdateUser() {\n return useSWRMutation(\n '/api/usystem/user/update',\n (\n url,\n {\n arg,\n }: {\n arg: { id: string; name: string; roles: string[] }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n\nexport function useRemoveUser() {\n return useSWRMutation(\n '/api/usystem/user/delete',\n (\n url,\n {\n arg,\n }: {\n arg: { id: string; name: string }\n },\n ) =>\n request(url, {\n method: 'post',\n body: arg,\n isGlobal: true,\n }),\n )\n}\n","import { Checkbox, Col, Collapse, Row } from 'antd'\nimport type { CheckboxChangeEvent } from 'antd/es/checkbox'\nimport type { FC } from 'react'\nimport { useCallback, useEffect, useState } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport type { PermissionEnumItem } from '../../types'\n\ninterface PermissionCollapseProps {\n expand?: boolean\n permissions?: PermissionEnumItem[]\n readonly?: boolean\n value?: string[]\n onChange?: (value: string[]) => void\n}\n\nconst PermissionCollapse: FC<PermissionCollapseProps> = props => {\n const { permissions, readonly, expand, value, onChange } = props\n const [activeKey, setActiveKey] = useState<string[]>([])\n const [checkedMap, setCheckedMap] = useState<Record<string, boolean>>({})\n const [internalValue, setInternalValue] = useState<string[]>(value ?? [])\n const t = useTranslation()\n\n const onCollapseChange = useCallback((key: string | string[]) => {\n setActiveKey(key as string[])\n }, [])\n\n const getCheckedValue = (checkedValue: boolean, codes: string[]) => {\n let tempValue: string[] = []\n\n if (checkedValue) {\n tempValue = [...new Set(internalValue.concat(codes))]\n } else {\n tempValue = internalValue.slice()\n\n codes.forEach(code => {\n const index = tempValue.findIndex(item => item === code)\n if (index > -1) {\n tempValue.splice(index, 1)\n }\n })\n }\n\n return tempValue\n }\n\n const onCheckChange = (e: CheckboxChangeEvent, codes: string[]) => {\n const checkedValue = getCheckedValue(e.target.checked, codes)\n setInternalValue(checkedValue)\n onChange?.(checkedValue)\n }\n\n useEffect(() => {\n setInternalValue(value ?? [])\n }, [value])\n\n useEffect(() => {\n if (expand) {\n setActiveKey((permissions ?? []).map(({ category }) => category))\n }\n }, [expand, permissions])\n\n useEffect(() => {\n const checkedValue = (permissions ?? []).reduce(\n (acc, curr) => {\n acc[curr.category] = curr.permissions.every(item => internalValue?.includes(item.value))\n return acc\n },\n {} as Record<string, boolean>,\n )\n\n setCheckedMap(checkedValue)\n }, [internalValue, permissions])\n\n return (\n <Collapse\n style={{ width: '100%' }}\n collapsible=\"header\"\n activeKey={activeKey}\n items={(permissions ?? []).map(item => ({\n key: item.category,\n label: item.category,\n extra: !readonly && (\n <Checkbox\n checked={checkedMap[item.category]}\n onChange={e => {\n onCheckChange(\n e,\n item.permissions.map(permission => permission.value),\n )\n }}\n >\n {t('global.selectAll')}\n </Checkbox>\n ),\n children: (\n <Checkbox.Group style={{ width: '100%' }} value={internalValue} disabled={readonly}>\n <Row gutter={[10, 10]} style={{ width: '100%' }}>\n {item.permissions.map(permission => (\n <Col key={permission.value} span={6}>\n <Checkbox\n value={permission.value}\n onChange={e => {\n onCheckChange(e, [permission.value])\n }}\n >\n {permission.label}\n </Checkbox>\n </Col>\n ))}\n </Row>\n </Checkbox.Group>\n ),\n }))}\n onChange={onCollapseChange}\n />\n )\n}\n\nexport default PermissionCollapse\n","import { Skeleton, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport { useAllPermissions } from '../../hooks'\nimport type { RoleV1 } from '../../types'\nimport PermissionCollapse from '../PermissionCollapse'\nimport type { PermissionListPropsBase } from '../PermissionList'\n\nconst { Text } = Typography\n\ninterface PermissionListV1Props extends PermissionListPropsBase {\n value?: RoleV1['permissions']\n onChange?: (checkedValue: RoleV1['permissions']) => void\n}\n\nconst PermissionListV1: FC<PermissionListV1Props> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: permissions, isLoading, error } = useAllPermissions()\n const t = useTranslation()\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n return (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value}\n permissions={permissions}\n readonly={readonly}\n expand={expand}\n onChange={onChange}\n />\n </Skeleton>\n )\n}\n\nexport default PermissionListV1\n","import { Button, Card, Divider, Empty, Select, Skeleton, Space, Typography } from 'antd'\nimport type { FC } from 'react'\nimport { useEffect, useState } from 'react'\nimport { useTranslation } from '../../../../hooks/i18n'\nimport { useAllPermissionsV2 } from '../../hooks'\nimport type { RoleV2 } from '../../types'\nimport PermissionCollapse from '../PermissionCollapse'\nimport type { PermissionListPropsBase } from '../PermissionList'\n\nconst { Text } = Typography\nconst { Option } = Select\n\ninterface PermissionListV2Props extends PermissionListPropsBase {\n value?: RoleV2['permissions']\n onChange?: (checkedValue: RoleV2['permissions']) => void\n}\n\nconst PermissionListV2: FC<PermissionListV2Props> = props => {\n const { expand = true, value, readonly, onChange } = props\n const { data: { permission, game: games } = {}, isLoading, error } = useAllPermissionsV2()\n const [gameList, setGameList] = useState<{ gameId: string; permissions: string[] }[]>([])\n const globalPermissions = permission?.filter(item => item.is_common)\n const gamePermissions = permission?.filter(item => !item.is_common)\n const t = useTranslation()\n\n useEffect(() => {\n const list: { gameId: string; permissions: string[] }[] = []\n\n Object.keys(value ?? {}).forEach(key => {\n if (key !== 'global') {\n list.push({ gameId: key, permissions: value?.[key] ?? [] })\n }\n })\n\n setGameList(list)\n }, [value])\n\n if (error) {\n return (\n <div className=\"flex justify-center\">\n <Text type=\"danger\">{t('PermissionList.failedDescription')}</Text>\n </div>\n )\n }\n\n const addGame = () => {\n setGameList(prev => [...prev, { gameId: '', permissions: [] }])\n }\n\n const removeGame = (index: number) => {\n setGameList(prev => prev.filter((_, i) => i !== index))\n }\n\n return (\n <div className=\"flex flex-col w-full\">\n <div className=\"mb-12\">\n <Divider dashed>{t('PermissionList.baseSectionTitle')}</Divider>\n </div>\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.global}\n readonly={readonly}\n permissions={globalPermissions}\n expand={expand}\n onChange={newValue => {\n onChange?.({\n ...value,\n global: newValue,\n })\n }}\n />\n </Skeleton>\n <div className=\"my-12\">\n <Divider dashed>{t('PermissionList.gameSectionTitle')}</Divider>\n </div>\n {gameList.map((item, index) => (\n <Card\n title={\n <Space>\n <Text>{t('global.game')}</Text>\n {readonly ? (\n <Text>{games?.find(game => game.id === item.gameId)?.name}</Text>\n ) : (\n <Select\n disabled={readonly}\n value={gameList[index].gameId || undefined}\n style={{ width: '160px' }}\n placeholder={t('PermissionList.gameSelectPlaceholder')}\n onChange={selectedValue => {\n setGameList(pev => {\n const temp = pev.slice()\n temp[index].gameId = selectedValue\n return temp\n })\n }}\n >\n {games?.map(game => (\n <Option key={game.id} value={game.id} disabled={gameList.some(({ gameId }) => gameId === game.id)}>\n {game.name}\n </Option>\n ))}\n </Select>\n )}\n </Space>\n }\n key={index}\n className=\"mb-6\"\n extra={\n !readonly && (\n <Button\n type=\"link\"\n onClick={() => {\n removeGame(index)\n }}\n >\n {t('PermissionList.removeText')}\n </Button>\n )\n }\n >\n {gameList[index].gameId ? (\n <Skeleton active loading={isLoading}>\n <PermissionCollapse\n value={value?.[gameList[index].gameId]}\n readonly={readonly}\n expand={expand}\n permissions={gamePermissions}\n onChange={newValue => {\n onChange?.({\n ...value,\n [gameList[index].gameId]: newValue,\n })\n }}\n />\n </Skeleton>\n ) : (\n <Empty description={t('PermissionList.gameSectionDescription')} />\n )}\n </Card>\n ))}\n {!readonly && (\n <Button block type=\"dashed\" onClick={addGame}>\n {t('PermissionList.addText')}\n </Button>\n )}\n </div>\n )\n}\n\nexport default PermissionListV2\n","import type { FC } from 'react'\nimport { useToolkitsContext } from '../../../../components/ContextProvider'\nimport type { RoleV1, RoleV2 } from '../../types'\nimport PermissionListV1 from '../PermissionListV1'\nimport PermissionListV2 from '../PermissionListV2'\n\nexport interface PermissionListPropsBase {\n expand?: boolean\n readonly?: boolean\n}\n\ninterface PermissionListProps extends PermissionListPropsBase {\n value?: RoleV1['permissions'] | RoleV2['permissions']\n onChange?: (checkedValue: RoleV1['permissions'] | RoleV2['permissions']) => void\n}\n\nconst PermissionList: FC<PermissionListProps> = (props: PermissionListProps) => {\n const { value } = props\n const { usePermissionApiV2 } = useToolkitsContext()\n\n return (\n <>\n {usePermissionApiV2 ? (\n <PermissionListV2 {...props} value={value as RoleV2['permissions']} />\n ) : (\n <PermissionListV1 {...props} value={value as RoleV1['permissions']} />\n )}\n </>\n )\n}\n\nexport default PermissionList\n","export interface PermissionEnumItem {\n category: string\n is_common?: boolean\n permissions: {\n label: string\n value: string\n route: string\n }[]\n}\n\nexport interface RoleEnumItem {\n id: string\n name: string\n}\n\nexport interface RoleListItem {\n id: number\n name: string\n ctime: string\n}\n\nexport interface RoleV1 {\n id: number\n name: string\n ctime: string\n permissions: string[]\n}\n\nexport interface RoleV2 {\n id: number\n name: string\n ctime: string\n permissions: Record<string, string[]>\n}\n\nexport interface UserListItem {\n id: string\n name: string\n ctime: string\n roles: string[]\n}\n","import PermissionList from './components/PermissionList'\n\nexport * from './hooks'\nexport * from './types'\nexport { PermissionList }\n","import { UserAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Col, Form, Input, Row, Select, Space, Tag } from 'antd'\nimport { produce } from 'immer'\nimport type { FC } from 'react'\nimport { Link } from 'react-router-dom'\nimport Highlight from '../../../components/Highlight'\nimport PermissionButton from '../../../components/PermissionButton'\nimport QueryList from '../../../components/QueryList'\nimport type { UserListItem } from '../../../features/permission'\nimport { useAllRoles, useCreateUser, useRemoveUser, useUpdateUser } from '../../../features/permission'\nimport { useFormModal } from '../../../hooks/formModal'\nimport { useTranslation } from '../../../hooks/i18n'\nimport { useQueryListStore } from '../../../stores/queryList'\n\nconst { Option } = Select\n\nexport const action = '/api/usystem/user/list'\n\nfunction useCreateModal() {\n const { message } = App.useApp()\n const create = useCreateUser()\n const { data: roles, isLoading } = useAllRoles()\n const { refresh } = useQueryListStore()\n const t = useTranslation()\n\n return useFormModal<{ id: string; name: string; roles: string[] }>({\n title: t('UserList.createTitle'),\n formProps: {\n labelCol: { flex: '80px' },\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select allowClear mode=\"multiple\" loading={isLoading}>\n {(roles ?? []).map(role => (\n <Option value={role.name} key={role.id}>\n {role.name}\n </Option>\n ))}\n </Select>\n </Form.Item>\n </>\n ),\n async onConfirm(values) {\n await create.trigger(values)\n refresh(action, 1)\n message.success(t('UserList.createSuccessfully'))\n },\n })\n}\n\nfunction useUpdateUserModal() {\n const { message } = App.useApp()\n const update = useUpdateUser()\n const { data: roles, isLoading } = useAllRoles()\n const { mutate } = useQueryListStore()\n const t = useTranslation()\n\n return useFormModal<{ id: string; name: string; roles: string[] }, { id: string }>({\n title: t('UserList.updateTitle'),\n formProps: {\n labelCol: { flex: '80px' },\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input readOnly />\n </Form.Item>\n <Form.Item label={t('global.role')} name=\"roles\">\n <Select\n allowClear\n mode=\"multiple\"\n loading={isLoading}\n options={roles?.map(role => ({\n label: role.name,\n value: role.name,\n }))}\n />\n </Form.Item>\n </>\n ),\n async onConfirm(values, extraValues) {\n await update.trigger(values)\n mutate<UserListItem>(\n action,\n prev => {\n return produce(prev, draft => {\n if (draft?.dataSource) {\n const index = draft.dataSource?.findIndex(item => item.id === extraValues?.id)\n if (index !== -1) {\n draft.dataSource[index].roles = values.roles\n }\n }\n })\n },\n { revalidate: false },\n )\n message.success(t('UserList.updateSuccessfully'))\n },\n })\n}\n\nconst UserList: FC = () => {\n const { modal, message } = App.useApp()\n const remove = useRemoveUser()\n const { mutate } = useQueryListStore()\n const { show: showCreateModal, modal: createModal } = useCreateModal()\n const { show: showUpdateModal, modal: updateModal } = useUpdateUserModal()\n const t = useTranslation()\n\n const columns: TableColumnsType<UserListItem> = [\n {\n title: t('global.name'),\n dataIndex: 'name',\n key: 'name',\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.role'),\n dataIndex: 'roles',\n key: 'roles',\n width: '40%',\n render(value: string[]) {\n return (\n <Row gutter={[4, 4]}>\n {(value || []).map((item: string) => (\n <Col key={item}>\n {item === 'root' ? (\n <Tag color=\"#f50\">{item}</Tag>\n ) : (\n <Tag color=\"#ff5a00\">\n <Link to={`/permission/role/${item}`}>{item}</Link>\n </Tag>\n )}\n </Col>\n ))}\n </Row>\n )\n },\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'Ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (value: UserListItem) => (\n <Space>\n <PermissionButton\n isGlobal\n size=\"small\"\n type=\"link\"\n code=\"100003\"\n onClick={() => {\n showUpdateModal({\n initialValues: {\n name: value.name,\n roles: value.roles,\n },\n extraValues: {\n id: value.id,\n },\n })\n }}\n >\n {t('global.update')}\n </PermissionButton>\n <PermissionButton\n isGlobal\n danger\n size=\"small\"\n code=\"100004\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('UserList.deleteTitle'),\n content: (\n <Highlight texts={[value.name]}>{t('UserList.deleteContent', { user: value.name })}</Highlight>\n ),\n async onOk() {\n await remove.trigger({\n id: value.id,\n name: value.name,\n })\n mutate(action, prev => {\n return produce(prev, draft => {\n const index = draft?.dataSource?.findIndex(item => item.id === value.id)\n if (index) {\n draft?.dataSource?.splice(index, 1)\n }\n })\n })\n message.success(t('UserList.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </PermissionButton>\n </Space>\n ),\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.user')}\n extra={\n <PermissionButton\n isGlobal\n type=\"primary\"\n icon={<UserAddOutlined />}\n code=\"100002\"\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('UserList.createTitle')}\n </PermissionButton>\n }\n >\n <QueryList<UserListItem, undefined, { List: UserListItem[]; Total: number }>\n isGlobal\n code=\"100001\"\n action={action}\n rowKey=\"id\"\n columns={columns}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default UserList\n","import { UsergroupAddOutlined } from '@ant-design/icons'\nimport type { TableColumnsType } from 'antd'\nimport { App, Card, Form, Input, Space } from 'antd'\nimport { produce } from 'immer'\nimport { Link } from 'react-router-dom'\nimport { useToolkitsContext } from '../../../components/ContextProvider'\nimport Highlight from '../../../components/Highlight'\nimport PermissionButton from '../../../components/PermissionButton'\nimport QueryList from '../../../components/QueryList'\nimport type { RoleListItem, RoleV1, RoleV2 } from '../../../features/permission'\nimport { PermissionList, useCreateRole, useRemoveRole, useUpdateRole } from '../../../features/permission'\nimport { useFormModal } from '../../../hooks/formModal'\nimport { useTranslation } from '../../../hooks/i18n'\nimport { usePermission } from '../../../hooks/permission'\nimport { useQueryListStore } from '../../../stores/queryList'\nimport { request } from '../../../utils/request'\n\nconst action = '/api/usystem/role/list'\n\nconst useCreateModal = () => {\n const { message } = App.useApp()\n const { refresh } = useQueryListStore()\n const create = useCreateRole()\n const t = useTranslation()\n\n const onConfirm = async (values: { name: string; permissions: RoleV1['permissions'] | RoleV2['permissions'] }) => {\n await create.trigger({\n name: `role_${values.name}`,\n permissions: values.permissions,\n })\n refresh(action, 1)\n message.success(t('RoleList.createSuccessfully'))\n }\n\n return useFormModal<{\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n }>({\n title: t('RoleList.createTitle'),\n width: '50vw',\n formProps: {\n layout: 'vertical',\n },\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input addonBefore=\"role_\" />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n ),\n onConfirm,\n })\n}\n\nconst useUpdateModal = () => {\n const { message } = App.useApp()\n const { mutate } = useQueryListStore()\n const update = useUpdateRole()\n const t = useTranslation()\n\n return useFormModal<\n {\n name: string\n permissions: RoleV1['permissions'] | RoleV2['permissions']\n },\n {\n id: number\n }\n >({\n title: t('RoleList.updateTitle'),\n width: '50vw',\n content: (\n <>\n <Form.Item label={t('global.name')} name=\"name\" rules={[{ required: true }]}>\n <Input readOnly addonBefore=\"role_\" />\n </Form.Item>\n <Form.Item name=\"permissions\">\n <PermissionList />\n </Form.Item>\n </>\n ),\n onConfirm: async (values, extraValues) => {\n await update.trigger({\n id: extraValues?.id as number,\n name: `role_${values.name}`,\n permissions: values.permissions,\n })\n mutate(\n action,\n prev =>\n produce(prev, draft => {\n const match = draft?.dataSource?.find(item => item.id === extraValues?.id)\n\n if (match) {\n match.permissions = values.permissions\n }\n }),\n { revalidate: false },\n )\n message.success(t('RoleList.updateSuccessfully'))\n },\n })\n}\n\nconst RoleList = () => {\n const { accessible: viewable } = usePermission('200005', true)\n const { modal, message } = App.useApp()\n const { usePermissionApiV2 } = useToolkitsContext()\n const remove = useRemoveRole()\n const { mutate } = useQueryListStore()\n const { show: showCreateModal, modal: createModal } = useCreateModal()\n const { show: showUpdateModal, modal: updateModal } = useUpdateModal()\n const t = useTranslation()\n\n const columns: TableColumnsType<RoleListItem> = [\n {\n title: t('global.name'),\n key: 'name',\n render(value: RoleListItem) {\n if (viewable) {\n return (\n <Link to={`${value.name}`} relative=\"path\">\n {value.name}\n </Link>\n )\n } else {\n return <>{value.name}</>\n }\n },\n },\n {\n title: 'ID',\n dataIndex: 'id',\n key: 'id',\n },\n {\n title: t('global.creationTime'),\n dataIndex: 'ctime',\n key: 'ctime',\n },\n {\n title: t('global.operation'),\n width: 150,\n align: 'center',\n render: (value: RoleListItem) => {\n return (\n <Space size=\"small\">\n <PermissionButton\n isGlobal\n code=\"200003\"\n size=\"small\"\n type=\"link\"\n onClick={async () => {\n const { data: role } = await request<RoleV1 | RoleV2>(\n `/api/usystem/role/info${usePermissionApiV2 ? 'V2' : ''}?name=${value.name}`,\n { isGlobal: true },\n )\n showUpdateModal({\n initialValues: {\n permissions: role?.permissions,\n name: role?.name.replace(/^role_/, ''),\n },\n extraValues: {\n id: role?.id,\n },\n })\n }}\n >\n {t('global.edit')}\n </PermissionButton>\n <PermissionButton\n isGlobal\n danger\n code=\"200004\"\n size=\"small\"\n type=\"link\"\n onClick={() => {\n modal.confirm({\n title: t('RoleList.deleteTitle'),\n content: (\n <Highlight texts={[value.name]}>{t('RoleList.deleteContent', { role: value.name })}</Highlight>\n ),\n async onOk() {\n await remove.trigger({\n id: value.id,\n name: value.name,\n })\n mutate(action, prev => {\n return produce(prev, draft => {\n const index = draft?.dataSource?.findIndex(item => item.id === value.id)\n if (index) {\n draft?.dataSource?.splice(index, 1)\n }\n })\n })\n message.success(t('RoleList.deleteSuccessfully'))\n },\n })\n }}\n >\n {t('global.delete')}\n </PermissionButton>\n </Space>\n )\n },\n },\n ]\n\n return (\n <>\n <Card\n title={t('global.role')}\n extra={\n <PermissionButton\n isGlobal\n type=\"primary\"\n code=\"200002\"\n icon={<UsergroupAddOutlined />}\n onClick={() => {\n showCreateModal()\n }}\n >\n {t('RoleList.createTitle')}\n </PermissionButton>\n }\n >\n <QueryList<RoleListItem, undefined, { List: RoleListItem[]; Total: number }>\n isGlobal\n rowKey=\"name\"\n columns={columns}\n code=\"200001\"\n action={action}\n getTotal={response => response.Total}\n getDataSource={response => response.List}\n />\n </Card>\n {createModal}\n {updateModal}\n </>\n )\n}\n\nexport default RoleList\n","import { Breadcrumb, Card, Descriptions, Skeleton } from 'antd'\nimport { Link, useParams } from 'react-router-dom'\nimport { PermissionList, useRole } from '../../../features/permission'\nimport { useTranslation } from '../../../hooks/i18n'\n\nconst RoleDetail = () => {\n const params = useParams()\n const { data, isLoading } = useRole(params.name as string)\n const t = useTranslation()\n\n return (\n <>\n <Breadcrumb\n style={{ marginBottom: 24 }}\n items={[\n {\n key: '1',\n title: <Link to=\"..\">{t('global.role')}</Link>,\n },\n {\n key: '2',\n title: params.name,\n },\n ]}\n />\n <Card title={t('RoleDetail.title')}>\n <Skeleton loading={isLoading}>\n <Descriptions column={3} layout=\"vertical\">\n <Descriptions.Item label={t('global.name')}>{data?.name}</Descriptions.Item>\n <Descriptions.Item label=\"ID\">{data?.id}</Descriptions.Item>\n <Descriptions.Item label={t('global.creationTime')}>{data?.ctime}</Descriptions.Item>\n </Descriptions>\n <PermissionList readonly value={data?.permissions} />\n </Skeleton>\n </Card>\n </>\n )\n}\n\nexport default RoleDetail\n","import { lazy } from 'react'\nimport { Navigate, Route, Routes } from 'react-router-dom'\n\nconst UserList = lazy(() => import('./UserList'))\nconst RoleList = lazy(() => import('./RoleList'))\nconst RoleDetail = lazy(() => import('./RoleDetail'))\n\nconst Permission = () => {\n return (\n <Routes>\n <Route index element={<Navigate to=\"user\" />} />\n <Route path=\"user\" element={<UserList />} />\n <Route path=\"role\" element={<RoleList />} />\n <Route path=\"role/:name\" element={<RoleDetail />} />\n </Routes>\n )\n}\n\nexport default Permission\n","import type { ContextState } from './components/ContextProvider'\nimport ContextProvider, { contextStore, useToolkitsContext } from './components/ContextProvider'\nimport type { DynamicTagsProps } from './components/DynamicTags'\nimport DynamicTags from './components/DynamicTags'\nimport type { FilterFormWrapperProps } from './components/FilterFormWrapper'\nimport FilterFormWrapper from './components/FilterFormWrapper'\nimport type { Game, GameState } from './components/GameSelect'\nimport GameSelect, { useGameStore } from './components/GameSelect'\nimport type { HighlightTextsProps } from './components/Highlight'\nimport Highlight from './components/Highlight'\nimport type { InfiniteListProps } from './components/InfiniteList'\nimport InfiniteList from './components/InfiniteList'\nimport Layout from './components/Layout'\nimport type { NavMenuItem } from './components/NavMenu'\nimport NavMenu from './components/NavMenu'\nimport type { PermissionButtonProps } from './components/PermissionButton'\nimport PermissionButton from './components/PermissionButton'\nimport type { PermissionGuardProps } from './components/PermissionGuard'\nimport PermissionGuard from './components/PermissionGuard'\nimport type { QueryListProps, QueryListRef } from './components/QueryList'\nimport QueryList, { QueryListAction } from './components/QueryList'\nimport UserWidget from './components/UserWidget'\nimport type { UseFormModalProps } from './hooks/formModal'\nimport { useFormModal } from './hooks/formModal'\nimport { useTranslation } from './hooks/i18n'\nimport { useModal, useModalStore } from './hooks/modal'\nimport { usePermission, usePermissions } from './hooks/permission'\nimport NotFound from './pages/NotFound'\nimport OperationLogList from './pages/OperationLogList'\nimport SignIn from './pages/SignIn'\nimport Permission from './pages/permission'\nimport { useQueryListStore } from './stores/queryList'\nimport type { TokenState } from './stores/token'\nimport { useTokenStore, useTokenValidation } from './stores/token'\nimport './styles/index.css'\nimport type { Locale } from './types'\nimport type { RequestOptions, RequestResponse } from './utils/request'\nimport { RequestError, request } from './utils/request'\nimport { withBaseRoutes, withLayout } from './utils/router'\nimport { mixedStorage } from './utils/storage'\n\nexport {\n ContextProvider,\n DynamicTags,\n FilterFormWrapper,\n GameSelect,\n Highlight,\n InfiniteList,\n Layout,\n NavMenu,\n NotFound,\n OperationLogList,\n Permission,\n PermissionButton,\n PermissionGuard,\n QueryList,\n QueryListAction,\n RequestError,\n SignIn,\n UserWidget,\n contextStore,\n mixedStorage,\n request,\n useFormModal,\n useGameStore,\n useModal,\n useModalStore,\n usePermission,\n usePermissions,\n useQueryListStore,\n useTokenStore,\n useTokenValidation,\n useToolkitsContext,\n useTranslation,\n withBaseRoutes,\n withLayout,\n type ContextState,\n type DynamicTagsProps,\n type FilterFormWrapperProps,\n type Game,\n type GameState,\n type HighlightTextsProps,\n type InfiniteListProps,\n type Locale,\n type NavMenuItem,\n type PermissionButtonProps,\n type PermissionGuardProps,\n type QueryListProps,\n type QueryListRef,\n type RequestOptions,\n type RequestResponse,\n type TokenState,\n type UseFormModalProps,\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport type { InputRef } from 'antd'\nimport { Input, Space, Tag, theme } from 'antd'\nimport type { ChangeEvent, CSSProperties, FC } from 'react'\nimport { useEffect, useRef, useState } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\n\nexport interface DynamicTagsProps {\n initialTags?: string[]\n addable?: boolean\n removable?: boolean\n // 返回 Promise。如果返回 Promise.resolve(true),则添加; 如果返回 Promise.resolve(false) 或 Promise.reject,则不添加\n addCallback?: (addedTag: string) => Promise<boolean>\n // 返回 Promise。如果返回 Promise.resolve(true),则删除; 如果返回 Promise.resolve(false) 或 Promise.reject,则不删除\n removeCallback?: (removedTag: string) => Promise<boolean>\n}\n\nconst DynamicTags: FC<DynamicTagsProps> = props => {\n const { initialTags, addable, removable, addCallback, removeCallback } = props\n const t = useTranslation()\n const { token } = theme.useToken()\n const [tags, setTags] = useState<string[]>([])\n const [inputVisible, setInputVisible] = useState(false)\n const [inputValue, setInputValue] = useState('')\n const [editInputIndex, setEditInputIndex] = useState(-1)\n const [editInputValue, setEditInputValue] = useState<string>('')\n const inputRef = useRef<InputRef>(null)\n const editInputRef = useRef<InputRef>(null)\n\n useEffect(() => {\n setTags(initialTags ?? [])\n }, [initialTags])\n\n useEffect(() => {\n if (inputVisible) {\n inputRef.current?.focus()\n }\n }, [inputVisible])\n\n useEffect(() => {\n editInputRef.current?.focus()\n }, [inputValue])\n\n const handleClose = async (removedTag: string) => {\n const success = await removeCallback?.(removedTag)\n\n if (success) {\n const newTags = tags.filter(tag => tag !== removedTag)\n setTags(newTags)\n }\n }\n\n const showInput = () => {\n setInputVisible(true)\n }\n\n const handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setInputValue(e.target.value)\n }\n\n const handleInputConfirm = async () => {\n if (inputValue && tags.indexOf(inputValue) === -1) {\n const success = await addCallback?.(inputValue)\n\n if (success) {\n setTags([...tags, inputValue])\n }\n }\n\n setInputVisible(false)\n setInputValue('')\n }\n\n const handleEditInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n setEditInputValue(e.target.value)\n }\n\n const handleEditInputConfirm = () => {\n const newTags = [...tags]\n newTags[editInputIndex] = editInputValue\n setTags(newTags)\n setEditInputIndex(-1)\n setInputValue('')\n }\n\n const tagInputStyle: CSSProperties = {\n width: 78,\n verticalAlign: 'top',\n }\n\n const tagPlusStyle: CSSProperties = {\n background: token.colorBgContainer,\n borderStyle: 'dashed',\n }\n\n return (\n <Space wrap size={[0, 8]}>\n <Space wrap size={[0, 8]}>\n {tags.map((tag, index) => {\n if (editInputIndex === index) {\n return (\n <Input\n ref={editInputRef}\n key={tag}\n size=\"small\"\n style={tagInputStyle}\n value={editInputValue}\n onChange={handleEditInputChange}\n onBlur={handleEditInputConfirm}\n onPressEnter={handleEditInputConfirm}\n />\n )\n }\n\n return (\n <Tag\n key={tag}\n closable={removable}\n style={{ userSelect: 'none' }}\n onClose={async e => {\n e.preventDefault()\n await handleClose(tag)\n }}\n >\n <span\n onDoubleClick={e => {\n if (index !== 0) {\n setEditInputIndex(index)\n setEditInputValue(tag)\n e.preventDefault()\n }\n }}\n >\n {tag}\n </span>\n </Tag>\n )\n })}\n </Space>\n {addable &&\n (inputVisible ? (\n <Input\n ref={inputRef}\n type=\"text\"\n size=\"small\"\n style={tagInputStyle}\n value={inputValue}\n onChange={handleInputChange}\n onBlur={handleInputConfirm}\n onPressEnter={handleInputConfirm}\n />\n ) : (\n <Tag style={tagPlusStyle} onClick={showInput}>\n <PlusOutlined />\n &nbsp;{t('global.add')}\n </Tag>\n ))}\n </Space>\n )\n}\n\nexport default DynamicTags\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { FormInstance } from 'antd'\nimport { Button, Form, Result, Spin, Table } from 'antd'\nimport type { TableProps } from 'antd/es/table'\nimport qs from 'query-string'\nimport type { Key, ReactNode } from 'react'\nimport { useEffect, useState } from 'react'\nimport useSWRInfinite from 'swr/infinite'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\nimport { request } from '../../utils/request'\nimport FilterFormWrapper from '../FilterFormWrapper'\n\ninterface InfiniteListExtra<Values> {\n key: Key\n children: ReactNode | ((form: FormInstance<Values>) => ReactNode)\n}\n\nexport interface InfiniteListProps<Item, Values, Response>\n extends Pick<TableProps<Item>, 'columns' | 'rowKey' | 'tableLayout' | 'expandable' | 'rowSelection' | 'bordered'> {\n action: string\n getRowKey: (response: Response) => any\n getDataSource: (data: Response[] | undefined) => Item[]\n code?: string\n headers?: Record<string, string> | ((form: FormInstance<Values>) => Record<string, string>)\n renderForm?: (form: FormInstance<Values>) => ReactNode\n transformArg: (values: Values, rowKey?: string) => Record<any, any>\n hasMore?: (data: Response[] | undefined) => boolean\n isGlobal?: boolean\n extras?: InfiniteListExtra<Values>[]\n}\n\nconst InfiniteList = <Item extends object, Values extends object | undefined = undefined, Response = any>(\n props: InfiniteListProps<Item, Values, Response>,\n) => {\n const {\n code,\n action,\n extras,\n headers,\n isGlobal,\n getRowKey,\n getDataSource,\n hasMore,\n renderForm,\n transformArg,\n ...tableProps\n } = props\n const t = useTranslation()\n const [form] = Form.useForm<Values>()\n const { accessible, isLoading } = usePermission(code)\n const [isValid, setIsValid] = useState(false)\n const [formValues, setFormValues] = useState<Values>()\n\n const getKey = (pageIndex: number, previousPageData: Response) => {\n if (!isValid) return null\n\n const rowKey = pageIndex !== 0 ? getRowKey(previousPageData) : undefined\n const args = transformArg(formValues as Values, rowKey)\n const queryString = qs.stringify(args)\n\n return queryString ? `${action}?${qs.stringify(args)}` : action\n }\n\n const {\n data,\n size,\n setSize,\n isValidating: isListValidating,\n } = useSWRInfinite(\n getKey,\n arg =>\n request<Response>(arg, {\n headers: typeof headers === 'function' ? headers(form) : headers,\n isGlobal,\n }).then(response => response.data),\n {\n shouldRetryOnError: false,\n revalidateOnFocus: false,\n revalidateFirstPage: false,\n },\n )\n\n const dataSource = getDataSource(data)\n const isLoadingMore = isListValidating || (size > 0 && data && typeof data[size - 1] === 'undefined')\n const isReachingEnd = typeof hasMore !== 'undefined' ? !hasMore(data) : true\n const isEmpty = !dataSource || dataSource.length === 0\n\n const onConfirm = async () => {\n const values = await form.getFieldsValue()\n setFormValues(values)\n\n try {\n await form.validateFields()\n setSize(1)\n setIsValid(true)\n } catch (_) {\n setSize(0)\n setIsValid(false)\n }\n }\n\n const loadMore = () => {\n setSize(size + 1)\n }\n\n const onReset = async () => {\n try {\n form.resetFields()\n await form.validateFields({ validateOnly: true })\n setSize(1)\n } catch (_) {\n setSize(0)\n }\n }\n\n useEffect(() => {\n if (accessible) {\n form\n .validateFields({ validateOnly: true })\n .then(values => {\n setFormValues(values)\n setIsValid(true)\n })\n .catch(() => {\n setIsValid(false)\n })\n }\n }, [accessible])\n\n if (isLoading) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 300,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status={403} subTitle={t('global.noEntitlement')} />\n }\n\n return (\n <>\n {renderForm ? (\n <FilterFormWrapper\n extras={extras?.map(extra => ({\n key: extra.key,\n children: typeof extra.children === 'function' ? extra.children(form) : extra.children,\n }))}\n onReset={onReset}\n onConfirm={onConfirm}\n >\n {renderForm(form)}\n </FilterFormWrapper>\n ) : (\n <Form form={form} />\n )}\n <Table {...tableProps} dataSource={dataSource} loading={isLoadingMore} pagination={false} />\n {!isEmpty && (\n <Button\n block\n loading={isLoadingMore}\n type=\"link\"\n htmlType=\"button\"\n disabled={isLoadingMore || isReachingEnd}\n onClick={loadMore}\n >\n {isLoadingMore\n ? t('InfiniteList.loadingText')\n : isReachingEnd\n ? t('InfiniteList.reachEndText')\n : t('InfiniteList.loadMoreText')}\n </Button>\n )}\n </>\n )\n}\n\nexport default InfiniteList\n","import * as Antd from 'antd'\nimport { Card, Divider, Empty, Space } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { Suspense } from 'react'\nimport logoUrl from '../../assets/logo.png'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useToolkitsContext } from '../ContextProvider'\nimport GameSelect, { useGameStore } from '../GameSelect'\nimport NavMenu from '../NavMenu'\nimport UserWidget from '../UserWidget'\n\nconst { Spin, theme } = Antd\nconst { Header, Sider, Content } = Antd.Layout\n\nconst ContentGuard: FC<PropsWithChildren> = props => {\n const { children } = props\n const { usePermissionApiV2, hideGameSelect } = useToolkitsContext()\n const { game, isLoading, switching } = useGameStore()\n const t = useTranslation()\n\n if (isLoading || switching) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (usePermissionApiV2 && !hideGameSelect && !game) {\n return (\n <Card>\n <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={t('RequireGame.description')} />\n </Card>\n )\n }\n\n return children\n}\n\nconst Layout: FC<PropsWithChildren> = props => {\n const { children } = props\n const {\n token: { colorBgContainer, colorBorder },\n } = theme.useToken()\n const { appTitle, usePermissionApiV2, hideGameSelect, localeDropdownMenu, layoutHeaderExtras } = useToolkitsContext()\n\n return (\n <Antd.Layout hasSider className=\"h-screen\">\n <Sider\n width={256}\n style={{\n overflow: 'auto',\n height: '100vh',\n position: 'fixed',\n left: 0,\n top: 0,\n bottom: 0,\n borderRightWidth: 1,\n borderRightStyle: 'solid',\n borderRightColor: colorBorder,\n }}\n theme=\"light\"\n >\n <div className=\"flex items-center px-6 py-4\">\n <img src={logoUrl} alt=\"logo\" className=\"w-8 h-8\" />\n <div className=\"ml-2\">{appTitle}</div>\n </div>\n <NavMenu />\n </Sider>\n <Antd.Layout className=\"ml-64\">\n <Header\n style={{\n padding: '0 24px',\n background: colorBgContainer,\n borderBottomWidth: 1,\n borderBottomStyle: 'solid',\n borderBottomColor: colorBorder,\n }}\n >\n <div className=\"flex justify-between items-center h-full\">\n <div>{usePermissionApiV2 && !hideGameSelect && <GameSelect />}</div>\n <Space size=\"small\" split={<Divider type=\"vertical\" />}>\n {layoutHeaderExtras?.map(extra => <span key={extra.key}>{extra.children}</span>)}\n {localeDropdownMenu}\n <UserWidget />\n </Space>\n </div>\n </Header>\n <Content className=\"p-6 bg-gray-50 over\">\n <Suspense\n fallback={\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: '200px',\n }}\n />\n }\n >\n <ContentGuard>{children}</ContentGuard>\n </Suspense>\n </Content>\n </Antd.Layout>\n </Antd.Layout>\n )\n}\n\nexport default Layout\n","import type { MenuProps } from 'antd'\nimport { Menu } from 'antd'\nimport type {\n ItemType,\n MenuDividerType,\n MenuItemGroupType,\n MenuItemType,\n SubMenuType,\n} from 'antd/es/menu/hooks/useItems'\nimport type { ReactNode } from 'react'\nimport { memo, useEffect, useMemo } from 'react'\nimport { Link, useLocation } from 'react-router-dom'\nimport type { Merge } from 'ts-essentials'\nimport { usePermissions } from '../../hooks/permission'\nimport { useToolkitsContext } from '../ContextProvider'\nimport { useNavStore } from '../NavMenu/store'\n\n// 扩展 antd Menu 的类型,使其支持一些我们想要的自定义字段。\ntype MenuItemType2 = Merge<\n MenuItemType,\n {\n // 权限编号\n code?: string\n // 前端路由地址\n route?: string\n }\n>\n\ntype SubMenuType2 = Merge<\n SubMenuType,\n {\n children?: NavMenuItem[]\n }\n>\n\ntype MenuItemGroupType2 = Merge<MenuItemGroupType, { children?: NavMenuItem[] }>\n\nexport type NavMenuItem = MenuItemType2 | SubMenuType2 | MenuItemGroupType2 | MenuDividerType | null\n\nconst withLink = (label?: ReactNode, route?: string): ReactNode => {\n if (route) {\n return <Link to={route}>{label}</Link>\n }\n\n return label\n}\n\nfunction checkChildren(children: NavMenuItem[], permissions?: Record<string, boolean>): boolean {\n return (children ?? []).some(child => {\n if (child === null) {\n return false\n } else if ((child as MenuDividerType).type === 'divider') {\n return true\n } else {\n if ((child as SubMenuType2 | MenuItemGroupType2).children) {\n return checkChildren((child as SubMenuType2 | MenuItemGroupType2).children ?? [], permissions)\n } else {\n return !permissions || !(child as MenuItemType2).code || permissions[(child as MenuItemType2).code as string]\n }\n }\n })\n}\n\nfunction transformItems(items: NavMenuItem[], permissions?: Record<string, boolean>) {\n const result: ItemType[] = []\n\n for (let i = 0; i < items.length; i++) {\n if (items[i] === null) {\n result[i] = null\n } else if ((items[i] as MenuDividerType).type === 'divider') {\n result[i] = { ...items[i] } as MenuDividerType\n } else {\n if ((items[i] as SubMenuType2 | MenuItemGroupType2).children) {\n const { children, ...restProps } = items[i] as SubMenuType2 | MenuItemGroupType2\n\n result[i] = checkChildren(children ?? [], permissions)\n ? ({\n ...restProps,\n children: transformItems(children ?? [], permissions),\n } as SubMenuType | MenuItemGroupType)\n : null\n } else {\n const { route, label, code, ...restProps } = items[i] as MenuItemType2\n const isPass = !code || !permissions || permissions[code]\n\n result[i] = isPass\n ? ({\n ...restProps,\n label: withLink(label, route),\n } as MenuItemType)\n : null\n }\n }\n }\n\n return result\n}\n\n// 拍平导航配置,并且注入 keypath 字段\nfunction flatItems(\n items: NavMenuItem[],\n result: Merge<MenuItemType2, { keypath?: string[] }>[] = [],\n keypath: string[] = [],\n) {\n for (const item of items) {\n const children = (item as SubMenuType2 | MenuItemGroupType2)?.children as NavMenuItem[]\n\n if (Array.isArray(children)) {\n const keys =\n (item as MenuItemGroupType2)!.type !== 'group' && item!.key ? [...keypath, item!.key as string] : keypath\n flatItems(children, result, keys)\n } else if (item) {\n result.push(Object.assign(item as MenuItemType2, { keypath }))\n }\n }\n\n return result\n}\n\nconst NavMenu = memo(function NavMenu() {\n const location = useLocation()\n const { menuItems } = useToolkitsContext()\n const flattenItems = useMemo(() => flatItems(menuItems ?? []), [menuItems])\n const codes = flattenItems.map(item => item.code).filter(Boolean) as string[]\n const { data: permissions } = usePermissions(codes, true, { suspense: true })\n const internalItems = useMemo(() => transformItems(menuItems ?? [], permissions), [menuItems, permissions])\n const { openKeys, selectedKeys, setOpenKeys, setSelectedKeys } = useNavStore()\n\n const onOpenChange: MenuProps['onOpenChange'] = keys => {\n const latestOpenKey = keys?.find(key => openKeys?.indexOf(key) === -1)\n const match = flattenItems.find(item => latestOpenKey === item.key)\n setOpenKeys((match?.keypath ?? [latestOpenKey]) as string[])\n }\n\n useEffect(() => {\n const match = flattenItems.find(item => location.pathname === item.route)\n\n if (match) {\n const key = match.key as string\n const keypath = match.keypath as string[]\n setSelectedKeys([key])\n setOpenKeys(keypath)\n }\n }, [flattenItems, location])\n\n return (\n <Menu\n style={{ borderRight: 'none' }}\n items={internalItems}\n mode=\"inline\"\n openKeys={openKeys}\n selectedKeys={selectedKeys}\n onOpenChange={onOpenChange}\n />\n )\n})\n\nif (process.env.NODE_ENV === 'development') {\n NavMenu.displayName = 'NavMenu'\n}\n\nexport default NavMenu\n","import { create } from 'zustand'\nimport { createJSONStorage, persist } from 'zustand/middleware'\n\nexport interface NavState {\n openKeys: string[]\n selectedKeys: string[]\n setOpenKeys: (keys: string[]) => void\n setSelectedKeys: (keys: string[]) => void\n}\n\nexport const useNavStore = create<NavState>()(\n persist(\n set => ({\n openKeys: [],\n setOpenKeys: keys => set({ openKeys: keys }),\n selectedKeys: [],\n setSelectedKeys: keys => set({ selectedKeys: keys }),\n }),\n {\n name: 'nav',\n storage: createJSONStorage(() => localStorage),\n partialize: state => ({\n openKeys: state.openKeys,\n selectedKeys: state.selectedKeys,\n }),\n },\n ),\n)\n","import { LogoutOutlined, UserOutlined } from '@ant-design/icons'\nimport type { MenuProps } from 'antd'\nimport { Dropdown, Space } from 'antd'\nimport type { FC } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport { useTranslation } from '../../hooks/i18n'\nimport { useTokenStore } from '../../stores/token'\nimport { useToolkitsContext } from '../ContextProvider'\n\nconst UserWidget: FC = () => {\n const navigate = useNavigate()\n const { clearToken, getUser } = useTokenStore()\n const user = getUser()\n const t = useTranslation()\n const { logoutRedirectUrl } = useToolkitsContext()\n\n const items: MenuProps['items'] = [\n {\n key: '1',\n label: (\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/anchor-is-valid\n <a\n data-cy=\"user-widget-logout\"\n onClick={() => {\n clearToken()\n if (logoutRedirectUrl) {\n navigate(logoutRedirectUrl)\n }\n }}\n >\n {t('UserWidget.signOutText')}\n </a>\n ),\n icon: <LogoutOutlined />,\n },\n ]\n\n return (\n <div data-cy=\"user-widget\">\n <Dropdown\n menu={{\n selectable: true,\n items,\n }}\n placement=\"bottomRight\"\n >\n {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions,jsx-a11y/anchor-is-valid */}\n <a\n onClick={e => {\n e.preventDefault()\n }}\n >\n <Space align=\"center\">\n <span>{user?.authorityId}</span>\n <UserOutlined style={{ fontSize: '16px' }} />\n </Space>\n </a>\n </Dropdown>\n </div>\n )\n}\n\nexport default UserWidget\n","import { Result, Spin } from 'antd'\nimport type { FC, PropsWithChildren } from 'react'\nimport { useTranslation } from '../../hooks/i18n'\nimport { usePermission } from '../../hooks/permission'\n\nexport interface PermissionGuardProps {\n code: string\n}\n\nconst PermissionGuard: FC<PropsWithChildren<PermissionGuardProps>> = props => {\n const { code, children } = props\n const { accessible, isValidating } = usePermission(code)\n const t = useTranslation()\n\n if (isValidating) {\n return (\n <Spin\n style={{\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n height: 200,\n }}\n />\n )\n }\n\n if (!accessible) {\n return <Result status=\"403\" subTitle={t('global.noEntitlement')} />\n }\n\n return <>{children}</>\n}\n\nexport default PermissionGuard\n","import type { ComponentType, ReactNode } from 'react'\nimport { lazy } from 'react'\nimport { Route, Routes } from 'react-router-dom'\nimport type { ContextState } from '../components/ContextProvider'\nimport ContextProvider from '../components/ContextProvider'\nimport Layout from '../components/Layout'\n\nconst NotFound = lazy(() => import('../pages/NotFound'))\nconst OperationLogList = lazy(() => import('../pages/OperationLogList'))\nconst SignIn = lazy(() => import('../pages/SignIn'))\nconst Permission = lazy(() => import('../pages/permission'))\n\nexport const withLayout = (WrappedComponent: ComponentType, props?: Partial<ContextState>) => {\n const ComponentWithLayout = () => {\n return (\n <ContextProvider {...props}>\n <Layout>\n <WrappedComponent />\n </Layout>\n </ContextProvider>\n )\n }\n\n return ComponentWithLayout\n}\n\nexport function withBaseRoutes(routes: ReactNode, props?: Partial<Omit<ContextState, 'hideGameSelect'>>) {\n const ComponentWithBaseRoutes = () => {\n const sharedProps = Object.assign({}, props, { hideGameSelect: true })\n\n return (\n <Routes>\n {routes}\n <Route path=\"/operation_log\" Component={withLayout(OperationLogList, sharedProps)} />\n <Route path=\"/permission/*\" Component={withLayout(Permission, sharedProps)} />\n <Route path=\"/sign_in\" element={<SignIn />} />\n <Route path=\"*\" element={<NotFound />} />\n </Routes>\n )\n }\n\n return ComponentWithBaseRoutes\n}\n"]}