@kodiak-finance/orderly-portfolio 2.8.18-rc.1 → 2.8.18

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/pages/overview/assets/assets.script.ts","../src/pages/overview/assets/assetsHeader.tsx","../src/pages/overview/assets/assets.ui.tsx","../src/pages/overview/assets/assets.widget.tsx","../src/pages/overview/assets/index.ts","../src/pages/overview/historyDataGroup/historyDataGroup.script.ts","../src/pages/overview/assetHistory/column.tsx","../src/pages/overview/helper/date.ts","../src/pages/overview/assetHistory/assetHistory.script.ts","../src/pages/overview/assetHistory/assetHistory.ui.tsx","../src/pages/overview/assetHistory/assetHistory.ui.mobile.tsx","../src/pages/overview/assetHistory/assetHistory.widget.tsx","../src/pages/overview/assetHistory/index.tsx","../src/pages/overview/funding/column.tsx","../src/pages/overview/funding/fundingHistory.ui.tsx","../src/pages/overview/funding/fundingHistory.ui.mobile.tsx","../src/pages/overview/funding/useDataSource.script.ts","../src/pages/overview/funding/fundingHistory.widget.tsx","../src/pages/overview/funding/index.tsx","../src/pages/overview/distribution/column.tsx","../src/pages/overview/distribution/distribution.ui.tsx","../src/pages/overview/distribution/distribution.ui.mobile.tsx","../src/pages/overview/distribution/useDataSource.script.ts","../src/pages/overview/distribution/distribution.widget.tsx","../src/pages/overview/distribution/index.tsx","../src/pages/overview/TransferHistory/column.tsx","../src/pages/overview/TransferHistory/transfer.ui.tsx","../src/pages/overview/TransferHistory/useDataSource.script.ts","../src/pages/overview/TransferHistory/transfer.widget.tsx","../src/pages/overview/TransferHistory/index.tsx","../src/pages/overview/VaultsHistory/column.tsx","../src/pages/overview/VaultsHistory/transfer.ui.tsx","../src/pages/overview/VaultsHistory/useDataSource.script.ts","../src/pages/overview/VaultsHistory/vaults.ui.mobile.tsx","../src/pages/overview/VaultsHistory/transfer.widget.tsx","../src/pages/overview/VaultsHistory/index.tsx","../src/pages/overview/historyDataGroup/historyDataGroup.ui.desktop.tsx","../src/hooks/useAccountsData.ts","../src/hooks/useAssetTotalValue.ts","../src/pages/assets/assetsPage/assets.ui.desktop.tsx","../src/hooks/useAccountFilter.ts","../src/hooks/useAssetsAccountFilter.ts","../src/hooks/index.ts","../src/pages/assets/convertPage/convert.script.ts","../src/pages/assets/convertPage/convert.column.tsx","../src/pages/assets/convertPage/convert.ui.desktop.tsx","../src/pages/assets/convertPage/convert.ui.mobile.tsx","../src/pages/assets/convertPage/convert.widget.tsx","../src/pages/overview/historyDataGroup/historyDataGroup.ui.mobile.tsx","../src/pages/overview/historyDataGroup/historyDataGroup.widget.tsx","../src/pages/overview/historyDataGroup/index.ts","../src/pages/overview/provider/overviewContext.tsx","../src/pages/overview/assetChart/assetsChart.script.ts","../src/pages/overview/shared/useAssetHistory.ts","../src/pages/overview/shared/periodHeader.tsx","../src/pages/overview/assetChart/assetsChart.ui.tsx","../src/pages/overview/assetChart/assetsChart.widget.tsx","../src/pages/overview/assetChart/index.ts","../src/pages/overview/performance/performance.ui.tsx","../src/pages/assets/type.ts","../src/pages/overview/performance/performance.script.ts","../src/pages/overview/performance/performance.widget.tsx","../src/pages/overview/performance/index.ts","../src/pages/feeTier/icons/effectiveFee.tsx","../src/pages/feeTier/icons/index.ts","../src/pages/feeTier/feeTierHeader.tsx","../src/pages/api/apiManager.script.tsx","../src/pages/api/dialog/createApiKey.tsx","../src/pages/api/dialog/createdApiKey.tsx","../src/pages/api/dialog/deleteApiKey.tsx","../src/pages/api/dialog/editApiKey.tsx","../src/pages/api/apiManager.ui.tsx","../src/layout/layout.widget.tsx","../src/layout/layout.script.tsx","../src/layout/layout.ui.tsx","../src/layout/layout.ui.mobile.tsx","../src/layout/context.tsx","../src/pages/overview/index.tsx","../src/pages/overview/performanceMobileDialog/performance.ui.tsx","../src/pages/overview/performanceMobileDialog/performance.widget.tsx","../src/pages/overview/provider/overviewProvider.tsx","../src/pages/overview/mobile/useRewardsData.script.ts","../src/pages/overview/main.tsx","../src/pages/overview/mobile/mobile.widget.tsx","../src/pages/overview/portfolioChartsMobile/portfolioChartsMobile.widget.tsx","../src/pages/overview/portfolioChartsMobile/portfolioChartsMobile.script.ts","../src/pages/overview/portfolioChartsMobile/portfolioChartsMobile.ui.tsx","../src/pages/overview/mobile/accountStatus.ui.mobile.tsx","../src/pages/overview/mobile/affiliateCard.ui.mobile.tsx","../src/pages/overview/mobile/portfolioHandle.ui.mobile.tsx","../src/pages/overview/mobile/portfolioVaule.ui.mobile.tsx","../src/pages/overview/mobile/settingRouter.ui.mobile.tsx","../src/pages/overview/mobile/traderCard.ui.mobile.tsx","../src/pages/feeTier/index.tsx","../src/pages/feeTier/feeTier.ui.tsx","../src/pages/feeTier/feeTier.widget.tsx","../src/pages/feeTier/page.tsx","../src/pages/feeTier/feeTier.script.ts","../src/pages/feeTier/column.tsx","../src/pages/feeTier/dataSource.ts","../src/pages/positions/page.tsx","../src/pages/orders/page.tsx","../src/pages/api/index.ts","../src/pages/api/apiManager.widget.tsx","../src/pages/api/apiManager.page.tsx","../src/pages/setting/index.ts","../src/pages/setting/setting.script.tsx","../src/pages/setting/setting.ui.tsx","../src/pages/setting/setting.ui.desktop.tsx","../src/pages/setting/setting.ui.mobile.tsx","../src/pages/setting/setting.widget.tsx","../src/pages/setting/setting.page.tsx","../src/pages/assets/index.tsx","../src/pages/assets/assetsPage/assets.widget.tsx","../src/pages/assets/assetsPage/assets.script.ts","../src/pages/assets/assetsPage/assets.column.tsx","../src/pages/assets/assetsPage/assets.ui.mobile.tsx","../src/pages/assets/page.tsx","../src/pages/history/index.tsx","../src/pages/history/history.page.tsx","../src/pages/symbolPerformance/index.tsx","../src/pages/symbolPerformance/page.tsx","../src/pages/symbolPerformance/symbolPerformance.widget.tsx","../src/pages/symbolPerformance/symbolPerformance.script.ts","../src/pages/symbolPerformance/useSymbolPerformanceData.ts","../src/pages/symbolPerformance/useTrades.ts","../src/pages/symbolPerformance/symbolPerformance.ui.tsx","../src/pages/symbolPerformance/dateUtils.ts","../src/pages/symbolPerformance/pnlRankingChart.tsx","../src/pages/symbolPerformance/symbolSelector.tsx","../src/pages/symbolPerformance/useKlineData.ts","../src/pages/symbolPerformance/symbolPerformance.ui.mobile.tsx","../src/pages/symbolPerformance/pnlRankingChartMobile.tsx"],"names":["useCallback","useMemo","useAccount","useCollateral","useLeverage","useLocalStorage","usePositionStream","useWalletConnector","useAppContext","AccountStatusEnum","modal","useScreen","LeverageWidgetWithDialogId","DepositAndWithdrawWithDialogId","DepositAndWithdrawWithSheetId","TransferDialogId","TransferSheetId","useAssetScript","init_assets_script","__esmMin","connect","namespace","state","isMainAccount","totalValue","freeCollateral","wrongNetwork","disabledConnect","data","curLeverage","visible","setVisible","isMobile","handleDomId","subAccounts","canTrade","onLeverageEdit","onDeposit","onWithdraw","onTransfer","useTranslation","ArrowDownSquareFillIcon","ArrowLeftRightIcon","ArrowUpSquareFillIcon","Button","CardTitle","Flex","jsx","jsxs","AssetsHeader","init_assetsHeader","props","Card","Divider","Grid","Either","Statistic","Text","EyeIcon","gradientTextVariants","EyeCloseIcon","AuthGuard","Fragment","AssetsUI","NoValue","AssetStatistic","init_assets_ui","AssetWidget","init_assets_widget","connectWallet","rest","assets_exports","__export","init_assets","useState","useHistoryDataGroupScript","init_historyDataGroup_script","active","setActive","AssetHistoryStatusEnum","capitalizeFirstLetter","TokenIcon","toast","Decimal","useAssetHistoryColumns","init_column","options","chainsInfo","isDeposit","isWeb3Wallet","t","onCopy","e","txIdColumn","value","record","href","item","accountIdColumn","accountId","recoed","netAmount","differenceInDays","setHours","parseDateRangeForFilter","init_date","dateRange","from","to","getDate","getMonth","getYear","set","useAssetsHistory","useChainInfo","useTokensInfo","useTransferHistory","AssetHistorySideEnum","usePagination","subtractDaysFromCurrentDate","useAssetHistoryScript","init_assetHistory_script","side","today","d","tokensInfo","target","setTarget","setDateRange","page","pageSize","setPage","parsePagination","startTime","endTime","assetData","assetMeta","assetLoading","transferData","transferLoading","transferMeta","onFilter","filter","isLoading","meta","pagination","dataSource","findToken","token","DataFilter","AuthGuardDataTable","AssetHistory","init_assetHistory_ui","queryParameter","columns","Badge","ListView","ArrowRightShortIcon","EmptyDataState","AssetHistoryMobile","init_assetHistory_ui_mobile","loadMore","getStatusText","status","renderHistoryItem","formattedAmount","getTxLink","chainInfo","chain","itemColor","amountView","statusView","timeView","txIdView","accountIdView","AssetHistoryWidget","init_assetHistory_widget","assetHistory_exports","init_assetHistory","useFundingHistoryColumns","index","useSymbolsInfo","FundingHistoryDesktop","init_fundingHistory_ui","symbols","symbol","FundingHistoryMobile","init_fundingHistory_ui_mobile","switchPaymentType","paymentType","useFundingFeeHistory","useFundingHistoryHook","init_useDataSource_script","setSymbol","isValidating","FundingHistoryWidget","init_fundingHistory_widget","funding_exports","init_funding","useColumns","DistributionHistoryDesktop","init_distribution_ui","type","TYPES","DistributionHistoryMobile","init_distribution_ui_mobile","getTypeText","renderItem","useDistributionHistory","useDistributionHistoryHook","setType","DistributionHistoryWidget","init_distribution_widget","distribution_exports","init_distribution","React","capitalizeString","sub","val","subAccount","produce","formatAddress","TransferHistoryUI","init_transfer_ui","selectedAccount","ALL_ACCOUNTS","MAIN_ACCOUNT","memoizedOptions","draft","row","useTransferHistoryHook","date","setAccount","setSide","filteredData","onAccountFilter","TransferHistoryWidget","init_transfer_widget","accountState","TransferHistory_exports","init_TransferHistory","cn","VaultsHistoryUI","useVaultsHistory","useVaultsHistoryHook","onDateRangeFilter","VaultsHistoryMobile","init_vaults_ui_mobile","typeColor","typeText","amountText","VaultsHistoryWidget","VaultsHistory_exports","init_VaultsHistory","useEffect","ArrowLeftRightSquareFill","FeeTierIcon","ServerFillIcon","TabPanel","Tabs","VaultsIcon","LazyAssetHistoryWidget","LazyFundingHistoryWidget","LazyDistributionHistoryWidget","LazyTransferHistoryWidget","LazyVaultsHistoryWidget","HistoryDataGroupDesktop","init_historyDataGroup_ui_desktop","mod","onTabChange","EMPTY_HOLDING","useAccountsData","init_useAccountsData","holding","useIndexPricesStream","isNumber","calculateTotalHolding","useAssetTotalValue","init_useAssetTotalValue","getIndexPrice","total","hol","indexPrice","allAccounts","mainTotalValue","subTotalValue","find","pick","ArrowDownShortIcon","LazyConvertHistoryWidget","TotalValueInfo","DepositAndWithdrawButton","DataFilterSection","AssetsDataTable","AssetsTable","init_assets_ui_desktop","onToggleVisibility","Icon","mergedDisabled","selectedAsset","assetsOptions","ALL_ASSETS","memoizedAssetOptions","init_useAccountFilter","useAssetsAccountFilter","useAssetsMultiFilter","init_useAssetsAccountFilter","setSelectedAccount","name","setSelectedAsset","accountFiltered","account","filteredChildren","child","init_hooks","useSubAccountQuery","EMPTY_LIST","useConvertScript","init_convert_script","indexPrices","statusFilter","setStatusFilter","convertedAssetFilter","setConvertedAssetFilter","convertedAssetOptions","assetOptions","queryUrl","params","summary","dataRows","totalConversions","totalUSDCReceived","sum","totalFees","detailSum","detail","Tooltip","ConvertedAssetColumn","useConvertColumns","useConvertDetailColumns","init_convert_column","convertedAssets","assets","tooltipContent","asset","onDetailsClick","qty","details","totalHaircut","convertId","haircut","txId","venue","result","DataTable","SimpleDialog","useModal","CONVERT_STATUS_OPTIONS","ConvertDetailsModal","ConvertDesktopUI","init_convert_ui_desktop","onOpenChange","detailColumns","convertState","dataFilter","SimpleSheet","ScrollIndicator","ConvertMobileUI","ConvertMobileField","ConvertMobileItem","ConverHistoryItemDetailsDialog","init_convert_ui_mobile","label","rule","copyable","className","onClick","hide","resolve","reject","convert_widget_exports","ConvertHistoryWidget","init_convert_widget","HistoryDataGroupMobile","init_historyDataGroup_ui_mobile","HistoryDataGroupWidget","init_historyDataGroup_widget","historyDataGroup_exports","init_historyDataGroup","createContext","useContext","OverviewContext","useOverviewContext","init_overviewContext","useDataTap","useAssetsChartScript","init_assetsChart_script","assetHistory","_data","invisible","useRef","subDays","format","usePrivateQuery","useStatisticsDaily","zero","getUTCStr","year","month","day","PeriodType","useAssetsHistoryData","init_useAssetHistory","localKey","isRealtime","periodTypes","period","setPeriod","convertToUSDCAndOperate","inputs","amount","op","delta","periodLabel","formatDateRange","getExpectedDateRange","offsetDay","getMatchingPeriodType","expectedRange","getCustomDateRangeLabel","getStartDate","startDate","setStartDate","endDate","setEndDate","periodValue","totalDeposit","transferOutHistory","transferInHistory","allDepositHistory","totalDepositForROI","acc","totalTransferInForROI","onPeriodChange","newStartDate","newRange","fromDate","toDate","matchingPeriod","filterItems","lastItem","totalTransferIn","totalTransferOut","calculateLastPnl","list","i","calculate","mergeData","calculateData","realtime","calculatedData","aggregateValue","vol","pnl","roi","tail","dataTailIndex","lastAccountValue","createFakeData","start","end","_","periodHeader_exports","PeriodTitle","init_periodHeader","periodOrder","periodType","AssetAreaChart","Box","LazyPeriodTitle","AssetsChart","init_assetsChart_ui","AssetsChartWidget","init_assetsChart_widget","assetChart_exports","init_assetChart","PnlAreaChart","PnLBarChart","VolBarChart","LabelWithHint","PerformancePnLTabs","VolumeChart","PerformanceUI","init_performance_ui","hint","activeTab","setActiveTab","volumeData","shouldHide","volumeUpdateDate","curPeriod","ORDERLY_ASSETS_VISIBLE_KEY","init_type","usePerformanceScript","init_performance_script","ctx","PerformanceWidget","init_performance_widget","performance_exports","init_performance","useId","EffectiveFee","init_effectiveFee","ref","linearId","init_icons","feeTierHeader_exports","DesktopHeaderItem","FeeTierHeader","MobileHeaderItem","useFeeState","createElement","isEffective","init_feeTierHeader","interactive","tier","headerDataAdapter","refereeRebate","others","isEffectiveFee","items","mergedData","useApiKeyManager","capitalizeFirstChar","str","useApiManagerScript","init_apiManager_script","filterTags","keyStatus","showCreateDialog","setShowCreateDialog","showCreatedDialog","setShowCreatedDialog","generateKey","setGenerateKey","canCreateApiKey","keys","generateOrderlyKey","setIPRestriction","removeOrderlyKey","resetOrderlyKeyIPRestriction","refresh","error","curPubKey","setCurPubKey","pubKey","onCreateApiKey","onReadApiGuide","hideCreateDialog","doCreate","ipRestriction","scope","createdSuccess","res","ip","key","secretKey","generateKeyRes","err","hideCreatedDialog","onCopyApiKeyInfo","doConfirm","doDelete","curKey","doEdit","future","onCopyAccountId","onCopyApiKey","onCopyApiSecretKey","onCopyIP","keyList","filterTag","filterCurKey","verifyIP","accountStatus","userId","createApiKey_exports","Checkbox","CreateAPIKeyDialog","init_createApiKey","ipText","setIpText","read","setRead","trade","setTrade","setHint","open","scopes","createdApiKey_exports","CreatedAPIKeyDialog","CopyIcon","init_createdApiKey","deleteApiKey_exports","DeleteAPIKeyDialog","Trans","init_deleteApiKey","init_apiManager_ui","setOpen","onDelete","formatKey","editApiKey_exports","EditAPIKeyDialog","init_editApiKey","onUpdate","PlusIcon","AuthGuardEmpty","AuthGuardTooltip","LazyCreateAPIKeyDialog","LazyCreatedAPIKeyDialog","LazyDeleteAPIKeyDialog","LazyEditAPIKeyDialog","APIManager","AccountInfo","Subtitle","KeyList","EditButton","DeleteButton","useMediaQuery","useScaffoldContext","PortfolioLeftSidebarPath","usePortfolioLayoutScript","routerAdapter","current","setCurrent","hideSideBar","Scaffold","SideBar","PortfolioLayout","children","leftSideProps","classNames","LeftSidebar","expanded","setExpand","MainNavMobile","BottomNav","LayoutContext","useLayoutContext","LayoutProvider","sideOpen","setSideOpen","memoizedValue","PortfolioLayoutMobile","PortfolioLayoutWidget","overview_exports","OverviewPage","OverviewProvider","PerformanceMobileDialogId","PerformanceMobileSheetId","PerformanceMobileUI","PerformanceMobileWidget","AssetLineChart","responsiveProps","i18n","registerSimpleDialog","registerSimpleSheet","useAllBrokers","useConfig","useCurEpochEstimate","useEpochInfo","useGetClaimed","noCacheConfig","DistributionId","TWType","useRewardsData","totalOrderClaimedReward","curEpochEstimate","brokers","mutate","epochList","brokerId","brokerName","lastStete","timerRef","useRewardsDataScript","referralInfo","isSignIn","rewardsData","ENVType","useGetEnv","DepositStatusWidget","usePortfolioChartsState","onPerformanceClick","Area","AreaChart","ChevronRightIcon","PortfolioChartsMobileUI","unrealPnL","unrealROI","colorId","PortfolioChartsMobileWidget","parseJSON","useChains","ChainNamespace","ChainIcon","useCurrentStatus","statusText","EVMChainPopover","chains","MoreIcon","EVMChains","ShowAccount","onCopyAddress","currentNamespace","getLinkDeviceStorage","leftNode","rightNode","bgClass","bg","AccountStatusMobile","description","rootClass","linkDeviceStorage","AffiliateIcon","commifyOptional","AffiliateCardMobile","rebate","CalendarMinusIcon","PortfolioHandleMobile","onGotoHistory","PortfolioValueMobile","SettingFillIcon","SettingRouterMobile","TraderMobileIcon","TraderCardMobile","MobileOverview","portfolioValue","toggleVisible","hasSubAccount","layoutContext","onRouteChange","env","goToClaim","url","navigateToPortfolioHistory","navigateToAnalysis","LazyAssetWidget","LazyAssetsChartWidget","LazyPerformanceWidget","LazyHistoryDataGroupWidget","feeTier_exports","FeeTierPage","useFeeTierScript","LazyFeeTierHeader","FeeTierTable","onRow","onCell","internalOnRow","config","internalOnCell","column","isFirstColumn","isLastColumn","FeeTier","FeeTierWidget","useAccountInfo","numberToHumanStyle","textStyle","useFeeTierColumns","volume_min","volume_max","volume_node","findCurrentTier","feeList","futures_taker_fee_rate","futures_maker_fee_rate","takerRate","makerRate","dataAdapter","setTier","cols","volumeStatistics","page_exports","PositionsPage","InfoCircleIcon","LiquidationWidget","PositionHistoryWidget","CombinePositionsWidget","PositionsWidget","tab","setTab","positionsRef","positionHistoryRef","LiquidationTab","OrdersPage","OrdersWidget","sharePnLConfig","ordersRef","TooltipIcon","api_exports","APIManagerPage","APIManagerWidget","setting_exports","SettingPage","SettingWidget","useDebouncedCallback","useMutation","useSettingScript","update","isMutating","checked","setChecked","updateCheckState","setMaintainConfig","maintenance_cancel_order_flag","canTouch","Switch","SettingDesktop","LanguageSwitcherWidget","SettingMobile","Setting","AssetsDataTableWidget","AssetsPage","AssetsTableMobile","AssetsWidget","useAssetsColumns","onConvert","id","useAssetsScript","filtered","enhancedFiltered","accountData","enhancedChildren","tokenInfo","assetValue","collateralRatio","collateralContribution","handleTransfer","handleConvert","showTransfer","assetsColumns","openDepositAndWithdraw","viewName","AccountTag","AssetMobileItem","memoizedAssets","assetsState","history_exports","HistoryPage","HistoryWidget","symbolPerformance_exports","SymbolPerformancePage","SymbolPerformanceUI","SymbolPerformanceWidget","useSymbolPerformanceScript","endOfDay","addDays","fillTimeSeriesGaps","dataMap","incrementFn","getKeyFn","filledData","fillDailyGaps","dailyMap","fillHourlyGaps","hourlyMap","fillFifteenMinuteGaps","fifteenMinMap","useSymbolPerformanceData","tradesData","periodStartDate","periodEndDate","includeFees","tradesWithPnL","volume","fees","totalPnL","totalVolume","totalTrades","grossPnL","sortedByDate","a","b","makerVolume","makerShare","dailyPnLMap","dateKey","existing","dailyData","hourlyDataMap","hourKey","isSingleDay","nextDayDate","nextDayStartTime","bucketEndDate","hourlyData","fifteenMinuteDataMap","minutes","roundedMinutes","fifteenMinKey","fifteenMinuteData","_pnl","cumulativeDailyPnL","_fees","cumulativeDailyFees","_volume","cumulativeDailyVolume","cumulativeHourlyPnL","hour","cumulativeHourlyFees","cumulativeHourlyVolume","cumulativeFifteenMinutePnL","fifteenMin","cumulativeFifteenMinuteFees","cumulativeFifteenMinuteVolume","usePrivateInfiniteQuery","useTrades","start_t","end_t","size","getKey","pageIndex","previousPageData","search","timeoutRef","lastPage","nextPageSize","AggregationWindow","PRESET_DAYS","getDateRange","normalizeDateToUTC","dateStr","selectedSymbol","setSelectedSymbol","aggregationWindow","setAggregationWindow","isNetPnL","setIsNetPnL","range","newDateRange","normalizedRange","normalizedRangeForComparison","endDateForAPI","trades","performanceData","aggregationWindowTypes","CombinedPnLChart","CombinedVolumeChart","CombinedFeesChart","CombinedPriceChart","Select","parseISO","getAggregationLabel","window","formatDateForChart","dateString","formatCurrency","PnLRankingChart","onSymbolSelect","maxAbsValue","isPositive","barWidth","DropdownMenuRoot","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuPortal","Input","CaretDownIcon","SymbolSelector","onValueChange","placeholder","setSearch","filteredOptions","opt","selectedOption","displayLabel","option","isSelected","cleanLabel","useSWR","fetcher","useKlineData","resolution","limit","now","fromTimestamp","toTimestamp","secondsPerCandle","o","h","l","c","v","timestamp","MakerTakerShare","takerShare","aggregatedData","symbolsInfo","viewType","setViewType","showCumulativePnL","setShowCumulativePnL","showCumulativeVolume","setShowCumulativeVolume","showCumulativeFees","setShowCumulativeFees","getTrimmedDataRange","startIndex","endIndex","lastIdx","idx","availableSymbols","combinedPnLData","combinedVolumeData","combinedFeesData","klineResolution","isAllSymbols","klineEndDate","klines","combinedPriceData","trimmedTradingData","klineMap","k","formattedDate","tradingItem","kline","tableData","tableColumns","formatVolumeValue","abbreviations","num","decimalPlaces","symbolSummaryData","symbolMap","tradeVolume","PnLRankingChartMobile","SymbolPerformanceUIMobile","getFirstNonZeroVolumeIndex","trimIndex","firstTrimmedEntry","firstTrimmedDate","isEmptyData","dataFilterItems","dateRangeFilter","handleFilter"],"mappings":"+HAAA,OAAS,eAAAA,GAAa,WAAAC,OAAe,QACrC,OACE,cAAAC,GACA,iBAAAC,GACA,eAAAC,GACA,mBAAAC,GACA,qBAAAC,GACA,sBAAAC,OACK,gCACP,OAAS,iBAAAC,OAAqB,oCAC9B,OAAS,qBAAAC,OAAyB,gCAClC,OAAS,SAAAC,GAAO,aAAAC,OAAiB,6BACjC,OAAS,8BAAAC,OAAkC,sCAC3C,OACE,kCAAAC,GACA,iCAAAC,GACA,oBAAAC,GACA,mBAAAC,OACK,sCAlBP,IAoBaC,GApBbC,GAAAC,EAAA,kBAoBaF,GAAiB,IAAM,CAClC,GAAM,CAAE,QAAAG,EAAS,UAAAC,CAAU,EAAId,GAAmB,EAC5C,CAAE,MAAAe,EAAO,cAAAC,CAAc,EAAIrB,GAAW,EACtC,CAAE,WAAAsB,EAAY,eAAAC,CAAe,EAAItB,GAAc,EAC/C,CAAE,aAAAuB,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EAClD,CAACoB,CAAI,EAAItB,GAAkB,EAC3B,CAAE,YAAAuB,CAAY,EAAIzB,GAAY,EAC9B,CAAC0B,EAASC,CAAU,EAAI1B,GAAgB,yBAA0B,EAAI,EACtE,CAAE,SAAA2B,CAAS,EAAIrB,GAAU,EACzBsB,EAAcD,EAChBlB,GACAD,GACEqB,EAAcZ,EAAM,aAAe,CAAC,EAEpCa,EAAWlC,GAAQ,IAErB,CAACyB,GACD,CAACC,IACAL,EAAM,SAAWb,GAAkB,eAClCa,EAAM,SAAWb,GAAkB,+BAEtC,CAACa,EAAM,OAAQI,EAAcC,CAAe,CAAC,EAE1CS,EAAiB,IAAM,CAC3B1B,GAAM,KAAKE,EAA0B,CACvC,EAEMyB,EAAYrC,GAAY,IAAM,CAClCU,GAAM,KAAKuB,EAAa,CAAE,UAAW,SAAU,CAAC,CAClD,EAAG,CAACA,CAAW,CAAC,EAEVK,EAAatC,GAAY,IAAM,CACnCU,GAAM,KAAKuB,EAAa,CAAE,UAAW,UAAW,CAAC,CACnD,EAAG,CAAC,CAAC,EAECM,EAAavC,GAAY,IAAM,CAC/BgC,EACFtB,GAAM,KAAKM,EAAe,EAE1BN,GAAM,KAAKK,EAAgB,CAE/B,EAAG,CAACiB,CAAQ,CAAC,EAEb,MAAO,CACL,SAAAG,EACA,QAAAf,EACA,eAAgBI,EAChB,eAAAC,EACA,UAAWG,EAAK,WAAW,iBAC3B,UAAWA,EAAK,mBAChB,gBAAiBC,EACjB,eAAAO,EACA,QAAAN,EACA,aAAAJ,EACA,cAAe,IAAMK,EAAW,CAACD,CAAO,EACxC,UAAAO,EACA,WAAAC,EACA,WAAAC,EACA,UAAAlB,EACA,cAAAE,EACA,cAAeW,GAAa,OAAS,CACvC,CACF,ICjFA,OAAS,kBAAAM,OAAsB,+BAC/B,OACE,2BAAAC,GACA,sBAAAC,GACA,yBAAAC,GACA,UAAAC,GACA,aAAAC,GACA,QAAAC,OACK,6BAgBD,cAAAC,GACA,QAAAC,OADA,oBAzBN,IAoBaC,GApBbC,GAAA/B,EAAA,kBAoBa8B,GAA2BE,GAAU,CAChD,GAAM,CAAE,CAAE,EAAIX,GAAe,EAE7B,OACEQ,GAACF,GAAA,CAAK,QAAS,UACb,UAAAC,GAACF,GAAA,CAAW,WAAE,iBAAiB,EAAE,EACjCG,GAACF,GAAA,CAAK,IAAK,EACR,UAAAK,EAAM,eACLJ,GAACH,GAAA,CACC,SAAUO,EAAM,SAChB,KAAK,KACL,QAAS,IAAMA,EAAM,YAAY,EACjC,KAAMJ,GAACN,GAAA,EAAwB,EAC/B,cAAY,0CAEX,WAAE,gBAAgB,EACrB,EAEDU,EAAM,eACLJ,GAACH,GAAA,CACC,SAAUO,EAAM,SAChB,KAAK,KACL,MAAM,YACN,QAAS,IAAMA,EAAM,aAAa,EAClC,KAAMJ,GAACL,GAAA,EAAmB,EAEzB,WAAE,iBAAiB,EACtB,EAEDS,EAAM,eACLJ,GAACH,GAAA,CACC,SAAUO,EAAM,SAChB,KAAK,KACL,MAAM,YACN,QAAS,IAAMA,EAAM,aAAa,EAClC,KAAMJ,GAACJ,GAAA,EAAsB,EAC7B,cAAY,2CAEX,WAAE,iBAAiB,EACtB,GAEJ,GACF,CAEJ,IC/DA,OAAS,kBAAAH,OAAsB,+BAC/B,OACE,QAAAY,GACA,WAAAC,GACA,QAAAP,GACA,QAAAQ,GACA,UAAAC,GACA,aAAAC,GACA,QAAAC,GACA,WAAAC,GACA,wBAAAC,GAEA,gBAAAC,OACK,6BACP,OAAS,aAAAC,OAAiB,uCAYlB,OAUF,YAAAC,GAVE,OAAAf,GAaI,QAAAC,OAbJ,oBA3BR,IAmBae,GAsEPC,GAqBOC,GA9GbC,GAAA/C,EAAA,kBAiBA+B,KAEaa,GAERZ,GAAU,CACb,GAAM,CAAE,CAAE,EAAIX,GAAe,EAC7B,OACEO,GAACK,GAAA,CACC,WAAY,CAAE,OAAQ,eAAgB,KAAM,eAAgB,EAC5D,MACEL,GAACE,GAAA,CACC,SAAU,CAACE,EAAM,SACjB,cAAeA,EAAM,cACrB,UAAWA,EAAM,UACjB,WAAYA,EAAM,WAClB,WAAYA,EAAM,WAClB,cAAeA,EAAM,cACvB,EAGF,SAAAH,GAAAc,GAAA,CACE,UAAAf,GAACS,GAAA,CACC,MACER,GAACF,GAAA,CAAK,IAAK,EACT,UAAAC,GAACU,GAAA,CAAK,UAAW,GAAK,WAAE,mBAAmB,EAAE,EAC7CV,GAAC,UACC,QAAS,IAAM,CACbI,EAAM,cAAc,CACtB,EACA,cAAY,sCAEX,SAAAA,EAAM,QACLJ,GAACW,GAAA,CAAQ,KAAM,GAAI,MAAO,QAAS,EAEnCX,GAACa,GAAA,CAAa,KAAM,GAAI,MAAO,QAAS,EAE5C,GACF,EAGF,SAAAb,GAACQ,GAAA,CAAO,MAAOJ,EAAM,SAAW,KAAMJ,GAACiB,GAAA,EAAQ,EAC7C,SAAAjB,GAACU,GAAK,QAAL,CACC,QAASN,EAAM,QACf,KAAK,OAEL,MAAO,CAAE,uBAAwB,OAAQ,EACzC,cAAc,2DACd,UAAWQ,GAAqB,CAC9B,UAAW,6BACX,MAAO,OACT,CAAC,EAEA,SAAAR,EAAM,gBAAkB,KAC3B,EACF,EACF,EACAJ,GAACM,GAAA,CAAQ,UAAU,WAAW,UAAW,EAAG,EAC5CN,GAACc,GAAA,CAAU,YAAa,CAAE,KAAM,KAAM,UAAW,EAAK,EACpD,SAAAd,GAACkB,GAAA,CACC,UAAWd,EAAM,UACjB,UAAWA,EAAM,UACjB,eAAgBA,EAAM,eACtB,gBAAiBA,EAAM,gBACvB,eAAgBA,EAAM,eACtB,QAASA,EAAM,QACjB,EACF,GACF,EACF,CAEJ,EAEMa,GAAc,IAEhBhB,GAACF,GAAA,CAAK,IAAK,EAAG,UAAW,UACvB,UAAAC,GAACU,GAAK,SAAL,CAAc,MAAM,QAAQ,OAAO,OAAO,cAE3C,EACAV,GAACU,GAAA,CAAK,gBAAI,GACZ,EAcSQ,GAAkBd,GAA+B,CAC5D,GAAM,CAAE,CAAE,EAAIX,GAAe,EAE7B,OACEQ,GAACM,GAAA,CAAK,KAAM,EAAG,UAAU,WACvB,UAAAP,GAACS,GAAA,CAAU,MAAO,EAAE,sBAAsB,EACxC,SAAAR,GAACF,GAAA,CACC,UAAAC,GAACU,GAAK,QAAL,CACC,SAAQ,GACR,KAAK,KACL,OAAO,WACP,QAASN,EAAM,QAEd,SAAAA,EAAM,UACT,EACAJ,GAACU,GAAK,QAAL,CACC,SAAQ,GACR,KAAK,cACL,KAAK,KACL,OAAO,WACP,OAAQ,IACR,OAAQ,IACR,QAASN,EAAM,QAEd,SAAAA,EAAM,UACT,GACF,EACF,EACAJ,GAACS,GAAA,CACC,MAAO,EAAE,sCAAsC,EAE/C,MAAM,QAEN,WAAY,CAAE,KAAM,KAAM,QAASL,EAAM,OAAQ,EAEhD,SAAAA,EAAM,eACT,GACF,CAEJ,IC9II,cAAAJ,OAAA,oBAPJ,IAIaoB,GAJbC,GAAAjD,EAAA,kBACAD,KACAgD,KAEaC,GAAwB,IAAM,CACzC,GAAM,CAAE,QAASE,EAAe,GAAGC,CAAK,EAAIrD,GAAe,EAC3D,OACE8B,GAACgB,GAAA,CAEC,gBAAiBM,EACjB,QAASA,EACR,GAAGC,EACN,CAEJ,ICdA,IAAAC,GAAA,GAAAC,EAAAD,GAAA,iBAAAJ,GAAA,aAAAJ,GAAA,mBAAA9C,KAAA,IAAAwD,GAAAtD,EAAA,kBAAAD,KACAgD,KACAE,OCFA,OAAS,YAAAM,OAAgB,QAAzB,IAUaC,GAVbC,GAAAzD,EAAA,kBAUawD,GAA4B,IAAM,CAC7C,GAAM,CAACE,EAAQC,CAAS,EAAIJ,GAAkB,SAAS,EACvD,MAAO,CACL,OAAAG,EACA,YAAaC,CACf,CACF,ICfA,OAAS,WAAA7E,OAAe,QACxB,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,0BAAAuC,OAA8B,gCACvC,OACE,yBAAAC,GACA,QAAAvB,GACA,QAAAX,GACA,aAAAmC,GACA,SAAAC,OAEK,6BACP,OAAS,WAAAC,OAAe,gCAyBP,cAAApC,GAgDL,QAAAC,OAhDK,oBArCjB,IAoBaoC,GApBbC,GAAAlE,EAAA,kBAoBaiE,GAA0BE,GAAqB,CAC1D,GAAM,CAAE,WAAAC,EAAY,UAAAC,EAAW,aAAAC,CAAa,EAAIH,EAC1C,CAAE,EAAAI,CAAE,EAAIlD,GAAe,EAEvBmD,EAAUC,GAAW,CACzBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBV,GAAM,QAAQQ,EAAE,oBAAoB,CAAC,CACvC,EAsHA,OApHgBzF,GAAkB,IAAM,CACtC,IAAM4F,EAAqB,CACzB,MAAOH,EAAE,aAAa,EACtB,UAAW,QACX,MAAO,IACP,OAAQ,CAACI,EAAOC,IAAW,CACzB,GAAI,CAACD,EACH,OAAO/C,GAAC,OAAI,UAAU,4BAA4B,aAAC,EAMrD,IAAMiD,EAAO,GAJKT,GAAY,KAC3BU,GAAS,SAASF,EAAO,QAAQ,IAAM,SAASE,EAAK,QAAQ,CAChE,GACqC,iBACJ,OAAOH,CAAK,GAC7C,OACE/C,GAAC,KAAE,KAAMiD,EAAM,OAAO,SAAS,IAAI,aAEjC,SAAAjD,GAACU,GAAK,UAAL,CACC,SAAU,CAAC,CAACqC,EACZ,KAAK,OACL,UAAU,oFACV,OAAQH,EAEP,SAAAG,EACH,EAEF,CAEJ,CACF,EAEMI,EAA0B,CAC9B,MAAOR,EAAE,kBAAkB,EAC3B,UAAW,aACX,MAAO,IACP,OAAQ,CAACI,EAAOC,IAAW,CACzB,IAAMI,EAAYX,EACdO,EAAO,gBACPA,EAAO,cAEX,OACEhD,GAACU,GAAK,UAAL,CAAe,KAAK,UAAU,SAAU,CAAC,CAAC0C,EAAW,OAAQR,EAC3D,SAAAQ,EACH,CAEJ,CACF,EAEA,MAAO,CACL,CACE,MAAOT,EAAE,cAAc,EACvB,UAAW,QACX,MAAO,GACP,OAASI,GAEL9C,GAACF,GAAA,CAAK,KAAM,EACV,UAAAC,GAACkC,GAAA,CAAU,KAAMa,EAAO,KAAK,KAAK,EAClC/C,GAAC,QAAM,SAAA+C,EAAM,GACf,CAGN,EACA,CACE,MAAOJ,EAAE,aAAa,EACtB,UAAW,eACX,MAAO,GACP,KAAM,MACR,EACAD,EAAeI,EAAaK,EAC5B,CACE,MAAOR,EAAE,eAAe,EACxB,UAAW,eACX,MAAO,IACP,OAAQ,CAACI,EAAOM,KACdN,EAAQL,EAAeK,EAAQM,EAAO,OACpB,CAChB,CAACrB,GAAuB,GAAG,EAAGW,EAAE,6BAA6B,EAC7D,CAACX,GAAuB,OAAO,EAAGW,EAAE,6BAA6B,EACjE,CAACX,GAAuB,OAAO,EAAGW,EAAE,6BAA6B,EACjE,CAACX,GAAuB,UAAU,EAAGW,EACnC,gCACF,EACA,CAACX,GAAuB,SAAS,EAAGW,EAClC,+BACF,EACA,CAACX,GAAuB,MAAM,EAAGW,EAAE,4BAA4B,CACjE,EAEYI,CAA+B,GACzCd,GAAsBc,GAAO,YAAY,CAAC,EAGhD,EACA,CACE,MAAOJ,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,IACP,KAAM,QACN,OAAQ,CAACI,EAAOC,IAAW,CACzB,IAAMM,EAAY,IAAIlB,GAAQW,CAAK,EAAE,MAAMC,EAAO,KAAO,CAAC,EAC1D,OACEhD,GAACU,GAAK,QAAL,CACC,GAAIsC,EAAO,SACX,KAAK,QACL,SAAQ,GACR,eAAc,GACd,QAAS,GAER,SAAAP,EAAYa,EAAU,SAAS,EAAIA,EAAU,IAAI,EAAE,SAAS,EAC/D,CAEJ,CACF,CACF,CACF,EAAG,CAACX,EAAGH,EAAYC,EAAWC,CAAY,CAAC,CAG7C,ICnJA,OAAS,oBAAAa,GAAkB,YAAAC,OAAgB,WAA3C,IAEaC,GAFbC,GAAAtF,EAAA,kBAEaqF,GAA2BE,GAGlC,CACJ,GAAM,CAAE,KAAAC,EAAM,GAAAC,EAAK,IAAI,IAAO,EAAIF,EAIlC,OAFaJ,GAAiBK,EAAMC,CAAE,IAEzB,EACJ,CAACD,EAAMJ,GAASK,EAAI,EAAE,CAAC,EAGzB,CAACD,EAAMC,CAAE,CAClB,ICfA,OAAS,eAAA5G,GAAa,WAAAC,GAAS,YAAAyE,OAAgB,QAC/C,OAAS,WAAAmC,GAAS,YAAAC,GAAU,WAAAC,GAAS,OAAAC,OAAW,WAChD,OACE,oBAAAC,GACA,gBAAAC,GACA,iBAAAC,GACA,sBAAAC,OACK,gCACP,OAAS,wBAAAC,OAA4B,gCACrC,OAAS,SAAA3G,GAAO,iBAAA4G,OAAqB,6BACrC,OAAS,iCAAAxG,OAAqC,sCAC9C,OAAS,+BAAAyG,OAAmC,gCAX5C,IAyBaC,GAzBbC,GAAAtG,EAAA,kBAYAsF,KAaae,GAAyBlC,GAAuC,CAC3E,GAAM,CAAE,KAAAoC,CAAK,EAAIpC,EACXE,EAAYkC,IAASL,GAAqB,QAE1C,CAACM,CAAK,EAAIjD,GAAS,IAAM,CAC7B,IAAMkD,EAAI,IAAI,KACd,OAAO,IAAI,KAAKb,GAAQa,CAAC,EAAGd,GAASc,CAAC,EAAGf,GAAQe,CAAC,EAAG,EAAG,EAAG,CAAC,CAC9D,CAAC,EAEKC,EAAaV,GAAc,EAE3B,CAACW,EAAQC,CAAS,EAAIrD,GAAsB,YAAsB,EAElE,CAACgC,EAAWsB,CAAY,EAAItD,GAAiB,CACjD6C,GAA4B,GAAII,CAAK,EACrCA,CACF,CAAC,EACK,CAAE,KAAAM,EAAM,SAAAC,EAAU,QAAAC,EAAS,gBAAAC,CAAgB,EAAId,GAAc,EAE7D,CAAE,UAAAe,EAAW,QAAAC,CAAQ,EAAIrI,GAAQ,IAAM,CAC3C,IAAMoI,EAAY3B,EAAU,CAAC,EAAE,QAAQ,EACjC4B,EAAUtB,GAAIN,EAAU,CAAC,EAAG,CAChC,MAAO,GACP,QAAS,GACT,QAAS,GACT,aAAc,CAChB,CAAC,EAAE,QAAQ,EAEX,MAAO,CAAE,UAAA2B,EAAW,QAAAC,CAAQ,CAC9B,EAAG,CAAC5B,CAAS,CAAC,EAER,CAAC6B,EAAW,CAAE,KAAMC,EAAW,UAAWC,CAAa,CAAC,EAC5DxB,GACE,CACE,UAAAoB,EACA,QAAAC,EACA,KAAAL,EACA,SAAAC,EACA,KAAAR,CACF,EACA,CACE,4BAA8B9F,GAASA,EAAK,OAAS8F,CACvD,CACF,EAEI,CAACgB,EAAc,CAAE,UAAWC,EAAiB,KAAMC,CAAa,CAAC,EACrExB,GAAmB,CACjB,UAAW,CAACiB,EAAWC,CAAO,EAC9B,KAAM9C,EAAY,KAAO,MACzB,KAAM0C,EACN,KAAMD,EACN,cAAe,EACjB,CAAC,EAEG,CAAE,KAAM1C,CAAW,EAAI2B,GAAa,EAEpC2B,EAAYC,GAAyC,CACrDA,EAAO,OAAS,aAClBd,EAAaxB,GAAwBsC,EAAO,KAAK,CAAC,EAClDX,EAAQ,CAAC,GACAW,EAAO,OAAS,WACzBf,EAAUe,EAAO,KAAK,EACtBX,EAAQ,CAAC,EAEb,EAEMY,EAAY9I,GAAQ,IACpB6H,IAAW,aACNW,EAEFE,EACN,CAACb,EAAQW,EAAcE,CAAe,CAAC,EAEpCK,EAAO/I,GAAQ,IACf6H,IAAW,aACNU,EAEFI,EACN,CAACd,EAAQU,EAAWI,CAAY,CAAC,EAE9BK,EAAahJ,GACjB,IAAMmI,EAAgBY,CAAI,EAC1B,CAACZ,EAAiBY,CAAI,CACxB,EAEME,EAAajJ,GAAQ,KACjB6H,IAAW,aAAyBS,EAAYG,GAAc,IACnEzC,GAAS,CACR,IAAMkD,EAAYtB,GAAY,KAAK,CAAC,CAAE,MAAAuB,CAAM,IAAMA,IAAUnD,EAAK,KAAK,EACtE,MAAO,CACL,GAAGA,EACH,SAAUkD,GAAW,UAAY,CACnC,CACF,CACF,EACC,CAACrB,EAAQS,EAAWG,EAAcb,CAAU,CAAC,EAE1CxF,EAAYrC,GAAY,IAAM,CAClCU,GAAM,KAAKI,GAA+B,CAAE,UAAW,SAAU,CAAC,CACpE,EAAG,CAAC,CAAC,EAEC2E,EAAeqC,IAAW,aAEhC,MAAO,CACL,WAAAoB,EACA,MAAOF,GAAM,MACb,UAAAD,EACA,eAAgB,CACd,OAAAjB,EACA,UAAApB,CACF,EACA,SAAAmC,EACA,WAAAI,EACA,UAAA5G,EACA,WAAYkD,EACZ,UAAAC,EACA,aAAAC,CACF,CACF,IC/IA,OAAa,WAAAxF,OAAe,QAC5B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,cAAA6G,OAAkB,6BAC3B,OAAS,sBAAAC,OAA0B,uCA2B/B,mBAAAxF,GACE,OAAAf,GADF,QAAAC,OAAA,oBA9BJ,IAYauG,GAZbC,GAAArI,EAAA,kBAIAsG,KAIApC,KAIakE,GAAuCpG,GAAU,CAC5D,GAAM,CAAE,WAAA+F,EAAY,eAAAO,EAAgB,SAAAZ,EAAU,UAAAE,CAAU,EAAI5F,EACtD,CAAE,UAAAuD,EAAW,OAAAoB,CAAO,EAAI2B,EACxBC,EAAUtE,GAAuB,CACrC,WAAYjC,EAAM,WAClB,UAAWA,EAAM,UACjB,aAAcA,EAAM,YACtB,CAAC,EACK,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAEvB8C,EAAUrF,GAAQ,IACf,CACL,CAAE,MAAOyF,EAAE,mBAAmB,EAAG,kBAA8B,EAC/D,CAAE,MAAOA,EAAE,kBAAkB,EAAG,iBAA6B,CAC/D,EACC,CAACA,CAAC,CAAC,EAEN,OACE1C,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,SACN,KAAM,SACN,QAAS/D,EACT,MAAOwC,CACT,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMpB,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACF,EAEA/C,GAACuG,GAAA,CACC,SAAQ,GACR,QAASP,EACT,WAAY,CACV,KAAM,4BACN,OAAQ,mBACV,EACA,QAASW,EACT,WAAYR,EACZ,WAAY/F,EAAM,WACpB,GACF,CAEJ,IClEA,OAAa,WAAAlD,OAAe,QAC5B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,0BAAAuC,OAA8B,gCACvC,OACE,SAAA4E,GACA,cAAAN,GACA,QAAAvG,GACA,YAAA8G,GACA,QAAAnG,GACA,yBAAAuB,GACA,SAAAE,GACA,uBAAA2E,GACA,kBAAAC,OACK,6BAwFD,OA0EM,YAAAhG,GAzEJ,OAAAf,GADF,QAAAC,OAAA,oBArGN,IAqBa+G,GArBbC,GAAA7I,EAAA,kBAcAsG,KAOasC,GAAmD5G,GAAU,CACxE,GAAM,CACJ,WAAA+F,EACA,eAAAO,EACA,SAAAZ,EACA,UAAAE,EACA,WAAAE,EACA,UAAA5G,EACA,WAAAkD,EACA,UAAAC,EACA,aAAAC,CACF,EAAItC,EACE,CAAE,UAAAuD,EAAW,OAAAoB,CAAO,EAAI2B,EACxB,CAAE,EAAA/D,CAAE,EAAIlD,GAAe,EAEvB8C,EAAUrF,GAAQ,IACf,CACL,CAAE,MAAOyF,EAAE,mBAAmB,EAAG,kBAA8B,EAC/D,CAAE,MAAOA,EAAE,kBAAkB,EAAG,iBAA6B,CAC/D,EACC,CAACA,CAAC,CAAC,EAEAuE,EAAW,IAAM,CACjBf,EAAW,QAAUD,GAAY,OAAS,IAC5CA,GAAY,mBAAmBA,GAAY,SAAW,EAAE,CAE5D,EAEMiB,EAAiBjE,GAAc,CACnC,IAAMkE,EAAShH,EAAM,aAAe8C,EAAK,aAAeA,EAAK,OAS7D,MARkB,CAChB,CAAClB,GAAuB,GAAG,EAAGW,EAAE,6BAA6B,EAC7D,CAACX,GAAuB,OAAO,EAAGW,EAAE,6BAA6B,EACjE,CAACX,GAAuB,OAAO,EAAGW,EAAE,6BAA6B,EACjE,CAACX,GAAuB,UAAU,EAAGW,EAAE,gCAAgC,EACvE,CAACX,GAAuB,SAAS,EAAGW,EAAE,+BAA+B,EACrE,CAACX,GAAuB,MAAM,EAAGW,EAAE,4BAA4B,CACjE,EAEYyE,CAAgC,GAC1CnF,GAAsBmF,GAAQ,YAAY,CAAC,CAE/C,EAEMC,EAAqBnE,GAAc,CAEvC,IAAMoE,EAAkB7E,EACpB,IAAIS,EAAK,QAAUA,EAAK,KAAO,EAAE,GACjC,EAAEA,EAAK,QAAUA,EAAK,KAAO,IAG3BqE,EAAY,IAAM,CACtB,GAAI,CAACrE,EAAK,MACR,OAGF,IAAMsE,EACJhF,GAAc,MAAM,QAAQA,CAAU,EAClCA,EAAW,KACRiF,GACC,SAASvE,EAAK,QAAQ,IAAM,SAASuE,EAAM,QAAQ,CACvD,EACA,OAEN,GAAID,GAAW,kBACb,MAAO,GAAGA,EAAU,iBAAiB,OAAOtE,EAAK,KAAK,EAI1D,EAEMN,EAAUC,GAAW,CACzBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBV,GAAM,QAAQQ,EAAE,oBAAoB,CAAC,CACvC,EAEM+E,EAAYjF,EAAY,MAAQ,OAEhCkF,EACJ1H,GAACF,GAAA,CAAK,UAAU,cACd,UAAAC,GAACU,GAAA,CAAK,MAAOgH,EAAY,SAAAJ,EAAgB,EACzCtH,GAACU,GAAA,CAAK,UAAU,WAAW,UAAW,GACnC,SAAAwC,EAAK,MACR,EACCR,GACC1C,GAAC4G,GAAA,CAAM,MAAOc,EAAW,UAAU,WAChC,SAAY/E,EAAZF,EAAc,iBAAsB,iBAAN,EACjC,GAEJ,EAGImF,EACJ5H,GAACU,GAAA,CAAK,UAAWgC,EAAe,GAAK,GAAI,KAAK,KAC3C,SAAAyE,EAAcjE,CAAI,EACrB,EAGI2E,EACJ7H,GAACU,GAAK,UAAL,CAAe,KAAK,OAAO,UAAW,GAAI,KAAK,MAC7C,SAAAwC,EAAK,aACR,EAGI4E,EAAW5E,EAAK,MACpBlD,GAAC,KAAE,KAAMuH,EAAU,EAAG,OAAO,SAAS,IAAI,aACxC,SAAAvH,GAACU,GAAK,UAAL,CACC,SAAU,CAAC,CAACwC,EAAK,MACjB,UAAU,oFACV,KAAK,OACL,OAAQN,EACR,UAAW,GACX,KAAK,KAEJ,SAAAM,EAAK,MACR,EACF,EAEAlD,GAACU,GAAA,CAAK,UAAW,GAAI,aAAC,EAGlB0C,EAAYX,EAAYS,EAAK,gBAAkBA,EAAK,cAEpD6E,EACJ9H,GAACF,GAAA,CAAK,KAAM,EACV,UAAAC,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,SACGiC,EADHF,EACK,iCACA,8BADgC,EAExC,EACAzC,GAACU,GAAK,UAAL,CACC,KAAK,UACL,SAAU,CAAC,CAAC0C,EACZ,OAAQR,EACR,UAAW,GACX,KAAK,KAEJ,SAAAQ,EACH,GACF,EAGF,OACEnD,GAACF,GAAA,CACC,EAAG,EACH,UAAU,SACV,KAAM,EACN,UAAW,IACX,EAAE,KACF,UAAU,oBAEV,UAAAC,GAACD,GAAA,CAAK,QAAQ,UAAU,MAAM,OAAO,OAAO,OACzC,SAAA2C,EACCzC,GAAAc,GAAA,CACG,UAAA4G,EACAC,GACH,EAEA3H,GAAAc,GAAA,CACG,UAAAgH,EACAJ,GACH,EAEJ,EAEA1H,GAACF,GAAA,CAAK,QAAQ,UAAU,MAAM,OAAO,OAAO,OACzC,UAAA8H,EACAnF,EAAeoF,EAAWF,GAC7B,GACF,CAEJ,EAEA,OACE3H,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,SACN,KAAM,SACN,QAAS/D,EACT,MAAOwC,EACP,KAAM,IACR,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMpB,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACA,UAAU,sFACZ,EAEA/C,GAAC6G,GAAA,CACC,WAAYV,EACZ,WAAYkB,EACZ,iBAAiB,iBACjB,SAAUH,EACV,UAAWlB,EACX,UAAU,WACV,UACE/F,GAACF,GAAA,CACC,UAAW,SACX,OAAQ,OACR,UAAW,SACX,QAAS,SACT,GAAI,EAEJ,UAAAC,GAAC+G,GAAA,EAAe,EACfZ,GAAY,QAAU,GACrBlG,GAACF,GAAA,CACC,UAAU,MACV,UAAU,SACV,QAAQ,SACR,QAAST,EACT,UAAU,iDAEV,UAAAU,GAACU,GAAA,CAAK,MAAM,UAAU,KAAK,MACxB,SAAAiC,EAAE,gBAAgB,EACrB,EACA3C,GAAC8G,GAAA,CACC,UAAU,yDACV,MAAM,UACN,KAAM,GACN,QAAS,IACX,GACF,GAEJ,EAEJ,GACF,CAEJ,ICnQA,OAAS,aAAAlJ,OAAiB,6BAef,cAAAoC,OAAA,oBAjBX,IAWagI,GAXbC,GAAA7J,EAAA,kBAGAsG,KACA+B,KACAQ,KAMae,GACX5H,GACG,CACH,IAAM7B,EAAQkG,GAAsB,CAAE,KAAMrE,EAAM,IAAK,CAAC,EAClD,CAAE,SAAAnB,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAACgH,GAAA,CAAoB,GAAGzI,EAAO,EAEjCyB,GAACwG,GAAA,CAAc,GAAGjI,EAAO,CAClC,ICpBA,IAAA2J,GAAA,GAAAzG,EAAAyG,GAAA,kBAAA1B,GAAA,uBAAAwB,GAAA,2BAAA3F,GAAA,0BAAAoC,KAAA,IAAA0D,GAAA/J,EAAA,kBAAAkE,KACAoC,KACA+B,KACAwB,OCHA,OAAS,WAAA/K,OAAe,QACxB,OAAS,kBAAAuC,OAAsB,+BAE/B,OAAS,QAAAM,GAAM,QAAAW,OAAyB,6BA4B5B,OAEE,OAAAV,GAFF,QAAAC,OAAA,oBA/BZ,IAKamI,GALb9F,GAAAlE,EAAA,kBAKagK,GAA2B,IAAM,CAC5C,GAAM,CAAE,EAAAzF,CAAE,EAAIlD,GAAe,EAyE7B,OAvEgBvC,GAAQ,IACf,CACL,CACE,MAAOyF,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,GACP,KAAM,SACN,UAAW,CACT,SAAU,EACZ,CACF,EACA,CACE,MAAOA,EAAE,aAAa,EACtB,UAAW,eACX,MAAO,IACP,KAAM,MACR,EACA,CACE,MAAO,GAAGA,EAAE,qBAAqB,CAAC,MAAMA,EAAE,oBAAoB,CAAC,GAC/D,UAAW,eACX,MAAO,GACP,OAAQ,CAACI,EAAYC,IAEjB/C,GAACF,GAAA,CAAK,IAAK,EAET,UAAAC,GAACU,GAAK,QAAL,CAAa,KAAM,cAAe,GAAI,EACpC,SAAAsC,EAAO,aACV,EACAhD,GAAC,QAAK,aAAC,EAEPA,GAACU,GAAK,QAAL,CAAa,KAAM,cAAe,GAAI,EACpC,SAAAsC,EAAO,YACV,GACF,CAGN,EACA,CACE,MAAOL,EAAE,qBAAqB,EAC9B,UAAW,eACX,MAAO,GACP,OAASI,GAAe,CACtB,OAAQA,EAAO,CACb,IAAK,MACL,IAAK,OACH,OAAOJ,EAAE,0BAA0B,EACrC,IAAK,UACL,IAAK,WACH,OAAOA,EAAE,8BAA8B,EACzC,QACE,OAAOI,CACX,CACF,CACF,EACA,CACE,MAAO,GAAGJ,EAAE,oBAAoB,CAAC,UACjC,UAAW,cACX,MAAO,GACP,KAAM,QACN,UAAUI,EAAOC,EAAQqF,EAAO,CAC9B,OAAO,OAAOtF,CAAK,EAAI,EACzB,EACA,aAAc,CACZ,SAAU,GACV,eAAgB,GAChB,SAAU,EACZ,CACF,CACF,EACC,CAACJ,CAAC,CAAC,CAGR,IChFA,OAAa,WAAAzF,OAAe,QAC5B,OAAS,kBAAAoL,OAAsB,gCAC/B,OAAS,kBAAA7I,OAAsB,+BAC/B,OAAS,cAAA6G,OAAkB,6BAC3B,OAAS,sBAAAC,OAA0B,uCA8B/B,mBAAAxF,GACE,OAAAf,GADF,QAAAC,OAAA,oBAlCJ,IAUasI,GAVbC,GAAApK,EAAA,kBAKAkE,KAKaiG,GAAkDnI,GAAU,CACvE,GAAM,CAAE,WAAA+F,EAAY,eAAAO,EAAgB,SAAAZ,EAAU,UAAAE,CAAU,EAAI5F,EACtDuG,EAAUyB,GAAyB,EACnCK,EAAUH,GAAe,EACzB,CAAE,OAAAI,EAAQ,UAAA/E,CAAU,EAAI+C,EACxB,CAAE,EAAA/D,CAAE,EAAIlD,GAAe,EAEvB8C,EAAUrF,GAAQ,IACf,CACL,CACE,MAAOyF,EAAE,YAAY,EACrB,MAAO,KACT,EACA,GAAG,OAAO,KAAK8F,CAAO,EAAE,IAAKC,IAEpB,CACL,MAFQA,EAAO,MAAM,GAAG,EAAE,CAAC,EAG3B,MAAOA,CACT,EACD,CACH,EACC,CAAC/F,EAAG8F,CAAO,CAAC,EAEf,OACExI,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,SACN,KAAM,SACN,UAAW,GACX,QAAA/D,EACA,MAAOmG,EACP,eAAiB3F,GACAR,EAAQ,KAAMW,GAASA,EAAK,QAAUH,CAAK,GAC3C,OAASA,CAE5B,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMY,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACF,EACA/C,GAACuG,GAAA,CACC,SAAQ,GACR,QAASI,EACT,WAAYR,EACZ,QAASH,EACT,gBAAkBhD,GAAW,GAAGA,EAAO,YAAY,GACnD,WAAY,CAAE,KAAM,2BAA4B,EAChD,WAAY5C,EAAM,WACpB,GACF,CAEJ,ICvEA,OAAS,kBAAAkI,OAAsB,gCAC/B,OAAS,kBAAA7I,OAAsB,+BAC/B,OAAS,cAAA6G,GAAY,QAAAvG,GAAM,YAAA8G,GAAU,QAAAnG,GAAM,SAAAkG,OAAa,6BAsChD,OAgEJ,YAAA7F,GA/DM,OAAAf,GADF,QAAAC,OAAA,oBAzCR,IAQa0I,GARbC,GAAAxK,EAAA,kBAQauK,GAAiDvI,GAAU,CACtE,GAAM,CAAE,WAAA+F,EAAY,eAAAO,EAAgB,SAAAZ,EAAU,UAAAE,EAAW,WAAAE,CAAW,EAAI9F,EAClEqI,EAAUH,GAAe,EACzB,CAAE,OAAAI,EAAQ,UAAA/E,CAAU,EAAI+C,EACxB,CAAE,EAAA/D,CAAE,EAAIlD,GAAe,EAEvBoJ,EAAqBC,GAAwB,CACjD,OAAQA,EAAa,CACnB,IAAK,MACL,IAAK,OACH,OAAOnG,EAAE,0BAA0B,EACrC,IAAK,UACL,IAAK,WACH,OAAOA,EAAE,8BAA8B,EACzC,QACE,OAAOmG,CACX,CACF,EAEM5B,EAAW,IAAM,CACjBf,GAAcA,EAAW,QAAUD,GAAY,OAAS,IAC1DA,GAAY,mBAAmBA,GAAY,SAAW,EAAE,CAE5D,EAEMmB,EAAqBnE,GAEvBjD,GAACF,GAAA,CACC,EAAG,EACH,UAAU,SACV,KAAM,EACN,UAAU,iDAEV,UAAAE,GAACF,GAAA,CAAK,UAAU,MAAM,QAAQ,UAAU,MAAM,OAAO,OAAO,OAC1D,UAAAC,GAACU,GAAK,UAAL,CACC,KAAK,SACL,UAAU,8CAET,SAAAwC,EAAK,OACR,EACAlD,GAAC4G,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAAiC,EAAkB3F,EAAK,YAAY,EACtC,EACAlD,GAACU,GAAK,UAAL,CACC,KAAK,OACL,UAAU,qDAET,SAAAwC,EAAK,aACR,GACF,EACAlD,GAAC,OAAI,UAAU,uCAAuC,EACtDC,GAACF,GAAA,CAAK,UAAU,MAAM,QAAQ,UAAU,MAAM,OAC5C,UAAAE,GAACF,GAAA,CAAK,UAAU,SACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yCACb,SAAAiC,EAAE,qBAAqB,EAC1B,EACA3C,GAACU,GAAK,QAAL,CACC,KAAM,cACN,GAAI,EACJ,UAAU,wCAET,SAAAwC,EAAK,aACR,GACF,EACAjD,GAACF,GAAA,CAAK,UAAU,SACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yCACb,SAAAiC,EAAE,oBAAoB,EACzB,EACA3C,GAACU,GAAK,QAAL,CACC,KAAM,cACN,GAAI,EACJ,UAAU,wCAET,SAAAwC,EAAK,YACR,GACF,EACAjD,GAACF,GAAA,CAAK,UAAU,SACd,UAAAE,GAACS,GAAA,CAAK,UAAU,yCACb,UAAAiC,EAAE,oBAAoB,EAAG,IAC1B3C,GAACU,GAAA,CAAK,UAAU,4BAA4B,kBAAM,GACpD,EACAV,GAACU,GAAK,QAAL,CACC,GAAI,EACJ,SAAU,GACV,SAAU,GACV,eAAgB,GAChB,UAAU,2BAET,gBAAOwC,EAAK,WAAW,EAAI,GAC9B,GACF,GACF,GACF,EAIJ,OACEjD,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,SACN,KAAM,SACN,UAAW,GACX,QAAS,CACP,CACE,MAAO,MACP,MAAO,KACT,EACA,GAAG,OAAO,KAAKmC,CAAO,EAAE,IAAKC,IAEpB,CACL,MAFQA,EAAO,MAAM,GAAG,EAAE,CAAC,EAG3B,MAAOA,CACT,EACD,CACH,EACA,MAAOA,EACP,eAAiB3F,GACXA,IAAU,MACL,MAEFA,EAAM,MAAM,GAAG,EAAE,CAAC,CAE7B,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMY,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACA,UAAU,sEACZ,EACA/C,GAAC6G,GAAA,CACC,WAAYV,EACZ,WAAYkB,EACZ,iBAAiB,iBACjB,SAAUH,EACV,UAAWlB,EACX,UAAU,WACZ,GACF,CAEJ,IC7JA,OAAS,wBAAA+C,OAA4B,gCACrC,OAAS,iBAAAxE,OAAqB,6BAC9B,OAAS,+BAAAC,OAAmC,gCAC5C,OAAS,WAAAtH,GAAS,YAAAyE,OAAgB,QAElC,OAAS,WAAAmC,GAAS,YAAAC,GAAU,WAAAC,GAAS,OAAAC,OAAW,WALhD,IAOa+E,GAPbC,GAAA7K,EAAA,kBAIAsF,KAGasF,GAAwB,IAAM,CAGzC,GAAM,CAACpE,CAAK,EAAIjD,GAAS,IAAM,CAC7B,IAAMkD,EAAI,IAAI,KAEd,OAAO,IAAI,KAAKb,GAAQa,CAAC,EAAGd,GAASc,CAAC,EAAGf,GAAQe,CAAC,EAAG,EAAG,EAAG,CAAC,CAC9D,CAAC,EAEK,CAAClB,EAAWsB,CAAY,EAAItD,GAAiB,CACjD6C,GAA4B,GAAII,CAAK,EACrCA,CACF,CAAC,EAEK,CAAC8D,EAAQQ,CAAS,EAAIvH,GAAiB,KAAK,EAC5C,CAAE,KAAAuD,EAAM,SAAAC,EAAU,QAAAC,EAAS,gBAAAC,CAAgB,EAAId,GAAc,EAE7D,CAAC1F,EAAM,CAAE,UAAAmH,EAAW,KAAAC,EAAM,aAAAkD,CAAa,CAAC,EAAIJ,GAChD,CAEE,UAAW,CACTpF,EAAU,CAAC,EAAE,QAAQ,EACrBM,GAAIN,EAAU,CAAC,EAAG,CAChB,MAAO,GACP,QAAS,GACT,QAAS,GACT,aAAc,CAChB,CAAC,EAEE,QAAQ,CACb,EACA,OAAA+E,EACA,KAAAxD,EACA,SAAAC,CACF,EACA,CACE,iBAAkB,EACpB,CACF,EAEMW,EAAYC,GAAyC,CACrDA,EAAO,OAAS,WAClBmD,EAAUnD,EAAO,KAAK,EACtBX,EAAQ,CAAC,GAGPW,EAAO,OAAS,cAElBd,EAAaxB,GAAwBsC,EAAO,KAAK,CAAC,EAClDX,EAAQ,CAAC,EAEb,EAEMc,EAAahJ,GACjB,IAAMmI,EAAgBY,CAAI,EAC1B,CAACZ,EAAiBY,CAAI,CACxB,EAEA,MAAO,CACL,WAAYpH,EACZ,UAAAmH,EACA,aAAAmD,EAEA,eAAgB,CACd,OAAAT,EACA,UAAA/E,CACF,EACA,SAAAmC,EACA,WAAAI,CACF,CACF,IC5EA,OAAS,aAAAtI,OAAiB,6BASf,cAAAoC,OAAA,oBAVX,IAMaoJ,GANbC,GAAAjL,EAAA,kBAEAoK,KACAI,KACAK,KAEaG,GAAiC,IAAM,CAClD,IAAM7K,EAAQyK,GAAsB,EAC9B,CAAE,SAAA/J,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAAC2I,GAAA,CAAsB,GAAGpK,EAAO,EAEnCyB,GAACuI,GAAA,CAAuB,GAAGhK,EAAO,CAC3C,ICbA,IAAA+K,GAAA,GAAA7H,EAAA6H,GAAA,2BAAAf,GAAA,yBAAAI,GAAA,yBAAAS,GAAA,6BAAAhB,GAAA,0BAAAY,KAAA,IAAAO,GAAAnL,EAAA,kBAAAiL,KACAb,KACAI,KACAtG,KACA2G,OCJA,OAAS,WAAA/L,OAAe,QACxB,OAAS,kBAAAuC,OAA4B,+BAErC,OAAS,QAAAM,GAAmB,aAAAmC,OAAiB,6BAcjC,OACE,OAAAlC,GADF,QAAAC,OAAA,oBAjBZ,IAKauJ,GALblH,GAAAlE,EAAA,kBAKaoL,GAAa,IAAM,CAC9B,GAAM,CAAE,EAAA7G,CAAE,EAAIlD,GAAe,EAoE7B,OAlEgBvC,GAAQ,IACf,CACL,CACE,MAAOyF,EAAE,cAAc,EACvB,UAAW,QACX,MAAO,GAEP,OAAQ,CAACI,EAAOC,IAEZ/C,GAACF,GAAA,CAAK,KAAM,EACV,UAAAC,GAACkC,GAAA,CAAU,KAAMa,EAAO,KAAK,KAAK,EAClC/C,GAAC,QAAM,SAAA+C,EAAM,GACf,CAGN,EACA,CACE,MAAOJ,EAAE,aAAa,EACtB,UAAW,eACX,MAAO,IACP,KAAM,MACR,EACA,CACE,MAAOA,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,IACP,UAAUI,EAAOC,EAAQqF,EAAO,CAC9B,OAAQtF,EAAO,CACb,IAAK,UACL,IAAK,QACH,OAAOJ,EAAE,gCAAgC,EAC3C,IAAK,YACL,QACE,OAAOA,EAAE,+BAA+B,CAC5C,CACF,CACF,EAEA,CACE,MAAOA,EAAE,aAAa,EACtB,UAAW,OACX,MAAO,GACP,UAAYI,GAAe,CACzB,OAAQA,EAAO,CACb,IAAK,kBACH,OAAOJ,EACL,yDACF,EACF,IAAK,iBACH,OAAOA,EAAE,oDAAoD,EAC/D,IAAK,aACH,OAAOA,EAAE,gDAAgD,EAC3D,QACE,MAAO,GACX,CACF,CACF,EACA,CACE,MAAOA,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,EAET,CACF,EACC,CAACA,CAAC,CAAC,CAGR,IC3EA,OAAa,WAAAzF,OAAe,QAC5B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,cAAA6G,OAAkB,6BAC3B,OAAS,sBAAAC,OAA0B,uCAgC/B,mBAAAxF,GACE,OAAAf,GADF,QAAAC,OAAA,oBAnCJ,IASawJ,GATbC,GAAAtL,EAAA,kBAIAkE,KAKamH,GAAuDrJ,GAAU,CAC5E,GAAM,CAAE,WAAA+F,EAAY,eAAAO,EAAgB,SAAAZ,EAAU,UAAAE,EAAW,aAAAmD,CAAa,EACpE/I,EACIuG,EAAU6C,GAAW,EACrB,CAAE,KAAAG,EAAM,UAAAhG,CAAU,EAAI+C,EACtB,CAAE,EAAA/D,CAAE,EAAIlD,GAAe,EAEvBmK,EAAQ1M,GAAQ,IACb,CACL,CAAE,MAAOyF,EAAE,YAAY,EAAG,MAAO,KAAM,EACvC,CACE,MAAOA,EAAE,yDAAyD,EAClE,MAAO,iBACT,EACA,CACE,MAAOA,EAAE,oDAAoD,EAC7D,MAAO,gBACT,EACA,CACE,MAAOA,EAAE,gDAAgD,EACzD,MAAO,YACT,CACF,EACC,CAACA,CAAC,CAAC,EAEN,OACE1C,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,SACN,KAAM,OACN,QAASsD,EACT,MAAOD,CACT,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMhG,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACF,EACA/C,GAACuG,GAAA,CACC,SAAQ,GACR,QAASI,EACT,WAAYR,EACZ,QAASH,EAET,UAAU,oBACV,WAAY,CACV,KAAM,2BACR,EACA,WAAY5F,EAAM,WACpB,GACF,CAEJ,ICvEA,OAAa,WAAAlD,OAAe,QAC5B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,cAAA6G,GAAY,QAAAvG,GAAM,QAAAW,GAAM,aAAAwB,OAAiB,6BAClD,OAAS,YAAA2E,OAAgB,6BA4DjB,OAqDJ,YAAA9F,GApDM,OAAAf,GADF,QAAAC,OAAA,oBA/DR,IAQa4J,GARbC,GAAA1L,EAAA,kBAQayL,GAAsDzJ,GAAU,CAC3E,GAAM,CAAE,WAAA+F,EAAY,eAAAO,EAAgB,SAAAZ,EAAU,UAAAE,EAAW,WAAAE,CAAW,EAAI9F,EAClE,CAAE,KAAAuJ,EAAM,UAAAhG,CAAU,EAAI+C,EACtB,CAAE,EAAA/D,CAAE,EAAIlD,GAAe,EAEvBmK,EAAQ1M,GAAQ,IACb,CACL,CAAE,MAAOyF,EAAE,YAAY,EAAG,MAAO,KAAM,EACvC,CACE,MAAOA,EAAE,yDAAyD,EAClE,MAAO,iBACT,EACA,CACE,MAAOA,EAAE,oDAAoD,EAC7D,MAAO,gBACT,EACA,CACE,MAAOA,EAAE,gDAAgD,EACzD,MAAO,YACT,CACF,EACC,CAACA,CAAC,CAAC,EAEAwE,EAAiBC,GAAmB,CACxC,OAAQA,EAAQ,CACd,IAAK,UACL,IAAK,QACH,OAAOzE,EAAE,gCAAgC,EAC3C,IAAK,YACL,QACE,OAAOA,EAAE,+BAA+B,CAC5C,CACF,EAEMoH,EAAeJ,GAAiB,CACpC,OAAQA,EAAM,CACZ,IAAK,kBACH,OAAOhH,EAAE,yDAAyD,EACpE,IAAK,iBACH,OAAOA,EAAE,oDAAoD,EAC/D,IAAK,aACH,OAAOA,EAAE,gDAAgD,EAC3D,QACE,MAAO,GACX,CACF,EAEMqH,EAAc9G,GAEhBjD,GAACF,GAAA,CACC,EAAG,EACH,UAAU,SACV,KAAM,EACN,UAAU,iDAEV,UAAAE,GAACF,GAAA,CAAK,UAAU,MAAM,QAAQ,UAAU,MAAM,OAAO,OAAO,OAC1D,UAAAC,GAACU,GAAK,UAAL,CACC,KAAK,OACL,UAAU,yCAET,SAAAwC,EAAK,aACR,EACAlD,GAACU,GAAA,CAAK,UAAU,wCACb,SAAAyG,EAAcjE,EAAK,MAAM,EAC5B,GACF,EACAlD,GAAC,OAAI,UAAU,oCAAoC,EACnDC,GAACF,GAAA,CAAK,UAAU,MAAM,QAAQ,UAAU,MAAM,OAC5C,UAAAE,GAACF,GAAA,CAAK,UAAU,SACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yCACb,SAAAiC,EAAE,cAAc,EACnB,EACA1C,GAACF,GAAA,CAAK,KAAM,EACV,UAAAC,GAACkC,GAAA,CAAU,KAAMgB,EAAK,MAAO,KAAK,KAAK,EACvClD,GAAC,QAAK,UAAU,wCACb,SAAAkD,EAAK,MACR,GACF,GACF,EACAjD,GAACF,GAAA,CAAK,UAAU,SACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yCACb,SAAAiC,EAAE,aAAa,EAClB,EACA3C,GAACU,GAAA,CAAK,UAAU,wCACb,SAAAqJ,EAAY7G,EAAK,IAAI,EACxB,GACF,EACAjD,GAACF,GAAA,CAAK,UAAU,SACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yCACb,SAAAiC,EAAE,eAAe,EACpB,EACA3C,GAACU,GAAA,CAAK,UAAU,wCACb,SAAAwC,EAAK,OACR,GACF,GACF,GACF,EAIEgE,EAAW,IAAM,CACjBf,EAAW,QAAUD,GAAY,OAAS,IAC5CA,GAAY,kBACVA,EAAW,iBAAiBA,GAAY,SAAW,EAAE,CAE3D,EAEA,OACEjG,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,SACN,KAAM,OACN,QAASsD,EACT,MAAOD,EACP,KAAM,IACR,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMhG,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACA,UAAU,sEACZ,EACA/C,GAAC6G,GAAA,CACC,WAAYV,EACZ,WAAY6D,EACZ,iBAAiB,gBACjB,SAAU9C,EACV,UAAWlB,EACX,UAAU,WACZ,GACF,CAEJ,ICtJA,OAAS,0BAAAiE,OAA8B,gCACvC,OAAS,+BAAAzF,OAAmC,gCAC5C,OAAS,WAAAtH,GAAS,YAAAyE,OAAgB,QAClC,OAAS,iBAAA4C,OAAqB,6BAE9B,OAAS,WAAAT,GAAS,YAAAC,GAAU,WAAAC,GAAS,OAAAC,OAAW,WALhD,IAOaiG,GAPbjB,GAAA7K,EAAA,kBAIAsF,KAGawG,GAA6B,IAAM,CAG9C,GAAM,CAACtF,CAAK,EAAIjD,GAAS,IAAM,CAC7B,IAAMkD,EAAI,IAAI,KAEd,OAAO,IAAI,KAAKb,GAAQa,CAAC,EAAGd,GAASc,CAAC,EAAGf,GAAQe,CAAC,EAAG,EAAG,EAAG,CAAC,CAC9D,CAAC,EAEK,CAAClB,EAAWsB,CAAY,EAAItD,GAAiB,CACjD6C,GAA4B,GAAII,CAAK,EACrCA,CACF,CAAC,EACK,CAAC+E,EAAMQ,CAAO,EAAIxI,GAAiB,KAAK,EACxC,CAAE,KAAAuD,EAAM,SAAAC,EAAU,QAAAC,EAAS,gBAAAC,CAAgB,EAAId,GAAc,EAE7D,CAAC1F,EAAM,CAAE,UAAAmH,EAAW,KAAAC,EAAM,aAAAkD,CAAa,CAAC,EAAIc,GAAuB,CAEvE,UAAW,CACTtG,EAAU,CAAC,EAAE,QAAQ,EACrBM,GAAIN,EAAU,CAAC,EAAG,CAChB,MAAO,GACP,QAAS,GACT,QAAS,GACT,aAAc,CAChB,CAAC,EAAE,QAAQ,CACb,EACA,KAAAgG,EACA,SAAAxE,EACA,KAAAD,CACF,CAAC,EAMKY,EAAYC,GAAyC,CACrDA,EAAO,OAAS,SAClBoE,EAAQpE,EAAO,KAAK,EACpBX,EAAQ,CAAC,GAGPW,EAAO,OAAS,cAElBd,EAAaxB,GAAwBsC,EAAO,KAAK,CAAC,EAClDX,EAAQ,CAAC,EAEb,EAEMc,EAAahJ,GACjB,IAAMmI,EAAgBY,CAAI,EAC1B,CAACZ,EAAiBY,CAAI,CACxB,EAEA,MAAO,CACL,WAAYpH,EACZ,UAAAmH,EACA,aAAAmD,EAEA,eAAgB,CACd,KAAAQ,EACA,UAAAhG,CACF,EACA,SAAAmC,EACA,WAAAI,CACF,CACF,ICxEA,OAAS,aAAAtI,OAAiB,6BASf,cAAAoC,OAAA,oBAVX,IAMaoK,GANbC,GAAAjM,EAAA,kBAEAsL,KACAI,KACAb,KAEamB,GAAsC,IAAM,CACvD,IAAM7L,EAAQ2L,GAA2B,EACnC,CAAE,SAAAjL,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAAC6J,GAAA,CAA2B,GAAGtL,EAAO,EAExCyB,GAACyJ,GAAA,CAA4B,GAAGlL,EAAO,CAChD,ICbA,IAAA+L,GAAA,GAAA7I,EAAA6I,GAAA,gCAAAb,GAAA,8BAAAI,GAAA,8BAAAO,KAAA,IAAAG,GAAAnM,EAAA,kBAAAiM,KACAP,KACAJ,OCFA,OAAOc,OAAW,QAClB,OAAS,cAAArN,OAAkB,gCAC3B,OAAS,kBAAAsC,OAAsB,+BAE/B,OAAS,QAAAM,GAAM,aAAAmC,GAAW,QAAAxB,GAAM,SAAAyB,GAAO,SAAAyE,OAAa,6BAEpD,OAAS,oBAAA6D,OAAwB,gCAiBrB,OACE,OAAAzK,GADF,QAAAC,OAAA,oBAvBZ,IAQauJ,GARblH,GAAAlE,EAAA,kBAQaoL,GAAa,IAAM,CAC9B,GAAM,CAAE,EAAA7G,CAAE,EAAIlD,GAAe,EACvBmD,EAAS,IAAM,CACnBT,GAAM,QAAQQ,EAAE,oBAAoB,CAAC,CACvC,EACM,CAAE,MAAApE,CAAM,EAAIpB,GAAW,EACvBuN,EAAMnM,EAAM,aAAe,CAAC,EA6ElC,OA5EgBiM,GAAM,QAA0C,IACvD,CACL,CACE,MAAO7H,EAAE,cAAc,EACvB,UAAW,QACX,MAAO,GACP,OAAOgI,EAAa,CAClB,OACE1K,GAACF,GAAA,CAAK,KAAM,EACV,UAAAC,GAACkC,GAAA,CAAU,KAAMyI,EAAK,KAAK,KAAK,EAChC3K,GAAC,QAAM,SAAA2K,EAAI,GACb,CAEJ,CACF,EACA,CACE,MAAOhI,EAAE,aAAa,EACtB,UAAW,eACX,MAAO,IACP,KAAM,MACR,EACA,CACE,MAAO,GAAGA,EAAE,gCAAgC,CAAC,gBAC7C,UAAW,kBACX,OAAOgI,EAAa,CAClB,IAAMnM,EAAgBmM,IAAQpM,EAAM,cAC9BqM,EAAaF,EAAI,KAAMxH,GAASA,EAAK,KAAOyH,CAAG,EACrD,OACE1K,GAACF,GAAA,CAAK,UAAU,QAAQ,GAAI,EAAG,IAAK,EAAG,UAAU,SAC/C,UAAAC,GAACU,GAAK,UAAL,CAAe,OAAQkC,EAAQ,SAAQ,GAAC,KAAK,UAC3C,SAAA+H,EACH,EACA3K,GAAC4G,GAAA,CAAM,UAAU,kBAAkB,MAAM,UAAU,KAAK,KACrD,SAAApI,EACGmE,EAAE,oBAAoB,EACtBiI,GAAY,aAAejI,EAAE,mBAAmB,EACtD,GACF,CAEJ,CACF,EACA,CACE,MAAO,GAAGA,EAAE,8BAA8B,CAAC,gBAC3C,UAAW,gBACX,OAAOgI,EAAa,CAClB,IAAMnM,EAAgBmM,IAAQpM,EAAM,cAC9BqM,EAAaF,EAAI,KAAMxH,GAASA,EAAK,KAAOyH,CAAG,EACrD,OACE1K,GAACF,GAAA,CAAK,UAAU,QAAQ,GAAI,EAAG,IAAK,EAAG,UAAU,SAC/C,UAAAC,GAACU,GAAK,UAAL,CAAe,OAAQkC,EAAQ,SAAQ,GAAC,KAAK,UAC3C,SAAA+H,EACH,EACA3K,GAAC4G,GAAA,CAAM,UAAU,kBAAkB,MAAM,UAAU,KAAK,KACrD,SAAApI,EACGmE,EAAE,oBAAoB,EACtBiI,GAAY,aAAejI,EAAE,mBAAmB,EACtD,GACF,CAEJ,CACF,EACA,CACE,MAAOA,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,IACP,OAAOgI,EAAa,CAClB,OAAOF,GAAiBE,CAAG,CAC7B,CACF,EACA,CACE,MAAOhI,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,EACT,CACF,EACC,CAACA,EAAGpE,EAAM,cAAemM,CAAG,CAAC,CAElC,IC5FA,OAAgB,WAAAxN,OAAe,QAC/B,OAAS,WAAA2N,OAAe,QAExB,OAAS,kBAAApL,OAAsB,+BAE/B,OAAS,cAAA6G,GAAY,iBAAAwE,OAAqB,6BAC1C,OAAS,sBAAAvE,OAA0B,uCAyD/B,mBAAAxF,GACE,OAAAf,GADF,QAAAC,OAAA,oBA/DJ,IAkBa8K,GAlBbC,GAAA5M,EAAA,kBAQAkE,KAUayI,GAER3K,GAAU,CACb,GAAM,CACJ,WAAA+F,EACA,eAAAO,EACA,MAAAnI,EACA,cAAAC,EACA,UAAAwH,EACA,gBAAAiF,EACA,SAAAnF,CACF,EAAI1F,EACE,CAAE,KAAAuE,EAAM,UAAAhB,CAAU,EAAI+C,EAEtB,CAAE,EAAA/D,CAAE,EAAIlD,GAAe,EAEvByL,EAA6B,CACjC,MAAOvI,EAAE,mBAAmB,EAC5B,MAAO,cACT,EAEMwI,EAA6B,CACjC,MAAOxI,EAAE,oBAAoB,EAC7B,MAAO,eACT,EAEMxD,EAAcZ,EAAM,aAAe,CAAC,EAEpC6M,EAAkBlO,GAAQ,IAC1B,MAAM,QAAQiC,CAAW,GAAKA,EAAY,OACrC,CACL+L,EACAC,EACA,GAAGhM,EAAY,IAAmB4D,IAAW,CAC3C,MAAOA,EAAM,GACb,MAAOA,GAAO,aAAe+H,GAAc/H,GAAO,EAAE,CACtD,EAAE,CACJ,EAEK,CAACmI,EAAcC,CAAY,EACjC,CAAChM,CAAW,CAAC,EAEVwH,EAAU6C,GAAW,EAE3B,OACEvJ,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,SAAUR,EACV,MAAO+E,GACL,CACE,CACE,KAAM,SACN,KAAM,OACN,MAAOlG,EACP,QAAS,CACP,CAAE,MAAO,MAAO,MAAO,SAAU,EACjC,CAAE,MAAO,KAAM,MAAO,QAAS,CACjC,CACF,EACA,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMhB,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACC0H,GAAU,CACL7M,GACF6M,EAAM,QAAQ,CACZ,KAAM,SACN,KAAM,UACN,MAAOJ,EACP,QAASG,CACX,CAAC,CAEL,CACF,EACF,EACApL,GAACuG,GAAA,CACC,SAAQ,GACR,QAASI,EACT,WAAYR,EACZ,QAASH,EAET,UAAU,oBACV,WAAY,CAAE,KAAM,2BAA4B,EAChD,WAAY5F,EAAM,WAClB,gBAAkBkL,GAAQA,EAAI,GAChC,GACF,CAEJ,IC/GA,OAAOd,OAAW,QAClB,OAAS,WAAA1G,GAAS,YAAAC,GAAU,WAAAC,GAAS,OAAAC,OAAW,WAChD,OAAS,cAAA9G,GAAY,sBAAAkH,OAA0B,gCAC/C,OAAS,iBAAAE,OAAqB,6BAE9B,OAAS,+BAAAC,OAAmC,gCAL5C,IASa+G,GATbtC,GAAA7K,EAAA,kBAMAsF,KACAsH,KAEaO,GAAyB,IAAM,CAG1C,IAAM3G,EAAQ4F,GAAM,QAAc,IAAM,CACtC,IAAMgB,EAAO,IAAI,KACjB,OAAO,IAAI,KAAKxH,GAAQwH,CAAI,EAAGzH,GAASyH,CAAI,EAAG1H,GAAQ0H,CAAI,EAAG,EAAG,EAAG,CAAC,CACvE,EAAG,CAAC,CAAC,EAEC,CAAC7H,EAAWsB,CAAY,EAAIuF,GAAM,SAAiB,CACvDhG,GAA4B,GAAII,CAAK,EACrCA,CACF,CAAC,EAEK,CAAE,KAAAM,EAAM,SAAAC,EAAU,QAAAC,EAAS,gBAAAC,CAAgB,EAAId,GAAc,EAE7D,CAAE,MAAAhG,CAAM,EAAIpB,GAAW,EAEvB,CAAC8N,EAAiBQ,CAAU,EAAIjB,GAAM,uBAAgC,EAEtE,CAAC7F,EAAM+G,CAAO,EAAIlB,GAAM,SAAuB,KAAK,EAEpD,CAAC3L,EAAM,CAAE,UAAAmH,EAAW,KAAAC,CAAK,CAAC,EAAI5B,GAAmB,CACrD,UAAW,CACTV,EAAU,CAAC,GAAG,QAAQ,EACtBM,GAAIN,EAAU,CAAC,EAAG,CAChB,MAAO,GACP,QAAS,GACT,QAAS,GACT,aAAc,CAChB,CAAC,GAAG,QAAQ,CACd,EACA,KAAMgB,EACN,KAAMQ,EACN,KAAMD,EACN,cAAe,EACjB,CAAC,EAEKyG,EAAenB,GAAM,QAAQ,IAC1B3L,EAAK,OAAQqE,GACd,CAAC+H,GAAmBA,mBACf,GAELA,oBAEA/H,EAAK,kBAAoB3E,EAAM,eAC/B2E,EAAK,gBAAkB3E,EAAM,cAI7B2E,EAAK,kBAAoB+H,GACzB/H,EAAK,gBAAkB+H,CAG5B,EACA,CAACpM,EAAMoM,CAAe,CAAC,EAEpBW,EAAkBpB,GAAM,YAC3BzE,GAA4C,CACvCA,EAAO,OAAS,WAClB0F,EAAW1F,EAAO,KAAK,EAErBA,EAAO,OAAS,QAClB2F,EAAQ3F,EAAO,KAAqB,EAElCA,EAAO,OAAS,aAClBd,EAAaxB,GAAwBsC,EAAO,KAAY,CAAC,EAE3DX,EAAQ,CAAC,CACX,EACA,CAACA,CAAO,CACV,EAEMc,EAAasE,GAAM,QACvB,IAAMnF,EAAgBY,CAAI,EAC1B,CAACZ,EAAiBY,CAAI,CACxB,EAEA,MAAO,CACL,WAAY0F,EACZ,UAAA3F,EAEA,eAAgB,CACd,KAAArB,EACA,UAAAhB,CACF,EACA,gBAAAsH,EACA,SAAUW,EACV,WAAA1F,CACF,CACF,ICjGA,OAAS,cAAA/I,OAAkB,gCAOlB,cAAA6C,OAAA,oBART,IAKa6L,GALbC,GAAA1N,EAAA,kBAEA4M,KACA/B,KAEa4C,GAAkC,IAAM,CACnD,IAAMtN,EAAQgN,GAAuB,EAC/BQ,EAAe5O,GAAW,EAChC,OAAO6C,GAAC+K,GAAA,CAAmB,GAAGxM,EAAQ,GAAGwN,EAAc,CACzD,ICTA,IAAAC,GAAA,GAAAvK,EAAAuK,GAAA,uBAAAjB,GAAA,0BAAAc,KAAA,IAAAI,GAAA7N,EAAA,kBAAA0N,KACAd,OCDA,OAAOR,OAAW,QAClB,OAAS,kBAAA/K,OAAsB,+BAE/B,OAAS,QAAAM,GAAM,aAAAmC,GAAW,QAAAxB,GAAM,MAAAwL,OAAU,6BAE1C,OAAS,oBAAAzB,OAAwB,gCAqCrB,OACE,OAAAzK,GADF,QAAAC,OAAA,oBA1CZ,IAOauJ,GAPblH,GAAAlE,EAAA,kBAOaoL,GAAa,IAAM,CAC9B,GAAM,CAAE,EAAA7G,CAAE,EAAIlD,GAAe,EAwE7B,OAvEgB+K,GAAM,QAA+C,IAC5D,CACL,CACE,MAAO7H,EAAE,aAAa,EACtB,UAAW,OACX,UAAYK,GACNA,GAAQ,OAAS,UACZ,mBAELA,GAAQ,OAAS,aACZ,kBAEF,GAET,OAAO2H,EAAa,CAClB,OAAIA,IAAQ,UACHhI,EAAE,gBAAgB,EAEvBgI,IAAQ,aACHhI,EAAE,iBAAiB,EAErB,IACT,CACF,EACA,CACE,MAAOA,EAAE,8BAA8B,EACvC,UAAW,WACb,EACA,CACE,MAAOA,EAAE,cAAc,EACvB,UAAW,QACX,OAAOgI,EAAa,CAClB,OACE1K,GAACF,GAAA,CAAK,QAAQ,QAAQ,UAAU,SAAS,IAAK,EAC5C,UAAAC,GAACkC,GAAA,CAAU,KAAMyI,EAAK,EACrBA,GACH,CAEJ,CACF,EACA,CACE,MAAOhI,EAAE,aAAa,EACtB,UAAW,eACX,KAAM,MACR,EACA,CACE,MAAOA,EAAE,eAAe,EACxB,UAAW,SACX,OAAOgI,EAAa,CAClB,OAAOF,GAAiBE,CAAG,CAC7B,CACF,EACA,CACE,MAAOhI,EAAE,eAAe,EACxB,UAAW,gBACX,OAAOgI,EAAa,CAClB,OACE3K,GAACU,GAAK,QAAL,CACC,eAAc,GACd,UAAWwL,GACT,kBACAvB,GAAO,EAAI,mBAAqB,iBAClC,EAEC,SAAAA,EACH,CAEJ,CACF,CACF,EACC,CAAChI,CAAC,CAAC,CAER,IC/EA,OAAS,cAAA2D,OAAkB,6BAC3B,OAAS,sBAAAC,OAA0B,uCAY/B,mBAAAxF,GACE,OAAAf,GADF,QAAAC,OAAA,oBAfJ,IASakM,GATbnB,GAAA5M,EAAA,kBAIAkE,KAKa6J,GAAqD/L,GAAU,CAC1E,GAAM,CAAE,WAAA+F,EAAY,UAAAxC,EAAW,UAAAqC,EAAW,SAAAF,CAAS,EAAI1F,EAEjDuG,EAAU6C,GAAW,EAE3B,OACEvJ,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,SAAUR,EACV,MAAO,CACL,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAMnC,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACF,EACA3D,GAACuG,GAAA,CACC,SAAQ,GACR,QAASI,EACT,WAAYR,EACZ,QAASH,EACT,UAAU,oBACV,WAAY,CAAE,KAAM,2BAA4B,EAChD,WAAY5F,EAAM,WAClB,gBAAkBkL,GAAQA,EAAI,GAChC,GACF,CAEJ,ICzCA,OAAOd,OAAW,QAClB,OAAS,WAAA1G,GAAS,YAAAC,GAAU,WAAAC,GAAS,OAAAC,OAAW,WAChD,OAAS,oBAAAmI,OAAwB,gCAEjC,OAAS,iBAAA7H,OAAqB,6BAE9B,OAAS,+BAAAC,OAAmC,gCAN5C,IASa6H,GATbpD,GAAA7K,EAAA,kBAOAsF,KAEa2I,GAAuB,IAAM,CACxC,IAAMzH,EAAQ4F,GAAM,QAAc,IAAM,CACtC,IAAMgB,EAAO,IAAI,KACjB,OAAO,IAAI,KAAKxH,GAAQwH,CAAI,EAAGzH,GAASyH,CAAI,EAAG1H,GAAQ0H,CAAI,EAAG,EAAG,EAAG,CAAC,CACvE,EAAG,CAAC,CAAC,EAEC,CAAC7H,EAAWsB,CAAY,EAAIuF,GAAM,SAAiB,CACvDhG,GAA4B,GAAII,CAAK,EACrCA,CACF,CAAC,EAEK,CAAE,KAAAM,EAAM,SAAAC,EAAU,QAAAC,EAAS,gBAAAC,CAAgB,EAAId,GAAc,EAE7D,CAAC1F,EAAM,CAAE,UAAAmH,EAAW,KAAAC,CAAK,CAAC,EAAImG,GAAiB,CACnD,UAAW,CACTzI,EAAU,CAAC,GAAG,QAAQ,EACtBM,GAAIN,EAAU,CAAC,EAAG,CAChB,MAAO,GACP,QAAS,GACT,QAAS,GACT,aAAc,CAChB,CAAC,GAAG,QAAQ,CACd,EACA,KAAMwB,EACN,KAAMD,CACR,CAAC,EAEKiB,EAAaqE,GAAM,QAAQ,IAC3B,CAAC,MAAM,QAAQ3L,CAAI,GAAK,CAACA,EAAK,OACzB,CAAC,EAEHA,EAAK,IAAkCqE,IAAU,CACtD,GAAGA,EACH,MAAO,OACP,UAAW,oBACX,cACEA,EAAK,OAAS,aAAe,CAACA,EAAK,cAAgBA,EAAK,aAC5D,EAAE,EACD,CAACrE,CAAI,CAAC,EAEHyN,EAAoB9B,GAAM,YAC7BzE,GAA4C,CACvCA,EAAO,OAAS,aAClBd,EAAaxB,GAAwBsC,EAAO,KAAY,CAAC,EAE3DX,EAAQ,CAAC,CACX,EACA,CAACA,CAAO,CACV,EAEMc,EAAasE,GAAM,QACvB,IAAMnF,EAAgBY,CAAI,EAC1B,CAACZ,EAAiBY,CAAI,CACxB,EAEA,MAAO,CACL,WAAYE,EACZ,UAAAH,EACA,UAAArC,EACA,SAAU2I,EACV,WAAApG,CACF,CACF,ICvEA,OAAS,kBAAAzG,OAAsB,+BAC/B,OAAS,WAAAa,OAAe,6BACxB,OAAS,cAAAgG,GAAY,aAAApE,GAAW,YAAA2E,GAAU,QAAAnG,OAAY,6BAoB9C,OAoCJ,YAAAK,GAnCM,OAAAf,GADF,QAAAC,OAAA,oBAtBR,IAKasM,GALbC,GAAApO,EAAA,kBAKamO,GAAuBnM,GAAsC,CACxE,GAAM,CAAE,UAAAuD,EAAW,SAAAmC,EAAU,WAAAK,EAAY,UAAAH,EAAW,WAAAE,CAAW,EAAI9F,EAC7D,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAEvByH,EAAW,IAAM,CACjBf,EAAW,QAAUD,GAAY,OAAS,IAC5CA,GAAY,mBAAmBA,GAAY,SAAW,EAAE,CAE5D,EAEMmB,EAAqBnE,GAAc,CACvC,IAAMuJ,EAAYvJ,EAAK,OAAS,UAAY,MAAQ,OAC9CwJ,EACJxJ,EAAK,OAAS,UAAYP,EAAE,gBAAgB,EAAIA,EAAE,iBAAiB,EAC/DgK,EAAazJ,EAAK,cAAgB,KAAK,IAAIA,EAAK,aAAa,EAAI,IACvE,OACEjD,GAAC,OAAI,UAAU,+EACb,UAAAA,GAAC,OAAI,UAAU,sFACb,UAAAD,GAAC,OAAK,SAAAkD,EAAK,UAAU,EACrBlD,GAAC,OACE,SAAAkD,EAAK,QAAQ,MAAM,EAAG,CAAC,EAAE,YAAY,EAAIA,EAAK,QAAQ,MAAM,CAAC,EAChE,GACF,EACAlD,GAACU,GAAK,UAAL,CAAe,KAAK,OAAO,UAAW,GAAI,KAAK,MAC7C,SAAAwC,EAAK,aACR,EACAlD,GAACM,GAAA,CAAQ,UAAU,WAAW,EAC9BL,GAAC,OAAI,UAAU,sGACb,UAAAA,GAAC,OACC,UAAAD,GAAC,OAAK,SAAA2C,EAAE,cAAc,EAAE,EACxB1C,GAAC,OAAI,UAAU,4EACb,UAAAD,GAACkC,GAAA,CAAU,KAAM,OAAQ,KAAK,MAAM,EACpClC,GAACU,GAAA,CAAK,gBAAI,GACZ,GACF,EACAT,GAAC,OACC,UAAAD,GAAC,OAAK,SAAA2C,EAAE,aAAa,EAAE,EACvB3C,GAACU,GAAA,CAAK,MAAO+L,EAAW,UAAU,cAC/B,SAAAC,EACH,GACF,EACAzM,GAAC,OAAI,UAAU,iBACb,UAAAD,GAAC,OAAK,SAAA2C,EAAE,eAAe,EAAE,EACzB3C,GAAC,OAAI,UAAU,wCACZ,SAAA2M,EACH,GACF,GACF,GACF,CAEJ,EAEA,OACE1M,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,MAAO,CACL,CACE,KAAM,QACN,KAAM,YACN,MAAO,CACL,KAAM3C,EAAU,CAAC,EACjB,GAAIA,EAAU,CAAC,CACjB,CACF,CACF,EACA,SAAWZ,GAAU,CACnB+C,EAAS/C,CAAK,CAChB,EACA,UAAU,sFACZ,EACA/C,GAAC6G,GAAA,CACC,WAAYV,EACZ,WAAYkB,EACZ,iBAAiB,iBACjB,SAAUH,EACV,UAAWlB,EACX,UAAU,WACZ,GACF,CAEJ,ICpFA,OAAS,aAAApI,OAAiB,6BASf,cAAAoC,OAAA,oBAVX,IAMa4M,GANbd,GAAA1N,EAAA,kBAEA4M,KACA/B,KACAuD,KAEaI,GAAgC,IAAM,CACjD,IAAMrO,EAAQ8N,GAAqB,EAC7B,CAAE,SAAApN,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAACuM,GAAA,CAAqB,GAAGhO,EAAO,EAElCyB,GAACmM,GAAA,CAAiB,GAAG5N,EAAO,CACrC,ICbA,IAAAsO,GAAA,GAAApL,EAAAoL,GAAA,qBAAAV,GAAA,wBAAAS,KAAA,IAAAE,GAAA1O,EAAA,kBAAA0N,KACAd,OCDA,OAAOR,IAAS,aAAAuC,OAAiB,QACjC,OAAS,cAAA5P,OAAkB,gCAC3B,OAAS,kBAAAsC,OAAsB,+BAC/B,OAAS,wBAAA6E,OAA4B,gCACrC,OACE,2BAAA5E,GACA,4BAAAsN,GACA,yBAAApN,GACA,QAAAS,GACA,eAAA4M,GACA,kBAAAC,GACA,YAAAC,GACA,QAAAC,GACA,cAAAC,OACK,6BA+CD,OAQU,OAAArN,GARV,QAAAC,OAAA,oBA7DN,IAiBMqN,GAMAC,GAMAC,GAMAC,GAMAC,GAMOC,GA/CbC,GAAAxP,EAAA,kBAiBMkP,GAAyB9C,GAAM,KAAK,IACxC,sCAA0B,KAAMqD,IACvB,CAAE,QAASA,EAAI,kBAAmB,EAC1C,CACH,EAEMN,GAA2B/C,GAAM,KAAK,IAC1C,sCAAqB,KAAMqD,IAClB,CAAE,QAASA,EAAI,oBAAqB,EAC5C,CACH,EAEML,GAAgChD,GAAM,KAAK,IAC/C,sCAA0B,KAAMqD,IACvB,CAAE,QAASA,EAAI,yBAA0B,EACjD,CACH,EAEMJ,GAA4BjD,GAAM,KAAK,IAC3C,sCAA6B,KAAMqD,IAC1B,CAAE,QAASA,EAAI,qBAAsB,EAC7C,CACH,EAEMH,GAA0BlD,GAAM,KAAK,IACzC,sCAA2B,KAAMqD,IACxB,CAAE,QAASA,EAAI,mBAAoB,EAC3C,CACH,EAEaF,GAGPvN,GAAU,CACd,GAAM,CAAE,OAAA0B,EAAS,UAAW,YAAAgM,CAAY,EAAI1N,EACtC,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvB,CAAE,cAAAjB,CAAc,EAAIrB,GAAW,EACrC,OAAA4P,GAAU,IAAM,CACVjL,IAAW,UAAY,CAACtD,GAC1BsP,EAAY,SAAS,CAEzB,EAAG,CAAChM,EAAQtD,CAAa,CAAC,EAExBwB,GAACK,GAAA,CACC,SAAAJ,GAACmN,GAAA,CACC,MAAOtL,EACP,cAAegM,EACf,QAAQ,YACR,KAAK,KAEL,UAAA9N,GAACmN,GAAA,CACC,MAAOxK,EAAE,iBAAiB,EAC1B,KAAM3C,GAACN,GAAA,EAAwB,EAC/B,MAAO,UAEP,SAAAM,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACsN,GAAA,CAAuB,KAAMhJ,GAAqB,QAAS,EAC9D,EACF,EACAtE,GAACmN,GAAA,CACC,MAAOxK,EAAE,oBAAoB,EAC7B,KAAM3C,GAACJ,GAAA,EAAsB,EAC7B,MAAO,WAEP,SAAAI,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACsN,GAAA,CAAuB,KAAMhJ,GAAqB,SAAU,EAC/D,EACF,EACAtE,GAACmN,GAAA,CACC,MAAOxK,EAAE,gBAAgB,EACzB,KAAM3C,GAACiN,GAAA,EAAY,EACnB,MAAO,UAEP,SAAAjN,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACuN,GAAA,EAAyB,EAC5B,EACF,EACAvN,GAACmN,GAAA,CACC,MAAOxK,EAAE,iCAAiC,EAC1C,KAAM3C,GAACkN,GAAA,EAAe,EACtB,MAAO,eAEP,SAAAlN,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACwN,GAAA,EAA8B,EACjC,EACF,EACAxN,GAACmN,GAAA,CACC,MAAOxK,EAAE,oCAAoC,EAC7C,KAAM3C,GAACgN,GAAA,EAAyB,EAChC,MAAO,WAEP,SAAAhN,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACyN,GAAA,EAA0B,EAC7B,EACF,EACCjP,GACCwB,GAACmN,GAAA,CACC,MAAO,SACP,KAAMnN,GAACqN,GAAA,EAAW,EAClB,MAAO1K,EAAE,2BAA2B,EAEpC,SAAA3C,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAAC0N,GAAA,EAAwB,EAC3B,EACF,GAEJ,EACF,CAEJ,IC7HA,OAAS,WAAAxQ,OAAe,QACxB,OAAS,WAAA2N,OAAe,QACxB,OAAS,cAAA1N,GAAY,iBAAAC,OAAqB,gCAC1C,OAAS,kBAAAqC,OAAsB,+BAJ/B,IAOMsO,GAeOC,GAtBbC,GAAA7P,EAAA,kBAOM2P,GAAsC,CAC1C,MAAO,OACP,QAAS,EACT,OAAQ,CACV,EAWaC,GAAkB,IAA6B,CAC1D,GAAM,CAAE,EAAArL,CAAE,EAAIlD,GAAe,EACvB,CAAE,MAAAlB,EAAO,cAAAC,CAAc,EAAIrB,GAAW,EACtC,CAAE,QAAA+Q,EAAU,CAAC,CAAE,EAAI9Q,GAAc,EACjC+B,EAAcZ,EAAM,aAAe,CAAC,EAE1C,OAAOrB,GAAQ,IACN2N,GAAe1L,EAAckM,GAAU,CAE5C,QAAWX,KAAOW,EAChBX,EAAI,WAAaA,EAAI,GACjB,MAAM,QAAQA,EAAI,OAAO,GAAKA,EAAI,QAAQ,OAC5CA,EAAI,SAAWA,EAAI,QAAQ,IAAKxH,IAAuB,CACrD,GAAGA,EACH,WAAYwH,EAAI,EAClB,EAAE,EAEFA,EAAI,SAAW,CAAC,CAAE,GAAGqD,GAAe,WAAYrD,EAAI,EAAG,CAAC,EAG1D,QAAQ,eAAeA,EAAK,SAAS,EAInClM,GACF6M,EAAM,QAAQ,CACZ,WAAY9M,EAAM,cAClB,YAAaoE,EAAE,oBAAoB,EACnC,SACE,MAAM,QAAQuL,CAAO,GAAKA,EAAQ,OAC9BA,EAAQ,IAAKhL,IAAuB,CAClC,GAAGA,EACH,WAAY3E,EAAM,aACpB,EAAE,EACF,CACE,CACE,GAAGwP,GACH,WAAYxP,EAAM,aACpB,CACF,CACR,CAAC,CAEL,CAAC,EACA,CAAC2P,EAAS/O,EAAaX,EAAeD,EAAM,cAAeoE,CAAC,CAAC,CAClE,IClEA,OAAS,WAAAzF,OAAe,QACxB,OACE,cAAAC,GACA,iBAAAC,GACA,wBAAA+Q,OACK,gCAEP,OAAS,WAAA/L,OAAe,gCAPxB,IAUMgM,GAIOC,GAqBAC,GAnCbC,GAAAnQ,EAAA,kBAQA6P,KAEMG,GAAYzD,GACT,OAAOA,GAAQ,UAAY,CAAC,OAAO,MAAMA,CAAG,EAGxC0D,GAAwB,CACnCxP,EACA2P,IACG,CACH,IAAIC,EAAQ,IAAIrM,GAAQ,CAAC,EACzB,QAAWc,KAAQrE,EACjB,GAAI,MAAM,QAAQqE,EAAK,OAAO,GAC5B,QAAWwL,KAAOxL,EAAK,QACrB,GAAIkL,GAASM,EAAI,OAAO,EAAG,CACzB,IAAMC,EAAaH,EAAcE,EAAI,KAAK,EAC1CD,EAAQA,EAAM,KAAK,IAAIrM,GAAQsM,EAAI,OAAO,EAAE,IAAIC,CAAU,CAAC,CAC7D,UAEOP,GAASlL,EAAK,OAAO,GAAK,UAAWA,EAAM,CACpD,IAAMyL,EAAaH,EAActL,EAAK,KAAK,EAC3CuL,EAAQA,EAAM,KAAK,IAAIrM,GAAQc,EAAK,OAAO,EAAE,IAAIyL,CAAU,CAAC,CAC9D,CAEF,OAAOF,CACT,EAEaH,GAAqB,IAAM,CACtC,GAAM,CAAE,MAAA/P,EAAO,cAAAC,CAAc,EAAIrB,GAAW,EACtC,CAAE,QAAA+Q,EAAU,CAAC,CAAE,EAAI9Q,GAAc,EACjC,CAAE,cAAAoR,CAAc,EAAIL,GAAqB,EACzCS,EAAcZ,GAAgB,EAE9B7O,EAAcZ,EAAM,aAAe,CAAC,EAGpCsQ,EAAiB3R,GACrB,IAAMmR,GAAsBH,EAASM,CAAa,EAClD,CAACN,EAASM,CAAa,CACzB,EAGMM,EAAgB5R,GACpB,IAAMmR,GAAsBlP,EAAaqP,CAAa,EACtD,CAACrP,EAAaqP,CAAa,CAC7B,EAsBA,OAnBmBtR,GAAgB,IAAM,CACvC,GAAIsB,EACF,OAAOqQ,EAAe,KAAKC,CAAa,EAAE,SAAS,EAC9C,CACL,IAAMC,EAAOH,EAAY,KAAM1L,GAASA,EAAK,KAAO3E,EAAM,SAAS,EACnE,OAAI,MAAM,QAAQwQ,GAAM,QAAQ,EACvBV,GAAsBU,EAAK,SAAUP,CAAa,EAAE,SAAS,EAE/D,CACT,CACF,EAAG,CACDhQ,EACAqQ,EACAC,EACAF,EACArQ,EAAM,UACNiQ,CACF,CAAC,CAGH,IC5EA,OAAOhE,IAAS,WAAAtN,OAAe,QAC/B,OAAO8R,OAAU,gBAEjB,OAAS,kBAAAvP,OAAsB,+BAC/B,OAAS,iBAAAhC,OAAqB,oCAC9B,OACE,QAAAiD,GACA,QAAAL,GACA,QAAAN,GACA,wBAAAa,GACA,WAAAD,GACA,gBAAAE,GACA,MAAAqL,GACA,cAAA5F,GACA,iBAAAwE,GACA,QAAAsC,GACA,YAAAD,GACA,sBAAA8B,GACA,UAAApP,OACK,6BACP,OAAS,sBAAA0G,OAA0B,uCA4B7B,OACE,OAAAvG,GADF,QAAAC,OAAA,oBAhDN,IAyBMiP,GAaAC,GAsCAC,GAmDAC,GAoFOC,GAgEAC,GAnRbC,GAAApR,EAAA,kBAyBM8Q,GAA2B1E,GAAM,KAAK,IAC1C,sCAAwC,KAAMqD,IACrC,CAAE,QAASA,EAAI,oBAAqB,EAC5C,CACH,EASMsB,GAID/O,GAAU,CACb,GAAM,CAAE,WAAA3B,EAAY,QAAAM,EAAS,mBAAA0Q,CAAmB,EAAIrP,EAC9C,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvBiQ,EAAO3Q,EAAU4B,GAAUE,GACjC,OACEZ,GAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAAG,UAAU,eAAe,UAAU,QAClE,UAAAE,GAACF,GAAA,CAAK,IAAK,EAAG,QAAQ,QAAQ,UAAU,SACtC,UAAAC,GAACU,GAAA,CAAK,KAAK,MAAM,MAAM,UAAU,OAAO,WACrC,SAAAiC,EAAE,mBAAmB,EACxB,EACA3C,GAAC,UAAO,QAASyP,EACf,SAAAzP,GAAC0P,EAAA,CAAK,KAAM,GAAI,UAAWxD,GAAG,2BAA2B,EAAG,EAC9D,GACF,EACAjM,GAACF,GAAA,CAAK,QAAS,QAAS,UAAU,MAAM,IAAK,EAC3C,UAAAC,GAACU,GAAK,QAAL,CACC,QAAS3B,EACT,OAAO,OACP,KAAK,MACL,UAAW6B,GAAqB,CAAE,MAAO,OAAQ,CAAC,EAClD,GAAG,MACH,QAAS,GACT,GAAI,EAEH,SAAAnC,GAAc,KACjB,EACAuB,GAACU,GAAA,CAAK,GAAG,MAAM,OAAO,OAAO,gBAE7B,GACF,GACF,CAEJ,EAEM0O,GAIDhP,GAAU,CACb,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAE,cAAAjB,EAAe,WAAAe,EAAY,UAAAD,CAAU,EAAIc,EAC3C,CAAE,aAAAzB,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EACxD,GAAI,CAACe,EACH,OAAO,KAET,IAAMmR,EAAiBhR,GAAgBC,EACvC,OACEqB,GAACF,GAAA,CACC,UAAU,yCACV,UAAU,SACV,IAAK,EAEL,UAAAE,GAACJ,GAAA,CACC,SAAU8P,EACV,cAAY,sCACZ,UAAS,GACT,KAAK,KACL,QAASrQ,EAET,UAAAU,GAACiP,GAAA,CACC,MAAM,QACN,QAASU,EAAiB,GAAM,EAChC,UAAU,eACZ,EACA3P,GAACU,GAAA,CAAM,WAAE,gBAAgB,EAAE,GAC7B,EACAT,GAACJ,GAAA,CACC,UAAS,GACT,SAAU8P,EACV,MAAM,YACN,KAAK,KACL,QAASpQ,EACT,cAAY,uCAEZ,UAAAS,GAACiP,GAAA,CACC,MAAM,QACN,QAASU,EAAiB,GAAM,EAChC,UAAU,iBACZ,EACA3P,GAACU,GAAA,CAAM,WAAE,iBAAiB,EAAE,GAC9B,GACF,CAEJ,EAEM2O,GAUDjP,GAAU,CACb,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CACJ,cAAAjB,EACA,SAAAsH,EACA,gBAAAmF,EACA,cAAA2E,EACA,cAAAC,EACA,MAAAtR,CACF,EAAI6B,EAEE8K,EAA6B,CACjC,MAAO,EAAE,mBAAmB,EAC5B,MAAO,cACT,EAEMC,EAA6B,CACjC,MAAO,EAAE,oBAAoB,EAC7B,MAAO,eACT,EAEM2E,EAA2B,CAC/B,MAAO,EAAE,mBAAoB,YAAY,EACzC,MAAO,KACT,EAEM3Q,EAAcjC,GAAsB,IACjCqB,EAAM,aAAe,CAAC,EAC5B,CAACA,EAAM,WAAW,CAAC,EAEhB6M,EAAkBlO,GAAQ,IAC1B,MAAM,QAAQiC,CAAW,GAAKA,EAAY,OACrC,CACL+L,EACAC,EACA,GAAGhM,EAAY,IAAmB4D,IAAW,CAC3C,MAAOA,GAAO,GACd,MAAOA,GAAO,aAAe+H,GAAc/H,GAAO,EAAE,CACtD,EAAE,CACJ,EAEK,CAACmI,EAAcC,CAAY,EACjC,CAACD,EAAcC,EAAchM,CAAW,CAAC,EAEtC4Q,EAAuB7S,GAAQ,IAC5B,CAAC4S,EAAY,GAAGD,CAAa,EACnC,CAACC,EAAYD,CAAa,CAAC,EAE9B,OAAKrR,EAKHwB,GAACsG,GAAA,CACC,UAAU,2BACV,SAAUR,EACV,MAAO,CACL,CACE,KAAM,SACN,KAAM,UACN,MAAOmF,EACP,QAASG,CACX,EACA,CACE,KAAM,SACN,KAAM,QACN,MAAOwE,EACP,QAASG,CACX,CACF,EACF,EArBO,IAuBX,EAEaT,GAYRlP,GAAU,CACb,GAAM,CAAE,QAAAuG,EAAS,WAAAR,CAAW,EAAI/F,EAChC,OACEH,GAACF,GAAA,CAAK,MAAM,OAAO,UAAW,SAC5B,UAAAC,GAACqP,GAAA,CACE,GAAGL,GACF,CACE,gBACA,WACA,kBACA,gBACA,gBACA,OACF,EACA5O,CACF,EACF,EACC+F,EAAW,IAAI,CAACjD,EAAMmF,IAEnBpI,GAACF,GAAA,CAEC,UAAU,uCACV,UAAW,SACX,UAAW,QACX,QAAS,UACT,GAAI,EAEJ,UAAAC,GAACU,GAAA,CACC,UAAU,WACV,UAAW,GACX,OAAO,WACP,KAAK,KAEJ,SAAAwC,GAAM,aAAe4H,GAAc5H,GAAM,IAAM,EAAE,EACpD,EACAlD,GAACuG,GAAA,CACC,SAAQ,GACR,UAAU,oBACV,WAAY,CACV,KAAM,qBACN,OAAQ,aACV,EACA,QAASI,EACT,WAAYzD,EAAK,SACnB,IAxBK,QAAQmF,CAAK,EAyBpB,CAEH,GACH,CAEJ,EAEakH,GAA4CnP,GAAU,CACjE,GAAM,CAAE,CAAE,EAAIX,GAAe,EAC7B,OACEO,GAACK,GAAA,CACC,UAAW,6BACX,WAAY,CAAE,QAAS,WAAY,EAEnC,SAAAJ,GAACmN,GAAA,CACC,aAAa,SACb,QAAQ,YACR,WAAY,CAAE,SAAU,EAAG,EAC3B,KAAK,KAEL,UAAAnN,GAACkN,GAAA,CAAS,MAAM,SAAS,UAAU,GAAG,MAAO,EAAE,eAAe,EAC5D,UAAAlN,GAACF,GAAA,CACC,UAAU,uCACV,UAAW,MACX,UAAW,SACX,QAAS,UACT,GAAI,EAEJ,UAAAC,GAACmP,GAAA,CACE,GAAGH,GAAK,CAAC,aAAc,UAAW,oBAAoB,EAAG5O,CAAK,EACjE,EACAJ,GAACoP,GAAA,CACE,GAAGJ,GAAK,CAAC,gBAAiB,YAAa,YAAY,EAAG5O,CAAK,EAC9D,GACF,EACAJ,GAACsP,GAAA,CACE,GAAGN,GACF,CACE,UACA,aACA,gBACA,WACA,kBACA,gBACA,gBACA,OACF,EACA5O,CACF,EACF,GACF,EACAJ,GAACmN,GAAA,CACC,MAAM,iBACN,UAAU,wCACV,MAAO,EAAE,wCAAwC,EAEjD,SAAAnN,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACkP,GAAA,EAAyB,EAC5B,EACF,GACF,EACF,CAEJ,IC3UA,OAAS,WAAAhS,OAAe,QACxB,OAAS,cAAAC,OAAkB,gCAD3B,IAAA6S,GAAA5R,EAAA,kBAEAoR,OCFA,OAAOhF,IAAS,WAAAtN,OAAe,QAC/B,OAAS,cAAAC,OAAkB,gCAD3B,IAKa8S,GA8CAC,GAnDbC,GAAA/R,EAAA,kBAEAoR,KAGaS,GACXpR,GACG,CACH,GAAM,CAAE,MAAAN,EAAO,cAAAC,CAAc,EAAIrB,GAAW,EACtC,CAAC8N,EAAiBmF,CAAkB,EAAI5F,GAAM,uBAEpD,EAGMmB,EAAezO,GAAQ,IACpB2B,EAAK,OAAQqE,GACd1E,EACE,CAACyM,GAAmBA,mBACf,GAELA,oBACK/H,EAAK,aAAe3E,EAAM,cAE1B2E,EAAK,aAAe+H,EAGtB/H,EAAK,aAAe3E,EAAM,SAEpC,EACA,CAACM,EAAMoM,EAAiBzM,EAAeD,CAAK,CAAC,EAG1CqN,EAAkBpB,GAAM,YAC3BzE,GAA4C,CAC3C,GAAM,CAAE,KAAAsK,EAAM,MAAAtN,CAAM,EAAIgD,EACpBsK,IAAS,WACXD,EAAmBrN,CAAK,CAE5B,EACA,CAAC,CACH,EAEA,MAAO,CACL,gBAAAkI,EACA,aAAAU,EACA,gBAAAC,EACA,mBAAAwE,CACF,CACF,EAGaF,GAMXrR,GACG,CACH,GAAM,CAAE,MAAAN,EAAO,cAAAC,CAAc,EAAIrB,GAAW,EACtC,CAAC8N,EAAiBmF,CAAkB,EAAI5F,GAAM,uBAEpD,EACM,CAACoF,EAAeU,CAAgB,EAAI9F,GAAM,SAAiB,KAAK,EAGhEmB,EAAezO,GAAQ,IAAM,CACjC,IAAIqT,EAAkB1R,EAGtB,OAAIL,EACEyM,GAAmBA,qBACjBA,oBACFsF,EAAkB1R,EAAK,OACpBqE,GAASA,EAAK,aAAe3E,EAAM,aACtC,EAEAgS,EAAkB1R,EAAK,OACpBqE,GAASA,EAAK,aAAe+H,CAChC,GAIJsF,EAAkB1R,EAAK,OACpBqE,GAASA,EAAK,aAAe3E,EAAM,SACtC,EAIEqR,GAAiBA,IAAkB,QACrCW,EAAkBA,EACf,IAAKC,GAAY,CAChB,GAAIA,EAAQ,SAAU,CACpB,IAAMC,EAAmBD,EAAQ,SAAS,OACvCE,GAAUA,EAAM,QAAUd,CAC7B,EAEA,OAAOa,EAAiB,OAAS,EAC7B,CAAE,GAAGD,EAAS,SAAUC,CAAiB,EACzC,IACN,CACA,OAAOD,CACT,CAAC,EACA,OAAO,OAAO,GAGZD,CACT,EAAG,CAAC1R,EAAMoM,EAAiB2E,EAAepR,EAAeD,CAAK,CAAC,EAGzDuH,EAAW0E,GAAM,YACpBzE,GAA4C,CAC3C,GAAM,CAAE,KAAAsK,EAAM,MAAAtN,CAAM,EAAIgD,EACpBsK,IAAS,UACXD,EAAmBrN,CAAK,EACfsN,IAAS,SAClBC,EAAiBvN,CAAK,CAE1B,EACA,CAAC,CACH,EAEA,MAAO,CACL,gBAAAkI,EACA,cAAA2E,EACA,aAAAjE,EACA,SAAA7F,EACA,mBAAAsK,EACA,iBAAAE,CACF,CACF,IClIA,IAAAK,GAAAvS,EAAA,kBAAAmQ,KACAyB,KACAG,KACAlC,OCHA,OAAOzD,IAAS,WAAAtN,GAAS,YAAAyE,OAAgB,QACzC,OAAS,WAAAmC,GAAS,YAAAC,GAAU,WAAAC,GAAS,OAAAC,OAAW,WAChD,OACE,cAAA9G,GACA,iBAAAC,GACA,wBAAA+Q,GACA,sBAAAyC,GACA,iBAAAxM,GACA,gBAAAD,OACK,gCACP,OAAS,cAAA0M,OAAkB,gCAC3B,OAAS,iBAAAtM,OAAqB,6BAC9B,OAAS,+BAAAC,OAAmC,gCAZ5C,IAiBasM,GAjBbC,GAAA3S,EAAA,kBAaAuS,KACAjN,KAGaoN,GAAmB,IAAM,CACpC,GAAM,CAAE,cAAAtS,EAAe,MAAAD,CAAM,EAAIpB,GAAW,EACtC,CAAE,QAAA+Q,EAAU,CAAC,CAAE,EAAI9Q,GAAc,EACjC,CAAE,KAAM4T,CAAY,EAAI7C,GAAqB,EAE7C,CAAE,KAAM3L,CAAW,EAAI2B,GAAa,EAGpC,CAAE,KAAAe,EAAM,SAAAC,EAAU,QAAAC,EAAS,gBAAAC,CAAgB,EAAId,GAAc,CACjE,KAAM,EACN,SAAU,EACZ,CAAC,EAGKqK,EAAcZ,GAAgB,EAE9BlJ,EAAaV,GAAc,EAG3B,CAAE,gBAAA6G,EAAiB,gBAAAW,CAAgB,EACvCqE,GAAuBrB,CAAW,EAG9B,CAAChK,CAAK,EAAIjD,GAAS,IAAM,CAC7B,IAAMkD,EAAI,IAAI,KACd,OAAO,IAAI,KAAKb,GAAQa,CAAC,EAAGd,GAASc,CAAC,EAAGf,GAAQe,CAAC,EAAG,EAAG,EAAG,CAAC,CAC9D,CAAC,EAEK,CAAClB,EAAWsB,CAAY,EAAItD,GAAiB,CACjD6C,GAA4B,GAAII,CAAK,EACrCA,CACF,CAAC,EAGK,CAACqM,EAAcC,CAAe,EAAIvP,GAAiB,KAAK,EACxD,CAACwP,EAAsBC,CAAuB,EAClDzP,GAAiB,KAAK,EAGlB0P,EAAwBnU,GAAQ,IAAM,CAE1C,IAAMoU,EACJxM,GAAY,IAAK5B,IAAU,CACzB,MAAOA,EAAK,MACZ,MAAOA,EAAK,KACd,EAAE,GAAK,CAAC,EAEV,MAAO,CAAC,CAAE,MAAO,aAAc,MAAO,KAAM,EAAG,GAAGoO,CAAY,CAChE,EAAG,CAACxM,CAAU,CAAC,EAGTgB,EAAW0E,GAAM,YACpBzE,GAAuE,CACtE,GAAM,CAAE,KAAAsK,EAAM,MAAAtN,CAAM,EAAIgD,EAGpBsK,IAAS,UACXzE,EAAgB7F,CAAyC,EAChDsK,IAAS,UAClBa,EAAgBnO,CAAe,EAC/BqC,EAAQ,CAAC,GACAiL,IAAS,mBAClBe,EAAwBrO,CAAe,EACvCqC,EAAQ,CAAC,IACAiL,IAAS,QAAUA,IAAS,eACrCpL,EACExB,GAAwBV,CAAiC,CAC3D,EACAqC,EAAQ,CAAC,EAEb,EACA,CAACwG,EAAiBxG,CAAO,CAC3B,EAGMmM,EAAW/G,GAAM,QAAQ,IAAM,CACnC,IAAMgH,EAAS,IAAI,gBAGnB,OAAAA,EAAO,IAAI,OAAQtM,EAAK,SAAS,CAAC,EAClCsM,EAAO,IAAI,OAAQrM,EAAS,SAAS,CAAC,EAGlCxB,EAAU,CAAC,GACb6N,EAAO,IAAI,UAAW7N,EAAU,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAErDA,EAAU,CAAC,GACb6N,EAAO,IACL,QACAvN,GAAIN,EAAU,CAAC,EAAG,CAChB,MAAO,GACP,QAAS,GACT,QAAS,GACT,aAAc,CAChB,CAAC,EACE,QAAQ,EACR,SAAS,CACd,EAIEsN,IAAiB,OACnBO,EAAO,IAAI,SAAUP,CAAY,EAG/BE,IAAyB,OAC3BK,EAAO,IAAI,kBAAmBL,CAAoB,EAG7C,6BAA6BK,EAAO,SAAS,CAAC,EACvD,EAAG,CAACtM,EAAMC,EAAUxB,EAAWsN,EAAcE,CAAoB,CAAC,EAG5D,CAAE,KAAAtS,EAAM,UAAAmH,CAAU,EAAI4K,GAOzBW,EAAU,CACX,UAAW/S,EAAgBD,EAAM,cAAgBA,EAAM,UACvD,UAAYM,GACHA,CAEX,CAAC,EAGKqH,EAAahJ,GAAQ,IACrB2B,GAAM,KACDwG,EAAgBxG,EAAK,IAAI,EAE3B,CACL,KAAAqG,EACA,SAAAC,EACA,aAAcC,EACd,iBAAkB,IAAM,CAExB,CACF,EACC,CAACvG,GAAM,KAAMwG,EAAiBH,EAAMC,EAAUC,CAAO,CAAC,EAGnDqM,EAAUvU,GAAQ,IAAM,CAC5B,IAAMwU,EAAW7S,GAAM,MAAQ,CAAC,EAE1B8S,EAAmBD,EAAS,OAC5BE,EAAoBF,EAAS,OACjC,CAACG,EAAK7O,KAAW6O,EAAM7O,GAAO,aAC9B,CACF,EACM8O,EAAYJ,EAAS,OACzB,CAACG,EAAK7O,KACJ6O,EACA7O,GAAO,QAAQ,OACb,CAAC+O,GAAWC,KAAWD,GAAYC,GAAO,QAC1C,CACF,EACF,CACF,EAEA,MAAO,CACL,iBAAAL,EACA,kBAAAC,EACA,UAAAE,CACF,CACF,EAAG,CAACjT,CAAI,CAAC,EAET,MAAO,CAEL,WAAYA,GAAM,MAAQgS,GAC1B,QAAAY,EACA,WAAAvL,EAGA,gBAAA+E,EACA,SAAAnF,EAGA,UAAAnC,EAGA,aAAAsN,EACA,qBAAAE,EACA,sBAAAE,EAGA,cAAA7S,EACA,UAAAwH,EACA,QAAAkI,EAGA,YAAA8C,EACA,WAAAxO,CACF,CACF,ICnNA,OAAOgI,IAAS,WAAAtN,OAAe,QAC/B,OAAS,kBAAAuC,OAAsB,+BAC/B,OACE,UAAAI,GACA,QAAAE,GACA,QAAAW,GACA,aAAAwB,GACA,WAAA+P,GACA,SAAA9P,OACK,6BA+BC,OAKE,OAAAnC,EALF,QAAAC,OAAA,oBAzCR,IAwBaiS,GAuEAC,GAoHAC,GAnNbC,GAAAjU,EAAA,kBAwBa8T,GAAuB,CAAC,CACnC,gBAAAI,CACF,IAEM,CACJ,GAAM,CAAE,CAAE,EAAI7S,GAAe,EACvB8S,EAASrV,GAAQ,IACd,OAAO,KAAKoV,CAAe,EACjC,CAACA,CAAe,CAAC,EAEdE,EAAiBtV,GAAQ,IAE3B+C,GAACF,GAAA,CACC,UAAU,SACV,IAAK,EACL,UAAU,4DAEV,UAAAE,GAACF,GAAA,CACC,UAAU,SACV,QAAQ,UACR,UAAU,oDAEV,UAAAC,EAAC,OAAK,WAAE,eAAe,EAAE,EACzBA,EAAC,OAAK,WAAE,YAAY,EAAE,GACxB,EACCuS,EAAO,IAAKE,GACXxS,GAACF,GAAA,CAEC,UAAU,SACV,QAAQ,UACR,UAAU,aAEV,UAAAE,GAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAACkC,GAAA,CAAU,KAAK,KAAK,KAAMuQ,EAAO,EAClCzS,EAACU,GAAK,UAAL,CAAgB,SAAA+R,EAAM,GACzB,EACAzS,EAAC,OACC,SAAAA,EAACU,GAAK,UAAL,CAAgB,SAAA4R,EAAgBG,CAAK,EAAE,EAC1C,IAXKA,CAYP,CACD,GACH,EAED,CAACF,CAAM,CAAC,EAEX,OACEtS,GAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,OAAI,UAAU,wBACZ,SAAAuS,EAAO,MAAM,EAAG,CAAC,EAAE,IAAI,CAACE,EAAOpK,IAC9BrI,EAAC,OAEC,UAAU,eACV,MAAO,CACL,WAAYqI,EAAQ,EAAI,OAAS,IACjC,OAAQkK,EAAO,OAASlK,CAC1B,EAEA,SAAArI,EAACkC,GAAA,CAAU,KAAK,KAAK,KAAMuQ,EAAO,GAP7BA,CAQP,CACD,EACH,EACAzS,EAACiS,GAAA,CAAQ,QAASO,EAChB,SAAAvS,GAACS,GAAK,UAAL,CAAe,UAAU,uGACvB,UAAA6R,EAAO,MAAM,EAAG,CAAC,EAAE,KAAK,IAAI,EAAG,IAC/BA,EAAO,OAAS,GAAK,IAAIA,EAAO,OAAS,CAAC,IAC7C,EACF,GACF,CAEJ,EAEaJ,GAAqB5P,GAAmC,CACnE,GAAM,CAAE,eAAAmQ,CAAe,EAAInQ,EACrB,CAAE,EAAAI,CAAE,EAAIlD,GAAe,EACvBmD,EAAUC,GAAW,CACzBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBV,GAAM,QAAQQ,EAAE,oBAAoB,CAAC,CACvC,EAyGA,OAvGgB6H,GAAM,QAAkB,IAC/B,CACL,CACE,MAAO7H,EAAE,kDAAkD,EAC3D,UAAW,kBACX,MAAO,OACP,MAAO,IACP,SAAU,IACV,OAAO2P,EAAyC,CAC9C,OAAOtS,EAACkS,GAAA,CAAqB,gBAAiBI,EAAiB,CACjE,CACF,EACA,CACE,MAAO3P,EAAE,8CAA8C,EACvD,UAAW,eACX,MAAO,OACP,MAAO,IACP,OAAOgQ,EAAa,CAClB,OACE3S,EAACU,GAAK,QAAL,CAAa,GAAI,EAAG,QAAS,GAC3B,SAAAiS,EACH,CAEJ,CACF,EACA,CACE,MAAOhQ,EAAE,YAAY,EACrB,UAAW,UACX,MAAO,OACP,MAAO,IACP,OAAOiQ,EAAmC,CACxC,IAAMC,EAAeD,EAAQ,OAC3B,CAACf,EAAKG,IAAWH,EAAMG,EAAO,QAC9B,CACF,EACA,OACEhS,EAACU,GAAK,QAAL,CAAa,GAAI,EAAG,QAAS,GAC3B,SAAAmS,EACH,CAEJ,CACF,EACA,CACE,MAAOlQ,EAAE,aAAa,EACtB,UAAW,OACX,MAAO,OACP,MAAO,IACP,OAAOgH,EAAc,CACnB,OAAO3J,EAACU,GAAA,CAAM,SAAAiJ,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,CAC7D,CACF,EACA,CACE,MAAOhH,EAAE,6CAA6C,EACtD,UAAW,aACX,MAAO,OACP,MAAO,IACP,OAAOmQ,EAAmB,CACxB,OACE9S,EAACU,GAAK,UAAL,CAAe,OAAQkC,EAAQ,SAAQ,GACrC,SAAAkQ,EACH,CAEJ,CACF,EACA,CACE,MAAOnQ,EAAE,aAAa,EACtB,UAAW,eACX,MAAO,OACP,MAAO,IACP,KAAM,MACR,EACA,CACE,MAAOA,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,OACP,MAAO,IACP,OAAOyE,EAAgB,CACrB,OACEpH,EAACU,GAAA,CAAM,SAAA0G,EAAO,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAO,MAAM,CAAC,EAAE,CAE5D,CACF,EACA,CACE,MAAO,GACP,UAAW,eACX,MAAO,SACP,MAAO,GACP,OAAO0L,EAAmB9P,EAAuB,CAC/C,OACEhD,EAACH,GAAA,CACC,KAAK,KACL,QAAQ,OACR,UAAU,mBACV,QAAS,IAAM6S,IAAiB1P,EAAO,UAAU,EAEhD,SAAAL,EAAE,2CAA2C,EAChD,CAEJ,CACF,CACF,EACC,CAAC+P,CAAc,CAAC,CAGrB,EAGaN,GACX7P,GACG,CACH,GAAM,CAAE,CAAE,EAAI9C,GAAe,EACvBmD,EAAUC,GAAW,CACzBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBV,GAAM,QAAQ,EAAE,oBAAoB,CAAC,CACvC,EA+GA,OA9GgBqI,GAAM,QAAkB,IAC/B,CACL,CACE,MAAO,EAAE,kDAAkD,EAC3D,UAAW,kBACX,MAAO,OACP,MAAO,IACP,OAAOiI,EAAe,CACpB,OACExS,GAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAACkC,GAAA,CAAU,KAAMuQ,EAAO,EACvBA,GACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,YAAY,EACrB,UAAW,gBACX,MAAO,OACP,MAAO,IACP,OAAOE,EAAa,CAClB,OACE3S,EAACU,GAAK,QAAL,CAAa,GAAI,EAAG,QAAS,GAC3B,SAAAiS,EACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,8CAA8C,EACvD,UAAW,eACX,MAAO,OACP,MAAO,IACP,OAAOA,EAAa,CAClB,OACE3S,EAACU,GAAK,QAAL,CAAa,GAAI,EAAG,QAAS,GAC3B,SAAAiS,EACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,YAAY,EACrB,UAAW,UACX,MAAO,OACP,MAAO,IACP,OAAOI,EAAiB,CACtB,OACE/S,EAACU,GAAK,QAAL,CAAa,GAAI,EAAG,QAAS,GAC3B,SAAAqS,EACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,aAAa,EACtB,UAAW,QACX,MAAO,OACP,MAAO,IACP,OAAOC,EAAchQ,EAA4B,CAC/C,GAAI,CAACgQ,EAAM,OAAOhT,EAACU,GAAA,CAAK,UAAW,GAAI,aAAC,EAKxC,IAAMuC,EAAO,GAJMV,EAAQ,YAAsB,KAC9CW,GAASF,EAAO,WAAa,SAASE,EAAK,QAAQ,CACtD,GACqC,iBACJ,OAAO8P,CAAI,GAC5C,OACEhT,EAAC,KAAE,KAAMiD,EAAM,OAAO,SAAS,IAAI,aACjC,SAAAjD,EAACU,GAAK,UAAL,CACC,OAAQkC,EACR,KAAK,OACL,SAAU,CAAC,CAACoQ,EACZ,UAAU,uGAET,SAAAA,EACH,EACF,CAEJ,CACF,EACA,CACE,MAAO,EAAE,kBAAkB,EAC3B,UAAW,WACX,MAAO,OACP,MAAO,IACP,OAAOC,EAAejQ,EAA4B,CAChD,OACEhD,EAACU,GAAA,CACE,SAAA6B,EAAQ,WAAW,KACjBW,GAASA,EAAK,UAAYF,EAAO,QACpC,GAAG,MAAQ,IACb,CAEJ,CACF,EACA,CACE,MAAO,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,OACP,MAAO,IACP,OAAOkQ,EAAgB,CACrB,OACElT,EAACU,GAAA,CAAM,SAAAwS,GAAQ,OAAO,CAAC,EAAE,YAAY,EAAIA,GAAQ,MAAM,CAAC,EAAE,CAE9D,CACF,CACF,EACC,CAAC,CAAC,CAGP,IC3UA,OAAS,WAAAhW,OAAe,QACxB,OAAS,kBAAAuC,OAAsB,+BAC/B,OACE,cAAA6G,GACA,QAAAvG,GACA,aAAAoT,GACA,SAAAxV,GACA,gBAAAyV,GACA,WAAA9S,OACK,6BACP,OAAS,YAAA+S,OAAgB,6BAkDnB,cAAArT,GA6FF,QAAAC,OA7FE,oBA5DN,IAmBaqT,GAgBPC,GA6COC,GAhFbC,GAAArV,EAAA,kBAYAiU,KAOaiB,GAAyB,CACpC,CACE,MAAO,aACP,MAAO,KACT,EACA,CACE,MAAO,YACP,MAAO,WACT,EACA,CACE,MAAO,UACP,MAAO,SACT,CACF,EAGMC,GAAsB5V,GAAM,OAI9ByC,GAAU,CACZ,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAE,QAAAV,EAAS,aAAA2U,CAAa,EAAIL,GAAS,EAGrCM,EAAgBvB,GAAwB,CAC5C,YAAahS,EAAM,YACnB,WAAYA,EAAM,UACpB,CAAC,EAED,OACEJ,GAACoT,GAAA,CACC,KAAMrU,EACN,aAAc2U,EACd,MAAO,EAAE,iDAAiD,EAC1D,KAAK,KACL,SAAQ,GACR,WAAY,CACV,QAAS,eACX,EAEA,SAAA1T,GAACmT,GAAA,CACC,QAASQ,EACT,WAAYvT,EAAM,OAAO,QACzB,SAAQ,GACR,UAAU,aACV,WAAY,CACV,OAAQ,WACR,KAAM,sDACR,EACA,MAAO,KAAO,CACZ,UAAW,cACb,GACA,gBAAkB4C,GAChBA,EAAO,gBAAkB,KAAK,OAAO,EAAE,SAAS,EAEpD,EACF,CAEJ,CAAC,EAEYwQ,GAAoD,CAAC,CAChE,aAAAI,CACF,IAAM,CAeJ,IAAMjN,EAAUwL,GAAkB,CAChC,eAf0BW,GAAsB,CAEhD,IAAM9P,EAAS4Q,EAAa,WAAW,KACpC1Q,GAASA,EAAK,aAAe4P,CAChC,EACI9P,GACFrF,GAAM,KAAK4V,GAAqB,CAC9B,OAAAvQ,EACA,YAAa4Q,EAAa,YAC1B,WAAYA,EAAa,UAC3B,CAAC,CAEL,CAIA,CAAC,EAEK,CACJ,qBAAAzC,EACA,aAAAF,EACA,UAAAtN,EACA,SAAAmC,EACA,sBAAAuL,CACF,EAAIuC,EAEEC,EAAa3W,GAAQ,IAEvB8C,GAACsG,GAAA,CACC,UAAU,GACV,SAAUR,EACV,MAAO,CAOL,CACE,KAAM,SACN,KAAM,kBACN,MAAOqL,EACP,QAASE,CACX,EACA,CACE,KAAM,SACN,KAAM,SACN,MAAOJ,EACP,QAASqC,EACX,EACA,CACE,KAAM,QACN,KAAM,OACN,MAAO,CACL,KAAM3P,IAAY,CAAC,EACnB,GAAIA,IAAY,CAAC,CACnB,CACF,CACF,EACF,EAED,CACDwN,EACAF,EACAtN,EACAmC,EACAuL,CACF,CAAC,EAED,OACEpR,GAACF,GAAA,CAAK,UAAU,SAAS,GAAI,EAAG,UAAU,SAAS,UAAU,aAC3D,UAAAC,GAACM,GAAA,CAAQ,UAAU,qDAAqD,EACxEN,GAACD,GAAA,CAAK,UAAU,MAAM,UAAU,aAC7B,SAAA8T,EACH,EACA7T,GAACmT,GAAA,CACC,QAASxM,EACT,WAAYiN,EAAa,WACzB,QAASA,EAAa,UACtB,SAAQ,GACR,WAAYA,EAAa,WACzB,iBAAgB,GAChB,UAAU,sBACV,WAAY,CACV,KAAM,8BACN,OAAQ,UACV,EACA,MAAO,KAAO,CACZ,UAAW,iCACb,GACA,gBAAkB5Q,GACTA,EAAO,WAAW,SAAS,EAEtC,GACF,CAEJ,ICnLA,OAAS,WAAA9F,OAAe,QACxB,OAAS,kBAAAuC,OAAsB,+BAC/B,OACE,YAAA4T,GACA,SAAA1V,GACA,QAAA+C,GACA,WAAAJ,GACA,aAAA4B,GACA,QAAAnC,GACA,cAAAuG,GACA,eAAAwN,GACA,SAAA3R,GACA,mBAAA4R,OACK,6BAuCD,OA0KM,YAAAhT,GA1KN,OAAAf,GA8CF,QAAAC,OA9CE,oBApDN,IAqCa+T,GA4EPC,GA2BAC,GAoEAC,GAhNNC,GAAAhW,EAAA,kBAeAiU,KAEAoB,KAoBaO,GAAkD,CAAC,CAC9D,aAAAJ,CACF,IAAM,CACJ,GAAM,CAAE,CAAE,EAAInU,GAAe,EAEvB,CACJ,qBAAA0R,EACA,aAAAF,EACA,UAAAtN,EACA,SAAAmC,EACA,sBAAAuL,CACF,EAAIuC,EAEEC,EAAa3W,GAAQ,IAEvB8C,GAACsG,GAAA,CACC,SAAUR,EACV,MAAO,CAQL,CACE,KAAM,KACN,KAAM,SACN,KAAM,kBACN,MAAOqL,EACP,QAASE,EACT,UAAW,uBACb,EACA,CACE,KAAM,KACN,KAAM,SACN,KAAM,SACN,MAAOJ,EACP,QAASqC,GACT,UAAW,uBACb,EACA,CACE,KAAM,QACN,KAAM,OACN,MAAO,CACL,KAAM3P,IAAY,CAAC,EACnB,GAAIA,IAAY,CAAC,CACnB,CACF,CACF,EACF,EAED,CACDwN,EACAF,EACAtN,EACAmC,EACAuL,CACF,CAAC,EAED,OACEpR,GAAC,OAAI,UAAU,2CACb,UAAAD,GAAC+T,GAAA,CAAgB,UAAU,WACzB,SAAA/T,GAACD,GAAA,CAAK,UAAU,MAAO,SAAA8T,EAAW,EACpC,EACCD,EAAa,WAAW,IAAK1Q,GAC5BlD,GAACkU,GAAA,CAEC,KAAMhR,EACN,WAAY0Q,EAAa,YAFpB1Q,EAAK,UAGZ,CACD,GACH,CAEJ,EAEM+Q,GAAwD,CAAC,CAC7D,MAAAI,EACA,MAAAtR,EACA,KAAAuR,EACA,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,QAAAC,CACF,IAAM,CACJ,GAAM,CAAE,EAAA9R,CAAE,EAAIlD,GAAe,EACvBmD,EAAUC,GAAW,CACzBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAClBV,GAAM,QAAQQ,EAAE,oBAAoB,CAAC,CACvC,EACA,OACE1C,GAAC,OACC,UAAW,4FAA4FuU,CAAS,GAChH,QAASC,EAET,UAAAzU,GAAC,KAAG,SAAAqU,EAAM,EACVrU,GAACU,GAAK,UAAL,CAAe,KAAM4T,EAAM,SAAUC,EAAU,OAAQ3R,EACrD,SAAAG,GAAS,IACZ,GACF,CAEJ,EAEMmR,GAAuD9T,GAAU,CACrE,GAAM,CAAE,KAAA8C,CAAK,EAAI9C,EACX,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAE7B,GAAI,CAACyD,EACH,OAAO,KAGT,IAAM2P,EAAe3P,EAAK,QAAQ,OAChC,CAAC2O,EAAaG,IAA+BH,EAAMG,EAAO,QAC1D,CACF,EAEA,OACE/R,GAAC,OAAI,UAAU,uEACb,UAAAA,GAAC,OAAI,UAAU,+BACb,UAAAA,GAAC,OAAI,UAAU,oFACb,UAAAD,GAACkS,GAAA,CAAqB,gBAAiBhP,EAAK,gBAAiB,EAC7DlD,GAAC,OACC,UAAU,4BACV,QAAS,IAAM,CACbrC,GAAM,KAAKwW,GAAgC,CACzC,KAAAjR,EACA,WAAY9C,EAAM,UACpB,CAAC,CACH,EAEC,SAAAuC,EAAE,2CAA2C,EAChD,GACF,EACA3C,GAACU,GAAK,UAAL,CACC,UAAU,yCACV,KAAK,OAEJ,SAAAwC,EAAK,aACR,GACF,EAGAjD,GAAC,OAAI,UAAU,qCACb,UAAAD,GAACiU,GAAA,CACC,MAAOtR,EAAE,8CAA8C,EACvD,MAAOO,EAAK,aACd,EACAlD,GAACiU,GAAA,CAAmB,MAAOtR,EAAE,YAAY,EAAG,MAAOkQ,EAAc,EACjE7S,GAACiU,GAAA,CACC,MAAOtR,EAAE,6CAA6C,EACtD,MAAOO,EAAK,WACZ,SAAU,GACZ,EACAlD,GAACiU,GAAA,CACC,MAAOtR,EAAE,aAAa,EACtB,MAAOO,EAAK,MAAM,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,MAAM,CAAC,EAChE,EACAlD,GAACiU,GAAA,CACC,MAAOtR,EAAE,eAAe,EACxB,MAAOO,EAAK,QAAQ,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,QAAQ,MAAM,CAAC,EACpE,GACF,GACF,CAEJ,EAOMiR,GACJxW,GAAM,OAA8CyC,GAAU,CAC5D,GAAM,CAAE,KAAA8C,EAAM,WAAAV,CAAW,EAAIpC,EACvB,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvB,CAAE,QAAAV,EAAS,KAAA2V,EAAM,QAAAC,EAAS,OAAAC,EAAQ,aAAAlB,CAAa,EAAIL,GAAS,EAElE,OACErT,GAAC8T,GAAA,CACC,MAAOnR,EAAE,iDAAiD,EAC1D,KAAM5D,EACN,aAAc2U,EAEd,SAAA1T,GAAC,OAAI,UAAU,yGACZ,SAAAkD,EAAK,QAAQ,IAAI,CAAC8O,EAAQ3J,IACzBpI,GAAAc,GAAA,CACE,UAAAd,GAAC,OAAI,UAAU,kCACb,UAAAA,GAAC,OAAI,UAAU,sCACb,UAAAD,GAACkC,GAAA,CAAU,KAAM8P,EAAO,gBAAiB,KAAK,KAAK,EACnDhS,GAAC,OAAI,UAAU,wCACZ,SAAAgS,EAAO,gBACV,GACF,EACA/R,GAAC,OAAI,UAAU,qCACb,UAAAD,GAACiU,GAAA,CACC,MAAOtR,EAAE,YAAY,EACrB,MAAOqP,EAAO,cAChB,EACAhS,GAACiU,GAAA,CACC,MAAOtR,EAAE,8CAA8C,EACvD,MAAOqP,EAAO,aAChB,EACAhS,GAACiU,GAAA,CAAmB,MAAM,MAAM,MAAOjC,EAAO,QAAS,EACvDhS,GAACiU,GAAA,CACC,MAAOtR,EAAE,aAAa,EACtB,SAAU,CAAC,CAACqP,EAAO,MACnB,KAAK,OACL,MAAOA,EAAO,MACd,QAAS,IAAM,CACb,GAAIA,EAAO,MAAO,CAChB,IAAMxK,EAAYhF,EAAW,KAC1BU,GAASA,EAAK,UAAY8O,EAAO,QACpC,EACIxK,GAAW,mBACb,OAAO,KACL,GAAGA,EAAU,iBAAiB,OAAOwK,EAAO,KAAK,GACjD,QACF,CAEJ,CACF,EACF,EACAhS,GAACiU,GAAA,CACC,MAAOtR,EAAE,kBAAkB,EAC3B,MACEH,EAAW,KACRU,GAASA,EAAK,UAAY8O,EAAO,QACpC,GAAG,MAAQ,IAEf,EACAhS,GAACiU,GAAA,CACC,MAAOtR,EAAE,eAAe,EACxB,MACEqP,EAAO,OACHA,EAAO,OAAO,OAAO,CAAC,EAAE,YAAY,EACpCA,EAAO,OAAO,MAAM,CAAC,EACrB,IAER,GACF,GACF,EACC3J,EAAQnF,EAAK,QAAQ,OAAS,GAAKlD,GAACM,GAAA,EAAQ,GAC/C,CACD,EACH,EACF,CAEJ,CAAC,IC5RH,IAAAuU,GAAA,GAAApT,EAAAoT,GAAA,0BAAAC,KACA,OAAS,aAAAlX,OAAiB,6BASf,cAAAoC,OAAA,oBAVX,IAMa8U,GANbC,GAAA3W,EAAA,kBAEA2S,KACA0C,KACAW,KAEaU,GAAiC,IAAM,CAClD,IAAMlB,EAAe9C,GAAiB,EAChC,CAAE,SAAA7R,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAACgU,GAAA,CAAgB,aAAcJ,EAAc,EAE/C5T,GAACwT,GAAA,CAAiB,aAAcI,EAAc,CACvD,ICZA,OAAS,kBAAAnU,OAAsB,+BAC/B,OAAS,wBAAA6E,OAA4B,gCACrC,OAAS,YAAA6I,GAAU,QAAAC,OAAY,6BAgB3B,OAYI,OAAApN,GAZJ,QAAAC,OAAA,oBAnBJ,IAWa+U,GAXbC,GAAA7W,EAAA,kBAIA2W,KACAjJ,KACA3D,KACAoC,KACAhB,KAGayL,GAGP5U,GAAU,CACd,GAAM,CAAE,OAAA0B,EAAS,UAAW,YAAAgM,CAAY,EAAI1N,EACtC,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAE7B,OACEQ,GAACmN,GAAA,CACC,MAAOtL,EACP,cAAegM,EACf,QAAQ,YACR,KAAK,KACL,WAAY,CACV,SAAU,oBACV,gBAAiB,UACnB,EACA,oBAAmB,GAEnB,UAAA9N,GAACmN,GAAA,CAAS,MAAOxK,EAAE,iBAAiB,EAAG,MAAO,UAC5C,SAAA3C,GAACgI,GAAA,CAAmB,KAAM1D,GAAqB,QAAS,EAC1D,EACAtE,GAACmN,GAAA,CAAS,MAAOxK,EAAE,oBAAoB,EAAG,MAAO,WAC/C,SAAA3C,GAACgI,GAAA,CAAmB,KAAM1D,GAAqB,SAAU,EAC3D,EACAtE,GAACmN,GAAA,CAAS,MAAOxK,EAAE,gBAAgB,EAAG,MAAO,UAC3C,SAAA3C,GAACoJ,GAAA,EAAqB,EACxB,EACApJ,GAACmN,GAAA,CACC,MAAOxK,EAAE,iCAAiC,EAC1C,MAAO,eAEP,SAAA3C,GAACoK,GAAA,EAA0B,EAC7B,EACApK,GAACmN,GAAA,CACC,MAAOxK,EAAE,wCAAwC,EACjD,MAAO,UAEP,SAAA3C,GAAC8U,GAAA,EAAqB,EACxB,EACA9U,GAACmN,GAAA,CAAS,MAAOxK,EAAE,eAAe,EAAG,MAAO,SAC1C,SAAA3C,GAAC4M,GAAA,EAAoB,EACvB,GACF,CAEJ,ICxDA,OAAS,aAAAhP,OAAiB,6BASf,cAAAoC,OAAA,oBATX,IAKakV,GALbC,GAAA/W,EAAA,kBACAyD,KACA+L,KACAqH,KAEaC,GAAmC,IAAM,CACpD,IAAM3W,EAAQqD,GAA0B,EAClC,CAAE,SAAA3C,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAACgV,GAAA,CAAwB,GAAGzW,EAAO,EAErCyB,GAAC2N,GAAA,CAAyB,GAAGpP,EAAO,CAC7C,ICZA,IAAA6W,GAAA,GAAA3T,EAAA2T,GAAA,4BAAAF,KAAA,IAAAG,GAAAjX,EAAA,kBAAA+W,OCAA,OAAS,iBAAAG,GAAe,cAAAC,OAAkB,QAA1C,IAWaC,GAIAC,GAfbC,GAAAtX,EAAA,kBAWaoX,GAAkBF,GAC7B,CAAC,CACH,EAEaG,GAAqB,IACzBF,GAAWC,EAAe,IChBnC,OAAS,WAAAtY,OAAe,QACxB,OAAS,cAAAC,OAAkB,gCAC3B,OAAS,iBAAAM,GAAe,cAAAkY,OAAkB,oCAC1C,OAAS,qBAAAjY,OAAyB,gCAHlC,IAMakY,GANbC,GAAAzX,EAAA,kBAIAsX,KAEaE,GAAuB,IAAM,CACxC,IAAME,EAAeL,GAAmB,EAElC,CAAE,aAAA9W,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EAClD,CAAE,MAAAc,CAAM,EAAIpB,GAAW,EAEvBwO,EAAegK,GAAWG,EAAa,KAAM,CACjD,cACEvX,EAAM,SAAWb,GAAkB,8BAC/BA,GAAkB,8BAClBA,GAAkB,cACxB,aAAcoY,EAAa,eACzB,CAAE,cAAe,CAAE,EACnB,CAAE,cAAe,GAAI,CACvB,CACF,CAAC,EAEKC,EAAQ7Y,GAAQ,IAChByO,GAAc,OACTA,EAEFmK,EAAa,eAClB,CAAE,cAAe,CAAE,EACnB,CAAE,cAAe,GAAI,CACvB,EACC,CAACnK,EAAcmK,CAAY,CAAC,EAEzBE,EACJrX,GAAgBC,GAAmB,CAACkX,EAAa,KAAK,OAExD,MAAO,CACL,GAAGA,EACH,KAAMC,EACN,UAAAC,CACF,CACF,ICzCA,OAAS,eAAA/Y,GAAa,WAAAC,GAAS,UAAA+Y,GAAQ,YAAAtU,OAAgB,QACvD,OAAS,WAAAuU,GAAS,UAAAC,GAAQ,oBAAA5S,OAAwB,WAClD,OAEE,oBAAAW,GACA,iBAAA9G,GACA,wBAAA+Q,GACA,mBAAA7Q,GACA,mBAAA8Y,GACA,sBAAAC,OACK,gCACP,OAAS,kBAAA5W,OAAsB,+BAE/B,OAAS,WAAA2C,GAAS,QAAAkU,OAAY,gCAwkB9B,SAASC,GAAU/K,EAAY,CAC7B,IAAMgL,EAAOhL,EAAK,eAAe,EAC3BiL,EAAQ,IAAIjL,EAAK,YAAY,EAAI,CAAC,GAAG,MAAM,EAAE,EAC7CkL,EAAM,IAAIlL,EAAK,WAAW,CAAC,GAAG,MAAM,EAAE,EAE5C,MAAO,GAAGgL,CAAI,IAAIC,CAAK,IAAIC,CAAG,EAChC,CA3lBA,IAeYC,GAOCC,GAtBbC,GAAAzY,EAAA,kBAeYuY,QACVA,EAAA,IAAM,KACNA,EAAA,KAAO,KACPA,EAAA,MAAQ,MACRA,EAAA,QAAU,MAJAA,QAAA,IAOCC,GAAuB,CAClCE,EACAvU,IACG,CACH,GAAM,CAACqC,CAAK,EAAIjD,GAAS,IAAM,IAAI,IAAM,EAEnC,CAAE,cAAA6M,CAAc,EAAIL,GAAqB,EAGzC,CAAE,EAAAxL,CAAE,EAAIlD,GAAe,EAEvB,CAAE,WAAAsX,EAAa,EAAM,EAAIxU,GAAW,CAAC,EACrCyU,EAAc,OAAO,OAAOL,EAAU,EAEtC,CAACM,EAAQC,CAAS,EAAI5Z,GAC1BwZ,EACA,KACF,EAEMK,EAA0Bla,GAC7Bma,GAKc,CACb,GAAM,CAAE,MAAA/Q,EAAO,OAAAgR,EAAQ,MAAAtU,EAAO,GAAAuU,EAAK,KAAM,EAAIF,EAC7C,GAAI/Q,EAAM,YAAY,IAAM,OAC1B,OAAOiR,IAAO,MAAQvU,EAAM,IAAIsU,CAAM,EAAItU,EAAM,IAAIsU,CAAM,EACrD,CACL,IAAM1I,GAAaH,EAAcnI,CAAK,EACtC,GAAIsI,GAAY,CACd,IAAM4I,GAAQ,IAAInV,GAAQiV,CAAM,EAAE,IAAI1I,EAAU,EAChD,OAAO2I,IAAO,MAAQvU,EAAM,IAAIwU,EAAK,EAAIxU,EAAM,IAAIwU,EAAK,CAC1D,CACA,OAAOxU,CACT,CACF,EACA,CAACyL,CAAa,CAChB,EAEMgJ,EAActa,GAAoC,KAC/C,CACJ,KAAiByF,EAAE,kBAAkB,EACrC,KAAkBA,EAAE,kBAAkB,EACtC,MAAmBA,EAAE,mBAAmB,EACxC,MAAqBA,EAAE,mBAAmB,CAC7C,GACC,CAACA,CAAC,CAAC,EAEA8U,EAAmBjM,GAChB2K,GAAO3K,EAAM,YAAY,EAG5BkM,EAAwBC,IACrB,CACL,KAAMzB,GAAQ,IAAI,KAAQyB,EAAY,CAAC,EACvC,GAAI,IAAI,IACV,GAGIC,EAAwB,CAAChU,EAAYC,IAAgC,CAEzE,IAAM8T,EAAY,KAAK,IAAIpU,GAAiBK,EAAMC,CAAE,CAAC,EAAI,EAIzD,GAAI,CADe,CAAC,EAAG,EAAG,GAAI,EAAE,EAChB,SAAS8T,CAAgB,EACvC,OAAO,KAIT,IAAME,EAAgBH,EAAqBC,CAAS,EACpD,GACEF,EAAgBI,EAAc,IAAI,IAAMJ,EAAgB7T,CAAI,GAC5D6T,EAAgBI,EAAc,EAAE,IAAMJ,EAAgB5T,CAAE,EAExD,OAAQ8T,EAAW,CACjB,IAAK,GACH,MAAO,KACT,IAAK,GACH,MAAO,KACT,IAAK,IACH,MAAO,MACT,IAAK,IACH,MAAO,KACX,CAGF,OAAO,IACT,EAEMG,EAA0B,CAAClU,EAAYC,IAGpC,GADW,KAAK,IAAIN,GAAiBK,EAAMC,CAAE,CAAC,EAAI,CACtC,IAGf,CAAE,WAAApF,CAAW,EAAIrB,GAAc,EAE/B2a,EAAgBhV,GAAsB,CAC1C,OAAQA,EAAO,CACb,IAAK,KACH,OAAOmT,GAAQtR,EAAO,CAAC,EACzB,IAAK,KACH,OAAOsR,GAAQtR,EAAO,CAAC,EACzB,IAAK,MACH,OAAOsR,GAAQtR,EAAO,EAAE,EAC1B,IAAK,MACH,OAAOsR,GAAQtR,EAAO,EAAE,EAC1B,QACE,OAAOsR,GAAQtR,EAAO,CAAC,CAC3B,CACF,EAEM,CAACoT,EAAWC,CAAY,EAAItW,GAASoW,EAAad,CAAM,CAAC,EACzD,CAACiB,EAASC,CAAU,EAAIxW,GAASiD,CAAK,EAEtCwT,EAAclb,GAAQ,IAAM,CAChC,GAAI+Z,EACF,OAAQA,EAAQ,CACd,IAAK,KACH,MAAO,GACT,IAAK,KACH,MAAO,GACT,IAAK,MACH,MAAO,IACT,IAAK,MACH,MAAO,GACX,CAGF,OAAO,KAAK,IAAI1T,GAAiByU,EAAWE,CAAO,CAAC,EAAI,CAC1D,EAAG,CAACjB,EAAQe,EAAWE,CAAO,CAAC,EAMzBG,EAAepC,GAAgBK,EAAI,EAGnC,CAAE,KAAMgC,CAAmB,EAAIlC,GACnC,qFAAqF4B,EAAU,QAAQ,CAAC,UAAUE,EAAQ,QAAQ,CAAC,GACnI,CACE,kBAAmB,EACrB,CACF,EACM,CAAE,KAAMK,CAAkB,EAAInC,GAClC,oFAAoF4B,EAAU,QAAQ,CAAC,UAAUE,EAAQ,QAAQ,CAAC,GAClI,CACE,kBAAmB,EACrB,CACF,EAEM,CAACrZ,CAAI,EAAIwX,GACb,CACE,UAAW2B,EAAU,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAC/C,QAASE,EAAQ,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAC7C,EACA,CACE,kBAAmB,EACrB,CACF,EAGM,CAACpC,CAAY,EAAI5R,GAAiB,CACtC,UAAWgS,GAAQtR,EAAO,CAAC,EAAE,QAAQ,EACrC,QAASsT,EAAQ,QAAQ,EACzB,SAAU,EACZ,CAAC,EAGK,CAACM,CAAiB,EAAItU,GAAiB,CAC3C,KAAM,UACN,UAAWgS,GAAQtR,EAAOwT,CAAW,EAAE,QAAQ,EAC/C,QAASF,EAAQ,QAAQ,EACzB,SAAU,GACZ,CAAC,EAEKO,EAAqBvb,GAAQ,IAC1Bsb,GACH,OAAQtV,GAASA,EAAK,eAAiB,WAAW,EACnD,OAAO,CAACwV,EAAKxV,IACLwV,EAAI,IAETvB,EAAwB,CACtB,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOoT,GACP,GAAI,KACN,CAAC,CACH,EACCA,EAAI,EACR,CAACkC,EAAmBrB,CAAuB,CAAC,EAEzCwB,EAAwBzb,GAAQ,IAC/B,MAAM,QAAQqb,CAAiB,EAG7BA,GACH,OAAQrV,GAASA,EAAK,SAAW,WAAW,EAC7C,OAAO,CAACwV,EAAKxV,IACLwV,EAAI,IACTvB,EAAwB,CACtB,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOoT,GACP,GAAI,KACN,CAAC,CACH,EACCA,EAAI,EAbAA,GAcR,CAACiC,EAAmBpB,CAAuB,CAAC,EAEzCxT,EAAYzG,GAChB,KAAO,CACL,KAAM8a,EACN,GAAIE,CACN,GACA,CAACF,EAAWE,CAAO,CACrB,EAEMU,EAAkB7V,GAAsB,CAC5C,IAAM8V,EAAed,EAAahV,CAAK,EACvCkV,EAAaY,CAAY,EACzBV,EAAWvT,CAAK,EAChBsS,EAAUnU,CAAK,CACjB,EAEMkC,GAAgB6T,GAGhB,CACJ,IAAMC,EACJD,EAAS,gBAAgB,KAAOA,EAAS,KAAO,IAAI,KAAKA,EAAS,IAAI,EAClEE,EACJF,EAAS,cAAc,KAAOA,EAAS,GAAK,IAAI,KAAKA,EAAS,EAAE,EAClEb,EAAac,CAAQ,EACrBZ,EAAWa,CAAM,EAGjB,IAAMC,EAAiBrB,EAAsBmB,EAAUC,CAAM,EAE3D9B,EADE+B,GAIQ,IAHc,CAK5B,EAEMnT,GAAYC,GAAyC,CACrDA,EAAO,OAAS,aAClBd,GAAac,EAAO,KAAK,CAE7B,EAEMmT,GAAchc,GAAQ,IAOnB,CANiB,CACtB,KAAM,QACN,KAAM,YACN,MAAOyG,EACP,IAAK,EACP,CACuB,EACtB,CAACA,CAAS,CAAC,EAIRwV,GAAWjc,GAAQ,IAChB2B,EAAK,OAAS,EAAIA,EAAKA,EAAK,OAAS,CAAC,EAAI,KAChD,CAACA,CAAI,CAAC,EAEHua,GAAkBlc,GAAQ,IACzB,MAAM,QAAQqb,CAAiB,EAIlCY,IAAY,MACZZ,GAAmB,SAAW,GAC9B,OAAOY,GAAS,cAAkB,IAE3B7C,GAEIiC,GAAmB,OAAQrV,GAEpCA,EAAK,SAAW,aAChBA,EAAK,aAAeiW,IAAU,aAEjC,GACY,OAAO,CAACT,EAAKxV,IACjBwV,EAAI,IACTvB,EAAwB,CACtB,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOoT,GACP,GAAI,KACN,CAAC,CACH,EACCA,EAAI,EAxBE,KAyBR,CAACiC,EAAmBY,GAAUhC,CAAuB,CAAC,EAEnDkC,EAAmBnc,GAAQ,IAC1B,MAAM,QAAQob,CAAkB,EAInCa,IAAY,MACZb,GAAoB,SAAW,GAC/B,OAAOa,GAAS,cAAkB,IAE3B7C,GAEIgC,GAAoB,OAAQpV,GAErCA,EAAK,SAAW,aAChBA,EAAK,aAAeiW,IAAU,aAEjC,GACY,OAAO,CAACT,EAAKxV,IACjBwV,EAAI,IACTvB,EAAwB,CACtB,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOoT,GACP,GAAI,KACN,CAAC,CACH,EACCA,EAAI,EAxBE,KAyBR,CAACgC,EAAoBa,GAAUhC,CAAuB,CAAC,EAEpDmC,EAAoBlC,GAQpB,CACJ,GAAI3Y,GAAc,KAChB,OAAO,KAGT,IAAIsE,EAAQ,IAAIX,GAAQ3D,CAAU,EAAE,IAAI2Y,EAAO,SAAS,aAAa,EAGrE,GACE,MAAM,QAAQA,EAAO,YAAY,GACjCA,EAAO,aAAa,OAAS,GAC7B,OAAOA,EAAO,SAAS,cAAkB,IACzC,CAEA,IAAMmC,EAAO,CAAC,EAEd,QAASC,EAAI,EAAGA,EAAIpC,EAAO,aAAa,OAAQoC,IAAK,CACnD,IAAMtW,EAAOkU,EAAO,aAAaoC,CAAC,EAC9BtW,EAAK,aAAekU,EAAO,SAAS,eACtCmC,EAAK,KAAKrW,CAAI,CAElB,CAGA,QAASsW,EAAI,EAAGA,EAAID,EAAK,OAAQC,IAAK,CACpC,IAAMtW,EAAOqW,EAAKC,CAAC,EACftW,EAAK,OAAS,UACZA,EAAK,eAAiB,cACxBH,EAAQoU,EAAwB,CAC9B,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAAH,EACA,GAAI,KACN,CAAC,EAEDsV,EAAa,QAAUlB,EAAwB,CAC7C,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAOmV,EAAa,QACpB,GAAI,KACN,CAAC,GAEMnV,EAAK,OAAS,YACnBA,EAAK,eAAiB,WACxBH,EAAQoU,EAAwB,CAC9B,MAAOjU,EAAK,MACZ,OAAQA,EAAK,OACb,MAAAH,EACA,GAAI,KACN,CAAC,EAGP,CACF,CAEA,OAAAA,EAAQA,EACL,IAAIqU,EAAO,gBAAgB,EAAE,EAC7B,IAAIA,EAAO,gBAAgB,GAAG,EAE1BrU,EAAM,SAAS,CACxB,EAEM0W,EAAY,CAChB5a,EACAJ,EACA2a,EACAC,IACG,CACH,IAAMF,EAAWta,EAAKA,EAAK,OAAS,CAAC,EAErC,MAAO,CACL,GAAGsa,EACH,KAAM5C,GAAU3R,CAAK,EACrB,YAAa,EACb,cACEnG,IAAe,KAAOA,EAAc0a,GAAU,eAAiB,EACjE,IACEG,EAAiB,CACf,SAAAH,EACA,aAAArD,EACA,WAAArX,EACA,gBAAiB,CACf,IAAK4a,EACL,GAAID,CACN,CACF,CAAC,GAAK,EACR,eAAgB,EAClB,CACF,EAEMM,EAAY,CAChB7a,EACAJ,EACA2a,EACAC,IAEI,CAAC,MAAM,QAAQxa,CAAI,GAAKA,EAAK,SAAW,GAIxCA,EAAKA,EAAK,OAAS,CAAC,EAAE,OAAS0X,GAAU3R,CAAK,EACzC/F,EAGFA,EAAK,OAAO,CACjB4a,EAAU5a,EAAMJ,EAAY2a,EAAiBC,CAAgB,CAC/D,CAAC,EAGGM,EAAgB,CACpB9a,EACA+a,EACAnb,EACA2a,EACAC,IACG,CACH,IAAMtD,GAAS6D,EAEXF,EAAU7a,EAAMJ,EAAY2a,EAAiBC,CAAgB,EAD7Dxa,EAGJ,OAAOkX,GAAM,MAAM,KAAK,IAAI,EAAGA,GAAM,OAASqC,CAAW,CAAC,CAC5D,EAEMyB,EAAiB3c,GAAQ,IAIzBuB,IAAe,KACV,CAAC,EAIN4a,IAAqB,MAAQD,KAAoB,KAC5C,CAAC,EAEHO,EACL9a,EACAkY,EACAtY,EACA2a,GACAC,CACF,EACC,CACDxa,EACAJ,EACAqX,EACAiB,EACAvI,EAGA4K,GACAC,CACF,CAAC,EAEKS,EAAiB5c,GAAQ,IAAM,CACnC,IAAI6c,EAAMzD,GACN0D,EAAM1D,GACN2D,EAAM3D,GAEV,GAAI,MAAM,QAAQuD,CAAc,GAAKA,EAAe,OAAQ,CAC1DA,EAAe,QAAShV,IAAM,CAE5BmV,EAAMA,EAAI,IAAInV,GAAE,GAAG,CACrB,CAAC,EAED,IAAMqV,EAAOL,EAAe,CAAC,EAEvBM,EAAgBtb,EAAK,UAAWgG,IAAMA,GAAE,OAASqV,EAAK,IAAI,EAE1DE,GAAmBvb,EAAKsb,EAAgB,CAAC,GAAG,cAI9C,OAAOC,GAAqB,KAAeA,KAAqB,EAClEH,EAAM3D,GAEN2D,EAAMD,EAAI,IACRrB,EAAsB,IAAIyB,EAAgB,EAAE,IAAI3B,CAAkB,CACpE,CAEJ,CAEA,GAAI5Z,EAAK,OAAS,EAChB,QAAS2a,EAAI,EAAGA,EAAIpB,EAAaoB,IAAK,CACpC,IAAMtW,EAAOrE,EAAKA,EAAK,OAAS,EAAI2a,CAAC,EAEjCtW,IACF6W,EAAMA,EAAI,IAAI7W,EAAK,aAAe,CAAC,EAEvC,CAKF,MAAO,CAAE,IAAK6W,EAAI,SAAS,EAAG,IAAKC,EAAI,SAAS,EAAG,IAAKC,EAAI,SAAS,CAAE,CACzE,EAAG,CACDJ,EACAhb,EACAuZ,EACAO,EACAF,CACF,CAAC,EAEK4B,EAAiB,CACrBC,EACAC,IAEO,MAAM,KAAK,CAAE,OAAQ,CAAE,EAAG,CAACC,EAAGhB,KAE5B,CAAE,KADIrD,GAAOqD,IAAM,EAAIxB,EAAY,IAAI,KAAQ,YAAY,EACnD,GAAIwB,IAAM,EAAIc,EAAQC,CAAK,EAC3C,EAGH,MAAO,CACL,YAAAvD,EACA,OAAQC,EACR,eAAgB2B,EAChB,YAAapB,EACb,UAAWP,EACPO,EAAYP,CAAoB,EAChCa,EAAwBE,EAAWE,CAAO,EAE9C,KAAM2B,EACN,eAAAC,EACA,eAAAO,EACA,iBAAkBxb,IAAOA,EAAK,OAAS,CAAC,GAAG,MAAQ,GACnD,YAAAqa,GACA,SAAApT,GACA,UAAAnC,EACA,aAAAsB,EACF,CACF,IC/kBA,IAAAwV,GAAA,GAAAhZ,EAAAgZ,GAAA,iBAAAC,KAAA,OAAgB,WAAAxd,OAAe,QAC/B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,aAAAK,GAAW,QAAAC,GAAM,cAAAuG,OAAkB,6BA+BtC,cAAAtG,GACA,QAAAC,OADA,oBAjCN,IAKaya,GALbC,GAAAvc,EAAA,kBAGAyY,KAEa6D,GAOPta,GAAU,CACd,GAAM,CAAE,CAAE,EAAIX,GAAe,EAEvB+X,EAActa,GAAQ,KACnB,CACJ,KAAiB,EAAE,kBAAkB,EACrC,KAAkB,EAAE,kBAAkB,EACtC,MAAmB,EAAE,mBAAmB,EACxC,MAAqB,EAAE,mBAAmB,CAC7C,GACC,CAAC,CAAC,CAAC,EAEA0d,EAAc,sBAKpB,EAEA,OACE3a,GAACF,GAAA,CAAK,UAAW,SAAU,QAAS,UAClC,UAAAC,GAACF,GAAA,CAAW,SAAAM,EAAM,MAAM,EACxBH,GAACF,GAAA,CAAK,IAAK,EAAG,UAAU,SACrB,UAAAK,EAAM,aAAeA,EAAM,YAAY,OAAS,GAC/CJ,GAACsG,GAAA,CACC,MAAOlG,EAAM,YACb,SAAUA,EAAM,WAAa,IAAM,CAAC,GACpC,UAAU,2BACZ,EAEDwa,EAAY,IAAKC,GAChB7a,GAAC,UAEC,UAAW,0EACTI,EAAM,SAAWya,EACb,gCACA,0FACN,GACA,QAAS,IAAMza,EAAM,eAAeya,CAAU,EAE7C,SAAArD,EAAYqD,CAAU,GARlBA,CASP,CACD,GACH,GACF,CAEJ,ICzDA,OAAOrQ,OAAW,QAClB,OAAS,kBAAAsQ,OAAsB,gCAC/B,OAAS,kBAAArb,OAAsB,+BAC/B,OAAS,QAAAY,GAAM,OAAA0a,OAAW,6BAoBd,cAAA/a,OAAA,oBAxBZ,IAOMgb,GAQOC,GAfbC,GAAA9c,EAAA,kBAOM4c,GAAkBxQ,GAAM,KAAK,IACjC,sCAAiC,KAAMqD,IAC9B,CAAE,QAASA,EAAI,WAAY,EACnC,CACH,EAIaoN,GAA+C7a,GAAU,CACpE,GAAM,CAAE,eAAAwY,EAAgB,KAAA/Z,EAAM,YAAAmY,EAAa,OAAAC,EAAQ,YAAAiC,EAAa,SAAApT,CAAS,EACvE1F,EACI,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAC7B,OACEO,GAACK,GAAA,CACC,MACEL,GAAC+a,GAAA,CACC,SAAA/a,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACgb,GAAA,CACC,eAAgBpC,EAChB,YAAa5B,EACb,OAAQC,EACR,MAAOtU,EAAE,eAAe,EACxB,YAAauW,EACb,SAAUpT,EACZ,EACF,EACF,EAEF,GAAG,kCACH,WAAY,CAAE,QAAS,wBAAyB,EAEhD,SAAA9F,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAAC8a,GAAA,CAAe,KAAMjc,EAAa,UAAWuB,EAAM,UAAW,EACjE,EACF,CAEJ,ICrCS,cAAAJ,OAAA,oBANT,IAIamb,GAJbC,GAAAhd,EAAA,kBACAyX,KACAqF,KAEaC,GAA8B,IAAM,CAC/C,IAAM5c,EAAQqX,GAAqB,EACnC,OAAO5V,GAACib,GAAA,CAAa,GAAG1c,EAAO,CACjC,ICPA,IAAA8c,GAAA,GAAA5Z,EAAA4Z,GAAA,iBAAAJ,GAAA,sBAAAE,GAAA,yBAAAvF,KAAA,IAAA0F,GAAAld,EAAA,kBAAAgd,KACAvF,KACAqF,OCDA,OAAO1Q,IAAS,YAAA7I,OAAgB,QAChC,OACE,gBAAA4Z,GACA,eAAAC,GACA,eAAAC,OACK,gCACP,OAAS,kBAAAhc,OAAsB,+BAC/B,OAAS,cAAAoR,OAAkB,gCAC3B,OACE,QAAAxQ,GACA,QAAAE,GACA,OAAAwa,GACA,aAAAta,GACA,QAAAC,GACA,QAAAX,GACA,WAAAkS,GACA,MAAA/F,GACA,QAAAkB,GACA,YAAAD,OACK,6BA8BD,cAAAnN,EAoBF,QAAAC,OApBE,oBAlDN,IAuBM+a,GAiBAU,GAgEOC,GA2CAC,GAmCAC,GAtLbC,GAAA1d,EAAA,kBAuBM4c,GAAkBxQ,GAAM,KAAK,IACjC,sCAAiC,KAAMqD,IAC9B,CAAE,QAASA,EAAI,WAAY,EACnC,CACH,EAaM6N,GAA+Ctb,GAAU,CAC7D,GAAM,CAAE,MAAAiU,EAAO,KAAA0H,CAAK,EAAI3b,EACxB,OACEJ,EAACiS,GAAA,CACC,KAAM8J,EAAO,OAAY,GACzB,QAASA,EACT,UAAU,mCACV,MAAO,CAAE,UAAW,iBAAkB,EACtC,cAAe,IAEf,SAAA/b,EAACU,GAAA,CACC,KAAK,KACL,UAAW,GACX,UAAWwL,GACT6P,GACE,sEACJ,EAEC,SAAA1H,EACH,EACF,CAEJ,EA0CasH,GAGPvb,GAAU,CACd,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAACuc,EAAWC,CAAY,EAAIta,GAAS,OAAO,EAElD,OACE3B,EAAC+a,GAAA,CAAI,GAAI,EACP,SAAA9a,GAACmN,GAAA,CAAK,MAAO4O,EAAW,cAAeC,EAAc,QAAQ,YAC3D,UAAAjc,EAACmN,GAAA,CACC,MAAM,QACN,MAAO,EAAE,yCAAyC,EAElD,SAAAnN,EAAC+a,GAAA,CACC,EAAE,KACF,UAAU,sDAEV,SAAA/a,EAACwb,GAAA,CACC,KAAMpb,EAAM,KACZ,UAAWA,EAAM,YAAcA,EAAM,MAAM,QAAU,IAAM,EAC7D,EACF,EACF,EACAJ,EAACmN,GAAA,CACC,MAAM,aACN,MAAO,EAAE,8CAA8C,EAEvD,SAAAnN,EAAC+a,GAAA,CACC,EAAE,KACF,UAAU,sDAEV,SAAA/a,EAACub,GAAA,CACC,KAAMnb,EAAM,KACZ,UAAWA,EAAM,YAAcA,EAAM,MAAM,QAAU,IAAM,EAC7D,EACF,EACF,GACF,EACF,CAEJ,EAEawb,GAIPxb,GAAU,CACd,GAAM,CAAE,CAAE,EAAIX,GAAe,EAEvByc,GAAc9b,EAAM,MAAQ,CAAC,GAAG,IAAK8C,IAAe,CACxD,KAAMA,EAAK,KACX,OAAQA,EAAK,aAAe,EAC5B,SAAUA,EAAK,aAAe,GAAK,EAAI,EAAI,CAC7C,EAAE,EAEIiZ,EAAa/b,EAAM,YAAcA,EAAM,MAAM,QAAU,IAAM,EAEnE,OACEH,GAAC8a,GAAA,CAAI,GAAI,EACP,UAAA/a,EAACU,GAAA,CAAK,GAAG,MAAM,KAAK,KAAK,UAAU,WAChC,WAAE,wCAAyC,CAC1C,OAAQN,EAAM,WAAa,EAC7B,CAAC,EACH,EACAJ,EAAC+a,GAAA,CACC,EAAE,KACF,UAAW7O,GACT,sDACAiQ,GAAc,iBAChB,EAEA,SAAAnc,EAACyb,GAAA,CAAY,KAAMS,EAAY,UAAU,gBAAgB,EAC3D,GACF,CAEJ,EAEaL,GAA+Czb,GAAU,CACpE,GAAM,CACJ,YAAA4W,EACA,OAAAC,EACA,eAAA2B,EACA,eAAAkB,EACA,UAAA9D,EACA,QAAAjX,EACA,iBAAAqd,EACA,UAAAC,EACA,YAAAnD,EACA,SAAApT,CACF,EAAI1F,EACE,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAE7B,OACEO,EAACK,GAAA,CACC,MACEL,EAAC+a,GAAA,CAAI,GAAI,EACP,SAAA/a,EAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,EAACgb,GAAA,CACC,eAAgBpC,EAChB,YAAa5B,EACb,OAAQC,EACR,MAAOtU,EAAE,gCAAgC,EACzC,YAAauW,EACb,SAAUpT,EACZ,EACF,EACF,EAEF,GAAG,iCAEH,SAAA7F,GAAC8a,GAAA,CAAI,GAAI,EACP,UAAA9a,GAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAClB,UAAAP,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAEb,SAAA/a,EAACS,GAAA,CACC,MACET,EAAC0b,GAAA,CACC,MAAO/Y,EAAE,qCAAsC,CAC7C,OAAQ0Z,CACV,CAAC,EACD,KAAM1Z,EAAE,4CAA4C,EACtD,EAEF,WAAY,CAAE,KAAM,cAAe,SAAU,GAAM,QAAA5D,CAAQ,EAE1D,SAAAiX,EAAY,KAAO8D,EAAe,IACrC,EACF,EACA9Z,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAEb,SAAA/a,EAACS,GAAA,CACC,MACET,EAAC0b,GAAA,CACC,MAAO/Y,EAAE,qCAAsC,CAC7C,OAAQ0Z,CACV,CAAC,EACD,KAAM1Z,EAAE,4CAA4C,EACtD,EAEF,WAAY,CAAE,SAAU,GAAM,eAAgB,GAAM,QAAA5D,CAAQ,EAE3D,SAAAiX,EAAY,KAAO8D,EAAe,IACrC,EACF,EACA9Z,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAEb,SAAA/a,EAACS,GAAA,CACC,WAAY,CACV,MAAO,YACT,EACA,MACER,GAACF,GAAA,CAAK,QAAS,UACb,UAAAC,EAAC,QACC,SAAAA,EAAC0b,GAAA,CACC,MAAO/Y,EAAE,wCAAyC,CAChD,OAAQ0Z,CACV,CAAC,EACD,KAAM1Z,EAAE,+CAA+C,EACzD,EACF,EACA3C,EAAC,QAAM,SAAAoc,EAAiB,GAC1B,EAEF,WAAY,CAAE,QAAArd,CAAQ,EAErB,SAAAiX,EAAY,KAAO8D,EAAe,IACrC,EACF,GACF,EACA7Z,GAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAAG,GAAI,EACzB,UAAAP,EAAC2b,GAAA,CACC,KAAMvb,EAAM,MAAQyQ,GACpB,UAAWzQ,EAAM,UACnB,EACAJ,EAAC4b,GAAA,CACC,KAAMxb,EAAM,MAAQyQ,GACpB,UAAWzQ,EAAM,UACjB,UAAWA,EAAM,UACnB,GACF,GACF,EACF,CAEJ,ICrTA,IAqCakc,GArCbC,GAAAne,EAAA,kBAqCake,GAA6B,2BCrC1C,OAAS,WAAApf,OAAe,QACxB,OAAS,cAAAC,GAAY,mBAAAG,OAAuB,gCAC5C,OAAS,iBAAAG,GAAe,cAAAkY,OAAkB,oCAC1C,OAAS,qBAAAjY,OAAyB,gCAHlC,IAOa8e,GAPbC,GAAAre,EAAA,kBAIAme,KACA7G,KAEa8G,GAAuB,IAAM,CACxC,IAAME,EAAMjH,GAAmB,EACzB,CAAC1W,EAASC,CAAU,EAAI1B,GAC5Bgf,GACA,EACF,EAEM,CAAE,aAAA3d,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EAClD,CAAE,MAAAc,CAAM,EAAIpB,GAAW,EACvBwO,EAAegK,GAAW+G,GAAK,KAAM,CACzC,cACEne,EAAM,SAAWb,GAAkB,8BAC/BA,GAAkB,8BAClBA,GAAkB,cACxB,aAAcgf,GAAK,iBACjB,CAAE,cAAe,EAAG,IAAK,CAAE,EAC3B,CAAE,cAAe,IAAK,IAAK,GAAI,CACjC,CACF,CAAC,EAEK3G,EAAQ7Y,GAAQ,IAChByO,GAAc,OACTA,EAEF+Q,GAAK,iBACV,CAAE,cAAe,EAAG,IAAK,CAAE,EAC3B,CAAE,cAAe,IAAK,IAAK,GAAI,CACjC,EACC,CAACA,EAAK/Q,CAAY,CAAC,EAEhBqK,EACJrX,GACAC,GACCL,EAAM,OAASb,GAAkB,eAChCa,EAAM,SAAWb,GAAkB,8BAEvC,MAAO,CACL,GAAGgf,EACH,KAAM3G,EACN,UAAAC,EACA,QAASjX,EACT,WAAYC,CACd,CACF,IC5CS,cAAAgB,OAAA,oBANT,IAIa2c,GAJbC,GAAAxe,EAAA,kBACAqe,KACAX,KAEaa,GAA8B,IAAM,CAC/C,IAAMpe,EAAQie,GAAqB,EACnC,OAAOxc,GAAC6b,GAAA,CAAe,GAAGtd,EAAO,CACnC,ICPA,IAAAse,GAAA,GAAApb,EAAAob,GAAA,mBAAAhB,GAAA,sBAAAc,GAAA,yBAAAH,KAAA,IAAAM,GAAA1e,EAAA,kBAAA0d,KACAc,KACAH,OCFA,OAAOjS,IAAS,SAAAuS,OAAa,QAkBvB,cAAA/c,GAKE,QAAAC,OALF,oBAlBN,IAEa+c,GAFbC,GAAA7e,EAAA,kBAEa4e,GAAexS,GAAM,WAGhC,CAACpK,EAAO8c,IAAQ,CAChB,IAAMC,EAAWJ,GAAM,EACvB,OACE9c,GAAC,OACC,MAAM,6BACN,MAAO,GACP,OAAQ,GACR,QAAQ,YACR,KAAK,eACL,IAAKid,EACL,UAAW,GACV,GAAG9c,EAEJ,UAAAJ,GAAC,QACC,EAAE,m5EACF,KAAM,QAAQmd,CAAQ,IACxB,EACAnd,GAAC,QACC,SAAAC,GAAC,kBACC,GAAIkd,EACJ,GAAG,UACH,GAAG,UACH,GAAG,SACH,GAAG,UACH,cAAc,iBAEd,UAAAnd,GAAC,QAAK,UAAU,qCAAqC,EACrDA,GAAC,QAAK,UAAU,uCAAuC,OAAQ,EAAG,GACpE,EACF,GACF,CAEJ,CAAC,EAEG,QAAQ,IAAI,WAAa,eAC3Bgd,GAAa,YAAc,kBCxC7B,IAAAI,GAAAhf,EAAA,kBAAA6e,OCAA,IAAAI,GAAA,GAAA5b,EAAA4b,GAAA,uBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,KACA,OAAS,WAAAtgB,OAAe,QACxB,OAAS,eAAAugB,OAAmB,gCAC5B,OAAS,kBAAAhe,OAAsB,+BAC/B,OACE,OAAAsb,GACA,QAAAhb,GACA,SAAApC,GACA,QAAA+C,GACA,WAAAuR,GACA,aAAArU,OACK,6BACP,OAAS,WAAAwE,OAAe,gCAuBlB,cAAApC,GAcI,QAAAC,OAdJ,oBA4LI,wBAAAyd,OAAA,QA/NV,IA2BMC,GAGOH,GAgDAF,GA2DAC,GAzIbK,GAAAxf,EAAA,kBAaAgf,KAcMO,GAAehT,GACnB,OAAOA,EAAQ,KAAeA,IAAQ,KAE3B6S,GAAsDpd,GAAU,CAC3E,GAAM,CAAE,MAAAiU,EAAO,MAAAtR,EAAO,YAAA8a,CAAY,EAAIzd,EAChC,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAC7B,OACEQ,GAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,MAAM,OAC/C,UAAAC,GAACU,GAAA,CACC,GAAG,MACH,UAAW,GACX,KAAK,KACL,OAAO,WACP,UAAU,qBAET,SAAA2T,EACH,EACApU,GAACF,GAAA,CAAK,UAAU,cAAc,UAAU,SAAS,QAAQ,UACvD,UAAAC,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,UAAU,qBACtC,SAAAqC,EACH,EACC8a,GACC5d,GAACF,GAAA,CACC,IAAK,EACL,QAAQ,SACR,UAAU,SACV,UAAU,yKACV,QAAS,IAAM,CACbpC,GAAM,OAAO,CACX,KAAM,KACN,MAAOgF,EAAE,aAAa,EACtB,QAASA,EAAE,wCAAwC,CACrD,CAAC,CACH,EAEA,UAAA3C,GAACgd,GAAA,EAAa,EACdhd,GAACU,GAAK,SAAL,CACC,UAAU,kBACV,MAAO,QACP,KAAK,MACL,OAAO,UAEN,SAAAiC,EAAE,qBAAqB,EAC1B,GACF,GAEJ,GACF,CAEJ,EAEa2a,GAAuDld,GAAU,CAC5E,GAAM,CAAE,MAAAiU,EAAO,MAAAtR,EAAO,YAAA8a,CAAY,EAAIzd,EAChC,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAC7B,OACEQ,GAAC8a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,MAAM,OACN,OAAM,GACN,YAAa,EAEb,UAAA/a,GAACU,GAAA,CACC,GAAG,MACH,UAAW,GACX,KAAK,MACL,OAAO,WACP,UAAU,qBAET,SAAA2T,EACH,EACApU,GAACF,GAAA,CACC,UAAU,sBACV,UAAU,SACV,QAAQ,UAER,UAAAC,GAACU,GAAA,CAAK,KAAK,OAAO,UAAW,GAAI,UAAU,qBACxC,SAAAqC,EACH,EACC8a,GACC7d,GAACiS,GAAA,CACC,QAAStP,EAAE,wCAAwC,EACnD,UAAU,sCAEV,SAAA1C,GAACF,GAAA,CACC,IAAK,EACL,QAAQ,SACR,UAAU,SACV,UAAU,yKAEV,UAAAC,GAACgd,GAAA,EAAa,EACdhd,GAACU,GAAK,SAAL,CACC,UAAU,kBACV,MAAO,QACP,KAAK,KACL,OAAO,UAEN,SAAAiC,EAAE,qBAAqB,EAC1B,GACF,EACF,GAEJ,GACF,CAEJ,EAEa4a,GAA+Cnd,GAAU,CACpE,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAE,KAAAqe,EAAM,IAAA/D,EAAK,kBAAAgE,CAAkB,EAAI3d,EACnC,CAAE,SAAAnB,CAAS,EAAIrB,GAAU,EACzB,CAAE,cAAAogB,EAAe,GAAGC,CAAO,EAAIR,GAAY,EAC3CS,EAAiBP,GAAYK,CAAa,EAC1CG,EAAkC,CACtC,CACE,MAAO,EAAE,mCAAmC,EAC5C,YAAa,GACb,MACEne,GAACU,GAAK,SAAL,CACC,MAAO,QACP,MAAO,IACP,KAAMzB,EAAW,KAAO,OAEvB,SAAA6e,GAAQ,KACX,CAEJ,EACA,CACE,MAAO,GAAG,EAAE,oCAAoC,CAAC,UACjD,YAAa,GACb,MACE9d,GAACU,GAAK,QAAL,CACC,KAAK,QACL,GAAI,EACJ,GAAI0B,GAAQ,WACZ,KAAMnD,EAAW,KAAO,OAEvB,SAAqB8a,GAAQ,KAAO,GAAGA,CAAG,GAAK,IAClD,CAEJ,EACA,CACE,MAAO,EAAE,uCAAuC,EAChD,YAAamE,EACb,MACEle,GAACU,GAAK,SAAL,CACC,MAAO,QACP,MAAO,IACP,KAAMzB,EAAW,KAAO,OAEvB,SAAAif,EACGD,EAAO,mBAAqB,KAC5BA,EAAO,UAAY,KACzB,CAEJ,EACA,CACE,MAAO,EAAE,uCAAuC,EAChD,YAAaC,EACb,MACEle,GAACU,GAAK,SAAL,CACC,MAAO,QACP,MAAO,IACP,KAAMzB,EAAW,KAAO,OAEvB,SAAAif,EACGD,EAAO,mBAAqB,KAC5BA,EAAO,UAAY,KACzB,CAEJ,CACF,EAEMG,EAAalhB,GAAkC,IAC/C,OAAO6gB,GAAsB,WACxBA,EAAkBI,CAAK,EAEzBA,EACN,CAACJ,EAAmBI,CAAK,CAAC,EAE7B,OAAK,MAAM,QAAQC,CAAU,EAIzBnf,EAEAe,GAACD,GAAA,CACC,UAAU,uCACV,UAAU,SACV,IAAK,EACL,UAAW,UAEV,SAAAqe,EAAW,IAAI,CAAClb,EAAMmF,IACrBqV,GAACF,GAAA,CAAkB,GAAGta,EAAM,IAAK,eAAemF,CAAK,GAAI,CAC1D,EACH,EAKFrI,GAACD,GAAA,CAAK,UAAU,GAAG,UAAU,MAAM,KAAM,EAAG,GAAI,EAAG,UAAW,UAC3D,SAAAqe,EAAW,IAAI,CAAClb,EAAMmF,IACrBqV,GAACJ,GAAA,CAAmB,GAAGpa,EAAM,IAAK,gBAAgBmF,CAAK,GAAI,CAC5D,EACH,EAvBO,IAyBX,IC5OA,OAAS,aAAA0E,GAAW,WAAA7P,GAAS,YAAAyE,OAAgB,QAC7C,OAGE,cAAAxE,GACA,oBAAAkhB,OACK,gCACP,OAAS,kBAAA5e,OAAsB,+BAC/B,OAAS,iBAAAhC,GAAe,cAAAkY,OAAkB,oCAC1C,OAAS,qBAAAjY,OAAyB,gCAClC,OAAS,SAAAyE,GAAO,iBAAAoC,OAAqB,6BA4P9B,SAAS+Z,GAAoBC,EAAqB,CACvD,OAAOA,EAAI,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAI,MAAM,CAAC,CAClD,CAxQA,IAmBaC,GAnBbC,GAAArgB,EAAA,kBAmBaogB,GAAuBpe,GAG9B,CACJ,GAAM,CAAE,WAAAse,EAAY,UAAAC,CAAU,EAAIve,GAAS,CAAC,EACtC,CAACwe,EAAkBC,CAAmB,EAAIld,GAAS,EAAK,EACxD,CAACmd,EAAmBC,CAAoB,EAAIpd,GAAS,EAAK,EAC1D,CAACqd,EAAaC,CAAc,EAAItd,GAAsC,EACtE,CAAE,aAAAhD,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EAClD,CAAE,MAAAc,EAAO,QAAAiS,CAAQ,EAAIrT,GAAW,EAChC,CAAE,EAAAwF,CAAE,EAAIlD,GAAe,EAEvByf,EACJ,CAACvgB,GACD,CAACC,IACAL,EAAM,SAAWb,GAAkB,eAClCa,EAAM,SAAWb,GAAkB,+BAEjC,CACJyhB,EACA,CACE,mBAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,6BAAAC,EACA,QAAAC,EACA,UAAAxZ,EACA,MAAAyZ,CACF,CACF,EAAIpB,GAAiB,CACnB,QAAS,CAAE,WAAYM,CAAU,CACnC,CAAC,EAEK,CAACe,EAAWC,CAAY,EAAIhe,GAA6B,MAAS,EAExEoL,GAAU,IAAM,CACdyD,EAAQ,SACL,cAAc,GACb,aAAa,EACd,KAAMoP,GAAW,CAChBD,EAAaC,CAAM,CACrB,CAAC,CACL,EAAG,CAACpP,EAASjS,CAAK,CAAC,EAEnB,IAAMshB,EAAiB,IAAM,CAC3BhB,EAAoB,EAAI,CAC1B,EACMiB,EAAiB,IAAM,CAC3B,OAAO,KACL,gGACA,QACF,CACF,EAEMC,EAAmB,IAAM,CAC7BlB,EAAoB,EAAK,CAC3B,EAEMmB,EAAW,MACfC,EACAC,IACoB,CACpB,GAAI,CACF,IAAMC,EAAiB,CACrBC,EAIAC,IACG,CACH,GAAM,CAAE,IAAAC,GAAK,UAAAC,EAAU,EAAIH,EAC3BL,EAAiB,EACjBd,EAAe,CACb,IAAKqB,GACL,UAAWC,GACX,GAAIF,EACJ,YAAaH,GACT,MAAM,GAAG,GACT,IAAKrd,IAAMyb,GAAoBzb,EAAC,CAAC,EAClC,KAAK,IAAI,CACd,CAAC,EACDkc,EAAqB,EAAI,CAC3B,EAEMyB,EAAiB,MAAMpB,EAAmBc,CAAK,EAKrD,GAHA/d,GAAM,QAAQQ,EAAE,0BAA0B,CAAC,GAGtCsd,GAAe,QAAU,GAAK,EAAG,CACpC,IAAMK,EAAME,EAAe,IAAI,WAAW,UAAU,EAChDA,EAAe,IACf,WAAWA,EAAe,GAAG,GAC3BJ,EAAM,MAAMf,EAAiBiB,EAAKL,CAAc,EAElDG,EAAI,SACND,EACEK,EACAJ,EAAI,KAAK,qBAAqB,KAAK,GAAG,CACxC,CAEJ,MACED,EAAeK,EAAgB,MAAS,CAE5C,OAASC,EAAU,CACbA,GAAK,SAASte,GAAM,MAAMse,GAAK,OAAO,CAC5C,CAEA,OAAO,QAAQ,QAAQ,CAAC,CAC1B,EAEMC,EAAoB,IAAM,CAC9B3B,EAAqB,EAAK,EAC1BS,EAAQ,CACV,EAEMmB,EAAmB,IAAM,CAC7B,UAAU,UAAU,UAAU,KAAK,UAAU3B,CAAW,CAAC,EACzD7c,GAAM,QAAQQ,EAAE,iCAAiC,CAAC,CACpD,EACMie,EAAY,IAAM,CACtBF,EAAkB,CACpB,EAEMG,GAAY3d,GACT,IAAI,QAAQ,MAAOyR,GAAY,CACpC,MAAM2K,EAAiBpc,EAAK,WAAW,EACpC,KACC,MAAOrE,GAAS,CACd,GAAIA,GAAM,QAAS,CACjBsD,GAAM,QAAQQ,EAAE,0BAA0B,CAAC,EAC3C6c,EAAQ,EAER,IAAMsB,EAAS,MAAMtQ,EAAQ,SAC1B,cAAc,GACb,aAAa,EACbtN,EAAK,cAAgB4d,GACvBtQ,EAAQ,kBAAkB,CAE9B,CACAmE,EAAQ,CAAC,CACX,EACCC,GAAW,CAAC,CACf,EACC,MAAO6L,GAAQ,CAAC,CAAC,CACtB,CAAC,EAGGM,GAAS,MAAO7d,EAAkBmd,IAA+B,CACrE,IAAIW,GACCX,GAAI,QAAU,KAAO,EACxBW,EAASzB,EAA6Brc,EAAK,YAAa,eAAe,EAEvE8d,EAAS3B,EAAiBnc,EAAK,YAAamd,CAAG,EAGjD,IAAMxhB,EAAO,MAAMmiB,EAEnB,OAAIniB,EAAK,SACPsD,GAAM,QAAQQ,EAAE,0BAA0B,CAAC,EAC3C6c,EAAQ,EACD,QAAQ,QAAQ,IAEvBrd,GAAM,MAAMtD,EAAK,OAAO,EAEnB,QAAQ,OAAO,EACxB,EAEMoiB,GAAkB,IACtB9e,GAAM,QAAQQ,EAAE,mCAAmC,CAAC,EAChDue,GAAgBZ,GAAiB,CACjC,OAAOA,EAAQ,KACjB,UAAU,UAAU,UAAUA,EAAI,QAAQ,WAAY,EAAE,CAAC,EAE3Dne,GAAM,QAAQQ,EAAE,qCAAqC,CAAC,CACxD,EACMwe,GAAqB,IACzBhf,GAAM,QAAQQ,EAAE,mCAAmC,CAAC,EAChDye,EAAW,IACfjf,GAAM,QAAQQ,EAAE,2CAA2C,CAAC,EAExD0e,EAAUnkB,GAAQ,IACfiiB,GAAM,OAAQtc,GAAM,CACzB,IAAMye,EAAY5C,EAAaA,GAAY,SAAS7b,EAAE,GAAG,EAAI,GACvD0e,EAAe7B,EACjB,CAAC7c,EAAE,YAAY,SAAS6c,CAAS,EACjC,GACJ,OAAO4B,GAAaC,CACtB,CAAC,EACA,CAACpC,EAAMT,EAAYgB,CAAS,CAAC,EAE1B8B,EAAYnB,GAEd,mMACa,KAAKA,CAAE,EAClB,GACA,wGAGAoB,EACJljB,EAAM,SAAWb,GAAkB,8BAC/BA,GAAkB,8BAClBA,GAAkB,cAElB0F,EAAYuS,GAAWpX,EAAM,UAAW,CAC5C,cAAAkjB,CACF,CAAC,EAEKC,EAAS/L,GAAWpX,EAAM,OAAQ,CACtC,cAAAkjB,CACF,CAAC,EAEK,CAAE,WAAAvb,CAAW,EAAI3B,GAAc,EAErC,MAAO,CACL,UAAWnB,GAAa,KACxB,OAAQse,GAAU,KAClB,eAAA7B,EACA,eAAAC,EACA,iBAAAlB,EACA,iBAAAmB,EACA,SAAAC,EACA,kBAAAlB,EACA,kBAAA4B,EACA,iBAAAC,EACA,UAAAC,EACA,SAAAC,GACA,OAAAE,GACA,gBAAA7B,EACA,OAAQ3gB,EAAM,OACd,KAAM8iB,EACN,YAAArC,EACA,gBAAAiC,GACA,aAAAtiB,EACA,aAAAuiB,GACA,mBAAAC,GACA,SAAAC,EACA,SAAAI,EACA,UAAAxb,EACA,WAAAE,CACF,CACF,ICpQA,IAAAyb,GAAA,GAAAlgB,EAAAkgB,GAAA,cAAAC,GAAA,uBAAAC,KAAA,OAAa,aAAA9U,GAAW,YAAApL,OAAgB,QAExC,OAAS,kBAAAlC,OAAsB,+BAC/B,OAAS,MAAAyM,GAAI,QAAAnM,GAAM,gBAAAqT,GAAc,aAAA3S,GAAW,QAAAC,OAAY,6BAkE9C,cAAAV,GAsBE,QAAAC,OAtBF,oBArEV,IAMa4hB,GAqIAD,GA3IbE,GAAA1jB,EAAA,kBAMayjB,GAAmDzhB,GAAU,CACxE,GAAM,CAAC2hB,EAAQC,CAAS,EAAIrgB,GAAS,EAAE,EACjC,CAACsgB,EAAMC,CAAO,EAAIvgB,GAAS,EAAI,EAC/B,CAACwgB,EAAOC,CAAQ,EAAIzgB,GAAS,EAAI,EACjC,CAACoa,EAAMsG,CAAO,EAAI1gB,GAAS,EAAE,EAC7B,CAAE,EAAAgB,CAAE,EAAIlD,GAAe,EAE7B,OAAAsN,GAAU,IAAM,CACT3M,EAAM,mBACT4hB,EAAU,EAAE,EACZE,EAAQ,EAAI,EACZE,EAAS,EAAI,EACbC,EAAQ,EAAE,EAEd,EAAG,CAACjiB,EAAM,gBAAgB,CAAC,EAE3B2M,GAAU,IAAM,CACVgV,EAAO,SAAW,GAAGM,EAAQ,EAAE,CACrC,EAAG,CAACN,CAAM,CAAC,EAGT/hB,GAACoT,GAAA,CACC,KAAK,KACL,KAAMhT,EAAM,iBACZ,aAAekiB,GAAS,CACtBliB,EAAM,mBAAmB,CAC3B,EACA,MAAOuC,EAAE,sCAAsC,EAC/C,QAAS,CACP,QAAS,CACP,MAAOA,EAAE,gBAAgB,EACzB,UAAW,iCACX,cAAe,oDACf,QAAS,SAAY,CACnB,GAAIof,EAAO,OAAS,EAAG,CACrB,IAAMhG,EAAO3b,EAAM,SAAS2hB,CAAM,EAElC,GADAM,EAAQtG,CAAI,EACRA,EAAK,OAAS,EAChB,MAEJ,CAEA,IAAMwG,EAAmB,CAAC,EACtBN,GACFM,EAAO,KAAK,MAAM,EAEhBJ,GACFI,EAAO,KAAK,SAAS,EAEvB,MAAMniB,EAAM,SAAS2hB,EAAQQ,EAAO,KAAK,GAAG,CAAc,CAC5D,EACA,SAAU,CAACJ,GAAS,CAACF,EACrB,KAAM,IACR,CACF,EACA,WAAY,CACV,OAAQ,qBACR,QACE,gEACJ,EAEA,SAAAhiB,GAACF,GAAA,CAAK,UAAW,SAAU,IAAK,EAC9B,UAAAE,GAACF,GAAA,CAAK,UAAW,SAAU,IAAK,EAAG,MAAO,OAAQ,UAAW,QAC3D,UAAAC,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,MACvB,SAAAiC,EAAE,uCAAuC,EAC5C,EACA3C,GAAC,YACC,cAAY,iDACZ,YAAa2C,EAAE,mDAAmD,EAClE,UAAWuJ,GACT,sGACA,mFACA,mCACA6P,EAAK,OAAS,GACZ,yDACJ,EACA,MAAOgG,EACP,SAAWlf,GAAM,CACfmf,EAAUnf,EAAE,OAAO,KAAK,CAC1B,EACA,MAAO,CACL,OAAQ,MACV,EACF,EACCkZ,EAAK,OAAS,GACb9b,GAACF,GAAA,CAAK,IAAK,EAAG,UAAU,eACtB,UAAAC,GAAC,OACC,UAAWkM,GACT,8BACA,2CACF,EACF,EACAlM,GAACU,GAAA,CAAK,MAAM,SAAS,KAAK,KAAK,UAAU,WACtC,SAAAqb,EACH,GACF,GAEJ,EACA/b,GAACS,GAAA,CACC,MACET,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAiC,EAAE,8BAA8B,EACnC,EAEF,UAAU,aAEV,SAAA1C,GAACF,GAAA,CACC,UAAW,MACX,IAAK,EACL,UAAW,QACX,UAAU,WAEV,UAAAC,GAAC4hB,GAAA,CACC,KAAM,GACN,QAASK,EACT,gBAAkBpf,GAAMqf,EAAQrf,CAAY,EAC5C,MAAOF,EAAE,mCAAmC,EAC5C,OAAO,sDACT,EACA3C,GAAC4hB,GAAA,CACC,KAAM,GACN,QAASO,EACT,gBAAkBtf,GAAMuf,EAASvf,CAAY,EAC7C,MAAOF,EAAE,sCAAsC,EAC/C,OAAO,yDACT,GACF,EACF,GACF,EACF,CAEJ,EAEaif,GAOPxhB,GAEFH,GAAC,UACC,SAAUG,EAAM,SAChB,QAAUyC,GAAM,CACdzC,EAAM,gBAAgB,CAACA,EAAM,OAAO,CACtC,EACA,UACE,8FAEF,cAAaA,EAAM,OAElB,UAAAA,EAAM,QACLJ,GAAC,OACC,MAAO,aACP,OAAQI,EAAM,KACd,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAJ,GAAC,QACC,SAAS,UACT,SAAS,UACT,EAAE,glBACF,KAAK,QACL,YAAY,OACd,EACF,EAEAA,GAAC,OACC,MAAOI,EAAM,KACb,OAAQA,EAAM,KACd,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAJ,GAAC,QACC,EAAE,qeACF,KAAK,QACL,YAAY,OACd,EACF,EAGFA,GAACU,GAAA,CACC,UAAW,GACX,KAAK,KACL,UAAU,yCAET,SAAAN,EAAM,MACT,GACF,ICrMJ,IAAAoiB,GAAA,GAAA/gB,EAAA+gB,GAAA,yBAAAC,KACA,OAAS,kBAAAhjB,OAAsB,+BAC/B,OACE,OAAAsb,GACA,YAAA2H,GACA,QAAA3iB,GACA,gBAAAqT,GACA,aAAA3S,GACA,QAAAC,OACK,6BA6CG,cAAAV,GAyBF,QAAAC,OAzBE,oBAtDV,IAYawiB,GAZbE,GAAAvkB,EAAA,kBAYaqkB,GAAoDriB,GAAU,CACzE,IAAMigB,EAAKjgB,EAAM,aAAa,IAAM,KAC9B,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAC7B,OACEO,GAACoT,GAAA,CACC,KAAK,KACL,KAAMhT,EAAM,kBACZ,aAAekiB,GAAS,CACtBliB,EAAM,oBAAoB,CAC5B,EACA,MAAOuC,EAAE,0BAA0B,EACnC,QAAS,CACP,QAAS,CACP,MAAOA,EAAE,WAAW,EACpB,cAAe,gDACf,UACE,mEACF,KAAM,KACN,QAAS,SACAvC,EAAM,UAAU,CAE3B,EACA,UAAW,CACT,MAAOuC,EAAE,6CAA6C,EACtD,cAAe,kDACf,UACE,4EACF,KAAM,KACN,QAAS,SACAvC,EAAM,iBAAiB,CAElC,CACF,EACA,WAAY,CACV,OAAQ,qBACR,QACE,iEACF,KAAM,mBACR,EAEA,SAAAH,GAACF,GAAA,CAAK,UAAW,SAAU,IAAK,EAAG,UAAW,QAC5C,UAAAC,GAACS,GAAA,CAAU,MAAOkC,EAAE,kBAAkB,EACpC,SAAA3C,GAACU,GAAK,UAAL,CACC,KAAK,KACL,UAAW,GACX,SAAQ,GACR,aAAc,GACd,UAAU,gBACV,OAAQN,EAAM,gBACd,cAAY,kDAEX,SAAAA,EAAM,UACT,EACF,EACAJ,GAACS,GAAA,CAAU,MAAOkC,EAAE,gCAAgC,EAClD,SAAA3C,GAACU,GAAK,UAAL,CACC,KAAK,KACL,UAAW,GACX,SAAQ,GACR,aAAc,GACd,UAAU,gBACV,OAAQ,IAAMN,EAAM,aAAaA,EAAM,aAAa,GAAG,EACvD,cAAY,kDAEX,SAAAA,EAAM,aAAa,IACtB,EACF,EACAH,GAACQ,GAAA,CAAU,MAAOkC,EAAE,4BAA4B,EAC9C,UAAA3C,GAACU,GAAK,UAAL,CACC,KAAK,KACL,UAAW,GACX,SAAQ,GACR,aAAc,GACd,UAAU,gBACV,OAAQN,EAAM,mBAEb,SAAAA,EAAM,aAAa,UACtB,EAAkB,KACpB,EACAJ,GAACS,GAAA,CAAU,MAAOkC,EAAE,qBAAqB,EACvC,SAAA1C,GAACF,GAAA,CACC,MAAO,IACP,IAAK,EACL,UAAW,SACX,UAAU,wCAEV,UAAAC,GAAC+a,GAAA,CAAI,UAAU,oGACZ,SAAAsF,EACH,EACCA,IAAO,MACNrgB,GAAC+a,GAAA,CACC,MAAO,GACP,OAAQ,GACR,UAAU,uCAEV,SAAA/a,GAAC0iB,GAAA,CACC,MAAM,QACN,QAAS,IACT,KAAM,GACN,QAAU7f,GAAM,CACVzC,EAAM,aAAa,IACrB,UAAU,UAAU,UAAUA,EAAM,aAAa,EAAE,EACrDA,GAAO,SAAS,CAClB,EACF,EACF,GAEJ,EACF,EACAJ,GAACS,GAAA,CAAU,MAAOkC,EAAE,8BAA8B,EAChD,SAAA3C,GAACU,GAAA,CACC,KAAK,KACL,UAAW,GACX,cAAY,0DAEX,SAAAN,EAAM,aAAa,YACtB,EACF,EACAJ,GAAC,QAAI,EACLA,GAACU,GAAA,CAAK,MAAM,UAAU,KAAK,KAAK,UAAU,kBACvC,SAAAiC,EAAE,kCAAkC,EACvC,GACF,EACF,CAEJ,ICzIA,IAAAigB,GAAA,GAAAnhB,EAAAmhB,GAAA,wBAAAC,KACA,OAAS,QAAA9iB,GAAM,gBAAAqT,GAAc,QAAA1S,OAAY,6BAGzC,OAAS,kBAAAjB,GAAgB,SAAAqjB,OAAa,+BA+Cf,cAAA9iB,OAAA,oBAnDvB,IAMa6iB,GANbE,GAAA3kB,EAAA,kBAGA4kB,KAGaH,GAKPziB,GAAU,CACd,GAAM,CAAE,KAAA8C,EAAM,KAAAof,EAAM,QAAAW,EAAS,SAAAC,CAAS,EAAI9iB,EACpC,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAC7B,OACEO,GAACoT,GAAA,CACC,KAAK,KACL,KAAMkP,EACN,aAAcW,EACd,MAAOtgB,EAAE,sCAAsC,EAC/C,QAAS,CACP,QAAS,CACP,MAAOA,EAAE,gBAAgB,EACzB,cAAe,oDACf,UAAW,iCACX,KAAM,KACN,QAAS,SAAY,CACnB,MAAMvC,EAAM,WAAW8C,CAAI,EAC3B+f,EAAQ,EAAK,CACf,CACF,EACA,UAAW,CACT,MAAOtgB,EAAE,eAAe,EACxB,UAAW,iCACX,KAAM,KACN,QAAS,SAAY,CACnBsgB,EAAQ,EAAK,CACf,CACF,CACF,EACA,WAAY,CACV,OAAQ,qBACR,QACE,gEACJ,EAEA,SAAAjjB,GAACD,GAAA,CAAK,UAAU,cAEd,SAAAC,GAAC8iB,GAAA,CACC,QAAQ,6CACR,OAAQ,CAAE,OAAQK,GAAUjgB,GAAM,WAAW,CAAE,EAC/C,WAAY,CAAClD,GAACU,GAAA,CAAK,MAAM,UAAU,UAAU,WAAW,CAAE,EAC5D,EACF,EACF,CAEJ,ICxDA,IAAA0iB,GAAA,GAAA3hB,EAAA2hB,GAAA,sBAAAC,KAAA,OAAa,aAAAtW,GAAW,YAAApL,OAAgB,QAExC,OAAS,kBAAAlC,OAAsB,+BAC/B,OAAS,MAAAyM,GAAI,QAAAnM,GAAM,gBAAAqT,GAAc,aAAA3S,GAAW,QAAAC,OAAY,6BAoE9C,cAAAV,GAsBE,QAAAC,OAtBF,oBAvEV,IAMaojB,GANbC,GAAAllB,EAAA,kBAIA0jB,KAEauB,GAMPjjB,GAAU,CACd,GAAM,CAAE,KAAA8C,EAAM,KAAAof,EAAM,QAAAW,EAAS,SAAAM,CAAS,EAAInjB,EACpC,CAAC2hB,EAAQC,CAAS,EAAIrgB,GAASuB,EAAK,qBAAqB,KAAK,GAAG,CAAC,EAClE,CAAC+e,EAAMC,CAAO,EAAIvgB,GAAS,EAAI,EAC/B,CAACwgB,EAAOC,CAAQ,EAAIzgB,GAAS,EAAI,EACjC,CAACoa,EAAMsG,CAAO,EAAI1gB,GAAS,EAAE,EAC7B,CAAE,EAAAgB,CAAE,EAAIlD,GAAe,EAE7B,OAAAsN,GAAU,IAAM,CACdiV,EAAU9e,EAAK,oBAAoB,KAAK,GAAG,CAAC,EAC5C,IAAMgd,EAAQhd,EAAK,OAAO,kBAAkB,GAAK,GAEjDgf,EAAQhC,EAAM,SAAS,MAAM,CAAC,EAC9BkC,EAASlC,EAAM,SAAS,SAAS,CAAC,CACpC,EAAG,CAAChd,CAAI,CAAC,EAET6J,GAAU,IAAM,CACVgV,EAAO,SAAW,GAAGM,EAAQ,EAAE,CACrC,EAAG,CAACN,CAAM,CAAC,EAGT/hB,GAACoT,GAAA,CACC,KAAK,KACL,KAAMkP,EACN,aAAcW,EACd,MAAOtgB,EAAE,oCAAoC,EAC7C,QAAS,CACP,QAAS,CACP,MAAOA,EAAE,gBAAgB,EACzB,cAAe,kDACf,UAAW,iCACX,QAAS,SAAY,CACnB,GAAIof,EAAO,OAAS,EAAG,CACrB,IAAMhG,EAAO3b,EAAM,SAAS2hB,CAAM,EAElC,GADAM,EAAQtG,CAAI,EACRA,EAAK,OAAS,EAChB,MAEJ,CACA,MAAM3b,EAAM,WAAW8C,EAAM6e,CAAM,EACnCkB,EAAQ,EAAK,CACf,EACA,SAAU/f,EAAK,oBAAoB,KAAK,GAAG,IAAM6e,EACjD,KAAM,KACN,UAAW,EACb,CACF,EACA,WAAY,CACV,OAAQ,qBACR,QACE,gEACJ,EAEA,SAAA9hB,GAACF,GAAA,CAAK,UAAW,SAAU,IAAK,EAK9B,UAAAE,GAACF,GAAA,CAAK,UAAW,SAAU,IAAK,EAAG,MAAO,OAAQ,UAAW,QAC3D,UAAAC,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,MACvB,SAAAiC,EAAE,uCAAuC,EAC5C,EACA3C,GAAC,YACC,cAAY,+CACZ,YAAa2C,EAAE,mDAAmD,EAClE,UAAWuJ,GACT,sGACA,mFACA,mCACA6P,EAAK,OAAS,GACZ,yDACJ,EACA,MAAOgG,EACP,SAAWlf,GAAM,CACfmf,EAAUnf,EAAE,OAAO,KAAK,CAC1B,EACA,MAAO,CACL,OAAQ,MACV,EACF,EACCkZ,EAAK,OAAS,GACb9b,GAACF,GAAA,CAAK,IAAK,EAAG,UAAU,eACtB,UAAAC,GAAC,OACC,UAAWkM,GACT,8BACA,2CACF,EACF,EACAlM,GAACU,GAAA,CAAK,MAAM,SAAS,KAAK,KAAK,UAAU,WACtC,SAAAqb,EACH,GACF,GAEJ,EACA/b,GAACS,GAAA,CACC,MACET,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAiC,EAAE,8BAA8B,EACnC,EAEF,UAAU,aAEV,SAAA1C,GAACF,GAAA,CACC,UAAW,MACX,IAAK,EACL,UAAW,QACX,UAAU,WAEV,UAAAC,GAAC4hB,GAAA,CACC,SAAQ,GACR,KAAM,GACN,QAASK,EACT,gBAAkBpf,GAAMqf,EAAQrf,CAAY,EAC5C,MAAOF,EAAE,mCAAmC,EAC9C,EACA3C,GAAC4hB,GAAA,CACC,SAAQ,GACR,KAAM,GACN,QAASO,EACT,gBAAkBtf,GAAMuf,EAASvf,CAAY,EAC7C,MAAOF,EAAE,sCAAsC,EACjD,GACF,EACF,GACF,EACF,CAEJ,IC3IA,OAAO6H,IAAS,YAAA7I,OAAgB,QAEhC,OAAS,kBAAAlC,OAAsB,+BAC/B,OACE,OAAAsb,GACA,UAAAlb,GACA,QAAAQ,GACA,YAAAqiB,GACA,QAAA3iB,GACA,YAAAyjB,GAEA,QAAA9iB,GACA,WAAAuR,OACK,6BACP,OACE,kBAAAwR,GACA,sBAAAld,GACA,oBAAAmd,OACK,uCAsCD,OAqPF,YAAA3iB,GA/OI,OAAAf,EANF,QAAAC,OAAA,oBAoTC,SAASkjB,GAAUpgB,EAAuB,CAC/C,OAAI,OAAOA,EAAU,IACZ,IAGF,GADK,GAAGA,CAAK,GAAG,QAAQ,WAAY,EAAE,EAAE,MAAM,EAAG,CAAC,CAC5C,OACf,CAlXA,IAwBM4gB,GAMAC,GAMAC,GAMAC,GAMOC,GA8BPC,GAwDAC,GAqDAC,GAwGAC,GAsCAC,GAzUNpB,GAAA5kB,EAAA,kBAmBAqgB,KAKMkF,GAAyBnZ,GAAM,KAAK,IACxC,sCAAgC,KAAMqD,IAC7B,CAAE,QAASA,EAAI,kBAAmB,EAC1C,CACH,EAEM+V,GAA0BpZ,GAAM,KAAK,IACzC,sCAAiC,KAAMqD,IAC9B,CAAE,QAASA,EAAI,mBAAoB,EAC3C,CACH,EAEMgW,GAAyBrZ,GAAM,KAAK,IACxC,sCAAgC,KAAMqD,IAC7B,CAAE,QAASA,EAAI,kBAAmB,EAC1C,CACH,EAEMiW,GAAuBtZ,GAAM,KAAK,IACtC,sCAA8B,KAAMqD,IAC3B,CAAE,QAASA,EAAI,gBAAiB,EACxC,CACH,EAEakW,GAAiD3jB,GAAU,CACtE,GAAM,CAAE,CAAE,EAAIX,GAAe,EAC7B,OACEQ,GAACI,GAAA,CACC,MAAO,EAAE,mBAAmB,EAC5B,GAAG,2BACH,UAAU,kCAEV,UAAAJ,GAACF,GAAA,CACC,UAAW,SACX,IAAK,EACL,MAAO,OACP,UAAU,oBAEV,UAAAC,EAACgkB,GAAA,CAAa,GAAG5jB,EAAO,EACxBJ,EAACikB,GAAA,CAAU,GAAG7jB,EAAO,GACvB,EACAH,GAAC,OACC,UAAAD,EAACkkB,GAAA,CAAS,GAAG9jB,EAAO,EACpBJ,EAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,EAAC2jB,GAAA,CAAwB,GAAGvjB,EAAO,EACrC,EACAJ,EAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,EAAC4jB,GAAA,CAAyB,GAAGxjB,EAAO,EACtC,GACF,GACF,CAEJ,EAEM4jB,GAAkD5jB,GAAU,CAChE,GAAM,CAAE,CAAE,EAAIX,GAAe,EAC7B,OACEQ,GAACF,GAAA,CACC,MAAO,OACP,IAAK,EACL,UAAU,4CAEV,UAAAE,GAACF,GAAA,CACC,GAAI,EACJ,GAAI,EACJ,UAAW,SACX,UAAW,QACX,EAAE,KACF,SAAS,UACT,MAAO,GACP,OAAM,GACN,UAAU,YAEV,UAAAC,EAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,WAAE,kBAAkB,EACvB,EACAV,EAACU,GAAK,UAAL,CACC,KAAK,OACL,OAAQ,GACR,KAAM,UACN,SAAUN,EAAM,YAAc,KAC9B,aAAc,GACd,OAAQA,EAAM,gBACd,eAAe,mDAEd,SAAAA,EAAM,UACT,GACF,EACAH,GAACF,GAAA,CACC,GAAI,EACJ,GAAI,EACJ,UAAW,SACX,UAAW,QACX,EAAE,KACF,SAAS,UACT,MAAO,GACP,OAAM,GACN,UAAU,YAEV,UAAAC,EAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,WAAE,sBAAsB,EAC3B,EACAV,EAACU,GAAA,CAAK,KAAK,OAAO,OAAQ,GACvB,SAAAN,EAAM,OACT,GACF,GACF,CAEJ,EAEM6jB,GAA+C7jB,GAAU,CAC7D,GAAM,CAAE,CAAE,EAAIX,GAAe,EAC7B,OACEQ,GAACF,GAAA,CACC,MAAO,OACP,UAAW,MACX,UAAU,wDAEV,UAAAE,GAACF,GAAA,CAAK,UAAW,SAAU,UAAW,QAAS,MAAO,OAAQ,IAAK,EACjE,UAAAC,EAACU,GAAA,CAAK,UAAW,GAAK,WAAE,8BAA8B,EAAE,EACxDT,GAACF,GAAA,CACC,UAAW,SACX,UAAU,4IACV,QAASK,EAAM,eAEf,UAAAJ,EAACU,GAAA,CAAM,WAAE,+BAA+B,EAAE,EAC1CV,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACL,MAAM,6BAEN,SAAAA,EAAC,QAAK,EAAE,8LAA8L,EACxM,GACF,GACF,EACAA,EAAC0jB,GAAA,CACC,KAAK,MACL,QAAS,CACP,cAAe,EAAE,+CAA+C,EAChE,OAAQ,EAAE,+CAA+C,EACzD,cAAe,EAAE,+CAA+C,EAChE,aAAc,EAAE,8CAA8C,CAChE,EAEA,SAAA1jB,EAACH,GAAA,CACC,KAAK,KACL,KAAMG,EAACwjB,GAAA,EAAS,EAChB,QAAQ,YACR,MAAM,UACN,QAASpjB,EAAM,eACf,SAAU,CAACA,EAAM,gBAEjB,cAAY,qCAEX,WAAE,sCAAsC,EAC3C,EACF,GACF,CAEJ,EAEM8jB,GAA8C9jB,GAAU,CAC5D,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvBkH,EAAgC,CACpC,CACE,MAAO,EAAE,gCAAgC,EACzC,UAAW,cACX,OAAS5D,GAEL/C,EAACU,GAAK,UAAL,CACC,KAAM,GACN,SAAQ,GACR,aAAc,GACd,OAAQ,IAAM,CACZN,EAAM,eAAe2C,CAAK,CAC5B,EAEC,SAAAogB,GAAUpgB,CAAK,EAClB,CAGN,EACA,CACE,MAAO,EAAE,wCAAwC,EACjD,UAAW,QACX,OAASA,GACPA,GACI,MAAM,GAAG,EACV,IAAKF,GAAWyb,GAAoB,GAAGzb,CAAC,EAAE,CAAC,EAC3C,KAAK,IAAI,CAChB,EACA,CACE,MAAO,EAAE,sCAAsC,EAC/C,UAAW,sBACX,OAASE,GAAU,CACjB,IAAIsd,EAAKtd,EAAM,KAAK,GAAG,EACvB,OAAIsd,EAAG,SAAW,IAChBA,EAAK,MAGLrgB,EAACiS,GAAA,CAAQ,QAASoO,EAAI,UAAU,kCAC9B,SAAApgB,GAACF,GAAA,CAAK,IAAK,EACT,UAAAC,EAAC,OAAI,UAAU,6CACZ,SAAAqgB,EACH,EACCA,IAAO,MACNrgB,EAAC+a,GAAA,CAAI,MAAO,GAAI,OAAQ,GAAI,UAAU,qBACpC,SAAA/a,EAAC0iB,GAAA,CACC,MAAM,QACN,QAAS,IACT,KAAM,GACN,QAAU7f,GAAM,CACd,UAAU,UAAU,UAAUwd,CAAE,EAChCjgB,GAAO,SAAS,CAClB,EACF,EACF,GAEJ,EACF,CAEJ,CACF,EACA,CACE,MAAO,EAAE,wCAAwC,EACjD,UAAW,aACX,OAAS2C,GACP/C,EAACU,GAAK,UAAL,CAAe,KAAM,OAAQ,aAAa,aACxC,SAAAqC,EACH,CAEJ,EACA,CACE,MAAO,GACP,KAAM,SACN,UAAW,SACX,MAAO,IACP,OAAQ,CAACyX,EAAGtX,IAERjD,GAACF,GAAA,CAAK,UAAW,MAAO,IAAK,EAC3B,UAAAC,EAACmkB,GAAA,CACC,KAAMjhB,EACN,SAAU9C,EAAM,OAChB,SAAUA,EAAM,SAClB,EACAJ,EAACokB,GAAA,CAAa,KAAMlhB,EAAM,SAAU9C,EAAM,SAAU,GACtD,CAGN,CACF,EACA,OACEJ,EAACuG,GAAA,CACC,SAAQ,GACR,QAASI,EACT,QAASvG,EAAM,UACf,WAAYA,EAAM,KAClB,UAAWJ,EAACyjB,GAAA,EAAe,EAC3B,WAAY,CAAC,EACb,WAAYrjB,EAAM,WAClB,iBAAkB,GACpB,CAEJ,EAEM+jB,GAIA/jB,GAAU,CACd,GAAM,CAAE,KAAA8C,EAAM,SAAAqgB,EAAU,SAAA/B,CAAS,EAAIphB,EAC/B,CAACkiB,EAAMW,CAAO,EAAIthB,GAAS,EAAK,EAChC,CAAE,EAAAgB,CAAE,EAAIlD,GAAe,EAE7B,OACEQ,GAAAc,GAAA,CACE,UAAAf,EAACH,GAAA,CACC,KAAK,KACL,MAAM,UACN,QAAQ,YACR,QAAUgD,GAAM,CACdA,EAAE,gBAAgB,EAClBogB,EAAQ,EAAI,CACd,EACA,cAAY,qCAEX,SAAAtgB,EAAE,aAAa,EAClB,EACC2f,GACCtiB,EAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,EAAC8jB,GAAA,CACC,KAAM5gB,EACN,KAAMof,EACN,QAASW,EACT,SAAUM,EACV,SAAU/B,EACZ,EACF,GAEJ,CAEJ,EAEM4C,GAGAhkB,GAAU,CACd,GAAM,CAAE,KAAA8C,EAAM,SAAAggB,CAAS,EAAI9iB,EACrB,CAACkiB,EAAMW,CAAO,EAAIthB,GAAS,EAAK,EAChC,CAAE,EAAAgB,CAAE,EAAIlD,GAAe,EAC7B,OACEQ,GAAAc,GAAA,CACE,UAAAf,EAACH,GAAA,CACC,KAAK,KACL,MAAM,OACN,QAAQ,YACR,QAAUgD,GAAM,CACdA,EAAE,gBAAgB,EAClBogB,EAAQ,EAAI,CACd,EACA,cAAY,uCAEX,SAAAtgB,EAAE,eAAe,EACpB,EACC2f,GACCtiB,EAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,EAAC6jB,GAAA,CACC,KAAM3gB,EACN,KAAMof,EACN,QAASW,EACT,SAAUC,EACZ,EACF,GAEJ,CAEJ,ICzWA,OAAS,aAAAtlB,OAAiB,6BCD1B,OAAS,aAAAmP,GAAW,WAAA7P,GAAS,YAAAyE,OAAgB,QAC7C,OAAS,iBAAA0iB,OAAqB,gCAC9B,OAAS,kBAAA5kB,OAAsB,+BAC/B,OAEE,sBAAA6kB,OACK,sCA4CK,cAAAtkB,OAAA,oBA1CL,IAAKukB,QACVA,EAAA,SAAW,aACXA,EAAA,UAAY,uBACZA,EAAA,OAAS,oBACTA,EAAA,OAAS,oBACTA,EAAA,QAAU,qBACVA,EAAA,OAAS,oBACTA,EAAA,QAAU,qBACVA,EAAA,QAAU,qBACVA,EAAA,kBAAoB,gCATVA,QAAA,IAgBCC,GAA4BpkB,GAAmC,CAC1E,GAAM,CAAE,cAAAqkB,CAAc,EAAIH,GAAmB,EACvC,CAACI,EAASC,CAAU,EAAIhjB,GAC5BvB,EAAM,SAAWqkB,GAAe,aAAe,YACjD,EACM,CAAE,EAAA9hB,CAAE,EAAIlD,GAAe,EAE7BsN,GAAU,IAAM,EACV3M,EAAM,SAAWqkB,GAAe,cAClCE,EAAWvkB,EAAM,SAAWqkB,GAAe,aAAe,YAAY,CAE1E,EAAG,CAACrkB,EAAM,QAASqkB,GAAe,WAAW,CAAC,EAE9C,IAAMtG,EAAQjhB,GAAQ,IACb,CACL,CACE,KAAMyF,EAAE,iBAAiB,EACzB,KAAM,aACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,2wBACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,kBAAkB,EAC1B,KAAM,uBACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,kcACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,eAAe,EACvB,KAAM,oBACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,iZACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,eAAe,EACvB,KAAM,oBACN,KACE3C,GAAC,OACC,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OAEL,SAAAA,GAAC,QACC,EAAE,klEACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,mBAAmB,EAC3B,KAAM,qBACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,2nEACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,mBAAmB,EAC3B,KAAM,oBACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,8yBACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,6BAA6B,EACrC,KAAM,gCACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,qpBACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,mBAAmB,EAC3B,KAAM,qBACN,KACE3C,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,u7CACF,UAAU,iFACZ,EACF,CAEJ,EACA,CACE,KAAM2C,EAAE,iBAAiB,EACzB,KAAM,qBACN,KAAM,EACR,CACF,EACC,CAACA,CAAC,CAAC,EAEAiiB,EAAcP,GAAc,oBAAoB,EAEtD,MAAO,CACL,MAAAlG,EACA,QAAAuG,EACA,YAAAE,EACA,aAAe1hB,GAAuB,CAChC,OAAOA,EAAK,KAAS,MAIzByhB,EAAWzhB,EAAK,IAAK,EACrBuhB,GAAe,cAAc,CAC3B,KAAMvhB,EAAK,KACX,KAAMA,EAAK,IACb,CAAC,EACH,CACF,CACF,EChNA,OAAS,kBAAAzD,OAAsB,+BAC/B,OAAS,MAAAyM,OAAU,6BACnB,OAGE,YAAA2Y,GACA,WAAAC,GAEA,sBAAAR,OACK,sCAgBG,cAAAtkB,OAAA,oBATH,IAAM+kB,GACX3kB,GACG,CACH,GAAM,CAAE,SAAA4kB,EAAU,cAAAC,EAAe,WAAAC,EAAY,GAAG3jB,CAAK,EAAInB,EAEzD,OACEJ,GAAC6kB,GAAA,CACC,YACEzkB,EAAM,YAAc,KAClBJ,GAACmlB,GAAA,CACC,QAAS/kB,EAAM,eAAe,YAC9B,cAAeA,EAAM,cACrB,MAAOA,EAAM,MACZ,GAAG6kB,EACN,EAGJ,cAAe7kB,EAAM,cACrB,WAAY,CACV,GAAG8kB,EACH,QAAShZ,GAAG,oBAAqBgZ,GAAY,OAAO,EACpD,UAAWhZ,GAAG,gBAAiBgZ,GAAY,SAAS,EACpD,YAAahZ,GACX,+BACA,kBACA,6BACAgZ,GAAY,WACd,CACF,EACC,GAAG3jB,EAEH,SAAAyjB,EACH,CAEJ,EAMMG,GAAqC/kB,GAAU,CACnD,GAAM,CAAE,SAAAglB,EAAU,UAAAC,CAAU,EAAIf,GAAmB,EAC7C,CAAE,EAAA3hB,CAAE,EAAIlD,GAAe,EAC7B,OACEO,GAAC8kB,GAAA,CACC,MAAOniB,EAAE,kBAAkB,EAC1B,GAAGvC,EACJ,KAAMglB,EACN,aAAe9C,GAAS+C,EAAU/C,CAAI,EACtC,aAAezf,GAAM,CACnBzC,EAAM,eAAeyC,CAAC,EACtBzC,EAAM,eAAe,gBAAgB,CACnC,KAAMyC,EAAE,MAAQ,GAChB,KAAMA,EAAE,IACV,CAAC,CACH,EACF,CAEJ,EC1EA,OAAS,QAAA9C,GAAM,OAAAgb,OAAW,6BAC1B,OACE,iBAAAuK,GACA,aAAAC,OAEK,sCCNP,OAAgB,iBAAAjQ,GAAe,cAAAC,GAAY,YAAA5T,GAAU,WAAAzE,OAAe,QA+BhE,cAAA8C,OAAA,oBAtBJ,IAAMwlB,GAAgBlQ,GAAkC,CACtD,SAAU,EACZ,CAAuB,EAEVmQ,GAAmB,IACvBlQ,GAAWiQ,EAAa,EAGpBE,GAERtlB,GAAU,CACb,GAAM,CAAE,cAAAqkB,EAAe,SAAAO,CAAS,EAAI5kB,EAC9B,CAACulB,EAAUC,CAAW,EAAIjkB,GAAS,EAAI,EACvCkkB,EAAgB3oB,GACpB,KAAO,CACL,SAAUyoB,EACV,iBAAkBC,EAClB,cAAenB,CACjB,GACA,CAACkB,EAAUC,EAAanB,CAAa,CACvC,EACA,OACEzkB,GAACwlB,GAAc,SAAd,CAAuB,MAAOK,EAC5B,SAAAb,EACH,CAEJ,EDlBM,OAOI,OAAAhlB,GAPJ,QAAAC,OAAA,oBAPC,IAAM6lB,GAIR1lB,GAEDJ,GAAC0lB,GAAA,CAAgB,GAAGtlB,EAClB,SAAAH,GAACF,GAAA,CACC,UAAW,SACX,MAAO,OACP,OAAQ,OACR,UAAU,mCAEV,UAAAC,GAAC,UAAO,UAAU,iFAChB,SAAAA,GAACslB,GAAA,CACE,GAAGllB,EAAM,aACV,QAASA,GAAO,QAChB,SAAUA,GAAO,MACjB,cAAeA,EAAM,cACvB,EACF,EACAJ,GAAC+a,GAAA,CAAI,UAAU,kGACZ,SAAA3a,EAAM,SACT,EACAJ,GAAC,UAAO,UAAU,6HAChB,SAAAA,GAACulB,GAAA,CACC,UAAWnlB,EAAM,gBAAgB,UACjC,QAASA,GAAO,QAChB,cAAeA,EAAM,eAAe,cACtC,EACF,GACF,EACF,EHzBA,mBAAAW,GAGI,OAAAf,OAHJ,oBATG,IAAM+lB,GAER3lB,GAAU,CACb,IAAM7B,EAAQimB,GAAyB,CACrC,QAASpkB,EAAM,eAAe,OAChC,CAAC,EACK,CAAE,SAAAnB,CAAS,EAAIrB,GAAU,EAE/B,OACEoC,GAAAe,GAAA,CACG,SAAA9B,EAECe,GAAC8lB,GAAA,CAAuB,GAAGvnB,EAAQ,GAAG6B,EAAO,EAE7CJ,GAAC+kB,GAAA,CAAiB,GAAGxmB,EAAQ,GAAG6B,EAAO,EAE3C,CAEJ,EK1BA,IAAA4lB,GAAA,GAAAvkB,EAAAukB,GAAA,kBAAAxf,GAAA,uBAAAwB,GAAA,gBAAA5G,GAAA,gBAAA6Z,GAAA,sBAAAE,GAAA,aAAAna,GAAA,+BAAAyI,GAAA,8BAAAI,GAAA,8BAAAO,GAAA,yBAAAhB,GAAA,2BAAA8L,GAAA,iBAAA+Q,GAAA,qBAAAC,GAAA,8BAAAC,GAAA,6BAAAC,GAAA,wBAAAC,GAAA,4BAAAC,GAAA,kBAAAzK,GAAA,sBAAAc,GAAA,2BAAAta,GAAA,0BAAAoC,GAAA,yBAAAmR,GAAA,6BAAAxN,GAAA,0BAAAY,GAAA,yBAAAwT,KAAA9a,KACA2T,KAEAiG,KACAnT,KAEA2U,KCcAjG,KAlBA,OACE,kBAAA0P,GACA,gBAAAhL,GACA,eAAAC,GACA,eAAAC,OAEK,gCACP,OAAS,kBAAAhc,OAAsB,+BAC/B,OACE,QAAA2N,GACA,YAAAD,GACA,QAAApN,GACA,QAAAW,GACA,cAAA4F,GACA,OAAAyU,GACA,MAAA7O,OACK,6BAqDG,cAAAlM,GAOJ,QAAAC,OAPI,oBA9CV,IAAMumB,GAAiE,CACrE,MAAO,OACP,UAAW,IACX,OAAQ,GACV,EAEaH,GAcRjmB,GAAU,CACb,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CACJ,KAAAZ,EACA,eAAAib,EACA,QAAA/a,EACA,UAAAiX,EACA,UAAAqG,EACA,OAAApF,EACA,eAAA2B,EACA,eAAAyB,EACA,YAAAnB,EACA,SAAApT,CACF,EAAI1F,EAEEge,EAAavf,EAAK,OACpBA,EACCwb,IACC,CAAE,cAAe,EAAG,IAAK,CAAE,EAC3B,CAAE,cAAe,IAAK,IAAK,GAAI,CACjC,EAEJ,OACEpa,GAAC,OACE,UAAAiZ,GAAeA,EAAY,OAAS,GACnClZ,GAAC+a,GAAA,CAAI,GAAI,EACP,SAAA/a,GAACsG,GAAA,CACC,MAAO4S,EACP,SAAUpT,IAAa,IAAM,CAAC,GAC9B,UAAU,2BACZ,EACF,EAEF7F,GAACmN,GAAA,CACC,MAAO6J,GAAU,GACjB,mBACA,WAAY,CAAE,SAAU,sBAAuB,QAAS,WAAY,EACpE,cAAgBlU,GAAU6V,EAAe7V,CAAmB,EAE5D,UAAA/C,GAACmN,GAAA,CACC,MAAO,EAAE,kBAAkB,EAC3B,WACA,UAAU,eAEV,SAAAnN,GAACumB,GAAA,CACC,KAAMnI,EACN,UAAWpI,IAAcoI,GAAY,QAAU,IAAM,EACrD,yBAA0BoI,GAC5B,EACF,EACAxmB,GAACmN,GAAA,CACC,MAAO,EAAE,kBAAkB,EAC3B,WACA,UAAU,eAEV,SAAAnN,GAACumB,GAAA,CACC,KAAMnI,EACN,UAAWpI,IAAcoI,GAAY,QAAU,IAAM,EACrD,yBAA0BoI,GAC5B,EACF,EACAxmB,GAACmN,GAAA,CACC,MAAO,EAAE,mBAAmB,EAC5B,YACA,UAAU,eAEV,SAAAnN,GAACumB,GAAA,CACC,KAAMnI,EACN,UAAWpI,IAAcoI,GAAY,QAAU,IAAM,EACrD,yBAA0BoI,GAC5B,EACF,EACAxmB,GAACmN,GAAA,CACC,MAAO,EAAE,mBAAmB,EAC5B,YACA,UAAU,eAEV,SAAAnN,GAACumB,GAAA,CACC,KAAMnI,EACN,UAAWpI,IAAcoI,GAAY,QAAU,IAAM,EACrD,yBAA0BoI,GAC5B,EACF,GACF,EACAvmB,GAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,IAAK,EAAG,GAAI,EACrD,UAAAE,GAACF,GAAA,CACC,IAAK,EACL,UAAU,SACV,UAAU,QACV,UAAU,6DAEV,UAAAC,GAACU,GAAA,CAAK,UAAU,eAAe,UAAW,GAAI,KAAK,MAChD,WAAE,qCAAsC,CAAE,OAAQ2b,CAAU,CAAC,EAChE,EACArc,GAACU,GAAK,QAAL,CAAa,KAAK,KAAK,QAAS3B,EAAS,KAAK,cAAc,SAAQ,GAClE,SAAAiX,EAAY,KAAO8D,EAAe,IACrC,GACF,EACA7Z,GAACF,GAAA,CACC,IAAK,EACL,UAAU,SACV,UAAU,QACV,UAAU,6DAEV,UAAAC,GAACU,GAAA,CAAK,UAAU,eAAe,UAAW,GAAI,KAAK,MAChD,WAAE,qCAAsC,CAAE,OAAQ2b,CAAU,CAAC,EAChE,EACArc,GAACU,GAAK,QAAL,CAAa,KAAK,KAAK,QAAS3B,EAAS,SAAQ,GAAC,eAAc,GAC9D,SAAAiX,EAAY,KAAO8D,EAAe,IACrC,GACF,EACA7Z,GAACF,GAAA,CACC,IAAK,EACL,UAAU,SACV,UAAU,QACV,UAAU,6DAEV,UAAAC,GAACU,GAAA,CAAK,UAAU,eAAe,UAAW,GAAI,KAAK,MAChD,WAAE,wCAAyC,CAAE,OAAQ2b,CAAU,CAAC,EACnE,EACArc,GAACU,GAAK,QAAL,CAAa,KAAK,KAAK,QAAS3B,EAAS,SAAU,GACjD,SAAAiX,EAAY,KAAO8D,EAAe,IACrC,GACF,GACF,EACA7Z,GAACmN,GAAA,CAAK,aAAc,WAClB,UAAApN,GAACmN,GAAA,CACC,MAAO,WACP,MAAO,EAAE,yCAAyC,EAClD,UAAU,eAEV,SAAAnN,GAACwb,GAAA,CACC,KAAM4C,EACN,UAAWpI,IAAcoI,GAAY,QAAU,IAAM,EACrD,yBAA0BoI,GAC5B,EACF,EACAxmB,GAACmN,GAAA,CACC,MAAO,gBACP,MAAO,EAAE,8CAA8C,EACvD,UAAU,eAEV,SAAAnN,GAACub,GAAA,CACC,KAAM6C,EACN,UAAWpI,IAAcoI,GAAY,QAAU,IAAM,EACrD,yBAA0BoI,GAC5B,EACF,EACAxmB,GAACmN,GAAA,CACC,MAAO,SACP,MAAO,EAAE,wCAAyC,CAAE,OAAQ,EAAG,CAAC,EAChE,UAAU,eAEV,SAAAnN,GAAC,OACC,UAAWkM,GACT,4BACC8J,IAAcoI,GAAY,QAAU,IAAM,IACzC,iBACJ,EAEA,SAAApe,GAACyb,GAAA,CACC,MAAO2C,GAAc,CAAC,GAAG,IAAKlb,IAAe,CAC3C,KAAMA,EAAK,KACX,OAAQA,EAAK,aAAe,EAC5B,SAAUA,EAAK,aAAe,GAAK,EAAI,EAAI,CAC7C,EAAE,EACF,UAAU,gBACZ,EACF,EACF,GACF,GACF,CAEJ,ECzNA,OAAS,QAAA8L,OAAY,QACrB,OAAS,QAAAyX,OAAY,+BACrB,OACE,wBAAAC,GACA,uBAAAC,OACK,6BCNP,OAAgC,WAAAzpB,OAAe,QCe/CwY,KAfA,OAAS,WAAAxY,GAAS,UAAA+Y,GAAQ,aAAAlJ,OAAiB,QAC3C,OACE,iBAAA6Z,GACA,aAAAC,GACA,uBAAAC,GACA,gBAAAC,GACA,iBAAAC,GACA,cAAA7pB,GAEA,mBAAAiZ,GACA,iBAAA6Q,OACK,gCACP,OAAS,kBAAAC,GAAgB,UAAAC,OAAc,gCACvC,OAAS,iBAAA1pB,OAAqB,oCAC9B,OAAS,qBAAAC,OAAyB,gCAG3B,IAAM0pB,GAAiB,CAAC,CAAE,KAAAzd,EAAOwd,GAAO,MAAO,IAAyB,CAC7E,IAAME,EAA0BL,GAC9Brd,IAASwd,GAAO,GAAKD,GAAe,QAAUA,GAAe,KAC/D,EACM,CAACI,CAAgB,EAAIR,GAAoBnd,CAAI,EAC7C,CAAC4d,CAAO,EAAIX,GAAc,EAC1B,CAAE,MAAAroB,CAAM,EAAIpB,GAAW,EACvB,CAAE,KAAA0B,EAAM,OAAA2oB,CAAO,EAAIpR,GACvB,oBACA,CAAE,kBAAmB,GAAM,gBAAiB,EAAG,GAAG6Q,EAAc,CAClE,EAEMQ,EAAYV,GAAapd,CAAc,EACvC+d,EAAWb,GAAU,UAAU,EAE/Bc,EAAazqB,GAAQ,IAClBqqB,IAAUG,CAAQ,EACxB,CAACA,EAAUH,CAAO,CAAC,EAEhBK,EAAY3R,GAA0BvY,GAAkB,YAAY,EAEpEmqB,EAAW5R,GAA6C,IAAI,EAElE,OAAAlJ,GAAU,KACJ6a,EAAU,UAAYrpB,EAAM,SAC9BqpB,EAAU,QAAUrpB,EAAM,OAC1BspB,EAAS,QAAU,WAAW,IAAM,CAClCL,EAAO,CACT,EAAG,GAAI,GAEF,IAAM,CACPK,EAAS,SACX,aAAaA,EAAS,OAAO,CAEjC,GACC,CAACtpB,EAAM,MAAM,CAAC,EAEV,CACL,wBAAA8oB,EACA,iBAAAC,EACA,UAAAG,EACA,WAAAE,EACA,aAAc9oB,CAChB,CACF,EAEaipB,GAAuB,IAAM,CACxC,GAAM,CACJ,wBAAAT,EACA,iBAAAC,EACA,UAAAG,EACA,WAAAE,EACA,aAAAI,CACF,EAAItS,GAAmB,EACjB,CAAE,MAAAlX,CAAM,EAAIpB,GAAW,EACvB,CAAE,aAAAwB,CAAa,EAAIlB,GAAc,EACjCuqB,EACJzpB,EAAM,SAAWb,GAAkB,eACnCa,EAAM,SAAWb,GAAkB,8BAErC,MAAO,CACL,wBAAA2pB,EACA,iBAAAC,EACA,UAAAG,EACA,WAAAE,EACA,SAAAK,EACA,aAAAD,EACA,aAAAppB,CACF,CACF,EDnFAkY,KACAnB,KAoBI,cAAA1V,OAAA,oBAlBG,IAAM8W,GAAW,+BAEXoP,GACX9lB,GACG,CACH,GAAM,CAAE,KAAAuJ,EAAM,SAAAqb,CAAS,EAAI5kB,EACrB7B,EAAQqY,GAAqBE,GAAU,CAAE,WAAY,EAAK,CAAC,EAC3DmR,EAAcb,GAAe,CAAE,KAAMzd,CAAK,CAAC,EAE3Ckc,EAAgB3oB,GAA8B,KAC3C,CACL,GAAGqB,EACH,KAAMoL,EACN,GAAGse,CACL,GACC,CAAC1pB,EAAOoL,EAAMse,CAAW,CAAC,EAE7B,OACEjoB,GAACwV,GAAgB,SAAhB,CAAyB,MAAOqQ,EAC9B,SAAAb,EACH,CAEJ,EDnBAnO,KAOI,cAAA7W,OAAA,oBAJG,IAAMsmB,GAAoC,IAAM,CACrD,IAAM/nB,EAAQqY,GAAqBE,GAAU,CAAE,WAAY,EAAK,CAAC,EAC3D,CAAE,QAAA/X,EAAS,UAAAiX,CAAU,EAAIwG,GAAqB,EACpD,OACExc,GAACqmB,GAAA,CACE,GAAGrX,GACF,CACE,OACA,YACA,iBACA,iBACA,iBACA,SACA,cACA,UACF,EACAzQ,CACF,EACA,QAASQ,EACT,UAAWiX,EACb,CAEJ,EAEaoQ,GAA2B,2BAE3BD,GAA4B,4BAEzCQ,GAAoBP,GAA0BE,GAAyB,CACrE,MAAO,IAAMG,GAAK,EAAE,gCAAgC,CACtD,CAAC,EAEDC,GAAqBP,GAA2BG,GAAyB,CACvE,MAAO,IAAMG,GAAK,EAAE,gCAAgC,EACpD,WAAY,CACV,QAAS,eACX,CACF,CAAC,EFnCDld,KAMAgB,KKpBA,OAAOC,OAAW,QAClB,OAAS,QAAAjK,GAAM,aAAA3C,OAAiB,6BCAhC,OAAS,WAAAsqB,GAAS,aAAAC,OAAiB,gCACnC,OAAS,kBAAA1oB,OAAsB,+BAC/B,OAAS,iBAAAhC,OAAqB,oCAC9B,OAAS,QAAAsC,OAAY,6BACrB,OAAS,uBAAAqoB,OAA2B,sCAEpC1mB,KCLA4Z,KADA,OAAS,cAAAzK,OAAkB,gCCE3B0L,KAHA,OAAS,eAAAtf,OAAmB,QAC5B,OAAS,mBAAAK,GAAiB,qBAAAC,OAAyB,gCACnD,OAAS,SAAAI,OAAa,6BAIf,IAAM0qB,GAA0B,IAAM,CAC3C,GAAM,CAACxpB,CAAI,EAAItB,GAAkB,EAC3B,CAACwB,EAASC,CAAU,EAAI1B,GAC5Bgf,GACA,EACF,EACMgM,EAAqBrrB,GAAY,IAC9BU,GAAM,KAAKyoB,EAAwB,EACzC,CAAC,CAAC,EACL,MAAO,CACL,UAAWvnB,GAAM,WAAW,iBAC5B,UAAWA,GAAM,mBACjB,QAASE,EACT,WAAYC,EACZ,mBAAoBspB,CACtB,CACF,ECrBA,OAAgB,SAAAvL,OAAa,QAC7B,OAAS,QAAAwL,GAAM,aAAAC,OAAiB,gCAChC,OAAS,kBAAA/oB,OAAsB,+BAC/B,OAAS,cAAAoR,OAAkB,gCAC3B,OAAS,oBAAA4X,GAAkB,MAAAvc,GAAI,QAAAnM,GAAM,QAAAW,OAAY,6BA8BzC,OA0CI,YAAAK,GA1CJ,OAAAf,GAGA,QAAAC,OAHA,oBA3BD,IAAMyoB,GAKRtoB,GAAU,CACb,GAAM,CAAE,KAAAvB,EAAM,UAAAmX,EAAW,UAAA2S,EAAW,UAAAC,EAAW,QAAA7pB,EAAS,mBAAAupB,CAAmB,EACzEloB,EACI,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvBopB,EAAU9L,GAAM,EACtB,OACE9c,GAACF,GAAA,CACC,EAAG,EACH,MAAO,OACP,UAAU,SACV,QAAQ,UACR,UAAWmM,GACT,+GACF,EAEA,UAAAjM,GAACF,GAAA,CACC,MAAO,OACP,QAAS,SACT,UAAW,QACX,UAAW,SACX,IAAK,EAEL,UAAAC,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAiC,EAAE,sBAAsB,EAC3B,EACA1C,GAACF,GAAA,CAAK,QAAS,QAAS,UAAW,SACjC,UAAAC,GAACU,GAAK,QAAL,CACC,SAAQ,GACR,KAAK,OACL,OAAO,WACP,QAAS3B,EAER,SAAA4pB,EACH,EACA3oB,GAACU,GAAK,QAAL,CACC,SAAQ,GACR,KAAK,cACL,KAAK,KACL,OAAO,WACP,OAAQ,IACR,OAAQ,IACR,QAAS3B,EAER,SAAA6pB,EACH,GACF,EACA3oB,GAACS,GAAA,CACC,KAAK,KACL,UAAW,GACX,UAAU,wDACV,QAAS4nB,EAER,UAAA3lB,EAAE,gCAAgC,EACnC3C,GAACyoB,GAAA,CAAiB,UAAU,4BAA4B,GAC1D,GACF,EACAzoB,GAACD,GAAA,CACC,MAAO,OACP,QAAS,SACT,UAAW,SACX,UAAW,SAEX,SAAAC,GAACwoB,GAAA,CAAU,KAAM3pB,GAAQgS,GAAY,MAAO,IAAK,OAAQ,GACtD,UAACmF,GACA/V,GAAAc,GAAA,CACE,UAAAf,GAAC,QACC,SAAAC,GAAC,kBAAe,GAAI4oB,EAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IACnD,UAAA7oB,GAAC,QAAK,UAAU,UAAU,OAAO,KAAK,YAAa,GAAK,EACxDA,GAAC,QAAK,UAAU,UAAU,OAAO,OAAO,YAAa,EAAG,GAC1D,EACF,EACAA,GAACuoB,GAAA,CACC,KAAK,UACL,QAAQ,gBACR,OAAQ,oBACR,YAAa,IACb,IAAK,GACL,kBAAmB,GACnB,KAAM,QAAQM,CAAO,IACvB,GACF,EAEJ,EACF,GACF,CAEJ,EFzFI,cAAA7oB,OAAA,oBAJG,IAAM8oB,GAAwC,IAAM,CACzD,GAAM,CAAE,KAAAjqB,EAAM,UAAAmX,CAAU,EAAIJ,GAAqB,EAC3CrX,EAAQ8pB,GAAwB,EACtC,OACEroB,GAAC0oB,GAAA,CACC,KAAM7pB,GAAQgS,GACd,UAAWmF,EACV,GAAGzX,EACN,CAEJ,EGhBA,OAAoC,WAAArB,OAAe,QACnD,OACE,aAAA6rB,GACA,cAAA5rB,GACA,aAAA6rB,GAEA,sBAAAxrB,OACK,gCACP,OAAS,kBAAAiC,OAAsB,+BAC/B,OAAS,iBAAAhC,OAAqB,oCAC9B,OAAS,qBAAAC,GAAmB,kBAAAurB,OAAsB,gCAClD,OACE,MAAA/c,GACA,SAAAvO,GACA,SAAAwE,GACA,iBAAA2I,GACA,QAAA/K,GACA,YAAA2iB,GACA,aAAAwG,OACK,6BA4EO,OAIE,OAAAlpB,GAJF,QAAAC,OAAA,oBAnEd,IAAMkpB,GAAmB,IAAM,CAC7B,GAAM,CAAE,MAAA5qB,EAAO,QAAAiS,CAAQ,EAAIrT,GAAW,EAChC,CAAE,aAAAwB,EAAc,gBAAAC,EAAiB,cAAA0C,CAAc,EAAI7D,GAAc,EACjE,CAAE,EAAAkF,CAAE,EAAIlD,GAAe,EAEvB2pB,EAAa,CACjB,aAAc,CACZ,YAAazmB,EAAE,gCAAgC,EAC/C,UAAW,4DACb,EACA,cAAe,CACb,YAAaA,EAAE,uCAAuC,EACtD,UAAW,4DACb,EACA,YAAa,CACX,YAAaA,EAAE,uCAAuC,EACtD,UAAW,4DACb,EACA,gBAAiB,CACf,YAAaA,EAAE,uCAAuC,EACtD,UAAW,4DACb,EACA,QAAS,CACP,YAAa,GACb,UAAW,GACX,eAAgB,GAChB,UAAW,EACb,CACF,EAEA,OAAOzF,GAAQ,IAAM,CACnB,GAAI0B,EACF,OAAOwqB,EAAW,cAGpB,GAAIzqB,EACF,OAAOyqB,EAAW,aAGpB,OAAQ7qB,EAAM,OAAQ,CACpB,KAAKb,GAAkB,aACrB,OAAO0rB,EAAW,cACpB,KAAK1rB,GAAkB,YACrB,OAAO0rB,EAAW,YACpB,KAAK1rB,GAAkB,gBACrB,OAAO0rB,EAAW,gBACpB,QACE,OAAOA,EAAW,OACtB,CACF,EAAG,CAAC7qB,EAAM,OAAQI,CAAY,CAAC,CACjC,EAEO,SAAS0qB,GAAgB,CAAE,SAAArE,CAAS,EAAkC,CAE3E,GAAM,CAACsE,CAAM,EAAIN,GAAU,UAAW,CACpC,KAAM,eACR,CAAC,EACK,CAAE,EAAArmB,CAAE,EAAIlD,GAAe,EAwB7B,OAAOO,GAAC,UAAO,QAtBI,IAAM,CACvBrC,GAAM,OAAO,CACX,MAAOgF,EAAE,mCAAmC,EAC5C,KAAM,KACN,QACE3C,GAAC,OACC,SAAAA,GAAC,OAAI,UAAU,kGACZ,SAAAspB,EAAO,IAAI,CAACpmB,EAAMod,IACjBrgB,GAAC,OAEC,UAAU,wDAEV,UAAAD,GAACkpB,GAAA,CAAU,QAAShmB,EAAK,SAAU,KAAK,MAAM,EAC9ClD,GAAC,OAAK,SAAAkD,EAAK,KAAK,IAJXod,CAKP,CACD,EACH,EACF,CAEJ,CAAC,CACH,EAEqC,SAAA0E,EAAS,CAChD,CAEO,IAAMuE,GAAyCnpB,GACpDH,GAAC,OACC,MAAM,6BACN,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACJ,GAAGG,EAEJ,UAAAJ,GAAC,QAAK,EAAE,kNAAkN,EAC1NA,GAAC,QAAK,EAAE,gMAAgM,EACxMA,GAAC,QAAK,EAAE,iMAAiM,GAC3M,EAGIwpB,GAAY,IAEdvpB,GAAC,OAAI,UAAU,4DACb,UAAAD,GAAC,OAAI,UAAU,6DACb,SAAAA,GAAC,OACC,IAAI,8DACJ,UAAU,iDACZ,EACF,EACAC,GAAC,OAAI,UAAU,sFACb,UAAAD,GAAC,OAAI,UAAU,iGACb,SAAAA,GAACqpB,GAAA,CACC,SAAArpB,GAACupB,GAAA,CACC,UAAU,0FACV,MAAO,CAAE,OAAQ,CAAE,EACrB,EACF,EACF,EACAvpB,GAAC,OAAI,UAAU,wDAAwD,eAEvE,GACF,GACF,EAIEypB,GAAkB,IAAM,CAC5B,GAAM,CAAE,MAAAlrB,EAAO,QAAAiS,CAAQ,EAAIrT,GAAW,EAChC,CAAE,UAAAmB,CAAU,EAAId,GAAmB,EACnC,CAAE,EAAAmF,CAAE,EAAIlD,GAAe,EACvBiqB,EAAgB,IAAM,CAC1B,UAAU,UAAU,UAAUnrB,EAAM,SAAW,EAAE,EACjD4D,GAAM,QAAQQ,EAAE,oBAAoB,CAAC,CACvC,EAEMgnB,EAAmBzsB,GAAQ,IAC3BoB,IAGAC,EAAM,SAAWb,GAAkB,8BAC9BksB,GAAqB,GAAG,eAE1B,MACN,CAACtrB,EAAWC,EAAM,MAAM,CAAC,EAEtBsrB,EAAW3sB,GAAQ,IAAM,CAC7B,GAAKqB,EAAM,QAGX,OACE0B,GAACF,GAAA,CAAK,UAAU,uCAAuC,KAAM,EAC1D,UAAA+K,GAAcvM,EAAM,SAAW,EAAE,EAClCyB,GAAC,UACC,UAAU,qBACV,QAAS,IAAM,CACb0pB,EAAc,CAChB,EAEA,SAAA1pB,GAAC0iB,GAAA,CACC,KAAM,GACN,UAAU,4BACV,QAAS,EACX,EACF,GACF,CAEJ,EAAG,CAACnkB,EAAM,OAAO,CAAC,EACZurB,EAAY5sB,GAAQ,IACpBysB,IAAqBV,GAAe,IAC/BjpB,GAACwpB,GAAA,EAAU,EAIlBvpB,GAACF,GAAA,CAAK,KAAM,EAAG,UAAW,SAAU,UAAU,eAC5C,UAAAC,GAAC,OACC,IAAI,yDACJ,UAAU,eACZ,EAAE,UAEJ,EAED,CAAC2pB,CAAgB,CAAC,EAEfI,EAAU7sB,GAAQ,IAAM,CAC5B,IAAI8sB,EAAK,GACT,OAAIL,GAAoBV,GAAe,IACrCe,EACE,4FACOL,GAAoBV,GAAe,SAC5Ce,EACE,6FAEGA,CACT,EAAG,CAACL,CAAgB,CAAC,EACrB,OACE1pB,GAAC,OACC,UAAWiM,GAAG,CACZ,kHACA6d,CACF,CAAC,EAEA,UAAAF,EACAC,GACH,CAEJ,EAEaG,GAA0B,IAAM,CAC3C,GAAM,CAAE,MAAA1rB,CAAM,EAAIpB,GAAW,EACvB,CAAE,aAAAwB,CAAa,EAAIlB,GAAc,EACjC,CAAE,YAAAysB,EAAa,UAAAC,CAAU,EAAIhB,GAAiB,EAYpD,OAV2BjsB,GAAQ,IAC7BqB,EAAM,SAAWb,GAAkB,8BAC9B,GAELiB,EACK,GAEFJ,EAAM,QAAUb,GAAkB,cACxC,CAACa,EAAM,OAAQI,CAAY,CAAC,EAGtBqB,GAACypB,GAAA,EAAY,EAIpBzpB,GAAC,OACC,UAAWkM,GAAG,CACZ,iHACAie,CAMF,CAAC,EAED,SAAAnqB,GAAC,OACC,UAAWkM,GACT,6FACA,2BACF,EAEC,SAAAge,EACH,EACF,CAEJ,EAGA,SAASN,IAAuB,CAC9B,GAAI,CACF,IAAMQ,EAAoB,aAAa,QAAQ,qBAAqB,EAEpE,OADaA,EAAoBrB,GAAUqB,CAAiB,EAAI,IAElE,MAAc,CAEd,CACF,CC5RA,OAAS,kBAAA3qB,OAAsB,+BAC/B,OACE,QAAAM,GACA,QAAAW,GACA,iBAAA2pB,GACA,oBAAA5B,GACA,MAAAvc,OACK,6BAEP,OAAS,mBAAAoe,OAAuB,gCAoCxB,OACE,OAAAtqB,GADF,QAAAC,OAAA,oBAlCR,IAAMmO,GAAYzD,GACT,OAAOA,GAAQ,UAAY,CAAC,OAAO,MAAMA,CAAG,EAQxC4f,GAAqDnqB,GAAU,CAC1E,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAE,aAAAsoB,EAAc,cAAAtD,CAAc,EAAIrkB,EAClCoqB,EAASzC,GAAc,gBAAgB,qBAAqB,EAClE,OACE9nB,GAACF,GAAA,CACC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAkBV,UAAAE,GAACF,GAAA,CAAK,UAAU,+DACd,UAAAE,GAACF,GAAA,CAAK,UAAU,+BACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yDACb,WAAE,iCAAiC,EACtC,EACAV,GAACU,GAAA,CAAK,UAAU,yDACb,WAAE,sBAAsB,EAC3B,GACF,EACAV,GAACqqB,GAAA,EAAc,GACjB,EACApqB,GAACF,GAAA,CAAK,UAAU,iEACd,UAAAC,GAAC,OACC,IAAI,0DACJ,IAAI,OACJ,UAAU,aACZ,EACAA,GAACU,GAAA,CACC,UAAWwL,GACT,gCACAkC,GAASoc,CAAM,GAAKA,IAAW,EAC3B,yBACA,2BACN,EAEC,SAAAF,GAAgBE,EAAQ,CAAE,IAAK,EAAG,SAAU,IAAK,CAAC,EACrD,EACAxqB,GAACU,GAAA,CAAK,UAAU,0DAA0D,iBAE1E,EACAV,GAACyoB,GAAA,CACC,KAAM,GACN,MAAM,QACN,UAAU,cACV,QAAS,IAAM,CACbhE,GAAe,cAAc,CAC3B,KAAM,mCACN,KAAM,EAAE,wBAAwB,CAClC,CAAC,CACH,EACF,GACF,GACF,CAEJ,ECzFA,OAAS,kBAAAhlB,OAAsB,+BAC/B,OACE,QAAAM,GACA,QAAAW,GACA,2BAAAhB,GACA,yBAAAE,GACA,qBAAA6qB,GACA,sBAAA9qB,OACK,6BAiCC,OAQI,OAAAK,GARJ,QAAAC,OAAA,oBAlBD,IAAMyqB,GAAoCtqB,GAAU,CACzD,GAAM,CAAE,CAAE,EAAIX,GAAe,EAEvBkrB,EAAgB,IAAM,CAC1BvqB,EAAM,eAAe,cAAc,CACjC,0BACA,KAAM,EAAE,iBAAiB,CAC3B,CAAC,CACH,EAEA,OACEH,GAACF,GAAA,CACC,UAAW,MACX,MAAO,OACP,OAAQ,OACR,UAAU,+BAET,UAAAK,EAAM,eACLH,GAACF,GAAA,CACC,UAAU,SACV,KAAM,EACN,UAAW,SACX,UAAU,gCACV,QAASK,GAAO,UAEhB,UAAAJ,GAAC,OAAI,UAAU,4FACb,SAAAA,GAACN,GAAA,CAAwB,KAAM,GAAI,MAAM,QAAQ,QAAS,EAAG,EAC/D,EACAM,GAACU,GAAA,CAAK,UAAU,gCACb,WAAE,gBAAgB,EACrB,GACF,EAEDN,EAAM,eACLH,GAACF,GAAA,CACC,UAAU,SACV,KAAM,EACN,UAAW,SACX,UAAU,gCACV,QAASK,GAAO,WAEhB,UAAAJ,GAAC,OAAI,UAAU,4FACb,SAAAA,GAACL,GAAA,CAAmB,KAAM,GAAI,MAAM,QAAQ,QAAS,EAAG,EAC1D,EACAK,GAACU,GAAA,CAAK,UAAU,gCACb,WAAE,iBAAiB,EACtB,GACF,EAEDN,EAAM,eACLH,GAACF,GAAA,CACC,UAAU,SACV,KAAM,EACN,UAAW,SACX,UAAU,gCACV,QAASK,GAAO,WAEhB,UAAAJ,GAAC,OAAI,UAAU,4FACb,SAAAA,GAACJ,GAAA,CAAsB,KAAM,GAAI,MAAM,QAAQ,QAAS,EAAG,EAC7D,EACAI,GAACU,GAAA,CAAK,UAAU,gCACb,WAAE,iBAAiB,EACtB,GACF,EAEFT,GAACF,GAAA,CACC,UAAU,SACV,KAAM,EACN,UAAW,SACX,UAAU,gCAEV,UAAAC,GAAC,OACC,UAAU,4FACV,QAAS2qB,EAET,SAAA3qB,GAACyqB,GAAA,CACC,KAAM,GACN,MAAM,QACN,QAAS,EACT,QAAQ,YACR,UAAU,4BACZ,EACF,EACAzqB,GAACU,GAAA,CAAK,UAAU,gCACb,WAAE,iBAAiB,EACtB,GACF,EACAT,GAACF,GAAA,CACC,UAAU,SACV,KAAM,EACN,UAAW,SACX,UAAU,gCACV,QAASK,GAAO,WAEhB,UAAAJ,GAAC,OAAI,UAAU,4FACb,SAAAA,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,GAAC,QACC,EAAE,qpBACF,KAAK,QACP,EACF,EACF,EACAA,GAACU,GAAA,CAAK,UAAU,gCACb,WAAE,6BAA6B,EAClC,GACF,GACF,CAEJ,EC1IA,OAAa,WAAAxD,OAAe,QAC5B,OAAS,aAAA6rB,GAAW,cAAA5rB,OAAkB,gCACtC,OAAS,kBAAAsC,OAAsB,+BAC/B,OAAS,qBAAA/B,GAAmB,kBAAAurB,OAAsB,gCAClD,OACE,QAAAlpB,GACA,QAAAW,GACA,MAAAwL,GACA,uBAAApF,GACA,WAAAnG,OACK,6BAwCD,OACE,OAAAX,GADF,QAAAC,OAAA,oBAzBC,IAAM2qB,GAAmCxqB,GAAU,CACxD,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAE,MAAAlB,CAAM,EAAIpB,GAAW,EAEvBwsB,EAAmBzsB,GAAQ,IAC3BkD,EAAM,UACDA,EAAM,UAEX7B,EAAM,SAAWb,GAAkB,8BAC9BksB,GAAqB,GAAG,eAE1B,KACN,CAACxpB,EAAM,UAAW7B,EAAM,MAAM,CAAC,EAClC,OACE0B,GAACF,GAAA,CACC,UAAW,SACX,MAAO,OACP,OAAQ,OACR,UAAWmM,GAAG,CACZ,iFACAyd,IAAqBV,GAAe,KAAO,mBAC3CU,IAAqBV,GAAe,QAAU,kBAChD,CAAC,EACD,EAAG,EAEH,UAAAhpB,GAACF,GAAA,CAAK,UAAU,MAAM,KAAM,EAAG,UAAW,SACxC,UAAAC,GAACU,GAAA,CAAK,UAAU,wCACb,WAAE,iCAAiC,EACtC,EACAV,GAACW,GAAA,CACC,KAAM,GACN,UAAWuL,GACT9L,EAAM,SAAW,4BAA8B,YACjD,EACA,QAASA,EAAM,cACjB,GACF,EACAH,GAACF,GAAA,CACC,UAAU,MACV,KAAM,EACN,UAAW,WACX,UAAU,WAEV,UAAAC,GAACU,GAAK,QAAL,CACC,QAASN,EAAM,QACf,UAAU,oDAET,SAAAA,EAAM,gBAAkB,KAC3B,EACAJ,GAACU,GAAA,CAAK,UAAU,wDAAwD,gBAExE,GACF,EACAT,GAACF,GAAA,CACC,UAAU,MACV,KAAM,EACN,UAAW,SACX,UAAU,qCAEV,UAAAC,GAACU,GAAK,QAAL,CAAa,QAASN,EAAM,QAC1B,SAAAA,EAAM,WAAa,KACtB,EACAJ,GAACU,GAAK,QAAL,CACC,QAASN,EAAM,QACf,KAAK,cACL,OAAQ,IACR,OAAQ,IAEP,SAAAA,EAAM,WAAa,KACtB,GACF,EACAJ,GAAC,OACC,UAAU,sGACV,QAAS,IACPI,EAAM,eAAe,cAAc,CACjC,yBACA,KAAM,QACR,CAAC,EAGH,SAAAJ,GAAC8G,GAAA,CAAoB,KAAM,GAAI,MAAM,QAAQ,QAAS,IAAM,EAC9D,GACF,CAEJ,EAIA,SAAS8iB,IAAuB,CAC9B,GAAI,CACF,IAAMQ,EAAoB,aAAa,QAAQ,qBAAqB,EAEpE,OADaA,EAAoBrB,GAAUqB,CAAiB,EAAI,IAElE,MAAc,CAEd,CACF,CCxHA,OAAS,kBAAA3qB,OAAsB,+BAC/B,OACE,QAAAM,GACA,QAAAW,GACA,mBAAAmqB,GACA,oBAAApC,OACK,6BAWH,OAWE,OAAAzoB,GAXF,QAAAC,OAAA,oBAHG,IAAM6qB,GAAkC1qB,GAAU,CACvD,GAAM,CAAE,CAAE,EAAIX,GAAe,EAC7B,OACEQ,GAACF,GAAA,CACC,UAAW,MACX,MAAO,OACP,UAAU,8FACV,QAAS,IACPK,GAAO,eAAe,cAAc,CAClC,0BACA,KAAM,EAAE,mBAAmB,CAC7B,CAAC,EAGH,UAAAJ,GAAC6qB,GAAA,CAAgB,KAAM,GAAI,QAAS,IAAM,MAAM,QAAQ,EACxD7qB,GAACU,GAAA,CAAK,UAAU,4DACb,WAAE,mBAAmB,EACxB,EACAV,GAACyoB,GAAA,CACC,UAAU,cACV,KAAM,GACN,QAAS,IACT,MAAM,QACR,GACF,CAEJ,ECvCA,OAAS,kBAAAhpB,OAAsB,+BAC/B,OACE,QAAAM,GACA,QAAAW,GACA,oBAAAqqB,GACA,oBAAAtC,GACA,MAAAvc,OACK,6BAEP,OAAS,mBAAAoe,OAAuB,gCAoCxB,OACE,OAAAtqB,GADF,QAAAC,OAAA,oBAlCR,IAAMmO,GAAYzD,GACT,OAAOA,GAAQ,UAAY,CAAC,OAAO,MAAMA,CAAG,EAQxCqgB,GAA+C5qB,GAAU,CACpE,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAE,aAAAsoB,EAAc,cAAAtD,CAAc,EAAIrkB,EAClCoqB,EAASzC,GAAc,eAAe,oBAAoB,EAChE,OACE9nB,GAACF,GAAA,CACC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAkBV,UAAAE,GAACF,GAAA,CAAK,UAAU,+DACd,UAAAE,GAACF,GAAA,CAAK,UAAU,+BACd,UAAAC,GAACU,GAAA,CAAK,UAAU,yDACb,WAAE,0BAA0B,EAC/B,EACAV,GAACU,GAAA,CAAK,UAAU,yDACb,WAAE,iCAAiC,EACtC,GACF,EACAV,GAAC+qB,GAAA,EAAiB,GACpB,EAEA9qB,GAACF,GAAA,CACC,UAAWmM,GACT,gEACF,EAEA,UAAAlM,GAAC,OACC,IAAI,0DACJ,IAAI,OACJ,UAAU,aACZ,EACAA,GAACU,GAAA,CACC,UAAWwL,GACT,gCACAkC,GAASoc,CAAM,GAAKA,IAAW,EAC3B,yBACA,2BACN,EAEC,SAAAF,GAAgBE,EAAQ,CAAE,IAAK,EAAG,SAAU,IAAK,CAAC,EACrD,EACAxqB,GAACU,GAAA,CAAK,UAAU,0DAA0D,iBAE1E,EACAV,GAACyoB,GAAA,CACC,KAAM,GACN,MAAM,QACN,UAAU,cACV,QAAS,IAAM,CACbhE,GAAe,cAAc,CAC3B,KAAM,gCACN,KAAM,EAAE,wBAAwB,CAClC,CAAC,CACH,EACF,GACF,GACF,CAEJ,ET1BI,mBAAA1jB,GAEI,OAAAf,GAQA,QAAAC,OAVJ,oBAnDG,IAAMgrB,GAA2B,IAAM,CAC5C,GAAM,CACJ,SAAA7rB,EACA,WAAAG,EACA,UAAAD,EACA,eAAA4rB,EACA,UAAAvC,EACA,UAAAC,EACA,QAAA7pB,EACA,UAAAT,EACA,cAAA6sB,EACA,WAAA3rB,EACA,cAAAhB,EACA,cAAA4sB,CACF,EAAIltB,GAAe,EACb,CAAE,EAAAyE,CAAE,EAAIlD,GAAe,EACvBwoB,EAAcH,GAAqB,EACnCuD,EAAgB5F,GAAiB,EACjC,CAAE,cAAA6F,CAAc,EAAI7tB,GAAc,EAClC8tB,EAAMpD,GAAU,EAEhBqD,EAAY,IAAM,CACtB,IAAMC,EAAM,WACVF,IAAQrD,GAAQ,KAAO,GAAGqD,CAAG,IAAM,EACrC,qCACA,OAAO,KAAKE,EAAK,QAAQ,CAC3B,EAEMC,EACJ,OAAOJ,GAAkB,WACrB,IAAM,CACJA,EAAc,CACZ,KAAM,qBACN,KAAM3oB,EAAE,iBAAiB,CAC3B,CAAC,CACH,EACA,OAEAgpB,EACJ,OAAOL,GAAkB,WACrB,IAAM,CACJA,EAAc,CACZ,KAAM,gCACN,KAAM3oB,EAAE,6BAA6B,CACvC,CAAC,CACH,EACA,OAIN,OACE1C,GAAAc,GAAA,CACE,UAAAf,GAAC,OAAI,UAAU,oBACb,SAAAA,GAACiqB,GAAA,EAAoB,EACvB,EACAhqB,GAACF,GAAA,CACC,UAAW,SACX,MAAO,OACP,OAAQ,OACR,UAAU,qBAEV,UAAAE,GAACF,GAAA,CAAK,UAAU,SAAS,MAAM,OAAO,KAAM,EAC1C,UAAAC,GAAC4qB,GAAA,CACC,cAAeO,EACf,eAAgBD,EAChB,UAAWvC,EACX,UAAWC,EACX,QAAS7pB,EACT,SAAUK,EACV,UAAWd,EACX,cAAe+sB,GAAe,cAChC,EACArrB,GAACooB,GAAA,CAAoB,QAASsD,EAA4B,EAC1D1rB,GAAC8oB,GAAA,EAA4B,GAC/B,EACA9oB,GAAC0qB,GAAA,CACC,SAAU,CAACtrB,EACX,WAAYG,EACZ,UAAWD,EACX,WAAYE,EACZ,cAAehB,EACf,cAAe6sB,GAAe,cAC9B,cAAeD,EACf,WAAYO,EACd,EACA3rB,GAACD,GAAA,CACC,UAAW,MACX,MAAO,OACP,OAAQ,OACR,UAAU,YAGV,SAAAE,GAACF,GAAA,CAAK,UAAU,MAAM,UAAU,uBAC9B,UAAAC,GAACuqB,GAAA,CACC,aAActC,EAAY,aAC1B,cAAeoD,GAAe,cAChC,EACArrB,GAACgrB,GAAA,CACC,aAAc/C,EAAY,aAC1B,cAAeoD,GAAe,cAChC,GACF,EAIF,EACArrB,GAAC8qB,GAAA,CAAoB,cAAeO,GAAe,cAAe,GACpE,GACF,CAEJ,ED9FQ,cAAArrB,GAEA,QAAAC,OAFA,oBA7BR,IAAM2rB,GAAkBphB,GAAM,KAAK,IACjC,sCAAmB,KAAMqD,IAChB,CAAE,QAASA,EAAI,WAAY,EACnC,CACH,EAEMge,GAAwBrhB,GAAM,KAAK,IACvC,sCAAuB,KAAMqD,IACpB,CAAE,QAASA,EAAI,iBAAkB,EACzC,CACH,EAEMie,GAAwBthB,GAAM,KAAK,IACvC,sCAAwB,KAAMqD,IACrB,CAAE,QAASA,EAAI,iBAAkB,EACzC,CACH,EAEMke,GAA6BvhB,GAAM,KAAK,IAC5C,sCAA6B,KAAMqD,IAC1B,CAAE,QAASA,EAAI,sBAAuB,EAC9C,CACH,EAEaoY,GAAyB,IAAM,CAC1C,GAAM,CAAE,SAAAhnB,CAAS,EAAIrB,GAAU,EAC/B,OACEoC,GAACkmB,GAAA,CACE,SAAAjnB,EACCe,GAACirB,GAAA,EAAe,EAEhBhrB,GAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAClB,UAAAP,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAAC4rB,GAAA,EAAgB,EACnB,EACA5rB,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAAC6rB,GAAA,EAAsB,EACzB,EACA7rB,GAACO,GAAK,KAAL,CAAU,QAAS,EAClB,SAAAP,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAAC8rB,GAAA,EAAsB,EACzB,EACF,EACA9rB,GAACO,GAAK,KAAL,CAAU,QAAS,EAClB,SAAAP,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAAC+rB,GAAA,EAA2B,EAC9B,EACF,GACF,EAEJ,CAEJ,EWzDA,IAAAC,GAAA,GAAAvqB,EAAAuqB,GAAA,iBAAAC,GAAA,qBAAAC,KCCA,OAAO1hB,IAAS,eAAAvN,OAAmB,QACnC,OAAS,kBAAAwC,OAAsB,+BAC/B,OACE,OAAAsb,GACA,QAAAhb,GACA,QAAAW,GACA,QAAAL,GACA,WAAAC,GACA,aAAA6S,GAEA,aAAAvV,GACA,MAAAsO,OAEK,6BA8GD,cAAAlM,GAkBA,QAAAC,OAlBA,oBA3GN,IAAMksB,GAAoB3hB,GAAM,KAAK,IACnC,sCAA0B,KAAMqD,IACvB,CAAE,QAASA,EAAI,aAAc,EACrC,CACH,EAkCaue,GAA6ChsB,GAAU,CAClE,GAAM,CAAE,SAAAnB,CAAS,EAAIrB,GAAU,EAEzB,CAAE,KAAAkgB,EAAM,QAAAnX,EAAS,WAAAR,EAAY,MAAAkmB,EAAO,OAAAC,CAAO,EAAIlsB,EAE/CmsB,EAAgBtvB,GACpB,CAAC+F,EAAqBqF,IAAkB,CACtC,IAAMmkB,EACJ,OAAOH,GAAU,WACbA,EAAMrpB,EAAQqF,CAAK,EACnB,CAAE,OAAQ,OAAW,OAAQ,MAAU,EAE7C,OADqCyV,GAAS,MAAQA,IAASzV,EAAQ,EAE9D,CACL,aAAc,SACd,UAAW6D,GACT,qFACF,EACA,GAAGsgB,EAAO,MACZ,EAEO,CACL,aAAc,OACd,UAAWtgB,GAAG,cAAc,EAC5B,GAAGsgB,EAAO,MACZ,CAEJ,EACA,CAAC1O,EAAMuO,CAAK,CACd,EAEMI,EAAiBxvB,GACrB,CACEyvB,EACA1pB,EACAqF,IACG,CACH,IAAMmkB,EACJ,OAAOF,GAAW,WACdA,EAAOI,EAAQ1pB,EAAQqF,CAAK,EAC5B,CAAE,OAAQ,OAAW,OAAQ,MAAU,EACvCvG,EAA+Bgc,GAAS,MAAQA,IAASzV,EAAQ,EACjEskB,EAAgBD,EAAO,iBAAiB,EACxCE,EAAeF,EAAO,gBAAgB,EAC5C,OAAI5qB,EACK,CACL,UAAWoK,GACTygB,GAAiB,mBACjBC,GAAgB,kBAClB,EACA,GAAGJ,EAAO,MACZ,EAEO,CACL,UAAW,GACX,GAAGA,EAAO,MACZ,CAEJ,EACA,CAAC1O,EAAMwO,CAAM,CACf,EAEA,OACEtsB,GAAC+a,GAAA,CACC,UAAW7O,GACT,8CACAjN,EAAW,wCAA0C,MACvD,EAEA,SAAAe,GAACmT,GAAA,CACC,SAAQ,GACR,UAAU,oBACV,WAAY,CAAE,KAAM,oBAAqB,EACzC,MAAOoZ,EACP,OAAQE,EACR,QAAS9lB,EACT,WAAYR,EACd,EACF,CAEJ,EAEMrG,GAAsB,IAAM,CAChC,GAAM,CAAE,EAAA6C,CAAE,EAAIlD,GAAe,EACvB,CAAE,SAAAR,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EAEAgB,GAACF,GAAA,CAAK,UAAW,SAAU,QAAS,SAAU,IAAK,EACjD,UAAAC,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAiC,EAAE,kCAAkC,EACvC,EACA3C,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,qBAE/B,GACF,EAIFT,GAACF,GAAA,CAAK,UAAW,SAAU,QAAS,UAClC,UAAAC,GAACU,GAAA,CAAK,KAAM,KAAO,SAAAiC,EAAE,mBAAmB,EAAE,EAC1C1C,GAACF,GAAA,CAAK,UAAW,SAAU,QAAS,SAAU,IAAK,EACjD,UAAAC,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAiC,EAAE,kCAAkC,EACvC,EACA3C,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,qBAE/B,GACF,GACF,CAEJ,EAEamsB,GAAmCzsB,GAAU,CACxD,GAAM,CAAE,QAAAuG,EAAS,WAAAR,EAAY,KAAA2X,EAAM,IAAA/D,EAAK,kBAAAgE,EAAmB,MAAAsO,EAAO,OAAAC,CAAO,EACvElsB,EACI,CAAE,SAAAnB,CAAS,EAAIrB,GAAU,EAC/B,OACEqC,GAACI,GAAA,CACC,MAAOL,GAACF,GAAA,EAAU,EAClB,GAAG,yBACH,UAAU,SACV,WAAY,CACV,KAAMb,EAAW,6BAA+B,eAClD,EAEC,WAACA,GAAYe,GAACM,GAAA,EAAQ,EACvBN,GAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,GAACmsB,GAAA,CACC,IAAKpS,EACL,KAAM+D,EACN,kBAAmBC,EACrB,EACF,EACA/d,GAACosB,GAAA,CACC,WAAYjmB,EACZ,QAASQ,EACT,IAAKoT,EACL,KAAM+D,EACN,MAAOuO,EACP,OAAQC,EACV,GACF,CAEJ,EC9LS,cAAAtsB,OAAA,oBAFF,IAAM8sB,GAA+C1sB,GAAU,CACpE,IAAM7B,EAAQ2tB,GAAiB9rB,CAAK,EACpC,OAAOJ,GAAC6sB,GAAA,CAAS,GAAGtuB,EAAO,CAC7B,ECHS,cAAAyB,OAAA,oBADF,IAAMisB,GAA2C7rB,GAC/CJ,GAAC8sB,GAAA,CAAe,GAAG1sB,EAAO,ECLnC,OAAgB,aAAA2M,GAAW,WAAA7P,GAAS,YAAAyE,OAAgB,QAEpD,OACE,cAAAxE,GACA,kBAAA4vB,GACA,mBAAA3W,OACK,gCACP,OAAS,cAAAT,OAAkB,oCAC3B,OAAS,qBAAAjY,OAA8B,gCAEvC,OAAS,WAAA0E,OAAe,gCCXxB,OAAgB,WAAAlF,OAAe,QAC/B,OAAS,kBAAAuC,OAAsB,+BAE/B,OAAS,sBAAAutB,OAA0B,gCA4BhB,cAAAhtB,GAWP,QAAAC,OAXO,oBAzBnB,IAAMgtB,GAAiC,CACrC,qBAAsB,MACxB,EAEaC,GAAoB,IAAM,CACrC,GAAM,CAAE,EAAAvqB,CAAE,EAAIlD,GAAe,EAC7B,OAAOvC,GAA+B,IAC7B,CACL,CACE,MAAOyF,EAAE,+BAA+B,EACxC,UAAW,OACX,MAAO,OACP,MAAO,GACT,EACA,CACE,MAAO,GAAGA,EAAE,oCAAoC,CAAC,UACjD,UAAW,SACX,MAAO,SACP,MAAO,IACP,OAAQ,CAACgI,EAAK3H,IAAW,CACvB,GAAM,CAAE,WAAAmqB,EAAY,WAAAC,EAAY,YAAAC,CAAY,EAAIrqB,EAChD,OAAIqqB,IAGA,CAACF,GAAc,CAACC,EACXptB,GAAC,OAAI,MAAOitB,GAAW,cAAE,EAE9BE,GAAc,CAACC,EACVzqB,EAAE,2CAA4C,CACnD,OAAQqqB,GACNG,EACAA,IAAe,KAAU,EAAI,CAC/B,CACF,CAAC,EAGDltB,GAAC,OACE,UAAAktB,GACCH,GAAmBG,EAAYA,IAAe,KAAU,EAAI,CAAC,EAC9D,MACAC,GACCJ,GAAmBI,EAAYA,IAAe,KAAU,EAAI,CAAC,GACjE,EAEJ,CACF,EACA,CACE,MAAOzqB,EAAE,gCAAgC,EACzC,UAAW,YACX,MAAO,QACP,MAAO,GACT,EACA,CACE,MAAOA,EAAE,gCAAgC,EACzC,UAAW,YACX,MAAO,QACP,MAAO,GACT,CACF,EACC,CAACA,CAAC,CAAC,CACR,EChEO,IAAMwD,GAA4B,CACvC,CACE,KAAM,EACN,WAAY,EACZ,WAAY,IACZ,UAAW,SACX,UAAW,OACb,EACA,CACE,KAAM,EACN,WAAY,IACZ,WAAY,IACZ,UAAW,QACX,UAAW,QACb,EACA,CACE,KAAM,EACN,WAAY,IACZ,WAAY,IACZ,UAAW,SACX,UAAW,OACb,EACA,CACE,KAAM,EACN,WAAY,IACZ,WAAY,IACZ,UAAW,SACX,UAAW,QACb,EACA,CACE,KAAM,EACN,WAAY,IACZ,WAAY,IACZ,GAAI,IACJ,UAAW,SACX,UAAW,QACb,EACA,CACE,KAAM,EACN,WAAY,IACZ,WAAY,IACZ,GAAI,IACJ,UAAW,SACX,UAAW,QACb,EACA,CACE,KAAM,EACN,WAAY,IACZ,WAAY,OACZ,GAAI,IACJ,UAAW,KACX,UAAW,QACb,CACF,EFCA,IAAMmnB,GAAkB,CAACC,EAAwB1uB,IAA0B,CACzE,GAAM,CAAE,uBAAA2uB,EAAyB,EAAG,uBAAAC,EAAyB,CAAE,EAAI5uB,EAC7D6uB,EAAY,IAAItrB,GAAQorB,CAAsB,EAAE,IAAI,GAAI,EACxDG,EAAY,IAAIvrB,GAAQqrB,CAAsB,EAAE,IAAI,GAAI,EAM9D,OALiBF,EAAQ,KACtBrqB,GACCA,EAAK,YAAc,GAAGwqB,EAAU,SAAS,CAAC,KAC1CxqB,EAAK,YAAc,GAAGyqB,EAAU,SAAS,CAAC,GAC9C,GACiB,IACnB,EAEazB,GAAoB3pB,GAAsC,CACrE,GAAM,CAAE,YAAAqrB,EAAa,kBAAA7P,EAAmB,MAAAsO,EAAO,OAAAC,CAAO,EAAI/pB,GAAW,CAAC,EAChE,CAACub,EAAM+P,CAAO,EAAIlsB,GAAwB,EAC1C,CAAE,KAAA9C,EAAM,UAAAmH,CAAU,EAAI+mB,GAAe,EACrC,CAAE,MAAAxuB,CAAM,EAAIpB,GAAW,EAEvB2wB,EAAOZ,GAAkB,EAEzB,CAAE,KAAMa,CAAiB,EAAI3X,GAEhC,uBAAuB,EAEpB,CAAE,QAAAzP,EAAS,WAAAR,CAAW,EAAIjJ,GAAQ,IAC/B,OAAO0wB,GAAgB,WAC1BA,EAAYE,EAAM3nB,GAAmB,CAAE,KAAM2X,CAAM,CAAC,EACpD,CAAE,QAASgQ,EAAM,WAAY3nB,EAAkB,EAClD,CAACynB,EAAaE,EAAMhQ,CAAI,CAAC,EAE5B,OAAA/Q,GAAU,IAAM,CACV,CAAClO,GAAQmH,GAGb6nB,EAAQP,GAAgBnnB,EAAYtH,CAAI,CAAC,CAC3C,EAAG,CAACA,EAAMmH,EAAWG,CAAU,CAAC,EAezB,CACL,GAdewP,GACf,CACE,KAAMmI,EACN,IAAKiQ,GAAkB,wBACzB,EACA,CACE,cACExvB,EAAM,SAAWb,GAAkB,8BAC/BA,GAAkB,8BAClBA,GAAkB,aAC1B,CACF,EAIE,QAASiJ,EACT,WAAYR,EACZ,MAAOkmB,EACP,OAAQC,EACR,kBAAmBvO,CACrB,CACF,EGlHA,IAAAiQ,GAAA,GAAAvsB,EAAAusB,GAAA,mBAAAC,KA2BAze,KA3BA,OAAS,WAAAtS,GAAS,YAAAyE,GAAU,UAAAsU,OAAc,QAC1C,OAAOzL,OAAW,QAClB,OAAS,cAAArN,OAAkB,gCAC3B,OAAS,kBAAAsC,OAAsB,+BAC/B,OACE,QAAAM,GACA,QAAAW,GACA,WAAAJ,GACA,OAAAya,GACA,QAAA3N,GACA,YAAAD,GACA,cAAA7G,GACA,iBAAAwE,GACA,WAAAmH,GACA,kBAAAic,GACA,UAAAruB,OACK,6BACP,OACE,qBAAAsuB,GACA,yBAAAC,GAGA,0BAAAC,GACA,mBAAAC,OAEK,uCAiED,OAsBU,YAAAvtB,GArBR,OAAAf,GADF,QAAAC,OAAA,oBAvDC,IAAMguB,GAA2C7tB,GAAU,CAChE,GAAM,CAACmuB,EAAKC,CAAM,EAAI7sB,GAAS,WAAkB,EAC3C,CAAE,EAAAgB,CAAE,EAAIlD,GAAe,EACvB,CAAE,MAAAlB,EAAO,cAAAC,CAAc,EAAIrB,GAAW,EAEtCgC,EAAcZ,EAAM,aAAe,CAAC,EAEpC,CAAC0M,EAAiBQ,CAAU,EAAIjB,GAAM,uBAAgC,EAEtEikB,EAAexY,GAA0B,IAAI,EAC7CyY,EAAqBzY,GAAgC,IAAI,EAEzDrK,EAAkBpB,GAAM,YAC3BzE,GAA4C,CAC3C,GAAM,CAAE,KAAAsK,EAAM,MAAAtN,CAAM,EAAIgD,EACpBsK,IAAS,WACX5E,EAAW1I,CAAK,CAEpB,EACA,CAAC,CACH,EAEMmI,EAA6B,CACjC,MAAOvI,EAAE,mBAAmB,EAC5B,oBACF,EAEMwI,EAA6B,CACjC,MAAOxI,EAAE,oBAAoB,EAC7B,qBACF,EAEMyI,EAAkBlO,GAAQ,IAC1B,MAAM,QAAQiC,CAAW,GAAKA,EAAY,OACrC,CACL+L,EACAC,EACA,GAAGhM,EAAY,IAAmB4D,IAAW,CAC3C,MAAOA,EAAM,GACb,MAAOA,GAAO,aAAe+H,GAAc/H,GAAO,EAAE,CACtD,EAAE,CACJ,EAEK,CAACmI,EAAcC,CAAY,EACjC,CAAChM,CAAW,CAAC,EAEhB,OACEc,GAACF,GAAA,CAEC,UAAW,SACX,UAAW,QACX,IAAK,EACL,MAAM,OACN,OAAO,OAEP,UAAAE,GAACF,GAAA,CAAK,MAAM,OAAO,QAAQ,UACzB,UAAAC,GAACU,GAAA,CAAK,KAAK,KAAM,SAAAiC,EAAE,kBAAkB,EAAE,EACvC3C,GAACH,GAAA,CAAO,MAAM,OAAO,KAAK,KAAK,UAAU,gBAAgB,SAAQ,GAAC,yBAElE,GACF,EACAG,GAACM,GAAA,CAAQ,UAAU,aAAa,EAEhCN,GAAC+a,GAAA,CAAI,MAAM,OAAO,UAAU,4BAC1B,SAAA9a,GAACmN,GAAA,CACC,MAAOmhB,EACP,cAAgB1rB,GAAM2rB,EAAO3rB,CAAQ,EACrC,WAAY,CACV,SAAU,4BACV,YAAa,4BACb,QAAS,WACX,EACA,UAAU,aAEV,UAAA7C,GAACmN,GAAA,CAAS,MAAO,YAAoB,MAAOxK,EAAE,kBAAkB,EAC9D,SAAA3C,GAACD,GAAA,CAAK,UAAU,SAAS,IAAK,EAAG,MAAM,OAAO,OAAO,OAClD,SAAAvB,EACCyB,GAAAc,GAAA,CACE,UAAAf,GAACsG,GAAA,CACC,SAAUsF,EACV,MAAO,CACL,CACE,KAAM,SACN,KAAM,UACN,MAAOX,EACP,QAASG,CACX,CACF,EACF,EACApL,GAACquB,GAAA,CACC,IAAKI,EACL,gBAAiBxjB,EAChB,GAAG7K,EACN,GACF,EAEAJ,GAACsuB,GAAA,CACC,IAAKG,EACJ,GAAGruB,EACJ,qBAAsB,GACxB,EAEJ,EACF,EACAJ,GAACmN,GAAA,CACC,MAAO,mBACP,MAAOxK,EAAE,2BAA2B,EAEpC,SAAA3C,GAACD,GAAA,CAAK,UAAU,SAAS,IAAK,EAAG,MAAM,OAAO,OAAO,OACnD,SAAAC,GAACouB,GAAA,CACC,IAAKM,EACJ,GAAGtuB,EACJ,qBAAsB,GACxB,EACF,EACF,EACAJ,GAACmN,GAAA,CAAS,MAAO,cAAsB,MAAOnN,GAAC2uB,GAAA,EAAe,EAC5D,SAAA3uB,GAACmuB,GAAA,EAAkB,EACrB,GACF,EACF,GACF,CAEJ,EAEMQ,GAA2B,IAAM,CACrC,GAAM,CAAE,EAAAhsB,CAAE,EAAIlD,GAAe,EAC7B,OACEQ,GAAC,OAAI,UAAU,yBACb,UAAAD,GAAC,QAAM,SAAA2C,EAAE,uBAAuB,EAAE,EAClC3C,GAACiS,GAAA,CACC,UAAU,kCACV,QACEhS,GAAC,OACC,UAAAD,GAAC,OAAI,UAAU,kBACZ,SAAA2C,EAAE,2CAA2C,EAChD,EACA3C,GAAC,OACC,SAAAA,GAAC,KACC,KAAK,4FACL,OAAO,SACP,IAAI,sBACJ,UAAU,mBAET,SAAA2C,EAAE,wCAAwC,EAC7C,EACF,GACF,EAEF,MAAO,CACL,UAAW,iBACb,EAEA,SAAA3C,GAAC,UAAO,UAAU,iDAChB,SAAAA,GAACkuB,GAAA,EAAe,EAClB,EACF,GACF,CAEJ,EClMA,IAAAF,GAAA,GAAAvsB,EAAAusB,GAAA,gBAAAY,KAAA,OAAuB,UAAA3Y,OAAc,QACrC,OAAOzL,OAAW,QAClB,OAAS,kBAAA/K,OAAsB,+BAC/B,OACE,OAAAsb,GACA,UAAAlb,GACA,WAAAS,GACA,QAAAP,GACA,QAAAW,GACA,WAAAuR,OACK,6BACP,OAEE,gBAAA4c,OACK,oCAqBC,cAAA7uB,GAEE,QAAAC,OAFF,oBAlBD,IAAM2uB,GACXxuB,GACG,CACH,GAAM,CAAE,eAAA0uB,CAAe,EAAI1uB,EACrB,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EAEvBsvB,EAAY9Y,GAA0B,IAAI,EAEhD,OACEhW,GAACF,GAAA,CAEC,UAAW,SACX,UAAW,QACX,IAAK,EACL,MAAM,OACN,OAAO,OAEP,UAAAE,GAACF,GAAA,CAAK,MAAM,OAAO,QAAQ,UACzB,UAAAC,GAACU,GAAA,CAAK,KAAK,KAAM,SAAAiC,EAAE,eAAe,EAAE,EACpC3C,GAACiS,GAAA,CAAQ,QAAStP,EAAE,yBAAyB,EAC3C,SAAA1C,GAACJ,GAAA,CAAO,MAAM,OAAO,KAAK,KAAK,UAAU,gBAAgB,SAAQ,GAC9D,UAAA8C,EAAE,iBAAiB,EACpB3C,GAACgvB,GAAA,CAAY,UAAU,yCAAyC,GAClE,EACF,GACF,EACAhvB,GAACM,GAAA,CAAQ,UAAU,aAAa,EAEhCN,GAAC+a,GAAA,CAAI,MAAM,OAAO,UAAU,4BAC1B,SAAA/a,GAAC6uB,GAAA,CAAa,IAAKE,EAAW,eAAgBD,EAAgB,EAChE,GACF,CAEJ,EAEME,GAAcxkB,GAAM,WACxB,CAACpK,EAAO8c,IAEJld,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,IAAKkd,EACJ,GAAG9c,EAEJ,SAAAJ,GAAC,QAAK,EAAE,gJAAgJ,EAC1J,CAGN,ECpEA,IAAAivB,GAAA,GAAAxtB,EAAAwtB,GAAA,oBAAAC,GAAA,qBAAAC,KCAAnM,KACAvE,KAQS,cAAAze,OAAA,oBALF,IAAMmvB,GAAoB/uB,GAG3B,CACJ,IAAM7B,EAAQigB,GAAoBpe,CAAK,EACvC,OAAOJ,GAAC+jB,GAAA,CAAY,GAAGxlB,EAAO,CAChC,ECGS,cAAAyB,OAAA,oBALF,IAAMkvB,GAAkB9uB,GAGzB,CACJ,GAAM,CAAE,WAAAse,EAAY,UAAAC,EAAY,QAAS,EAAIve,EAC7C,OAAOJ,GAACmvB,GAAA,CAAiB,WAAYzQ,EAAY,UAAWC,EAAU,CACxE,ECdA,IAAAyQ,GAAA,GAAA3tB,EAAA2tB,GAAA,iBAAAC,GAAA,kBAAAC,KCAA,OAAS,aAAAviB,GAAW,YAAApL,OAAgB,QACpC,OACE,cAAAxE,GACA,kBAAA4vB,GACA,wBAAAwC,GACA,eAAAC,OACK,gCACP,OAAS,iBAAA/xB,OAAqB,oCAC9B,OAAS,qBAAAC,OAAyB,gCAClC,OAAS,SAAAyE,OAAa,6BASf,IAAMstB,GAAmB,IAA4B,CAC1D,GAAM,CAAE,KAAA5wB,EAAM,OAAQ2gB,CAAQ,EAAIuN,GAAe,EAC3C,CAAE,aAAApuB,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EAClD,CAACiyB,EAAQ,CAAE,WAAAC,CAAW,CAAC,EAAIH,GAAY,+BAA+B,EACtE,CAACI,EAASC,CAAU,EAAIluB,GAAS,EAAK,EAE5CoL,GAAU,IAAM,CACd8iB,EAAWhxB,GAAM,2BAA6B,EAAK,CACrD,EAAG,CAACA,CAAI,CAAC,EAET,IAAMixB,EAAmBP,GAAsBxsB,GAAmB,CAEhE2sB,EAAO,CACL,8BAA+B3sB,CACjC,CAAC,EAAE,KAAMlE,GAAS,CACZA,EAAK,QACPsD,GAAM,QAAQY,EAAQ,SAAW,QAAQ,EAEzC8sB,EAAW,CAAC9sB,CAAK,CAErB,CAAC,CACH,EAAG,GAAG,EAEAgtB,EAAqBC,GAA2C,CACpEH,EAAWG,CAA6B,EACxCF,EAAiBE,CAA6B,CAChD,EACM,CAAE,MAAAzxB,CAAM,EAAIpB,GAAW,EAEvB8yB,EACJ,CAACtxB,GACD,CAACC,IACAL,EAAM,SAAWb,GAAkB,eAClCa,EAAM,SAAWb,GAAkB,+BAEvC,MAAO,CACL,0BAA2BkyB,EAC3B,kBAAAG,EACA,UAAW,GACX,SAAAE,CACF,CACF,EC1DA,OAAS,aAAAryB,OAAiB,6BCA1B,OAAS,kBAAA6B,OAAsB,+BAC/B,OAAS,QAAAY,GAAM,QAAAN,GAAM,UAAAmwB,GAAQ,QAAAxvB,OAAY,6BACzC,OAAS,oBAAAgjB,OAAwB,uCAoBzB,OACE,OAAA1jB,GADF,QAAAC,OAAA,oBAjBD,IAAMkwB,GAA4C/vB,GAAU,CACjE,GAAM,CAAE,CAAE,EAAIX,GAAe,EAE7B,OACEO,GAACK,GAAA,CACC,MAAO,EAAE,iCAAiC,EAC1C,GAAG,2BACH,UAAU,kCAEV,SAAAJ,GAACF,GAAA,CACC,UAAW,MACX,IAAK,EACL,MAAO,OACP,UAAW,SACX,GAAI,EACJ,UAAU,qDAEV,UAAAE,GAACF,GAAA,CAAK,UAAW,SAAU,UAAW,QAAS,UAAU,aACvD,UAAAC,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,OACvB,WAAE,oCAAoC,EACzC,EACAV,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,WAAE,gDAAgD,EACrD,GACF,EAEAV,GAAC0jB,GAAA,CAAiB,MAAM,MACtB,SAAA1jB,GAACkwB,GAAA,CACC,QAAS9vB,EAAM,0BACf,gBAAkByC,GAAM,CACtBzC,EAAM,kBAAkByC,CAAC,CAC3B,EACA,SAAUzC,EAAM,WAAa,CAACA,EAAM,SACpC,cAAY,gCACd,EACF,GACF,EACF,CAEJ,EC7CA,OAAa,YAAAuB,OAAgB,QAC7B,OAAS,kBAAAlC,OAAsB,+BAC/B,OACE,QAAAY,GACA,QAAAN,GACA,UAAAmwB,GACA,QAAAxvB,GACA,oBAAA+nB,OACK,6BACP,OAAS,oBAAA/E,OAAwB,uCACjC,OAAS,0BAAA0M,OAA8B,sCAWnC,mBAAArvB,GAEI,OAAAf,GACA,QAAAC,OAHJ,oBARG,IAAMowB,GAA2CjwB,GAAU,CAChE,GAAM,CAAE,CAAE,EAAIX,GAAe,EACvB,CAAC6iB,EAAMW,CAAO,EAAIthB,GAAkB,EAAK,EAK/C,OACE1B,GAAAc,GAAA,CACE,UAAAd,GAACF,GAAA,CAAK,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,UAAW,IAAK,EAAE,KAAK,UAAU,SACzD,UAAAC,GAACowB,GAAA,CAAuB,KAAM9N,EAAM,aAAcW,EAAS,EAC3DhjB,GAACF,GAAA,CACC,UAAU,qBACV,UAAU,SACV,MAAM,OACN,QAZiB,IAAM,CAC7BkjB,EAAQ,EAAI,CACd,EAYQ,UAAAjjB,GAACU,GAAA,CACC,KAAK,OACL,OAAO,WACP,UAAW,GACX,UAAU,WAET,WAAE,2BAA2B,EAChC,EACAV,GAACyoB,GAAA,CACC,KAAM,GACN,UAAU,wCACZ,GACF,GACF,EAEAzoB,GAACK,GAAA,CAEC,MACEL,GAAC,OAAI,UAAU,cACZ,WAAE,iCAAiC,EACtC,EAEF,GAAG,2BACH,UAAU,kCACV,WAAY,CAAE,KAAM,UAAW,QAAS,WAAY,EAEpD,SAAAA,GAACD,GAAA,CACC,UAAW,MACX,IAAK,EACL,MAAO,OACP,UAAW,SACX,GAAI,EACJ,UAAU,qDAEV,SAAAE,GAACF,GAAA,CACC,UAAW,SACX,UAAW,QACX,UAAU,uBAEV,UAAAC,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,KACvB,WAAE,oCAAoC,EACzC,EACAV,GAACU,GAAA,CAAK,UAAW,GAAI,KAAK,MAAM,UAAU,kBACvC,WAAE,gDAAgD,EACrD,EACAV,GAAC0jB,GAAA,CACC,SAAA1jB,GAACkwB,GAAA,CACC,UAAU,WACV,QAAS9vB,EAAM,0BACf,gBAAkByC,GAAM,CACtBzC,EAAM,kBAAkByC,CAAC,CAC3B,EACA,SAAUzC,EAAM,WAAa,CAACA,EAAM,SACpC,cAAY,gCACd,EACF,GACF,EACF,EACF,GACF,CAEJ,EFhFQ,cAAAJ,OAAA,oBALD,IAAMswB,GAAqClwB,GAAU,CAC1D,GAAM,CAAE,SAAAnB,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EAEAe,GAAC,OAAI,UAAU,WACb,SAAAA,GAACqwB,GAAA,CAAe,GAAGjwB,EAAO,EAC5B,EAGGJ,GAACmwB,GAAA,CAAgB,GAAG/vB,EAAO,CACpC,EGVS,cAAAJ,OAAA,oBAFF,IAAMsvB,GAA0B,IAAM,CAC3C,IAAM/wB,EAAQkxB,GAAiB,EAC/B,OAAOzvB,GAACswB,GAAA,CAAS,GAAG/xB,EAAO,CAC7B,ECHS,cAAAyB,OAAA,oBADF,IAAMqvB,GAAwB,IAC5BrvB,GAACsvB,GAAA,EAAc,ECJxB,IAAA9tB,GAAA,GAAAC,EAAAD,GAAA,qBAAA8N,GAAA,0BAAAihB,GAAA,eAAAC,GAAA,gBAAAjhB,GAAA,sBAAAkhB,GAAA,iBAAAC,KCCA,OAAS,cAAAvzB,OAAkB,gCAC3B,OAAS,aAAAS,OAAiB,6BCc1B+S,KACApC,KACAgO,KAlBA,OAAS,eAAAtf,GAAa,aAAA8P,GAAW,WAAA7P,OAAe,QAChD,OACE,cAAAC,GACA,iBAAAC,GACA,mBAAAE,GACA,wBAAA6Q,GACA,iBAAA/J,OACK,gCACP,OAAS,WAAAoM,OAAe,+BACxB,OAAS,cAAAK,OAAkB,gCAC3B,OAAS,SAAAlT,OAAa,6BACtB,OACE,kCAAAG,GACA,oBAAAE,OACK,sCACP,OAAS,WAAAoE,GAAS,QAAAkU,OAAY,gCCf9B,OAAO9L,OAAW,QAClB,OAAS,iBAAApG,OAAqB,gCAC9B,OAAS,sBAAA5G,OAA0B,gCACnC,OAAS,kBAAAiC,OAAsB,+BAC/B,OAAS,kBAAAwpB,OAAsB,gCAC/B,OAAS,UAAAppB,GAAQ,QAAAE,GAAM,QAAAW,GAAM,aAAAwB,OAAiB,6BAiClC,OACE,OAAAlC,GADF,QAAAC,OAAA,oBAdL,IAAM0wB,GAAoBpuB,GAA4B,CAC3D,GAAM,CAAE,CAAE,EAAI9C,GAAe,EACvBqF,EAAaV,GAAc,EAC3B,CAAE,UAAA9F,CAAU,EAAId,GAAmB,EACnC,CAAE,WAAAgC,EAAY,UAAAoxB,CAAU,EAAIruB,EA0HlC,OAzHgBiI,GAAM,QAAkB,IAC/B,CACL,CACE,MAAO,EAAE,iCAAiC,EAC1C,UAAW,QACX,MAAO,OACP,MAAO,IACP,OAAOG,EAAa,CAClB,OACE1K,GAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,GAACkC,GAAA,CAAU,KAAMyI,EAAK,EACrBA,GACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,+BAA+B,EACxC,UAAW,UACX,MAAO,OACP,MAAO,IACP,OAAOA,EAAa3H,EAAQ,CAC1B,IAAMoD,EAAYtB,GAAY,KAC5B,CAAC,CAAE,MAAAuB,CAAM,IAAMA,IAAUrD,EAAO,KAClC,EACA,OACEhD,GAACU,GAAK,QAAL,CAAa,GAAI0F,GAAW,UAAY,EAAG,QAAS,GAClD,SAAAuE,EACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,sCAAsC,EAC/C,UAAW,aACX,MAAO,OACP,MAAO,IACP,OAAOA,EAAa,CAClB,OACE3K,GAACU,GAAK,QAAL,CAAa,KAAK,QAAQ,GAAI,EAAG,SAAS,IAAI,QAAS,GACrD,SAAAiK,EACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,sCAAsC,EAC/C,UAAW,aACX,MAAO,OACP,MAAO,IACP,OAAOA,EAAa,CAClB,OACE3K,GAACU,GAAK,QAAL,CAAa,KAAK,QAAQ,GAAI,EAAG,SAAS,IAAI,QAAS,GACrD,SAAAiK,EACH,CAEJ,CACF,EACA,CACE,MAAO,EAAE,2CAA2C,EACpD,UAAW,kBACX,MAAO,OACP,MAAO,IACP,OAAOA,EAAa,CAClB,OACE3K,GAACU,GAAK,QAAL,CAAa,GAAI,EAAG,OAAO,IACzB,SAAAiK,EAAM,IACT,CAEJ,CACF,EACA,CACE,MAAO,EAAE,yCAAyC,EAClD,UAAW,yBACX,MAAO,OACP,MAAO,IACP,OAAOA,EAAa,CAClB,OACE3K,GAACU,GAAK,QAAL,CAAa,KAAK,QAAQ,GAAI,EAAG,SAAS,IAAI,QAAS,GACrD,SAAAiK,EACH,CAEJ,CACF,EACA,CACE,MAAO,KACP,UAAW,aACX,MAAO,SACP,MAAO,IACP,OAAOkmB,EAAY7tB,EAAyB,CAC1C,GAAM,CAAE,MAAAqD,CAAM,EAAIrD,EAClB,OACE/C,GAACF,GAAA,CAAK,UAAU,SAAS,QAAQ,MAAM,IAAK,EACzC,UAAAsG,IAAU,QACT/H,IAAc2qB,GAAe,QAC7B,OAAO2H,GAAc,YACnB5wB,GAACH,GAAA,CACC,KAAM,KACN,QAAS,WACT,MAAO,YACP,QAAS,IAAM+wB,IAAYC,EAAIxqB,CAAK,EAEnC,WAAE,kBAAkB,EACvB,EAEH,OAAO7G,GAAe,YACrBQ,GAACH,GAAA,CACC,KAAM,KACN,QAAS,WACT,MAAO,YACP,QAAS,IAAML,IAAaqxB,EAAIxqB,CAAK,EAEpC,WAAE,iBAAiB,EACtB,GAEJ,CAEJ,CACF,CACF,EACC,CAAC,EAAGvB,EAAYtF,EAAYoxB,EAAWtyB,CAAS,CAAC,CAEtD,EDlIO,IAAMwyB,GAAkB,IAAM,CACnC,GAAM,CAAC/xB,EAASC,CAAU,EAAI1B,GAC5Bgf,GACA,EACF,EAEM,CAAE,MAAA/d,EAAO,WAAAqM,EAAY,cAAApM,CAAc,EAAIrB,GAAW,EAClD,CAAE,QAAA+Q,EAAU,CAAC,CAAE,EAAI9Q,GAAc,EACjC,CAAE,cAAAoR,CAAc,EAAIL,GAAqB,EAEzCrJ,EAAaV,GAAc,EAE3BjF,EAAcZ,EAAM,aAAe,CAAC,EAE1CwO,GAAU,IAAM,CACVmB,EAAQ,OAAS,GACnBtD,EAAW,QAAQ,CAEvB,EAAG,CAACsD,CAAO,CAAC,EAGZ,IAAMzP,EAAa6P,GAAmB,EAEhC6c,EAAgB,IAAM,CAE1BnsB,EAAYD,GAAqB,CAACA,CAAO,CAC3C,EAEM8Q,EAAgB3S,GAAQ,IACrB4H,GAAY,IAAK5B,IAAU,CAChC,MAAOA,EAAK,MACZ,MAAOA,EAAK,KACd,EAAE,EACD,CAAC4B,CAAU,CAAC,EAGT8J,EAAcZ,GAAgB,EAG9B,CACJ,gBAAA/C,EACA,cAAA2E,EACA,aAAcmhB,EACd,SAAAjrB,CACF,EAAIoK,GAAqBtB,CAAW,EAG9BoiB,EAAmB9zB,GAAQ,IACxB6zB,EAAS,IAAKE,GAAgB,CAEnC,IAAMC,EACJD,EAAY,UAAU,IAAK/iB,GAAY,CACrC,IAAMijB,EAAYrsB,GAAY,KAC3B5B,IAASA,GAAK,QAAUgL,EAAQ,KACnC,EAGMS,EAAaH,EAAcN,EAAQ,KAAK,EAGxCkjB,EAAa,IAAIhvB,GAAQ8L,EAAQ,OAAO,EAC3C,IAAIS,CAAU,EACd,SAAS,EAGN0iB,EAAkBF,EACpB3gB,GAAQ,gBAAgB,CACtB,WAAY2gB,EAAU,aAAe,EACrC,eAAgBA,EAAU,iBAAmB,EAC7C,cAAejjB,EAAQ,QACvB,cAAeijB,GAAW,cAAgBjjB,EAAQ,QAClD,WAAYS,CACd,CAAC,EACD2H,GAGEgb,GAAyB9gB,GAAQ,uBAAuB,CAC5D,cAAetC,EAAQ,QACvB,cAAeijB,GAAW,cAAgBjjB,EAAQ,QAClD,gBAAiBmjB,EAAgB,SAAS,EAC1C,WAAY1iB,CACd,CAAC,EAED,MAAO,CACL,GAAGT,EACH,WAAAS,EACA,WAAAyiB,EACA,gBAAAC,EACA,uBAAAC,EACF,CACF,CAAC,GAAK,CAAC,EAET,MAAO,CACL,GAAGL,EACH,SAAUC,CACZ,CACF,CAAC,EACA,CAACH,EAAUviB,EAAe1J,CAAU,CAAC,EAElCysB,EAAiBt0B,GAAY,CAACmG,EAAmBiD,IAAkB,CAClEjD,GAGLzF,GAAM,KAAKK,GAAkB,CAC3B,YAAaoF,EACb,MAAAiD,CACF,CAAC,CACH,EAAG,CAAC,CAAC,EAECmrB,EAAgB,CAACpuB,EAAmBiD,IAAkB,CAC1D1I,GAAM,KAAK,kBAAmB,CAC5B,UAAAyF,EACA,MAAAiD,CACF,CAAC,CACH,EAEMorB,EAAejzB,EAAgBW,EAAY,OAAS,EAAI,GAExDuyB,EAAgBf,GAAiB,CACrC,WAAYc,EAAeF,EAAiB,OAC5C,UAAWC,CACb,CAAC,EAEKG,EAAyB10B,GAC5B20B,GAAqC,CACpCj0B,GAAM,KAAKG,GAAgC,CACzC,UAAW8zB,CACb,CAAC,CACH,EACA,CAAC,CACH,EAEMtyB,EAAYrC,GAAY,IAAM,CAClC00B,EAAuB,SAAS,CAClC,EAAG,CAAC,CAAC,EAECpyB,EAAatC,GAAY,IAAM,CACnC00B,EAAuB,UAAU,CACnC,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,QAASD,EACT,WAAYV,EACZ,QAASjyB,EACT,mBAAoBosB,EACpB,gBAAAlgB,EACA,cAAA2E,EACA,SAAA9J,EACA,WAAArH,EACA,cAAeU,EAAY,OAAS,EACpC,UAAAG,EACA,WAAAC,EACA,QAAA2O,EACA,cAAe2B,GAAiBgB,EAClC,CACF,ED3KArB,KGYAA,KAhBA,OAAOhF,IAAS,WAAAtN,OAAe,QAC/B,OAAS,sBAAAM,OAA0B,gCACnC,OAAS,kBAAAiC,OAAsB,+BAC/B,OAAS,kBAAAwpB,OAAsB,gCAC/B,OACE,UAAAppB,GACA,MAAAqM,GACA,aAAAhK,GACA,QAAAxB,GACA,iBAAAoK,GACA,cAAAxE,GACA,SAAA3I,GACA,QAAAoC,OACK,6BAOH,cAAAC,GA8BM,QAAAC,OA9BN,oBAFJ,IAAM4xB,GAAyC,CAAC,CAAE,KAAAxhB,CAAK,IAEnDrQ,GAAC,OAAI,UAAU,8JACZ,SAAAqQ,EACH,EAQEyhB,GAAmD1xB,GAAU,CACjE,GAAM,CAAE,KAAA8C,CAAK,EAAI9C,EACX,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvB,CAAE,UAAAnB,CAAU,EAAId,GAAmB,EACzC,OACEyC,GAAC,OAAI,UAAU,uEACb,UAAAA,GAACF,GAAA,CACC,MAAO,OACP,QAAS,UACT,UAAW,SACX,UAAU,gBAEV,UAAAE,GAACF,GAAA,CACC,UAAU,yBACV,UAAW,QACX,UAAW,SAEX,UAAAC,GAAC,OAAI,UAAU,2DACZ,SAAA2C,EAAE,cAAc,EACnB,EACA1C,GAACF,GAAA,CACC,IAAK,EACL,QAAS,QACT,UAAW,SACX,UAAU,0DAEV,UAAAC,GAACkC,GAAA,CAAU,KAAMgB,EAAK,MAAO,KAAK,MAAM,EACvCA,EAAK,OACR,GACF,EACAjD,GAACF,GAAA,CACC,UAAU,yBACV,UAAW,QACX,UAAW,SAEX,UAAAC,GAAC,OAAI,UAAU,2DACZ,SAAA2C,EAAE,YAAY,EACjB,EACA3C,GAACU,GAAK,QAAL,CACC,UAAU,eACV,KAAK,KACL,GAAI,EACJ,QAAS,GAER,SAAAwC,EAAK,QACR,GACF,EACAjD,GAACF,GAAA,CACC,UAAU,yBACV,UAAW,QACX,UAAW,SAEX,UAAAC,GAAC,OAAI,UAAU,mFACZ,SAAA2C,EAAE,mBAAmB,EACxB,EACA1C,GAACF,GAAA,CACC,IAAK,EACL,MAAO,OACP,QAAS,MACT,UAAW,SACX,UAAU,2DAEV,UAAAC,GAACU,GAAK,QAAL,CACC,KAAK,KACL,KAAK,QACL,GAAI,EACJ,SAAS,IACT,QAAS,GAER,SAAAwC,EAAK,WACR,EACAlD,GAAC,OAAI,UAAU,sDAAsD,gBAErE,GACF,GACF,GACF,EACAC,GAACF,GAAA,CACC,MAAO,OACP,QAAS,UACT,UAAW,SACX,UAAU,gBAEV,UAAAE,GAACF,GAAA,CACC,UAAU,yBACV,UAAW,QACX,UAAW,SAEX,UAAAC,GAAC,OAAI,UAAU,2DACZ,SAAA2C,EAAE,sCAAsC,EAC3C,EACA3C,GAACU,GAAK,QAAL,CACC,KAAK,KACL,UAAW,GACX,UAAU,iCACV,KAAK,QACL,GAAI,EACJ,SAAS,IACT,QAAS,GAER,SAAAwC,EAAK,WACR,GACF,EACAjD,GAACF,GAAA,CACC,UAAU,yBACV,UAAW,QACX,UAAW,SAEX,UAAAC,GAAC,OAAI,UAAU,2DACZ,SAAA2C,EAAE,2CAA2C,EAChD,EACA3C,GAACU,GAAK,QAAL,CAAa,KAAK,KAAK,GAAI,EAAG,OAAO,IACnC,SAAAwC,EAAK,gBAAkB,IAC1B,GACF,EACAjD,GAACF,GAAA,CACC,UAAU,yBACV,UAAW,QACX,UAAW,SAEX,UAAAC,GAAC,OAAI,UAAU,mFACZ,SAAA2C,EAAE,yCAAyC,EAC9C,EACA1C,GAACF,GAAA,CACC,IAAK,EACL,MAAO,OACP,QAAS,MACT,UAAW,SACX,UAAU,2DAEV,UAAAC,GAACU,GAAK,QAAL,CACC,KAAK,KACL,KAAK,QACL,GAAI,EACJ,SAAS,IACT,QAAS,GAER,SAAAwC,EAAK,uBACR,EACAlD,GAAC,OAAI,UAAU,sDAAsD,gBAErE,GACF,GACF,GACF,EACAC,GAACF,GAAA,CAAK,QAAS,UAAW,UAAW,SAAU,IAAK,EACjD,UAAAmD,EAAK,QAAU,QAAU5E,IAAc2qB,GAAe,QACrDjpB,GAACH,GAAA,CACC,UAAS,GACT,QAAQ,WACR,KAAK,KACL,MAAM,OACN,QAAS,IAAM,CACblC,GAAM,KAAK,iBAAkB,CAC3B,UAAWuF,EAAK,WAChB,MAAOA,EAAK,KACd,CAAC,CACH,EACA,UAAWgJ,GACT,8DACF,EAEC,SAAAvJ,EAAE,kBAAkB,EACvB,EAEF3C,GAACH,GAAA,CACC,UAAS,GACT,QAAQ,WACR,KAAK,KACL,MAAM,OACN,QAAS,IAAM,CACblC,GAAM,KAAK,kBAAmB,CAC5B,UAAWuF,EAAK,WAChB,MAAOA,EAAK,KACd,CAAC,CACH,EACA,UAAWgJ,GACT,8DACF,EAEC,SAAAvJ,EAAE,iBAAiB,EACtB,GACF,GACF,CAEJ,EAEa8tB,GAAsDrwB,GAAU,CAC3E,GAAM,CAAE,CAAE,EAAIX,GAAe,EAEvB,CACJ,cAAAoQ,EACA,MAAAtR,EACA,cAAAC,EACA,WAAA2H,EACA,gBAAA8E,EACA,cAAA2E,EACA,SAAA9J,CACF,EAAI1F,EAEEjB,EAAcZ,EAAM,aAAe,CAAC,EAEpC2M,EAA6B,CACjC,MAAO,EAAE,mBAAmB,EAC5B,oBACF,EAEMC,EAA6B,CACjC,MAAO,EAAE,oBAAoB,EAC7B,qBACF,EAEM2E,EAA2B,CAC/B,MAAO,aACP,MAAO,KACT,EAEM1E,EAAkBlO,GAAQ,IAC1B,MAAM,QAAQiC,CAAW,GAAKA,EAAY,OACrC,CACL+L,EACAC,EACA,GAAGhM,EAAY,IAAmB4D,IAAW,CAC3C,MAAOA,EAAM,GACb,MAAOA,GAAO,aAAe+H,GAAc/H,GAAO,EAAE,CACtD,EAAE,CACJ,EAEK,CAACmI,EAAcC,CAAY,EACjC,CAAChM,CAAW,CAAC,EAGV4yB,EAAiB70B,GAAQ,IACtB,CAAC4S,EAAY,GAAGD,CAAa,EACnC,CAACA,CAAa,CAAC,EAElB,OACE5P,GAAC,OAAI,UAAWiM,GAAG,mDAAmD,EACnE,UAAA1N,GACCwB,GAACsG,GAAA,CACC,SAAUR,EACV,UAAU,2BACV,MAAO,CACL,CACE,KAAM,KACN,KAAM,SACN,KAAM,UACN,MAAOmF,EACP,QAASG,CACX,EACA,CACE,KAAM,KACN,KAAM,SACN,KAAM,QACN,MAAOwE,EACP,QAASmiB,CACX,CACF,EACF,EAEF/xB,GAAC,OAAI,UAAU,kCACZ,SAAAmG,EAAW,IAAI,CAACoM,EAAQlK,IAErBpI,GAACuK,GAAM,SAAN,CACC,UAAAxK,GAAC6xB,GAAA,CAAW,KAAMtf,EAAO,aAAe,cAAe,EACtD,MAAM,QAAQA,EAAO,QAAQ,GAC5BA,EAAO,SAAS,IAAK7B,GACnB1Q,GAAC8xB,GAAA,CACC,KAAMphB,GACD,GAAGA,EAAM,KAAK,IAAIA,EAAM,UAAU,EACzC,CACD,IARgB,QAAQrI,CAAK,EASlC,CAEH,EACH,GACF,CAEJ,EHxSS,cAAArI,OAAA,oBAHF,IAAMuwB,GAAkC,IAAM,CACnD,IAAMyB,EAAclB,GAAgB,EAC9B/kB,EAAe5O,GAAW,EAChC,OAAO6C,GAACsP,GAAA,CAAiB,GAAG0iB,EAAc,GAAGjmB,EAAc,CAC7D,EAEa2kB,GAAyB,IAAM,CAC1C,IAAMsB,EAAclB,GAAgB,EAC9B/kB,EAAe5O,GAAW,EAC1B,CAAE,SAAA8B,CAAS,EAAIrB,GAAU,EAC/B,OAAIqB,EACKe,GAACywB,GAAA,CAAmB,GAAGuB,EAAc,GAAGjmB,EAAc,EAExD/L,GAACuP,GAAA,CAAa,GAAGyiB,EAAc,GAAGjmB,EAAc,CACzD,EIjBS,cAAA/L,OAAA,oBADF,IAAMwwB,GAAuB,IAC3BxwB,GAAC0wB,GAAA,EAAa,ELDvBlhB,KMNA,IAAAyiB,GAAA,GAAAxwB,EAAAwwB,GAAA,iBAAAC,GAAA,kBAAAC,KCCA9c,KAGS,cAAArV,OAAA,oBADF,IAAMmyB,GAA0B,IAC9BnyB,GAACkV,GAAA,EAAuB,EAGpBgd,GAAwB,IAC5BlyB,GAACkV,GAAA,EAAuB,ECRjC,IAAAkd,GAAA,GAAA3wB,EAAA2wB,GAAA,2BAAAC,GAAA,wBAAAC,GAAA,4BAAAC,GAAA,+BAAAC,KCCA,OAAS,OAAAzX,OAAW,6BCApB,OAAS,aAAAnd,OAAiB,6BCD1B,OAAiC,WAAAV,GAAS,YAAAyE,OAAgB,QAC1D,OAAS,oBAAA4B,GAAkB,WAAA2S,GAAkB,UAAAC,GAAQ,YAAAsc,OAAgB,WACrE,OAAS,cAAAt1B,OAAkB,gCAC3B,OAAS,iBAAAM,OAAqB,oCAC9B,OAAS,qBAAAC,OAAyB,gCCJlC,OAAS,WAAAR,OAAe,QACxB,OAAS,WAAAw1B,OAAe,WAmDxB,IAAMC,GAAqB,CACzBC,EACA5a,EACAE,EACA2a,EACAC,IACG,CACH,IAAMC,EAKD,CAAC,EAEArO,EAAU,IAAI,KAAK1M,CAAS,EAGlC,IAFA0M,EAAQ,YAAY,EAAG,EAAG,EAAG,CAAC,EAEvBA,GAAWxM,GAAS,CACzB,IAAMoI,EAAMwS,EAASpO,CAAO,EACtB7lB,EAAO+zB,EAAQ,IAAItS,CAAG,GAAK,CAC/B,IAAK,EACL,OAAQ,EACR,KAAM,CACR,EACAyS,EAAW,KAAK,CAAE,KAAMzS,EAAK,GAAGzhB,CAAK,CAAC,EACtCg0B,EAAYnO,CAAO,CACrB,CAEA,OAAOqO,CACT,EAGMC,GAAgB,CACpBC,EACAjb,EACAE,IAEOya,GACLM,EACAjb,EACAE,EACC1M,GAASA,EAAK,WAAWA,EAAK,WAAW,EAAI,CAAC,EAC9CA,GAASA,EAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,CAC3C,EAII0nB,GAAiB,CACrBC,EACAnb,EACAE,IAEOya,GACLQ,EACAnb,EACAE,EACC1M,GAASA,EAAK,YAAYA,EAAK,YAAY,EAAI,CAAC,EAChDA,GAASA,EAAK,YAAY,CAC7B,EAII4nB,GAAwB,CAC5BC,EACArb,EACAE,IAEOya,GACLU,EACArb,EACAE,EACC1M,GAASA,EAAK,cAAcA,EAAK,cAAc,EAAI,EAAE,EACrDA,GAASA,EAAK,YAAY,CAC7B,EAGW8nB,GAA2B,CACtCC,EACAC,EACAC,EACAC,EAAuB,KAEhBx2B,GAAQ,IAAM,CACnB,GAAI,CAACq2B,GAAcA,EAAW,SAAW,EACvC,OAAO,KAIT,IAAMI,EAAgBJ,EAAW,IAAKpR,GAAU,CAC9C,IAAMyR,EAAS,KAAK,IAAIzR,EAAM,kBAAoBA,EAAM,cAAc,EAChE0R,EAAO1R,EAAM,KAAO,EAGpBnI,EAAM0Z,EACRvR,EAAM,cAAgB,GACrBA,EAAM,cAAgB,GAAK0R,EAEhC,MAAO,CACL,GAAG1R,EACH,IAAAnI,EACA,OAAA4Z,EACA,KAAAC,EACA,KAAM,IAAI,KAAK1R,EAAM,kBAAkB,CACzC,CACF,CAAC,EAGK2R,EAAWH,EAAc,OAAO,CAAC9hB,EAAKsQ,IAAUtQ,EAAMsQ,EAAM,IAAK,CAAC,EAClE4R,EAAcJ,EAAc,OAChC,CAAC9hB,EAAKsQ,IAAUtQ,EAAMsQ,EAAM,OAC5B,CACF,EACMrQ,EAAY6hB,EAAc,OAAO,CAAC9hB,EAAKsQ,IAAUtQ,EAAMsQ,EAAM,KAAM,CAAC,EACpE6R,EAAcL,EAAc,OAC5BM,EAAWH,EAAWhiB,EAGtBoiB,EAAe,CAAC,GAAGP,CAAa,EAAE,KACtC,CAACQ,EAAGC,IAAMD,EAAE,KAAK,QAAQ,EAAIC,EAAE,KAAK,QAAQ,CAC9C,EACMpc,EAAYwb,GAAmBU,EAAa,CAAC,EAAE,KAC/Chc,EAAUub,GAAiBS,EAAaA,EAAa,OAAS,CAAC,EAAE,KAGjEG,EAAcd,EACjB,OAAQpR,GAAUA,EAAM,WAAa,CAAC,EACtC,OACC,CAACtQ,EAAKsQ,IACJtQ,EAAM,KAAK,IAAIsQ,EAAM,kBAAoBA,EAAM,cAAc,EAC/D,CACF,EACImS,EAAaP,EAAc,EAAKM,EAAcN,EAAe,IAAM,EAGnEQ,EAAc,IAAI,IAIxBZ,EAAc,QAASxR,GAAU,CAC/B,IAAMqS,EAAUrS,EAAM,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC,EAC/CsS,EAAWF,EAAY,IAAIC,CAAO,GAAK,CAC3C,IAAK,EACL,OAAQ,EACR,KAAM,CACR,EACAD,EAAY,IAAIC,EAAS,CACvB,IAAKC,EAAS,IAAMtS,EAAM,IAC1B,OAAQsS,EAAS,OAAStS,EAAM,OAChC,KAAMsS,EAAS,KAAOtS,EAAM,IAC9B,CAAC,CACH,CAAC,EAGD,IAAMuS,EAAY1B,GAAcuB,EAAavc,EAAWE,CAAO,EAGzDyc,EAAgB,IAAI,IAI1BhB,EAAc,QAASxR,GAAU,CAI/B,IAAM3W,EAAO,IAAI,KAAK2W,EAAM,IAAI,EAChC3W,EAAK,cAAc,EAAG,EAAG,CAAC,EAC1B,IAAMopB,EAAUppB,EAAK,YAAY,EAC3BipB,EAAWE,EAAc,IAAIC,CAAO,GAAK,CAC7C,IAAK,EACL,KAAM,EACN,OAAQ,CACV,EACAD,EAAc,IAAIC,EAAS,CACzB,IAAKH,EAAS,IAAMtS,EAAM,IAC1B,KAAMsS,EAAS,KAAOtS,EAAM,KAC5B,OAAQsS,EAAS,OAAStS,EAAM,MAClC,CAAC,CACH,CAAC,EAGD,IAAM0S,EAAc7c,EAAU,QAAQ,IAAME,EAAQ,QAAQ,EAGtD4c,EAAcpC,GAAQ1a,EAAW,CAAC,EAClC+c,EAAmB,IAAI,KAC3BD,EAAY,eAAe,EAC3BA,EAAY,YAAY,EACxBA,EAAY,WAAW,EACvB,EACA,EACA,EACA,CACF,EAAE,QAAQ,EAIJE,EAAgBH,EAAcnC,GAAQ1a,EAAW,CAAC,EAAIE,EAGxD+c,EAAa/B,GAAeyB,EAAe3c,EAAWgd,CAAa,EAEnEH,IACFI,EAAaA,EAAW,OACrB/xB,GAAS,IAAI,KAAKA,EAAK,IAAI,EAAE,QAAQ,EAAI6xB,CAC5C,GAIF,IAAMG,EAAuB,IAAI,IAIjCvB,EAAc,QAASxR,GAAU,CAC/B,IAAM3W,EAAO,IAAI,KAAK2W,EAAM,IAAI,EAE1BgT,EAAU3pB,EAAK,cAAc,EAC7B4pB,EAAiB,KAAK,MAAMD,EAAU,EAAE,EAAI,GAGlD3pB,EAAK,cAAc4pB,EAAgB,EAAG,CAAC,EACvC,IAAMC,EAAgB7pB,EAAK,YAAY,EACjCipB,EAAWS,EAAqB,IAAIG,CAAa,GAAK,CAC1D,IAAK,EACL,KAAM,EACN,OAAQ,CACV,EACAH,EAAqB,IAAIG,EAAe,CACtC,IAAKZ,EAAS,IAAMtS,EAAM,IAC1B,KAAMsS,EAAS,KAAOtS,EAAM,KAC5B,OAAQsS,EAAS,OAAStS,EAAM,MAClC,CAAC,CACH,CAAC,EAGD,IAAImT,EAAoBlC,GACtB8B,EACAld,EACAgd,CACF,EAEIH,IACFS,EAAoBA,EAAkB,OACnCpyB,GAAS,IAAI,KAAKA,EAAK,IAAI,EAAE,QAAQ,EAAI6xB,CAC5C,GAIF,IAAIQ,EAAO,EACLC,EAAqBd,EAAU,IAAKhe,IACxC6e,GAAQ7e,EAAI,IACL,CACL,KAAMA,EAAI,KACV,cAAe6e,CACjB,EACD,EAEGE,EAAQ,EACNC,EAAsBhB,EAAU,IAAKhe,IACzC+e,GAAS/e,EAAI,KACN,CACL,KAAMA,EAAI,KACV,eAAgB+e,CAClB,EACD,EACGE,EAAU,EACRC,EAAwBlB,EAAU,IAAKhe,IAC3Cif,GAAWjf,EAAI,OACR,CACL,KAAMA,EAAI,KACV,iBAAkBif,CACpB,EACD,EACDJ,EAAO,EACP,IAAMM,EAAsBZ,EAAW,IAAKa,IAC1CP,GAAQO,EAAK,IACN,CACL,KAAMA,EAAK,KACX,cAAeP,CACjB,EACD,EACDE,EAAQ,EACR,IAAMM,GAAuBd,EAAW,IAAKa,IAC3CL,GAASK,EAAK,KACP,CACL,KAAMA,EAAK,KACX,eAAgBL,CAClB,EACD,EACDE,EAAU,EACV,IAAMK,GAAyBf,EAAW,IAAKa,IAC7CH,GAAWG,EAAK,OACT,CACL,KAAMA,EAAK,KACX,iBAAkBH,CACpB,EACD,EAGDJ,EAAO,EACP,IAAMU,GAA6BX,EAAkB,IAAKY,IACxDX,GAAQW,EAAW,IACZ,CACL,KAAMA,EAAW,KACjB,cAAeX,CACjB,EACD,EAEDE,EAAQ,EACR,IAAMU,GAA8Bb,EAAkB,IAAKY,IACzDT,GAASS,EAAW,KACb,CACL,KAAMA,EAAW,KACjB,eAAgBT,CAClB,EACD,EAEDE,EAAU,EACV,IAAMS,GAAgCd,EAAkB,IACrDY,IACCP,GAAWO,EAAW,OACf,CACL,KAAMA,EAAW,KACjB,iBAAkBP,CACpB,EAEJ,EAEA,MAAO,CACL,SAAA7B,EACA,SAAAG,EACA,YAAAF,EACA,UAAAjiB,EACA,YAAAkiB,EACA,WAAAM,EAGA,UAAAI,EACA,mBAAAc,EACA,oBAAAE,EACA,sBAAAE,EAGA,WAAAX,EACA,oBAAAY,EACA,qBAAAE,GACA,uBAAAC,GAGA,kBAAAV,EACA,2BAAAW,GACA,4BAAAE,GACA,8BAAAC,EACF,CACF,EAAG,CAAC7C,EAAYC,EAAiBC,EAAeC,CAAW,CAAC,ECrZ9D,OAAS,WAAAx2B,GAAS,aAAA6P,GAAW,UAAAkJ,OAAc,QAC3C,OAAS,2BAAAogB,OAA+B,gCA0BjC,IAAMC,GAAa9kB,GAKpB,CACJ,GAAM,CAAE,OAAA9I,EAAQ,QAAA6tB,EAAS,MAAAC,EAAO,KAAAC,EAAO,GAAI,EAAIjlB,EAEzCklB,EAASx5B,GAAQ,IACd,CAACy5B,EAAmBC,IAAyC,CAClE,GAAIA,EAAkB,CAEpB,IAAMnoB,EAAQmoB,EAAiB,MAAM,OAAS,EAS9C,GARuBD,EAAYF,GAGbhoB,GAKlBmoB,EAAiB,KAAK,OAASH,EACjC,OAAO,IAEX,CAEA,IAAMI,EAAS,IAAI,gBACnB,OAAAA,EAAO,IAAI,OAAQJ,EAAK,SAAS,CAAC,EAClCI,EAAO,IAAI,OAAQ,GAAGF,EAAY,CAAC,EAAE,EACjCjuB,GACFmuB,EAAO,IAAI,SAAUnuB,CAAM,EAEzB6tB,GACFM,EAAO,IAAI,UAAWN,EAAQ,SAAS,CAAC,EAEtCC,GACFK,EAAO,IAAI,QAASL,EAAM,SAAS,CAAC,EAE1B,cAAcK,EAAO,SAAS,CAAC,EAE7C,EACC,CAACnuB,EAAQ6tB,EAASC,EAAOC,CAAI,CAAC,EAE3BvjB,EAASmjB,GAAwCK,EAAQ,CAC7D,UAAY73B,GAASA,EACrB,kBAAmB,GACnB,iBAAkB,EACpB,CAAC,EAEKi4B,EAAa7gB,GAAuB,EAG1C,OAAAlJ,GAAU,IAAM,CACd,GAAI,CAACmG,EAAO,KAAM,OAElB,IAAM6jB,EAAW7jB,EAAO,KAAKA,EAAO,KAAK,OAAS,CAAC,EAGnD,GAAI6jB,GAAYA,EAAS,KAAK,SAAWN,EAAM,CAE7C,IAAMO,EAAe9jB,EAAO,KAAK,OAAS,EAG1C4jB,EAAW,QAAU,WAAW,IAAM,CACpC5jB,EAAO,QAAQ8jB,CAAY,CAC7B,EAAG,GAAG,CACR,CAEA,MAAO,IAAM,CACPF,EAAW,SACb,aAAaA,EAAW,OAAO,CAEnC,CACF,EAAG,CAAC5jB,EAAO,KAAMujB,CAAI,CAAC,EAGtB1pB,GAAU,IACD,IAAM,CACP+pB,EAAW,SACb,aAAaA,EAAW,OAAO,CAEnC,EACC,CAACpuB,EAAQ6tB,EAASC,CAAK,CAAC,EAWpB,CACL,OATat5B,GAAQ,IAChBgW,EAAO,KACLA,EAAO,KACX,IAAKhO,GAASA,EAAK,IAAI,EACvB,KAAK,EACL,OAAQid,GAA8BA,IAAU,MAAS,EAJnC,CAAC,EAKzB,CAACjP,EAAO,IAAI,CAAC,EAId,UAAWA,EAAO,UAClB,MAAOA,EAAO,MACd,OAAQA,EAAO,MACjB,CACF,EFtHO,IAAKyD,QACVA,EAAA,IAAM,KACNA,EAAA,KAAO,KACPA,EAAA,MAAQ,MACRA,EAAA,QAAU,MAJAA,QAAA,IAOAsgB,QACVA,EAAA,YAAc,MACdA,EAAA,OAAS,KACTA,EAAA,MAAQ,KAHEA,QAAA,IAYNC,GAAc,CACjB,KAAiB,EACjB,KAAkB,EAClB,MAAmB,GACnB,MAAqB,EACxB,EAEMC,GAAe,CAAClgB,EAA6BrS,IAAgB,CACjE,IAAM+S,EAAY,OAAOV,GAAW,SAAWA,EAASigB,GAAYjgB,CAAM,EAC1E,MAAO,CACL,KAAMf,GAAQtR,EAAO+S,EAAY,CAAC,EAClC,GAAI/S,CACN,CACF,EAMA,IAAM6S,GAAmBjM,GAAgB,CACvC,GAAI,SAAOA,EAAS,KACpB,OAAO2K,GAAO3K,EAAM,YAAY,CAClC,EAcM4rB,GAAsB5rB,GAAqB,CAC/C,IAAM6rB,EAAUlhB,GAAO3K,EAAM,YAAY,EACnC,CAACgL,EAAMC,EAAOC,CAAG,EAAI2gB,EAAQ,MAAM,GAAG,EAAE,IAAI,MAAM,EACxD,OAAO,IAAI,KAAK,KAAK,IAAI7gB,EAAMC,EAAQ,EAAGC,CAAG,CAAC,CAChD,EAEa8b,GAA8B9pB,GAAoB,CAC7D,GAAM,CAAE,aAAA/J,EAAc,gBAAAC,CAAgB,EAAInB,GAAc,EAClD,CAAE,MAAAc,CAAM,EAAIpB,GAAW,EACvB,CAACm6B,EAAgBC,CAAiB,EAAI51B,GAC1C+G,GAAU,aACZ,EACM,CAAC8uB,EAAmBC,CAAoB,EAAI91B,GAChD,IACF,EACM,CAAC+1B,EAAUC,CAAW,EAAIh2B,GAAS,EAAK,EACxC,CAACiD,CAAK,EAAIjD,GAAS,IAAM,IAAI,IAAM,EACnC,CAACsV,EAAQC,CAAS,EAAIvV,GAA4B,IAAe,EAEjE,CAACgC,EAAWsB,CAAY,EAAItD,GAAmC,IAAM,CACzE,IAAMi2B,EAAQT,GAAa,KAAiBvyB,CAAK,EACjD,MAAO,CACL,KAAMwyB,GAAmBQ,EAAM,IAAI,EACnC,GAAIR,GAAmBQ,EAAM,EAAE,CACjC,CACF,CAAC,EAEKhf,EAAkB7V,GAAsB,CAC5C,IAAM+V,EAAWqe,GAAap0B,EAAO6B,CAAK,EAC1CsS,EAAUnU,CAAK,EACfkC,EAAa,CACX,KAAMmyB,GAAmBte,EAAS,IAAI,EACtC,GAAIse,GAAmBte,EAAS,EAAE,CACpC,CAAC,CACH,EAEMhT,EAAYC,GAAyC,CACzD,GAAIA,EAAO,OAAS,YAAa,CAC/B,IAAM8xB,EAAe9xB,EAAO,MAGtB+xB,EAAkB,CACtB,KAAMV,GAAmBS,EAAa,IAAI,EAC1C,GAAIT,GAAmBS,EAAa,EAAE,CACxC,EAIA,GAFA5yB,EAAa6yB,CAAe,EAExBA,EAAgB,MAAQA,EAAgB,GAAI,CAC9C,IAAMngB,GACJ,KAAK,IAAIpU,GAAiBu0B,EAAgB,KAAMA,EAAgB,EAAE,CAAC,EACnE,EAEIF,GAAQT,GAAaxf,GAAW/S,CAAK,EACrCmzB,GAA+B,CACnC,KAAMX,GAAmBQ,GAAM,IAAI,EACnC,GAAIR,GAAmBQ,GAAM,EAAE,CACjC,EAGEngB,GAAgBsgB,GAA6B,IAAI,IAC/CtgB,GAAgBqgB,EAAgB,IAAI,GACtCrgB,GAAgBsgB,GAA6B,EAAE,IAC7CtgB,GAAgBqgB,EAAgB,EAAE,EAEpC5gB,EACG,OAAO,KAAKggB,EAAW,EAAmB,KACxC5W,IAAQ4W,GAAY5W,EAAG,IAAM3I,EAChC,GAAK,IACP,EAEAT,EAAU,IAAI,CAElB,CACF,CACF,EAEMc,EAAYrU,EAAU,KACtBuU,EAAUvU,EAAU,GAIpBq0B,EAAgB96B,GAAQ,IACvBgb,GACEua,GAASva,CAAO,EACtB,CAACA,CAAO,CAAC,EAENgB,EAAchc,GAAQ,IACnB,CACL,CACE,KAAM,QACN,KAAM,YACN,MAAOyG,EACP,IAAK,EACP,CACF,EACC,CAACA,CAAS,CAAC,EAER,CAAE,OAAAs0B,EAAQ,UAAAjyB,EAAW,MAAAyZ,CAAM,EAAI6W,GAAU,CAC7C,OAAQgB,IAAmB,cAAgB,OAAYA,EACvD,QAAStf,EAAYA,EAAU,QAAQ,EAAI,OAC3C,MAAOggB,EAAgBA,EAAc,QAAQ,EAAI,MACnD,CAAC,EAKKE,EAAkB5E,GACtB2E,EACAjgB,EACAggB,EACA,EACF,EAEMhiB,EACJrX,GACAC,GACCL,EAAM,OAASb,GAAkB,eAChCa,EAAM,SAAWb,GAAkB,8BAEjCsZ,EAAc,OAAO,OAAOL,EAAU,EACtCwhB,EAAyB,OAAO,OAAOlB,EAAiB,EAoC9D,MAAO,CACL,eAAAK,EACA,kBAAAC,EACA,OAAAtgB,EACA,eAAA2B,EACA,YAAA5B,EACA,kBAAAwgB,EACA,qBAAAC,EACA,uBAAAU,EACA,SAAAT,EACA,YAAAC,EACA,UAAAh0B,EACA,YAAAuV,EACA,SAAApT,EACA,OAAAmyB,EACA,UAAAjyB,EACA,MAAAyZ,EACA,gBAAAyY,EACA,gBApDwB,IAAM,CAC9B,GAAI,CAACA,EAAiB,OAAO,KAE7B,IAAIhlB,EACJ,OAAQskB,EAAmB,CACzB,IAAK,MACHtkB,EAAS,CACP,WAAYglB,EAAgB,kBAC5B,cAAeA,EAAgB,2BAC/B,eAAgBA,EAAgB,4BAChC,iBAAkBA,EAAgB,6BACpC,EACA,MACF,IAAK,KACHhlB,EAAS,CACP,WAAYglB,EAAgB,WAC5B,cAAeA,EAAgB,oBAC/B,eAAgBA,EAAgB,qBAChC,iBAAkBA,EAAgB,sBACpC,EACA,MACF,IAAK,KACL,QACEhlB,EAAS,CACP,WAAYglB,EAAgB,UAC5B,cAAeA,EAAgB,mBAC/B,eAAgBA,EAAgB,oBAChC,iBAAkBA,EAAgB,qBACpC,CACJ,CAEA,OAAOhlB,CACT,GAoBoC,EAClC,UAAA8C,CACF,CACF,EGjPA,OAAOxL,IAAS,WAAAtN,GAAS,YAAAyE,OAAgB,QACzC,OAAS,YAAA8wB,OAAgB,WACzB,OACE,oBAAA2F,GACA,uBAAAC,GACA,qBAAAC,GACA,sBAAAC,OAEK,gCACP,OAAS,kBAAAjwB,OAAsB,gCAC/B,OAAS,kBAAA7I,OAAsB,+BAC/B,OACE,QAAAY,GACA,QAAAE,GACA,OAAAwa,GACA,aAAAta,GACA,QAAAC,GACA,WAAAJ,GACA,QAAAP,GACA,UAAAy4B,GACA,UAAAtI,GACA,MAAAhkB,GACA,aAAAiH,OAEK,6BCxBP,OAAS,UAAAgD,GAAQ,YAAAsiB,OAAgB,WAS1B,IAAMC,GAAuBC,GAAsC,CACxE,OAAQA,EAAQ,CACd,UACE,MAAO,SACT,SACE,MAAO,SACT,SACE,MAAO,QACT,QACE,MAAO,OACX,CACF,EAUaC,GAAqB,CAChCC,EACAF,IACW,CACX,GAAI,CACF,IAAMntB,EAAOitB,GAASI,CAAU,EAEhC,OAAQF,EAAQ,CACd,UACA,SAEE,OAAOxiB,GAAO3K,EAAM,eAAe,EACrC,SACA,QAEE,OAAO2K,GAAO3K,EAAM,OAAO,CAC/B,CACF,MAAQ,CAEN,OAAOqtB,CACT,CACF,ECnDA,OAAgB,WAAA37B,OAAe,QAC/B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,QAAAiB,GAAM,MAAAwL,OAAU,6BAoCjB,OAEI,OAAAlM,GAFJ,QAAAC,OAAA,oBAtBR,IAAM64B,GAAkB/1B,GAClBA,GAAS,IAAY,KAAKA,EAAQ,KAAK,QAAQ,CAAC,CAAC,IACjDA,GAAS,IAAY,KAAKA,EAAQ,KAAK,QAAQ,CAAC,CAAC,IACjDA,GAAS,IAAY,KAAKA,EAAQ,KAAK,QAAQ,CAAC,CAAC,IAC9C,IAAIA,EAAM,QAAQ,CAAC,CAAC,GAGhBg2B,GAAkD,CAAC,CAC9D,KAAAl6B,EACA,eAAAm6B,CACF,IAAM,CACJ,GAAM,CAAE,EAAAr2B,CAAE,EAAIlD,GAAe,EAEvBw5B,EAAc/7B,GAClB,IAAM,KAAK,IAAI,GAAG2B,EAAK,IAAKqE,GAAS,KAAK,IAAIA,EAAK,GAAG,CAAC,EAAG,CAAC,EAC3D,CAACrE,CAAI,CACP,EAEA,OACEoB,GAAC,OAAI,UAAU,aAEb,UAAAD,GAAC,OAAI,UAAU,+EACb,SAAAC,GAAC,OAAI,UAAU,uDACb,UAAAD,GAAC,OAAI,UAAU,iBACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,OAAO,WACnC,SAAAiC,EAAE,gDAAgD,EACrD,EACF,EACA3C,GAAC,OAAI,UAAU,iBACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,OAAO,WACnC,SAAAiC,EAAE,4CAA4C,EACjD,EACF,EACA3C,GAAC,OAAI,UAAU,gCACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,OAAO,WACnC,SAAAiC,EAAE,+CAA+C,EACpD,EACF,EACA3C,GAAC,OAAI,UAAU,gCACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,OAAO,WACnC,SAAAiC,EAAE,6CAA6C,EAClD,EACF,GACF,EACF,EAGA3C,GAAC,OAAI,UAAU,gBACZ,SAAAnB,EAAK,IAAKqE,GAAS,CAClB,IAAMg2B,EAAah2B,EAAK,KAAO,EACzBi2B,EAAY,KAAK,IAAIj2B,EAAK,GAAG,EAAI+1B,EAAe,IAEtD,OACEj5B,GAAC,OAEC,QAAS,IAAMg5B,IAAiB91B,EAAK,MAAM,EAC3C,UAAU,iIAEV,SAAAjD,GAAC,OAAI,UAAU,uDAEb,UAAAD,GAAC,OAAI,UAAU,iBACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,OAAO,WAAW,UAAU,eACzC,SAAAwC,EAAK,OACR,EACF,EAGAlD,GAAC,OAAI,UAAU,iBACb,SAAAC,GAAC,OAAI,UAAU,0GACb,UAAAD,GAAC,OACC,UAAU,yDACV,MAAO,CACL,MAAO,GAAGm5B,CAAQ,IAClB,gBAAiBD,EAAa,UAAY,SAC5C,EACF,EACAj5B,GAACS,GAAA,CACC,KAAK,KACL,OAAO,WACP,UAAWwL,GACT,iCACAgtB,EACI,sBACA,mBACN,EAEC,UAAAA,EAAa,IAAM,GACnBh2B,EAAK,IAAI,QAAQ,CAAC,GACrB,GACF,EACF,EAGAlD,GAAC,OAAI,UAAU,gCACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,OAAO,WACpB,SAAAo4B,GAAe51B,EAAK,MAAM,EAC7B,EACF,EAGAlD,GAAC,OAAI,UAAU,gCACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,OAAO,WAAW,UAAW,GAC1C,SAAAo4B,GAAe51B,EAAK,IAAI,EAC3B,EACF,GACF,GAnDKA,EAAK,MAoDZ,CAEJ,CAAC,EACH,EAGCrE,EAAK,SAAW,GACfmB,GAAC,OAAI,UAAU,wDACb,SAAAA,GAACU,GAAA,CAAK,UAAW,GAAK,SAAAiC,EAAE,oCAAoC,EAAE,EAChE,GAEJ,CAEJ,ECvIA,OAAgB,WAAAzF,GAAS,YAAAyE,OAAgB,QACzC,OACE,oBAAAy3B,GACA,uBAAAC,GACA,uBAAAC,GACA,sBAAAC,GACA,QAAAx5B,GACA,QAAAW,GACA,aAAAwB,GACA,SAAAs3B,GACA,MAAAttB,GACA,iBAAAutB,OAEK,6BA2CG,OAEI,OAAAz5B,GAFJ,QAAAC,OAAA,oBA7BH,IAAMy5B,GAAgD,CAAC,CAC5D,MAAA32B,EACA,cAAA42B,EACA,QAAAp3B,EACA,YAAAq3B,EAAc,eAChB,IAAM,CACJ,GAAM,CAACtX,EAAMW,CAAO,EAAIthB,GAAS,EAAK,EAChC,CAACk1B,EAAQgD,CAAS,EAAIl4B,GAAS,EAAE,EAEjCm4B,EAAkB58B,GAAQ,IACzB25B,EACEt0B,EAAQ,OACZw3B,GACCA,EAAI,MAAM,YAAY,EAAE,SAASlD,EAAO,YAAY,CAAC,GACrDkD,EAAI,MAAM,YAAY,EAAE,SAASlD,EAAO,YAAY,CAAC,CACzD,EALoBt0B,EAMnB,CAACs0B,EAAQt0B,CAAO,CAAC,EAEdy3B,EAAiBz3B,EAAQ,KAAMw3B,GAAQA,EAAI,QAAUh3B,CAAK,EAC1Dk3B,EACJl3B,IAAU,cACN,cACAi3B,GAAgB,OAASJ,EAG/B,OACE35B,GAACm5B,GAAA,CAAiB,KAAM9W,EAAM,aAAcW,EAC1C,UAAAjjB,GAACq5B,GAAA,CAAoB,QAAO,GAC1B,SAAAp5B,GAAC,UAAO,UAAU,sKAChB,UAAAA,GAACF,GAAA,CAAK,IAAK,EAAG,UAAU,SACrB,YAPUgD,IAAU,gBAOHk3B,IAAiBL,GACjC55B,GAACkC,GAAA,CAAU,KAAM+3B,EAAc,KAAK,MAAM,EAE5Cj6B,GAACU,GAAA,CAAK,KAAK,KAAK,UAAU,4BACvB,SAAAu5B,EACH,GACF,EAEAj6B,GAACy5B,GAAA,CACC,KAAM,GACN,UAAWvtB,GACT,qDACAoW,GAAQ,gBACV,EACF,GACF,EACF,EACAtiB,GAACu5B,GAAA,CACC,SAAAt5B,GAACq5B,GAAA,CACC,MAAM,QACN,KAAK,SACL,WAAY,EACZ,UAAU,2HACV,iBAAmBz2B,GAAMA,EAAE,eAAe,EAG1C,UAAA7C,GAAC,OAAI,UAAU,4DACb,SAAAA,GAACw5B,GAAA,CACC,UAAS,GACT,YAAY,oBACZ,MAAO3C,EACP,cAAegD,EACf,KAAK,KACP,EACF,EAGA75B,GAAC,OAAI,UAAU,wCACZ,SAAA85B,EAAgB,SAAW,EAC1B95B,GAAC,OAAI,UAAU,0EAA0E,4BAEzF,EAEA85B,EAAgB,IAAKI,GAAW,CAC9B,IAAMC,EAAap3B,IAAUm3B,EAAO,MAC9BE,EACJF,EAAO,QAAU,cAAgB,cAAgBA,EAAO,MAE1D,OACEj6B,GAAC,UAEC,QAAS,IAAM,CACb05B,EAAcO,EAAO,KAAK,EAC1BjX,EAAQ,EAAK,EACb4W,EAAU,EAAE,CACd,EACA,UAAW3tB,GACT,mHACAiuB,EAAa,gBAAkB,qBACjC,EAEC,UAAAD,EAAO,QAAU,eAChBl6B,GAACkC,GAAA,CAAU,KAAMk4B,EAAY,KAAK,MAAM,EAE1Cp6B,GAACU,GAAA,CAAK,KAAK,KAAK,UAAU,4BACvB,SAAA05B,EACH,IAhBKF,EAAO,KAiBd,CAEJ,CAAC,EAEL,GACF,EACF,GACF,CAEJ,ECrIA,OAAS,WAAAh9B,OAAe,QACxB,OAAS,UAAAm9B,OAAc,gCAwBvB,IAAMC,GAAW7O,GACf,MAAM,0BAA0BA,CAAG,EAAE,EAAE,KAAMrL,GAAQA,EAAI,KAAK,CAAC,EAEpDma,GAAgB/oB,GAMvB,CACJ,GAAM,CAAE,OAAA9I,EAAQ,WAAA8xB,EAAY,KAAA52B,EAAM,GAAAC,EAAI,MAAA42B,EAAQ,GAAK,EAAIjpB,EAEjDklB,EAASx5B,GAAQ,IAAM,CAC3B,GAAI,CAACwL,GAAU,CAAC8xB,EAAY,OAAO,KAGnC,IAAME,EAAM,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAGpCC,EAAgB/2B,EACdg3B,EAAc/2B,GAAM62B,EAE1B,GAAI,CAACC,EAAe,CAElB,IAAME,EAAmB,CACvB,MAAO,IACP,KAAM,KACN,KAAM,KACR,EAAEL,CAAU,EAEZG,EAAgBD,EAAMD,EAAQI,CAChC,CAEA,IAAMhE,EAAS,IAAI,gBACnB,OAAAA,EAAO,IAAI,SAAUnuB,CAAM,EAC3BmuB,EAAO,IAAI,aAAc2D,CAAU,EACnC3D,EAAO,IAAI,OAAQ8D,EAAc,SAAS,CAAC,EAC3C9D,EAAO,IAAI,KAAM+D,EAAY,SAAS,CAAC,EAEhC,wBAAwB/D,EAAO,SAAS,CAAC,EAClD,EAAG,CAACnuB,EAAQ8xB,EAAY52B,EAAMC,EAAI42B,CAAK,CAAC,EAElC,CAAE,KAAA57B,EAAM,UAAAmH,EAAW,MAAAyZ,CAAM,EAAI4a,GAAsB3D,EAAQ4D,GAAS,CACxE,kBAAmB,GACnB,iBAAkB,GACpB,CAAC,EAoBD,MAAO,CACL,OAlBap9B,GAAQ,IAAM,CAC3B,GAAI,CAAC2B,GAAM,GAAK,CAAC,MAAM,QAAQA,EAAK,CAAC,EAAG,MAAO,CAAC,EAEhD,GAAM,CAAE,EAAAi8B,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAC,EAAG,EAAAv4B,CAAE,EAAI9D,EAE7B,OAAO8D,EAAE,IAAI,CAACw4B,EAAW9yB,KAAW,CAClC,OAAQK,GAAU,GAClB,WAAY8xB,GAAc,GAC1B,UAAAW,EACA,KAAML,EAAEzyB,CAAK,EACb,KAAM0yB,EAAE1yB,CAAK,EACb,IAAK2yB,EAAE3yB,CAAK,EACZ,MAAO4yB,EAAE5yB,CAAK,EACd,OAAQ6yB,EAAE7yB,CAAK,CACjB,EAAE,CACJ,EAAG,CAACxJ,EAAM6J,EAAQ8xB,CAAU,CAAC,EAI3B,UAAAx0B,EACA,MAAAyZ,CACF,CACF,EJlDM,OACA,OAAAzf,EADA,QAAAC,MAAA,oBAZN,IAAM+a,GAAkBxQ,GAAM,KAAK,IACjC,sCAA0C,KAAMqD,IACvC,CAAE,QAASA,EAAI,WAAY,EACnC,CACH,EAIMutB,GAAoD,CAAC,CAAE,WAAA9G,CAAW,IAAM,CAC5E,IAAM+G,EAAa,IAAM/G,EACzB,OACEr0B,EAAC,OAAI,UAAU,yDACb,UAAAA,EAACS,GAAA,CAAK,OAAO,WAAY,UAAA4zB,EAAW,QAAQ,CAAC,EAAE,KAAC,EAChDt0B,EAAC,QAAK,UAAU,4BAA4B,aAAC,EAC7CC,EAACS,GAAA,CAAK,OAAO,WAAY,UAAA26B,EAAW,QAAQ,CAAC,EAAE,KAAC,GAClD,CAEJ,EAcO,IAAM/I,GACXlyB,GACG,CACH,GAAM,CACJ,eAAAk3B,EACA,kBAAAC,EACA,OAAAtgB,EACA,eAAA2B,EACA,YAAA5B,EACA,gBAAAkhB,EACA,YAAAhf,EACA,SAAApT,EACA,kBAAA0xB,EACA,qBAAAC,EACA,uBAAAU,EACA,eAAAmD,EACA,OAAArD,EACA,UAAAt0B,EACA,SAAA+zB,EACA,YAAAC,CACF,EAAIv3B,EACE,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvB87B,EAAcjzB,GAAe,EAC7B,CAACkzB,EAAUC,CAAW,EAAI95B,GAAmB,OAAc,EAC3D,CAAC+5B,EAAmBC,CAAoB,EAAIh6B,GAAS,EAAI,EACzD,CAACi6B,EAAsBC,CAAuB,EAAIl6B,GAAS,EAAK,EAChE,CAACm6B,EAAoBC,CAAqB,EAAIp6B,GAAS,EAAK,EAI5Dq6B,EAAuBn9B,GAAgB,CAC3C,GAAI,CAACA,GAAQA,EAAK,SAAW,EAAG,MAAO,CAAE,MAAO,EAAG,IAAK,CAAE,EAG1D,IAAMo9B,EAAap9B,EAAK,UACrBqE,GAASA,EAAK,QAAUA,EAAK,SAAW,CAC3C,EAGMg5B,EAAWr9B,EAAK,OACpB,CAACs9B,EAASj5B,EAAMk5B,IACdl5B,EAAK,QAAUA,EAAK,SAAW,EAAIk5B,EAAMD,EAC3C,EACF,EAEA,MAAO,CACL,MAAOF,IAAe,GAAK,EAAIA,EAC/B,IAAKC,IAAa,GAAKr9B,EAAK,OAASq9B,EAAW,CAClD,CACF,EAGMG,EAAmBn/B,GAAQ,IAAM,CACrC,IAAMuL,EAAU,OAAO,KAAK8yB,CAAW,EACvC,MAAO,CACL,CAAE,MAAO,cAAe,MAAO,aAAc,EAC7C,GAAG9yB,EAAQ,IAAKC,IAAY,CAC1B,MAAOA,EACP,MAAOA,EAAO,QAAQ,QAAS,EAAE,EAAE,QAAQ,QAAS,EAAE,CACxD,EAAE,CACJ,CACF,EAAG,CAAC6yB,CAAW,CAAC,EAKVe,EAAkBp/B,GAAQ,IAAM,CACpC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,GAAM,CAAE,MAAAhhB,EAAO,IAAAC,CAAI,EAAIyhB,EAAoBV,EAAe,UAAU,EAEpE,OADoBA,EAAe,WAAW,MAAMhhB,EAAOC,CAAG,EAC3C,IAAKrX,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EAGrD,IAAKE,EAAWx0B,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC7C,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,EAAmBE,CAAQ,CAAC,EAG1C6E,EAAqBr/B,GAAQ,IAAM,CACvC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,GAAM,CAAE,MAAAhhB,EAAO,IAAAC,CAAI,EAAIyhB,EAAoBV,EAAe,UAAU,EAEpE,OADoBA,EAAe,WAAW,MAAMhhB,EAAOC,CAAG,EAC3C,IAAKrX,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EACrD,OAAQt0B,EAAK,QAAU,CACzB,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,CAAiB,CAAC,EAIhCgF,EAAmBt/B,GAAQ,IAAM,CACrC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,GAAM,CAAE,MAAAhhB,EAAO,IAAAC,CAAI,EAAIyhB,EAAoBV,EAAe,UAAU,EAEpE,OADoBA,EAAe,WAAW,MAAMhhB,EAAOC,CAAG,EAC3C,IAAKrX,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EACrD,KAAM,EAAEt0B,EAAK,MAAQ,EACvB,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,CAAiB,CAAC,EAGhCiF,GAAkBv/B,GAAQ,IAAM,CACpC,OAAQs6B,EAAmB,CACzB,IAAK,MACH,MAAO,MACT,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,KACT,QACE,MAAO,IACX,CACF,EAAG,CAACA,CAAiB,CAAC,EAGhBkF,GAAepF,IAAmB,cAClCqF,GAAez/B,GAAQ,IAAM,CACjC,GAAKyG,GAAW,GAEhB,OAAO8uB,GAAS9uB,EAAU,EAAE,CAC9B,EAAG,CAACA,GAAW,EAAE,CAAC,EAEZ,CAAE,OAAAi5B,EAAO,EAAIrC,GAAa,CAC9B,OAAQ,CAACmC,IAAgBpF,EAAiBA,EAAiB,OAC3D,WAAYmF,GACZ,KAAM94B,EAAY,KAAK,MAAMA,EAAU,KAAK,QAAQ,EAAI,GAAI,EAAI,OAChE,GAAIg5B,GAAe,KAAK,MAAMA,GAAa,QAAQ,EAAI,GAAI,EAAI,MACjE,CAAC,EAKKE,GAAoB3/B,GAAQ,IAAM,CACtC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WACrC,MAAO,CAAC,EAIV,GAAM,CAAE,MAAAhhB,EAAO,IAAAC,CAAI,EAAIyhB,EAAoBV,EAAe,UAAU,EAC9DwB,EAAqBxB,EAAe,WAAW,MAAMhhB,EAAOC,CAAG,EAErE,GAAIuiB,EAAmB,SAAW,GAAKF,GAAO,SAAW,EACvD,MAAO,CAAC,EAIV,IAAMG,EAAW,IAAI,IACrB,OAAAH,GAAO,QAASI,GAAM,CACpB,IAAMxxB,EAAO,IAAI,KAAKwxB,EAAE,UAAY,GAAI,EAClCC,EAAgBrE,GACpBptB,EAAK,YAAY,EACjBgsB,CACF,EACAuF,EAAS,IAAIE,EAAeD,CAAC,CAC/B,CAAC,EAGcF,EAAmB,IAAKI,GAAgB,CACrD,IAAMD,EAAgBrE,GACpBsE,EAAY,KACZ1F,CACF,EACM2F,EAAQJ,EAAS,IAAIE,CAAa,EAExC,MAAO,CACL,KAAMA,EACN,KAAME,GAAO,MAAQ,KACrB,KAAMA,GAAO,MAAQ,KACrB,IAAKA,GAAO,KAAO,KACnB,MAAOA,GAAO,OAAS,IACzB,CACF,CAAC,CAGH,EAAG,CAACP,GAAQtB,EAAgB9D,CAAiB,CAAC,EAGxC4F,EAAYlgC,GAAQ,IAAM,CAC9B,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,GAAM,CAAE,MAAAhhB,EAAO,IAAAC,CAAI,EAAIyhB,EAAoBV,EAAe,UAAU,EAEpE,OADoBA,EAAe,WAAW,MAAMhhB,EAAOC,CAAG,EAC3C,IAAKrX,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EACrD,IAAKt0B,EAAK,IACV,OAAQA,EAAK,QAAU,EACvB,KAAMA,EAAK,MAAQ,CACrB,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,CAAiB,CAAC,EAGhC6F,EAA8CngC,GAClD,IAAM,CACJ,CACE,MAAOyF,EAAE,aAAa,EACtB,UAAW,OACX,MAAO,IACP,MAAO,MACT,EACA,CACE,MAAOA,EAAE,yCAAyC,EAClD,UAAW,MACX,MAAO,QACP,MAAO,IACP,OAASI,GAAkB,CACzB,IAAMm2B,EAAan2B,GAAS,EAC5B,OACE9C,EAACS,GAAA,CACC,GAAG,OACH,OAAO,WACP,UACEw4B,EAAa,sBAAwB,oBAGtC,UAAAn2B,EAAM,QAAQ,CAAC,EAAE,SACpB,CAEJ,CACF,EACA,CACE,MAAOJ,EAAE,oCAAoC,EAC7C,UAAW,SACX,MAAO,QACP,MAAO,IACP,OAASI,GACA/C,EAACU,GAAA,CAAK,GAAG,OAAQ,SAAA48B,EAAkBv6B,CAAK,EAAE,CAErD,EACA,CACE,MAAOJ,EAAE,kCAAkC,EAC3C,UAAW,OACX,MAAO,QACP,MAAO,IACP,OAASI,GACA/C,EAACU,GAAA,CAAK,GAAG,OAAQ,SAAA48B,EAAkBv6B,CAAK,EAAE,CAErD,CACF,EACA,CAACJ,CAAC,CACJ,EAGM26B,EAAqBv6B,GAA0B,CACnD,IAAMw6B,EAAgB,CAAC,GAAI,IAAK,IAAK,IAAK,GAAG,EACzCl1B,EAAQ,EACRm1B,EAAMz6B,EACV,KAAOy6B,GAAO,KAAQn1B,EAAQk1B,EAAc,OAAS,GACnDC,GAAO,IACPn1B,IAEF,IAAMo1B,EAAgBD,GAAO,GAAK,EAAIA,GAAO,IAAM,EAAI,EAEvD,MAAO,GADS,WAAWA,EAAI,QAAQC,CAAa,CAAC,CACpC,GAAGF,EAAcl1B,CAAK,CAAC,EAC1C,EAGMq1B,EAAoBxgC,GAAQ,IAAM,CACtC,GAAI,CAAC+6B,GAAUA,EAAO,SAAW,EAAG,MAAO,CAAC,EAE5C,IAAM0F,EAAY,IAAI,IAKtB,OAAA1F,EAAO,QAAS9V,GAAqB,CACnC,IAAMzZ,EAASyZ,EAAM,OAChBwb,EAAU,IAAIj1B,CAAM,GACvBi1B,EAAU,IAAIj1B,EAAQ,CAAE,IAAK,EAAG,OAAQ,EAAG,KAAM,EAAG,OAAQ,CAAE,CAAC,EAGjE,IAAMgc,EAAUiZ,EAAU,IAAIj1B,CAAM,EAC9Bk1B,EAAczb,EAAM,kBAAoBA,EAAM,eAEpDuC,EAAQ,KAAOvC,EAAM,cAAgB,EACrCuC,EAAQ,QAAUkZ,EAClBlZ,EAAQ,MAAQvC,EAAM,KAAO,EAC7BuC,EAAQ,QAAU,CACpB,CAAC,EAGM,MAAM,KAAKiZ,EAAU,QAAQ,CAAC,EAClC,IAAI,CAAC,CAACj1B,EAAQ7J,CAAI,KAAO,CACxB,OAAA6J,EACA,GAAG7J,CACL,EAAE,EACD,KAAK,CAACs1B,EAAGC,IAAMA,EAAE,IAAMD,EAAE,GAAG,EAC5B,MAAM,EAAG,EAAE,CAChB,EAAG,CAAC8D,CAAM,CAAC,EAEX,OACEj4B,EAACK,GAAA,CACC,MACEL,EAAC+a,GAAA,CACC,SAAA/a,EAACwK,GAAM,SAAN,CAAe,SAAU,KACxB,SAAAxK,EAACgb,GAAA,CACC,eAAgBpC,EAChB,YAAa5B,EACb,OAAQC,EACR,MAAOtU,EAAE,6BAA6B,EACtC,YAAauW,EACb,SAAUpT,EACZ,EACF,EACF,EAGF,SAAA7F,EAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAClB,UAAAN,EAACF,GAAA,CAAK,IAAK,EAAG,UAAU,MAEtB,UAAAE,EAAC8a,GAAA,CAAI,UAAU,0BACb,UAAA/a,EAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,UAAU,WACtC,SAAAiC,EAAE,eAAe,EACpB,EACA3C,EAAC05B,GAAA,CACC,MAAOpC,GAAkB,GACzB,cAAgBv0B,GAAkBw0B,EAAkBx0B,CAAK,EACzD,QAASs5B,EACT,YAAa15B,EAAE,eAAe,EAChC,GACF,EAGA1C,EAAC8a,GAAA,CAAI,UAAU,eACb,UAAA/a,EAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,UAAU,WACtC,SAAAiC,EAAE,yCAAyC,EAC9C,EACA3C,EAACw4B,GAAO,QAAP,CACC,MAAOhB,EACP,cAAgBz0B,GACd00B,EAAqB10B,CAA0B,EAEjD,QAASo1B,EAAuB,IAAKxuB,IAAU,CAC7C,MACEA,IAAS,MACL,SACAA,IAAS,KACP,SACA,QACR,MAAOA,CACT,EAAE,EACF,WAAY,CAAE,QAASuC,GAAG,gBAAgB,CAAE,EAC9C,GACF,GACF,EAEAlM,EAACM,GAAA,CAAQ,UAAU,0BAA0B,UAAW,EAAG,EAE3DL,EAAC8a,GAAA,CAAI,GAAI,EAEP,UAAA9a,EAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAAG,GAAI,EACzB,UAAAP,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAGb,SAAA/a,EAACS,GAAA,CACC,MAAM,oBACN,WAAY,CAAE,SAAU,GAAM,eAAgB,EAAK,EAElD,SAAAy3B,EAAkBA,EAAgB,SAAS,QAAQ,CAAC,EAAI,KAC3D,EACF,EACAl4B,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAGb,SAAA/a,EAACS,GAAA,CACC,MAAOkC,EAAE,uCAAuC,EAChD,WAAY,CAAE,eAAgB,EAAM,EAEnC,SAAAu1B,EAAkBA,EAAgB,UAAU,QAAQ,CAAC,EAAI,KAC5D,EACF,EACAl4B,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAGb,SAAA/a,EAACS,GAAA,CACC,MAAM,kBACN,WAAY,CAAE,SAAU,GAAM,eAAgB,EAAK,EAElD,SAAAy3B,EAAkBA,EAAgB,SAAS,QAAQ,CAAC,EAAI,KAC3D,EACF,EACAl4B,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAGb,SAAA/a,EAACS,GAAA,CAAU,MAAOkC,EAAE,yCAAyC,EAC1D,SAAAu1B,EACGA,EAAgB,YAAY,QAAQ,CAAC,EACrC,KACN,EACF,EACAl4B,EAAC+a,GAAA,CACC,SAAS,UACT,EAAE,KACF,GAAI,EACJ,GAAI,EACJ,MAAO,IACP,OAAM,GACN,YAAa,EAGb,SAAA/a,EAACS,GAAA,CAAU,MAAM,gBACd,SAAAy3B,EACCl4B,EAACo7B,GAAA,CAAgB,WAAYlD,EAAgB,WAAY,EAEzDl4B,EAAC,OAAI,UAAU,kBAAkB,cAAE,EAEvC,EACF,GACF,EAGAC,EAACF,GAAA,CAAK,IAAK,EAAG,GAAI,EAChB,UAAAC,EAAC,UACC,QAAS,IAAMy7B,EAAY,OAAc,EACzC,UAAWvvB,GACT,iFACAsvB,IAAa,QACT,uCACA,6DACN,EACD,iBAED,EACAx7B,EAAC,UACC,QAAS,IAAMy7B,EAAY,OAAc,EACzC,UAAWvvB,GACT,iFACAsvB,IAAa,QACT,uCACA,6DACN,EACD,iBAED,GACF,EAGCA,IAAa,SACZv7B,EAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAElB,UAAAN,EAAC8a,GAAA,CACC,UAAA9a,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KAAK,UAAU,WAChC,UAAAg4B,GAAoBlB,CAAiB,EAAG,IACxC70B,EAAE,yCAAyC,GAC9C,EACA1C,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,UAAU,WACnD,UAAAE,EAACF,GAAA,CAAK,IAAK,EACT,UAAAC,EAAC,UACC,QAAS,IAAM23B,EAAY,EAAK,EAChC,UAAWzrB,GACT,iFACCwrB,EAEG,8DADA,sCAEN,EACD,qBAED,EACA13B,EAAC,UACC,QAAS,IAAM23B,EAAY,EAAI,EAC/B,UAAWzrB,GACT,iFACAwrB,EACI,uCACA,6DACN,EACD,mBAED,GACF,EACAz3B,EAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,SAAM,UAAU,wCAAwC,sBAEzD,EACAA,EAACkwB,GAAA,CACC,QAASwL,EACT,gBAAiBC,EACnB,GACF,GACF,EACA37B,EAAC+a,GAAA,CACC,EAAE,KACF,UAAU,6CAEV,SAAA/a,EAACo4B,GAAA,CAEC,KAAMkE,EACN,kBAAmB9E,EACnB,UACE,CAAC8D,GACD,CAACA,EAAe,YAChBA,EAAe,WAAW,SAAW,EAEvC,eAAgBI,GARX,gBAAgBlE,CAAiB,EASxC,EACF,GACF,EAGAv3B,EAAC8a,GAAA,CACC,UAAA9a,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,UAAU,WACnD,UAAAE,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KACjB,UAAAg4B,GAAoBlB,CAAiB,EAAG,IACxC70B,EAAE,oCAAoC,GACzC,EACA1C,EAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,SAAM,UAAU,wCAAwC,sBAEzD,EACAA,EAACkwB,GAAA,CACC,QAAS0L,EACT,gBAAiBC,EACnB,GACF,GACF,EACA77B,EAAC+a,GAAA,CACC,EAAE,KACF,UAAU,6CAEV,SAAA/a,EAACq4B,GAAA,CAEC,KAAMkE,EACN,kBAAmB/E,EACnB,UACE,CAAC8D,GACD,CAACA,EAAe,YAChBA,EAAe,WAAW,SAAW,EAEvC,eAAgBM,GARX,gBAAgBpE,CAAiB,EASxC,EACF,GACF,EAGC,CAACkF,IACAz8B,EAAC8a,GAAA,CACC,UAAA9a,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KAAK,UAAU,WAChC,UAAAg4B,GAAoBlB,CAAiB,EAAE,UAC1C,EACAx3B,EAAC+a,GAAA,CACC,EAAE,KACF,UAAU,6CAEV,SAAA/a,EAACu4B,GAAA,CAEC,KAAMsE,GACN,kBACErF,EAEF,UAAWqF,GAAkB,SAAW,GALnC,kBAAkBrF,CAAiB,IAAIF,CAAc,EAM5D,EACF,GACF,EAIFr3B,EAAC8a,GAAA,CACC,UAAA9a,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,UAAU,WACnD,UAAAE,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KACjB,UAAAg4B,GAAoBlB,CAAiB,EAAG,IACxC70B,EAAE,kCAAkC,GACvC,EACA1C,EAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,SAAM,UAAU,wCAAwC,sBAEzD,EACAA,EAACkwB,GAAA,CACC,QAAS4L,EACT,gBAAiBC,EACnB,GACF,GACF,EACA/7B,EAAC+a,GAAA,CACC,EAAE,KACF,UAAU,6CAEV,SAAA/a,EAACs4B,GAAA,CAEC,KAAMkE,EACN,kBAAmBhF,EACnB,UACE,CAAC8D,GACD,CAACA,EAAe,YAChBA,EAAe,WAAW,SAAW,EAEvC,eAAgBQ,GARX,iBAAiBtE,CAAiB,EASzC,EACF,GACF,GACF,EAIDgE,IAAa,SACZx7B,EAAC+a,GAAA,CAAI,UAAU,gBACb,SAAA/a,EAACmT,GAAA,CACC,SAAQ,GACR,QAASkqB,EACT,WAAYD,EACZ,UACEp9B,EAAC+a,GAAA,CAAI,UAAU,2BACb,SAAA/a,EAACU,GAAA,CAAM,SAAAiC,EAAE,oCAAoC,EAAE,EACjD,EAEJ,EACF,EAID+6B,EAAkB,OAAS,GAC1Bz9B,EAAC8a,GAAA,CAAI,GAAI,EACP,UAAA/a,EAACM,GAAA,CAAQ,UAAU,0BAA0B,UAAW,EAAG,EAC3DN,EAACU,GAAA,CAAK,GAAG,MAAM,KAAK,KAAK,OAAO,WAAW,UAAU,WAClD,SAAAiC,EAAE,wCAAwC,EAC7C,EACA3C,EAAC+a,GAAA,CAAI,UAAU,sDACb,SAAA/a,EAAC+4B,GAAA,CACC,KAAM2E,EACN,eAAgBnG,EAClB,EACF,GACF,GAEJ,GACF,EACF,CAEJ,EK9sBA,OAAgB,WAAAr6B,GAAS,YAAAyE,OAAgB,QACzC,OACE,oBAAAy2B,GACA,uBAAAC,GACA,qBAAAC,GACA,sBAAAC,OACK,gCACP,OAAS,kBAAAjwB,OAAsB,gCAC/B,OAAS,kBAAA7I,OAAsB,+BAC/B,OACE,OAAAsb,GAEA,QAAAra,GACA,QAAAX,GACA,QAAAqN,GACA,YAAAD,GACA,cAAA7G,GACA,UAAAkyB,GACA,QAAAj4B,GACA,WAAAD,GACA,UAAA4vB,GAEA,MAAAhkB,OACK,6BCvBP,OAAgB,WAAAhP,OAAe,QAC/B,OAAS,kBAAAuC,OAAsB,+BAC/B,OAAS,QAAAiB,GAAM,MAAAwL,OAAU,6BAoCjB,OACE,OAAAlM,GADF,QAAAC,OAAA,oBAtBR,IAAM64B,GAAkB/1B,GAClBA,GAAS,IAAY,KAAKA,EAAQ,KAAK,QAAQ,CAAC,CAAC,IACjDA,GAAS,IAAY,KAAKA,EAAQ,KAAK,QAAQ,CAAC,CAAC,IACjDA,GAAS,IAAY,KAAKA,EAAQ,KAAK,QAAQ,CAAC,CAAC,IAC9C,IAAIA,EAAM,QAAQ,CAAC,CAAC,GAGhB86B,GAA8D,CAAC,CAC1E,KAAAh/B,EACA,eAAAm6B,CACF,IAAM,CACJ,GAAM,CAAE,EAAAr2B,CAAE,EAAIlD,GAAe,EAEvBw5B,EAAc/7B,GAClB,IAAM,KAAK,IAAI,GAAG2B,EAAK,IAAKqE,GAAS,KAAK,IAAIA,EAAK,GAAG,CAAC,EAAG,CAAC,EAC3D,CAACrE,CAAI,CACP,EAEA,OACEoB,GAAC,OAAI,UAAU,2BAEb,UAAAD,GAAC,OAAI,UAAU,4DACb,SAAAC,GAAC,OAAI,UAAU,gDACb,UAAAD,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,OAAO,WACnC,SAAAiC,EAAE,gDAAgD,EACrD,EACA3C,GAACU,GAAA,CACC,KAAK,KACL,UAAW,GACX,OAAO,WACP,UAAU,iBAET,SAAAiC,EAAE,4CAA4C,EACjD,GACF,EACF,EAGC9D,EAAK,IAAKqE,GAAS,CAClB,IAAMg2B,EAAah2B,EAAK,KAAO,EACzBi2B,EAAY,KAAK,IAAIj2B,EAAK,GAAG,EAAI+1B,EAAe,IAEtD,OACEh5B,GAAC,OAEC,QAAS,IAAM+4B,IAAiB91B,EAAK,MAAM,EAC3C,UAAU,8HAGV,UAAAlD,GAACU,GAAA,CAAK,KAAK,KAAK,OAAO,WAAW,UAAU,WACzC,SAAAwC,EAAK,OACR,EAGAjD,GAAC,OAAI,UAAU,mHACb,UAAAD,GAAC,OACC,UAAU,yDACV,MAAO,CACL,MAAO,GAAGm5B,CAAQ,IAClB,gBAAiBD,EAAa,UAAY,SAC5C,EACF,EACAj5B,GAACS,GAAA,CACC,KAAK,KACL,OAAO,WACP,UAAWwL,GACT,iCACAgtB,EAAa,sBAAwB,mBACvC,EAEC,UAAAA,EAAa,IAAM,GACnBh2B,EAAK,IAAI,QAAQ,CAAC,GACrB,GACF,EAGAjD,GAAC,OAAI,UAAU,iFACb,UAAAA,GAAC,OACC,UAAAD,GAACU,GAAA,CAAK,KAAK,MAAM,UAAW,GAAI,UAAU,aACvC,SAAAiC,EAAE,+CAA+C,EACpD,EACA3C,GAACU,GAAA,CAAK,KAAK,KAAK,OAAO,WACpB,SAAAo4B,GAAe51B,EAAK,MAAM,EAC7B,GACF,EACAjD,GAAC,OAAI,UAAU,iBACb,UAAAD,GAACU,GAAA,CAAK,KAAK,MAAM,UAAW,GAAI,UAAU,aACvC,SAAAiC,EAAE,6CAA6C,EAClD,EACA3C,GAACU,GAAA,CAAK,KAAK,KAAK,OAAO,WAAW,UAAW,GAC1C,SAAAo4B,GAAe51B,EAAK,IAAI,EAC3B,GACF,GACF,IAjDKA,EAAK,MAkDZ,CAEJ,CAAC,EAGArE,EAAK,SAAW,GACfmB,GAAC,OAAI,UAAU,wDACb,SAAAA,GAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAiC,EAAE,oCAAoC,EACzC,EACF,GAEJ,CAEJ,EDtFM,OAGA,OAAA3C,EAHA,QAAAC,MAAA,oBAJN,IAAMm7B,GAAoD,CAAC,CAAE,WAAA9G,CAAW,IAAM,CAC5E,IAAM+G,EAAa,IAAM/G,EACzB,OACEr0B,EAACF,GAAA,CAAK,UAAU,MAAM,QAAQ,SAAS,IAAK,EAC1C,UAAAE,EAACS,GAAA,CAAK,OAAO,WAAW,KAAK,MAC1B,UAAA4zB,EAAW,QAAQ,CAAC,EAAE,KACzB,EACAt0B,EAAC,QAAK,UAAU,4BAA4B,aAAC,EAC7CC,EAACS,GAAA,CAAK,OAAO,WAAW,KAAK,MAC1B,UAAA26B,EAAW,QAAQ,CAAC,EAAE,KACzB,GACF,CAEJ,EAEayC,GAER19B,GAAU,CACb,GAAM,CACJ,eAAAk3B,EACA,kBAAAC,EACA,OAAAtgB,EACA,eAAA2B,EACA,gBAAAsf,EACA,YAAAhf,EACA,SAAApT,EACA,kBAAA0xB,EACA,qBAAAC,EACA,uBAAAU,EACA,eAAAmD,EACA,OAAArD,EACA,UAAAt0B,EACA,SAAA+zB,EACA,YAAAC,CACF,EAAIv3B,EACE,CAAE,EAAAuC,CAAE,EAAIlD,GAAe,EACvB87B,EAAcjzB,GAAe,EAC7B,CAACozB,EAAmBC,CAAoB,EAAIh6B,GAAS,EAAI,EACzD,CAACi6B,EAAsBC,CAAuB,EAAIl6B,GAAS,EAAK,EAChE,CAACm6B,EAAoBC,CAAqB,EAAIp6B,GAAS,EAAK,EAG5Do8B,EAA8Bl/B,GAAgB,CAClD,GAAI,CAACA,GAAQA,EAAK,SAAW,EAAG,MAAO,GACvC,IAAMwJ,EAAQxJ,EAAK,UAAWqE,GAASA,EAAK,QAAUA,EAAK,SAAW,CAAC,EACvE,OAAOmF,IAAU,GAAK,EAAIA,CAC5B,EAGMg0B,EAAmBn/B,GAAQ,IAAM,CACrC,IAAMuL,EAAU,OAAO,KAAK8yB,CAAW,EACvC,MAAO,CACL,CAAE,MAAO,cAAe,MAAO,aAAc,EAC7C,GAAG9yB,EAAQ,IAAKC,IAAY,CAC1B,MAAOA,EACP,MAAOA,EAAO,QAAQ,QAAS,EAAE,EAAE,QAAQ,QAAS,EAAE,CACxD,EAAE,CACJ,CACF,EAAG,CAAC6yB,CAAW,CAAC,EAKVe,EAAkBp/B,GAAQ,IAAM,CACpC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,IAAM0C,EAAYD,EAA2BzC,EAAe,UAAU,EAEtE,OADoBA,EAAe,WAAW,MAAM0C,CAAS,EAC1C,IAAK96B,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EAGrD,IAAKE,EAAWx0B,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC7C,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,EAAmBE,CAAQ,CAAC,EAG1C6E,EAAqBr/B,GAAQ,IAAM,CACvC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,IAAM0C,EAAYD,EAA2BzC,EAAe,UAAU,EAEtE,OADoBA,EAAe,WAAW,MAAM0C,CAAS,EAC1C,IAAK96B,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EACrD,OAAQt0B,EAAK,QAAU,CACzB,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,CAAiB,CAAC,EAIhCgF,EAAmBt/B,GAAQ,IAAM,CACrC,GAAI,CAACo+B,GAAkB,CAACA,EAAe,WAAY,MAAO,CAAC,EAC3D,IAAM0C,EAAYD,EAA2BzC,EAAe,UAAU,EAEtE,OADoBA,EAAe,WAAW,MAAM0C,CAAS,EAC1C,IAAK96B,IAAU,CAChC,KAAM01B,GAAmB11B,EAAK,KAAMs0B,CAAiB,EACrD,KAAM,EAAEt0B,EAAK,MAAQ,EACvB,EAAE,CACJ,EAAG,CAACo4B,EAAgB9D,CAAiB,CAAC,EAGhCiF,EAAkBv/B,GAAQ,IAAM,CACpC,OAAQs6B,EAAmB,CACzB,IAAK,MACH,MAAO,MACT,IAAK,KACH,MAAO,KACT,IAAK,KACH,MAAO,KACT,QACE,MAAO,IACX,CACF,EAAG,CAACA,CAAiB,CAAC,EAGhBkF,EAAepF,IAAmB,cAClC,CAAE,OAAAsF,CAAO,EAAIrC,GAAa,CAC9B,OAAQ,CAACmC,GAAgBpF,EAAiBA,EAAiB,OAC3D,WAAYmF,EACZ,KAAM94B,EAAY,KAAK,MAAMA,EAAU,KAAK,QAAQ,EAAI,GAAI,EAAI,OAChE,GAAIA,EAAY,KAAK,MAAMA,EAAU,GAAG,QAAQ,EAAI,GAAI,EAAI,MAC9D,CAAC,EAIKk5B,GAAoB3/B,GAAQ,IAAM,CACtC,GAAI0/B,EAAO,SAAW,GAAK,CAACtB,GAAkB,CAACA,EAAe,WAC5D,MAAO,CAAC,EAIV,IAAM0C,EAAYD,EAA2BzC,EAAe,UAAU,EAChE2C,EAAoB3C,EAAe,WAAW0C,CAAS,EAE7D,GAAI,CAACC,EACH,MAAO,CAAC,EAIV,IAAMC,EAAmB,IAAI,KAAKD,EAAkB,IAAI,EAExD,OAAOrB,EACJ,OAAQI,GACW,IAAI,KAAKA,EAAE,UAAY,GAAI,GACzBkB,CACrB,EACA,IAAKlB,GAAM,CACV,IAAMxxB,EAAO,IAAI,KAAKwxB,EAAE,UAAY,GAAI,EAMxC,MAAO,CACL,KANoBpE,GACpBptB,EAAK,YAAY,EACjBgsB,CACF,EAIE,KAAMwF,EAAE,KACR,KAAMA,EAAE,KACR,IAAKA,EAAE,IACP,MAAOA,EAAE,KACX,CACF,CAAC,CACL,EAAG,CAACJ,EAAQtB,EAAgB9D,CAAiB,CAAC,EAExC2G,GACJ,CAAC7C,GACD,CAACA,EAAe,YAChBA,EAAe,WAAW,SAAW,EAGjC8C,GAAkBlhC,GAAQ,IAAM,CACpC,IAAMihB,EAA4D,CAAC,EAGnE,GAAIjF,GAAeA,EAAY,OAAS,EAAG,CACzC,IAAMmlB,EAAkBnlB,EAAY,KACjChW,GAASA,EAAK,OAAS,WAC1B,EACIm7B,GACFlgB,EAAM,KAAK,CACT,KAAM,QACN,KAAM,YACN,MAAOkgB,EAAgB,KACzB,CAAC,CAEL,CAEA,OAAOlgB,CACT,EAAG,CAACjF,CAAW,CAAC,EAEVolB,GAAgBv4B,GAAyC,CACzDA,EAAO,OAAS,aAAeD,GACjCA,EAASC,CAAM,CAEnB,EAGM23B,GAAoBxgC,GAAQ,IAAM,CACtC,GAAI,CAAC+6B,GAAUA,EAAO,SAAW,EAAG,MAAO,CAAC,EAE5C,IAAM0F,EAAY,IAAI,IAKtB,OAAA1F,EAAO,QAAS9V,GAAqB,CACnC,IAAMzZ,EAASyZ,EAAM,OAChBwb,EAAU,IAAIj1B,CAAM,GACvBi1B,EAAU,IAAIj1B,EAAQ,CAAE,IAAK,EAAG,OAAQ,EAAG,KAAM,EAAG,OAAQ,CAAE,CAAC,EAGjE,IAAMgc,EAAUiZ,EAAU,IAAIj1B,CAAM,EAC9Bk1B,EAAczb,EAAM,kBAAoBA,EAAM,eAEpDuC,EAAQ,KAAOvC,EAAM,cAAgB,EACrCuC,EAAQ,QAAUkZ,EAClBlZ,EAAQ,MAAQvC,EAAM,KAAO,EAC7BuC,EAAQ,QAAU,CACpB,CAAC,EAGM,MAAM,KAAKiZ,EAAU,QAAQ,CAAC,EAClC,IAAI,CAAC,CAACj1B,EAAQ7J,CAAI,KAAO,CACxB,OAAA6J,EACA,GAAG7J,CACL,EAAE,EACD,KAAK,CAACs1B,EAAGC,IAAMA,EAAE,IAAMD,EAAE,GAAG,EAC5B,MAAM,EAAG,EAAE,CAChB,EAAG,CAAC8D,CAAM,CAAC,EAEX,OACEh4B,EAAC,OAEC,UAAAA,EAACF,GAAA,CAAK,IAAK,EAAG,UAAU,MAAM,GAAI,EAChC,UAAAE,EAAC8a,GAAA,CAAI,UAAU,aACb,UAAA/a,EAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,UAAU,WACtC,SAAAiC,EAAE,eAAe,EACpB,EACA3C,EAAC05B,GAAA,CACC,MAAOpC,GAAkB,GACzB,cAAgBv0B,GAAkBw0B,EAAkBx0B,CAAK,EACzD,QAASs5B,EACT,YAAa15B,EAAE,eAAe,EAChC,GACF,EAEA1C,EAAC8a,GAAA,CAAI,UAAU,aACb,UAAA/a,EAACU,GAAA,CAAK,KAAK,KAAK,UAAW,GAAI,UAAU,WACtC,SAAAiC,EAAE,yCAAyC,EAC9C,EACA3C,EAACw4B,GAAO,QAAP,CACC,MAAOhB,EACP,cAAgBz0B,GACd00B,EAAqB10B,CAA0B,EAEjD,QAASo1B,EAAuB,IAAKxuB,IAAU,CAC7C,MACEA,IAAS,MAAQ,SAAWA,IAAS,KAAO,SAAW,QACzD,MAAOA,CACT,EAAE,EACJ,GACF,GACF,EAGCy0B,IAAmBA,GAAgB,OAAS,GAC3Cp+B,EAAC+a,GAAA,CAAI,GAAI,EACP,SAAA/a,EAACsG,GAAA,CACC,MAAO83B,GACP,SAAUE,GACV,UAAU,2BACZ,EACF,EAIFt+B,EAAC+a,GAAA,CAAI,GAAI,EACP,SAAA9a,EAACmN,GAAA,CACC,MAAO6J,GAAU,GACjB,kBACA,WAAY,CAAE,SAAU,sBAAuB,QAAS,WAAY,EACpE,cAAgBlU,GAAU6V,EAAe7V,CAAmB,EAE5D,UAAA/C,EAACmN,GAAA,CACC,MAAOxK,EAAE,kBAAkB,EAC3B,WACA,UAAU,sBACZ,EACA3C,EAACmN,GAAA,CACC,MAAOxK,EAAE,kBAAkB,EAC3B,WACA,UAAU,sBACZ,EACA3C,EAACmN,GAAA,CACC,MAAOxK,EAAE,mBAAmB,EAC5B,YACA,UAAU,sBACZ,EACA3C,EAACmN,GAAA,CACC,MAAOxK,EAAE,mBAAmB,EAC5B,YACA,UAAU,sBACZ,GACF,EACF,EAGA1C,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,IAAK,EAAG,GAAI,EACrD,UAAAE,EAACF,GAAA,CACC,IAAK,EACL,UAAU,SACV,UAAU,QACV,UAAU,6DAEV,UAAAC,EAACU,GAAA,CAAK,UAAU,eAAe,UAAW,GAAI,KAAK,MAChD,SAAAiC,EAAE,sCAAsC,EAC3C,EACA3C,EAACU,GAAK,QAAL,CAAa,KAAK,KAAK,OAAO,WAAW,SAAQ,GAC/C,SAAAw3B,EAAkBA,EAAgB,SAAS,QAAQ,CAAC,EAAI,KAC3D,GACF,EACAj4B,EAACF,GAAA,CACC,IAAK,EACL,UAAU,SACV,UAAU,QACV,UAAU,6DAEV,UAAAC,EAACU,GAAA,CAAK,UAAU,eAAe,UAAW,GAAI,KAAK,MAChD,SAAAiC,EAAE,yCAAyC,EAC9C,EACA3C,EAACU,GAAK,QAAL,CAAa,KAAK,KAAK,SAAU,GAC/B,SAAAw3B,EAAkBA,EAAgB,YAAY,QAAQ,CAAC,EAAI,KAC9D,GACF,EACAj4B,EAACF,GAAA,CACC,IAAK,EACL,UAAU,SACV,UAAU,QACV,UAAU,6DAEV,UAAAC,EAACU,GAAA,CAAK,UAAU,eAAe,UAAW,GAAI,KAAK,MAAM,yBAEzD,EACAV,EAAC,OAAI,UAAU,cACZ,SAAAk4B,EACCl4B,EAACo7B,GAAA,CAAgB,WAAYlD,EAAgB,WAAY,EAEzDl4B,EAACU,GAAA,CAAK,KAAK,KAAK,cAAE,EAEtB,GACF,GACF,EAGAT,EAACM,GAAA,CAAK,KAAM,EAAG,IAAK,EAAG,GAAI,EAEzB,UAAAN,EAAC8a,GAAA,CACC,UAAA9a,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,UAAU,WACnD,UAAAE,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KACjB,UAAAg4B,GAAoBlB,CAAiB,EAAG,IACxC70B,EAAE,yCAAyC,GAC9C,EACA1C,EAACF,GAAA,CAAK,IAAK,EACT,UAAAC,EAAC,UACC,QAAS,IAAM23B,EAAY,EAAK,EAChC,UAAWzrB,GACT,oFACCwrB,EAEG,0CADA,sCAEN,EACD,iBAED,EACA13B,EAAC,UACC,QAAS,IAAM23B,EAAY,EAAI,EAC/B,UAAWzrB,GACT,oFACAwrB,EACI,uCACA,yCACN,EACD,eAED,EACA13B,EAACM,GAAA,CAAQ,UAAU,WAAW,EAC9BL,EAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,SAAM,UAAU,yCAAyC,gBAE1D,EACAA,EAACkwB,GAAA,CACC,QAASwL,EACT,gBAAiBC,EACnB,GACF,GACF,GACF,EACA37B,EAAC+a,GAAA,CAAI,EAAE,KAAK,UAAU,6CACpB,SAAA/a,EAACo4B,GAAA,CAEC,KAAMkE,EACN,kBAAmB9E,EACnB,SAAU,GACV,UAAW2G,GACX,eAAgBzC,GALX,cAAclE,CAAiB,EAMtC,EACF,GACF,EAGAv3B,EAAC8a,GAAA,CACC,UAAA9a,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,UAAU,WACnD,UAAAE,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KACjB,UAAAg4B,GAAoBlB,CAAiB,EAAG,IACxC70B,EAAE,oCAAoC,GACzC,EACA1C,EAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,SAAM,UAAU,yCAAyC,gBAE1D,EACAA,EAACkwB,GAAA,CACC,QAAS0L,EACT,gBAAiBC,EACnB,GACF,GACF,EACA77B,EAAC+a,GAAA,CAAI,EAAE,KAAK,UAAU,6CACpB,SAAA/a,EAACq4B,GAAA,CAEC,KAAMkE,EACN,kBAAmB/E,EACnB,SAAU,GACV,UAAW2G,GACX,eAAgBvC,GALX,iBAAiBpE,CAAiB,EAMzC,EACF,GACF,EAGC,CAACkF,GACAz8B,EAAC8a,GAAA,CACC,UAAA9a,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KAAK,UAAU,WAChC,UAAAg4B,GAAoBlB,CAAiB,EAAE,UAC1C,EACAx3B,EAAC+a,GAAA,CAAI,EAAE,KAAK,UAAU,6CACpB,SAAA/a,EAACu4B,GAAA,CAEC,KAAMsE,GACN,kBAAmBrF,EACnB,SAAU,GACV,UAAWqF,GAAkB,SAAW,GAJnC,gBAAgBrF,CAAiB,IAAIF,CAAc,EAK1D,EACF,GACF,EAIFr3B,EAAC8a,GAAA,CACC,UAAA9a,EAACF,GAAA,CAAK,QAAQ,UAAU,UAAU,SAAS,UAAU,WACnD,UAAAE,EAACS,GAAA,CAAK,GAAG,MAAM,KAAK,KACjB,UAAAg4B,GAAoBlB,CAAiB,EAAG,IACxC70B,EAAE,kCAAkC,GACvC,EACA1C,EAACF,GAAA,CAAK,UAAU,SAAS,IAAK,EAC5B,UAAAC,EAAC,SAAM,UAAU,yCAAyC,gBAE1D,EACAA,EAACkwB,GAAA,CACC,QAAS4L,EACT,gBAAiBC,EACnB,GACF,GACF,EACA/7B,EAAC+a,GAAA,CAAI,EAAE,KAAK,UAAU,6CACpB,SAAA/a,EAACs4B,GAAA,CAEC,KAAMkE,EACN,kBAAmBhF,EACnB,SAAU,GACV,UAAW2G,GACX,eAAgBrC,GALX,eAAetE,CAAiB,EAMvC,EACF,GACF,GACF,EAGCkG,GAAkB,OAAS,GAC1Bz9B,EAAC8a,GAAA,CAAI,GAAI,EAAG,GAAI,EACd,UAAA/a,EAACM,GAAA,CAAQ,UAAU,0BAA0B,UAAW,EAAG,EAC3DN,EAACU,GAAA,CAAK,GAAG,MAAM,KAAK,KAAK,OAAO,WAAW,UAAU,WAClD,SAAAiC,EAAE,wCAAwC,EAC7C,EACA3C,EAAC+a,GAAA,CAAI,UAAU,sDACb,SAAA/a,EAAC69B,GAAA,CACC,KAAMH,GACN,eAAgBnG,EAClB,EACF,GACF,GAEJ,CAEJ,ETzgBW,cAAAv3B,OAAA,oBAPJ,IAAMuyB,GAAyD,CAAC,CACrE,OAAA7pB,CACF,IAAM,CACJ,GAAM,CAAE,SAAAzJ,CAAS,EAAIrB,GAAU,EACzBW,EAAQi0B,GAA2B9pB,CAAM,EAE/C,OAAIzJ,EACKe,GAAC89B,GAAA,CAA2B,GAAGv/B,EAAO,EAGxCyB,GAACsyB,GAAA,CAAqB,GAAG/zB,EAAO,CACzC,EDCM,cAAAyB,OAAA,oBAdC,IAAMqyB,GAAkC,IAE3CryB,GAAC+a,GAAA,CACC,EAAG,EACH,GAAI,EACJ,UAAW,IACX,EAAE,KACF,MAAM,OACN,MAAO,CACL,UAAW,IACX,UAAW,KACX,SAAU,MACZ,EAEA,SAAA/a,GAACuyB,GAAA,EAAwB,EAC3B","sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport {\n useAccount,\n useCollateral,\n useLeverage,\n useLocalStorage,\n usePositionStream,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { modal, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeverageWidgetWithDialogId } from \"@kodiak-finance/orderly-ui-leverage\";\nimport {\n DepositAndWithdrawWithDialogId,\n DepositAndWithdrawWithSheetId,\n TransferDialogId,\n TransferSheetId,\n} from \"@kodiak-finance/orderly-ui-transfer\";\n\nexport const useAssetScript = () => {\n const { connect, namespace } = useWalletConnector();\n const { state, isMainAccount } = useAccount();\n const { totalValue, freeCollateral } = useCollateral();\n const { wrongNetwork, disabledConnect } = useAppContext();\n const [data] = usePositionStream();\n const { curLeverage } = useLeverage();\n const [visible, setVisible] = useLocalStorage(\"orderly_assets_visible\", true);\n const { isMobile } = useScreen();\n const handleDomId = isMobile\n ? DepositAndWithdrawWithSheetId\n : DepositAndWithdrawWithDialogId;\n const subAccounts = state.subAccounts ?? [];\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [state.status, wrongNetwork, disabledConnect]);\n\n const onLeverageEdit = () => {\n modal.show(LeverageWidgetWithDialogId);\n };\n\n const onDeposit = useCallback(() => {\n modal.show(handleDomId, { activeTab: \"deposit\" });\n }, [handleDomId]);\n\n const onWithdraw = useCallback(() => {\n modal.show(handleDomId, { activeTab: \"withdraw\" });\n }, []);\n\n const onTransfer = useCallback(() => {\n if (isMobile) {\n modal.show(TransferSheetId);\n } else {\n modal.show(TransferDialogId);\n }\n }, [isMobile]);\n\n return {\n canTrade,\n connect,\n portfolioValue: totalValue,\n freeCollateral,\n unrealPnL: data.aggregated.total_unreal_pnl,\n unrealROI: data.totalUnrealizedROI,\n currentLeverage: curLeverage,\n onLeverageEdit,\n visible,\n wrongNetwork,\n toggleVisible: () => setVisible(!visible),\n onDeposit,\n onWithdraw,\n onTransfer,\n namespace,\n isMainAccount,\n hasSubAccount: subAccounts?.length > 0,\n } as const;\n};\n\nexport type AssetScriptReturn = ReturnType<typeof useAssetScript>;\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n ArrowDownSquareFillIcon,\n ArrowLeftRightIcon,\n ArrowUpSquareFillIcon,\n Button,\n CardTitle,\n Flex,\n} from \"@kodiak-finance/orderly-ui\";\n\ntype Props = {\n disabled: boolean;\n onWithdraw?: () => void;\n onDeposit?: () => void;\n onTransfer?: () => void;\n isMainAccount?: boolean;\n hasSubAccount?: boolean;\n};\n\nexport const AssetsHeader: FC<Props> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify={\"between\"}>\n <CardTitle>{t(\"common.overview\")}</CardTitle>\n <Flex gap={3}>\n {props.isMainAccount && (\n <Button\n disabled={props.disabled}\n size=\"md\"\n onClick={() => props.onDeposit?.()}\n icon={<ArrowDownSquareFillIcon />}\n data-testid=\"oui-testid-portfolio-assets-deposit-btn\"\n >\n {t(\"common.deposit\")}\n </Button>\n )}\n {props.hasSubAccount && (\n <Button\n disabled={props.disabled}\n size=\"md\"\n color=\"secondary\"\n onClick={() => props.onTransfer?.()}\n icon={<ArrowLeftRightIcon />}\n >\n {t(\"common.transfer\")}\n </Button>\n )}\n {props.isMainAccount && (\n <Button\n disabled={props.disabled}\n size=\"md\"\n color=\"secondary\"\n onClick={() => props.onWithdraw?.()}\n icon={<ArrowUpSquareFillIcon />}\n data-testid=\"oui-testid-portfolio-assets-withdraw-btn\"\n >\n {t(\"common.withdraw\")}\n </Button>\n )}\n </Flex>\n </Flex>\n );\n};\n","import React, { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Card,\n Divider,\n Flex,\n Grid,\n Either,\n Statistic,\n Text,\n EyeIcon,\n gradientTextVariants,\n EditIcon,\n EyeCloseIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { AssetScriptReturn } from \"./assets.script\";\nimport { AssetsHeader } from \"./assetsHeader\";\n\nexport const AssetsUI: React.FC<\n AssetScriptReturn & { onConnectWallet?: () => void }\n> = (props) => {\n const { t } = useTranslation();\n return (\n <Card\n classNames={{ footer: \"oui-h-[48px]\", root: \"oui-h-[240px]\" }}\n title={\n <AssetsHeader\n disabled={!props.canTrade}\n isMainAccount={props.isMainAccount}\n onDeposit={props.onDeposit}\n onWithdraw={props.onWithdraw}\n onTransfer={props.onTransfer}\n hasSubAccount={props.hasSubAccount}\n />\n }\n >\n <>\n <Statistic\n label={\n <Flex gap={1}>\n <Text intensity={54}>{t(\"common.totalValue\")}</Text>\n <button\n onClick={() => {\n props.toggleVisible();\n }}\n data-testid=\"oui-testid-portfolio-assets-eye-btn\"\n >\n {props.visible ? (\n <EyeIcon size={16} color={\"white\"} />\n ) : (\n <EyeCloseIcon size={16} color={\"white\"} />\n )}\n </button>\n </Flex>\n }\n >\n <Either value={props.canTrade!} left={<NoValue />}>\n <Text.numeral\n visible={props.visible}\n unit=\"USDC\"\n // @ts-ignore\n style={{ \"--oui-gradient-angle\": \"45deg\" }}\n unitClassName=\"oui-text-base oui-text-base-contrast-80 oui-h-9 oui-ml-1\"\n className={gradientTextVariants({\n className: \"oui-font-bold oui-text-3xl\",\n color: \"brand\",\n })}\n >\n {props.portfolioValue ?? \"--\"}\n </Text.numeral>\n </Either>\n </Statistic>\n <Divider className=\"oui-my-4\" intensity={8} />\n <AuthGuard buttonProps={{ size: \"lg\", fullWidth: true }}>\n <AssetStatistic\n unrealROI={props.unrealROI}\n unrealPnL={props.unrealPnL}\n freeCollateral={props.freeCollateral}\n currentLeverage={props.currentLeverage}\n onLeverageEdit={props.onLeverageEdit}\n visible={props.visible}\n />\n </AuthGuard>\n </>\n </Card>\n );\n};\n\nconst NoValue: FC = () => {\n return (\n <Flex gap={1} className={\"oui-h-9\"}>\n <Text.gradient color=\"brand\" weight=\"bold\">\n --\n </Text.gradient>\n <Text>USDC</Text>\n </Flex>\n );\n};\n\ntype AssetStatisticProps = Pick<\n AssetScriptReturn,\n | \"currentLeverage\"\n | \"unrealPnL\"\n | \"unrealROI\"\n | \"freeCollateral\"\n | \"onLeverageEdit\"\n | \"visible\"\n>;\n\nexport const AssetStatistic = (props: AssetStatisticProps) => {\n const { t } = useTranslation();\n\n return (\n <Grid cols={2} className=\"oui-h-12\">\n <Statistic label={t(\"common.unrealizedPnl\")}>\n <Flex>\n <Text.numeral\n coloring\n size=\"lg\"\n weight=\"semibold\"\n visible={props.visible}\n >\n {props.unrealPnL}\n </Text.numeral>\n <Text.numeral\n coloring\n rule=\"percentages\"\n size=\"sm\"\n weight=\"semibold\"\n prefix={\"(\"}\n suffix={\")\"}\n visible={props.visible}\n >\n {props.unrealROI}\n </Text.numeral>\n </Flex>\n </Statistic>\n <Statistic\n label={t(\"portfolio.overview.availableWithdraw\")}\n // @ts-ignore\n align=\"right\"\n // @ts-ignore\n valueProps={{ size: \"lg\", visible: props.visible }}\n >\n {props.freeCollateral}\n </Statistic>\n </Grid>\n );\n};\n","import React from \"react\";\nimport { useAssetScript } from \"./assets.script\";\nimport { AssetsUI } from \"./assets.ui\";\n\nexport const AssetWidget: React.FC = () => {\n const { connect: connectWallet, ...rest } = useAssetScript();\n return (\n <AssetsUI\n // TODO: remove duplicate props\n onConnectWallet={connectWallet}\n connect={connectWallet}\n {...rest}\n />\n );\n};\n","export { useAssetScript } from \"./assets.script\";\nexport { AssetsUI } from \"./assets.ui\";\nexport { AssetWidget } from \"./assets.widget\";\n","import { useState } from \"react\";\n\nexport type TabName =\n | \"deposit\"\n | \"withdraw\"\n | \"funding\"\n | \"distribution\"\n | \"transfer\"\n | \"vaults\";\n\nexport const useHistoryDataGroupScript = () => {\n const [active, setActive] = useState<TabName>(\"deposit\");\n return {\n active,\n onTabChange: setActive as React.Dispatch<React.SetStateAction<string>>,\n } as const;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistoryStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport {\n capitalizeFirstLetter,\n Text,\n Flex,\n TokenIcon,\n toast,\n type Column,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\n\ntype Options = {\n chainsInfo: any[];\n isDeposit: boolean;\n isWeb3Wallet: boolean;\n};\n\nexport const useAssetHistoryColumns = (options: Options) => {\n const { chainsInfo, isDeposit, isWeb3Wallet } = options;\n const { t } = useTranslation();\n\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n\n const columns = useMemo<Column[]>(() => {\n const txIdColumn: Column = {\n title: t(\"common.txId\"),\n dataIndex: \"tx_id\",\n width: 120,\n render: (value, record) => {\n if (!value) {\n return <div className=\"oui-text-base-contrast-54\">-</div>;\n }\n const chainInfo = chainsInfo?.find(\n (item) => parseInt(record.chain_id) === parseInt(item.chain_id),\n );\n const explorer_base_url = chainInfo?.explorer_base_url;\n const href = `${explorer_base_url}/tx/${value}`;\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n {/* <Tooltip content={value} delayDuration={0}> */}\n <Text.formatted\n copyable={!!value}\n rule=\"txId\"\n className=\"oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n onCopy={onCopy}\n >\n {value}\n </Text.formatted>\n {/* </Tooltip> */}\n </a>\n );\n },\n };\n\n const accountIdColumn: Column = {\n title: t(\"common.accountId\"),\n dataIndex: \"account_id\",\n width: 120,\n render: (value, record) => {\n const accountId = isDeposit\n ? record.from_account_id\n : record.to_account_id;\n\n return (\n <Text.formatted rule=\"address\" copyable={!!accountId} onCopy={onCopy}>\n {accountId}\n </Text.formatted>\n );\n },\n };\n\n return [\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n width: 80,\n render: (value) => {\n return (\n <Flex gapX={1}>\n <TokenIcon name={value} size=\"xs\" />\n <span>{value}</span>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n width: 80,\n rule: \"date\",\n },\n isWeb3Wallet ? txIdColumn : accountIdColumn,\n {\n title: t(\"common.status\"),\n dataIndex: \"trans_status\",\n width: 100,\n render: (value, recoed) => {\n value = isWeb3Wallet ? value : recoed.status;\n const statusMap = {\n [AssetHistoryStatusEnum.NEW]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.PENDING]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.CONFIRM]: t(\"assetHistory.status.confirm\"),\n [AssetHistoryStatusEnum.PROCESSING]: t(\n \"assetHistory.status.processing\",\n ),\n [AssetHistoryStatusEnum.COMPLETED]: t(\n \"assetHistory.status.completed\",\n ),\n [AssetHistoryStatusEnum.FAILED]: t(\"assetHistory.status.failed\"),\n };\n return (\n statusMap[value as keyof typeof statusMap] ||\n capitalizeFirstLetter(value?.toLowerCase())\n );\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount\",\n width: 100,\n rule: \"price\",\n render: (value, record) => {\n const netAmount = new Decimal(value).minus(record.fee ?? 0);\n return (\n <Text.numeral\n dp={record.decimals}\n rule=\"price\"\n coloring\n showIdentifier\n padding={false}\n >\n {isDeposit ? netAmount.toNumber() : netAmount.neg().toNumber()}\n </Text.numeral>\n );\n },\n },\n ];\n }, [t, chainsInfo, isDeposit, isWeb3Wallet]);\n\n return columns;\n};\n","import { differenceInDays, setHours } from \"date-fns\";\n\nexport const parseDateRangeForFilter = (dateRange: {\n from: Date;\n to?: Date;\n}) => {\n const { from, to = new Date() } = dateRange;\n\n const diff = differenceInDays(from, to);\n\n if (diff === 0) {\n return [from, setHours(to, 23)];\n }\n\n return [from, to];\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport {\n useAssetsHistory,\n useChainInfo,\n useTokensInfo,\n useTransferHistory,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport { modal, usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { DepositAndWithdrawWithSheetId } from \"@kodiak-finance/orderly-ui-transfer\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\n\nexport enum AssetTarget {\n Web3Wallet = \"Web3Wallet\",\n AccountId = \"AccountId\",\n}\n\nexport type AssetHistoryScriptOptions = {\n side: AssetHistorySideEnum;\n};\n\nexport type AssetHistoryScriptReturn = ReturnType<typeof useAssetHistoryScript>;\n\nexport const useAssetHistoryScript = (options: AssetHistoryScriptOptions) => {\n const { side } = options;\n const isDeposit = side === AssetHistorySideEnum.DEPOSIT;\n\n const [today] = useState(() => {\n const d = new Date();\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const tokensInfo = useTokensInfo();\n\n const [target, setTarget] = useState<AssetTarget>(AssetTarget.Web3Wallet);\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const { startTime, endTime } = useMemo(() => {\n const startTime = dateRange[0].getTime();\n const endTime = set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n }).getTime();\n\n return { startTime, endTime };\n }, [dateRange]);\n\n const [assetData, { meta: assetMeta, isLoading: assetLoading }] =\n useAssetsHistory(\n {\n startTime,\n endTime,\n page,\n pageSize,\n side,\n },\n {\n shouldUpdateOnWalletChanged: (data) => data.side === side,\n },\n );\n\n const [transferData, { isLoading: transferLoading, meta: transferMeta }] =\n useTransferHistory({\n dataRange: [startTime, endTime],\n side: isDeposit ? \"IN\" : \"OUT\",\n size: pageSize,\n page: page,\n main_sub_only: false,\n });\n\n const { data: chainsInfo } = useChainInfo();\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n setDateRange(parseDateRangeForFilter(filter.value));\n setPage(1);\n } else if (filter.name === \"target\") {\n setTarget(filter.value);\n setPage(1);\n }\n };\n\n const isLoading = useMemo(() => {\n if (target === AssetTarget.Web3Wallet) {\n return assetLoading;\n }\n return transferLoading;\n }, [target, assetLoading, transferLoading]);\n\n const meta = useMemo(() => {\n if (target === AssetTarget.Web3Wallet) {\n return assetMeta;\n }\n return transferMeta;\n }, [target, assetMeta, transferMeta]);\n\n const pagination = useMemo(\n () => parsePagination(meta),\n [parsePagination, meta],\n );\n\n const dataSource = useMemo(() => {\n return (target === AssetTarget.Web3Wallet ? assetData : transferData).map(\n (item) => {\n const findToken = tokensInfo?.find(({ token }) => token === item.token);\n return {\n ...item,\n decimals: findToken?.decimals ?? 2,\n };\n },\n );\n }, [target, assetData, transferData, tokensInfo]);\n\n const onDeposit = useCallback(() => {\n modal.show(DepositAndWithdrawWithSheetId, { activeTab: \"deposit\" });\n }, []);\n\n const isWeb3Wallet = target === AssetTarget.Web3Wallet;\n\n return {\n dataSource,\n total: meta?.total,\n isLoading,\n queryParameter: {\n target,\n dateRange,\n },\n onFilter,\n pagination,\n onDeposit,\n chainsInfo: chainsInfo as any[],\n isDeposit,\n isWeb3Wallet,\n };\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport {\n AssetTarget,\n type AssetHistoryScriptReturn,\n} from \"./assetHistory.script\";\nimport { useAssetHistoryColumns } from \"./column\";\n\ntype AssetHistoryProps = AssetHistoryScriptReturn;\n\nexport const AssetHistory: FC<AssetHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading } = props;\n const { dateRange, target } = queryParameter;\n const columns = useAssetHistoryColumns({\n chainsInfo: props.chainsInfo,\n isDeposit: props.isDeposit,\n isWeb3Wallet: props.isWeb3Wallet,\n });\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"common.web3Wallet\"), value: AssetTarget.Web3Wallet },\n { label: t(\"common.accountId\"), value: AssetTarget.AccountId },\n ];\n }, [t]);\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"target\",\n options: options,\n value: target,\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n />\n\n <AuthGuardDataTable\n bordered\n loading={isLoading}\n classNames={{\n root: \"oui-h-[calc(100%_-_49px)]\",\n scroll: \"oui-min-h-[400px]\",\n }}\n columns={columns}\n dataSource={dataSource}\n pagination={props.pagination}\n />\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistoryStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n DataFilter,\n Flex,\n ListView,\n Text,\n capitalizeFirstLetter,\n toast,\n ArrowRightShortIcon,\n EmptyDataState,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AssetTarget,\n type AssetHistoryScriptReturn,\n} from \"./assetHistory.script\";\n\ntype AssetHistoryMobileProps = AssetHistoryScriptReturn;\n\nexport const AssetHistoryMobile: FC<AssetHistoryMobileProps> = (props) => {\n const {\n dataSource,\n queryParameter,\n onFilter,\n isLoading,\n pagination,\n onDeposit,\n chainsInfo,\n isDeposit,\n isWeb3Wallet,\n } = props;\n const { dateRange, target } = queryParameter;\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"common.web3Wallet\"), value: AssetTarget.Web3Wallet },\n { label: t(\"common.accountId\"), value: AssetTarget.AccountId },\n ];\n }, [t]);\n\n const loadMore = () => {\n if (dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange?.(pagination?.pageSize + 50);\n }\n };\n\n const getStatusText = (item: any) => {\n const status = props.isWeb3Wallet ? item.trans_status : item.status;\n const statusMap = {\n [AssetHistoryStatusEnum.NEW]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.PENDING]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.CONFIRM]: t(\"assetHistory.status.confirm\"),\n [AssetHistoryStatusEnum.PROCESSING]: t(\"assetHistory.status.processing\"),\n [AssetHistoryStatusEnum.COMPLETED]: t(\"assetHistory.status.completed\"),\n [AssetHistoryStatusEnum.FAILED]: t(\"assetHistory.status.failed\"),\n };\n return (\n statusMap[status as keyof typeof statusMap] ||\n capitalizeFirstLetter(status?.toLowerCase())\n );\n };\n\n const renderHistoryItem = (item: any) => {\n // Amount formatting\n const formattedAmount = isDeposit\n ? `+${item.amount - (item.fee ?? 0)}`\n : -(item.amount - (item.fee ?? 0));\n\n // Get tx link\n const getTxLink = () => {\n if (!item.tx_id) {\n return undefined;\n }\n\n const chainInfo =\n chainsInfo && Array.isArray(chainsInfo)\n ? chainsInfo.find(\n (chain: any) =>\n parseInt(item.chain_id) === parseInt(chain.chain_id),\n )\n : undefined;\n\n if (chainInfo?.explorer_base_url) {\n return `${chainInfo.explorer_base_url}/tx/${item.tx_id}`;\n }\n\n return undefined;\n };\n\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n\n const itemColor = isDeposit ? \"buy\" : \"sell\";\n\n const amountView = (\n <Flex className=\"oui-text-xs\">\n <Text color={itemColor}>{formattedAmount}</Text>\n <Text className=\"oui-ml-1\" intensity={80}>\n {item.token}\n </Text>\n {isWeb3Wallet && (\n <Badge color={itemColor} className=\"oui-ml-2\">\n {isDeposit ? t(\"common.deposit\") : t(\"common.withdraw\")}\n </Badge>\n )}\n </Flex>\n );\n\n const statusView = (\n <Text intensity={isWeb3Wallet ? 80 : 36} size=\"xs\">\n {getStatusText(item)}\n </Text>\n );\n\n const timeView = (\n <Text.formatted rule=\"date\" intensity={36} size=\"2xs\">\n {item.created_time}\n </Text.formatted>\n );\n\n const txIdView = item.tx_id ? (\n <a href={getTxLink()} target=\"_blank\" rel=\"noreferrer\">\n <Text.formatted\n copyable={!!item.tx_id}\n className=\"oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n rule=\"txId\"\n onCopy={onCopy}\n intensity={36}\n size=\"xs\"\n >\n {item.tx_id}\n </Text.formatted>\n </a>\n ) : (\n <Text intensity={54}>-</Text>\n );\n\n const accountId = isDeposit ? item.from_account_id : item.to_account_id;\n\n const accountIdView = (\n <Flex gapX={1}>\n <Text intensity={36} size=\"xs\">\n {isDeposit\n ? t(\"transfer.internalTransfer.from\")\n : t(\"transfer.internalTransfer.to\")}\n </Text>\n <Text.formatted\n rule=\"address\"\n copyable={!!accountId}\n onCopy={onCopy}\n intensity={80}\n size=\"xs\"\n >\n {accountId}\n </Text.formatted>\n </Flex>\n );\n\n return (\n <Flex\n p={2}\n direction=\"column\"\n gapY={1}\n intensity={900}\n r=\"xl\"\n className=\"oui-font-semibold\"\n >\n <Flex justify=\"between\" width=\"100%\" height=\"18px\">\n {isWeb3Wallet ? (\n <>\n {amountView}\n {statusView}\n </>\n ) : (\n <>\n {accountIdView}\n {amountView}\n </>\n )}\n </Flex>\n\n <Flex justify=\"between\" width=\"100%\" height=\"18px\">\n {timeView}\n {isWeb3Wallet ? txIdView : statusView}\n </Flex>\n </Flex>\n );\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"picker\",\n name: \"target\",\n options: options,\n value: target,\n size: \"md\",\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-sticky oui-top-[44px] oui-z-10 oui-border-none oui-bg-base-10 oui-px-3 oui-py-2\"\n />\n\n <ListView\n dataSource={dataSource}\n renderItem={renderHistoryItem}\n contentClassName=\"!oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n emptyView={\n <Flex\n direction={\"column\"}\n height={\"100%\"}\n itemAlign={\"center\"}\n justify={\"center\"}\n mt={3}\n >\n <EmptyDataState />\n {dataSource?.length == 0 && (\n <Flex\n direction=\"row\"\n itemAlign=\"center\"\n justify=\"center\"\n onClick={onDeposit}\n className=\"oui-mt-2 oui-h-4 oui-w-full oui-text-secondary\"\n >\n <Text color=\"primary\" size=\"2xs\">\n {t(\"common.deposit\")}\n </Text>\n <ArrowRightShortIcon\n className=\"oui-ml-0.5 oui-size-4 oui-text-primary oui-opacity-100\"\n color=\"primary\"\n size={16}\n opacity={100}\n />\n </Flex>\n )}\n </Flex>\n }\n />\n </>\n );\n};\n","import React from \"react\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useAssetHistoryScript } from \"./assetHistory.script\";\nimport { AssetHistory } from \"./assetHistory.ui\";\nimport { AssetHistoryMobile } from \"./assetHistory.ui.mobile\";\n\ntype AssetHistoryWidgetProps = {\n side: AssetHistorySideEnum;\n};\n\nexport const AssetHistoryWidget: React.FC<AssetHistoryWidgetProps> = (\n props,\n) => {\n const state = useAssetHistoryScript({ side: props.side });\n const { isMobile } = useScreen();\n if (isMobile) {\n return <AssetHistoryMobile {...state} />;\n }\n return <AssetHistory {...state} />;\n};\n","export { useAssetHistoryColumns } from \"./column\";\nexport { useAssetHistoryScript } from \"./assetHistory.script\";\nexport { AssetHistory } from \"./assetHistory.ui\";\nexport { AssetHistoryWidget } from \"./assetHistory.widget\";\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Flex, Text, type Column } from \"@kodiak-finance/orderly-ui\";\n\nexport const useFundingHistoryColumns = () => {\n const { t } = useTranslation();\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n width: 80,\n rule: \"symbol\",\n textProps: {\n showIcon: true,\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n width: 120,\n rule: \"date\",\n },\n {\n title: `${t(\"funding.fundingRate\")} / ${t(\"funding.annualRate\")}`,\n dataIndex: \"funding_rate\",\n width: 80,\n render: (value: any, record) => {\n return (\n <Flex gap={1}>\n {/* <span>{`${record.funding_rate * 100}%`}</span> */}\n <Text.numeral rule={\"percentages\"} dp={6}>\n {record.funding_rate}\n </Text.numeral>\n <span>/</span>\n {/* <span>{`${record.annual_rate * 10}%`}</span> */}\n <Text.numeral rule={\"percentages\"} dp={6}>\n {record.annual_rate}\n </Text.numeral>\n </Flex>\n );\n },\n },\n {\n title: t(\"funding.paymentType\"),\n dataIndex: \"payment_type\",\n width: 80,\n render: (value: any) => {\n switch (value) {\n case \"Pay\":\n case \"Paid\":\n return t(\"funding.paymentType.paid\");\n case \"Receive\":\n case \"Received\":\n return t(\"funding.paymentType.received\");\n default:\n return value;\n }\n },\n },\n {\n title: `${t(\"funding.fundingFee\")} (USDC)`,\n dataIndex: \"funding_fee\",\n width: 80,\n rule: \"price\",\n formatter(value, record, index) {\n return Number(value) * -1;\n },\n numeralProps: {\n coloring: true,\n showIdentifier: true,\n ignoreDP: true,\n },\n },\n ] as Column<API.FundingFeeRow & { annual_rate: number }>[];\n }, [t]);\n\n return columns;\n};\n","import { FC, useMemo } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useFundingHistoryColumns } from \"./column\";\nimport { type UseFundingHistoryReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & UseFundingHistoryReturn;\n\nexport const FundingHistoryDesktop: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading } = props;\n const columns = useFundingHistoryColumns();\n const symbols = useSymbolsInfo();\n const { symbol, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n {\n label: t(\"common.all\"),\n value: \"All\",\n },\n ...Object.keys(symbols).map((symbol) => {\n const s = symbol.split(\"_\")[1];\n return {\n label: s,\n value: symbol,\n };\n }),\n ];\n }, [t, symbols]);\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"symbol\",\n isCombine: true,\n options,\n value: symbol,\n valueFormatter: (value) => {\n const option = options.find((item) => item.value === value);\n return option?.label || value;\n },\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n />\n <AuthGuardDataTable\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n generatedRowKey={(record) => `${record.updated_time}`}\n classNames={{ root: \"oui-h-[calc(100%_-_49px)]\" }}\n pagination={props.pagination}\n />\n </>\n );\n};\n","import { FC } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter, Flex, ListView, Text, Badge } from \"@kodiak-finance/orderly-ui\";\nimport { type UseFundingHistoryReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & UseFundingHistoryReturn;\n\nexport const FundingHistoryMobile: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading, pagination } = props;\n const symbols = useSymbolsInfo();\n const { symbol, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const switchPaymentType = (paymentType: string) => {\n switch (paymentType) {\n case \"Pay\":\n case \"Paid\":\n return t(\"funding.paymentType.paid\");\n case \"Receive\":\n case \"Received\":\n return t(\"funding.paymentType.received\");\n default:\n return paymentType;\n }\n };\n\n const loadMore = () => {\n if (dataSource && dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange?.(pagination?.pageSize + 50);\n }\n };\n\n const renderHistoryItem = (item: any) => {\n return (\n <Flex\n p={2}\n direction=\"column\"\n gapY={2}\n className=\"oui-rounded-xl oui-bg-base-9 oui-font-semibold\"\n >\n <Flex direction=\"row\" justify=\"between\" width=\"100%\" height=\"20px\">\n <Text.formatted\n rule=\"symbol\"\n className=\"oui-text-base-contrast oui-mr-1 oui-text-sm\"\n >\n {item.symbol}\n </Text.formatted>\n <Badge color=\"neutral\" size=\"xs\">\n {switchPaymentType(item.payment_type)}\n </Badge>\n <Text.formatted\n rule=\"date\"\n className=\"oui-text-base-contrast-36 oui-text-2xs oui-ml-auto\"\n >\n {item.created_time}\n </Text.formatted>\n </Flex>\n <div className=\"oui-w-full oui-h-[1px] oui-bg-base-6\" />\n <Flex direction=\"row\" justify=\"between\" width=\"100%\">\n <Flex direction=\"column\">\n <Text className=\"oui-text-base-contrast-36 oui-text-2xs\">\n {t(\"funding.fundingRate\")}\n </Text>\n <Text.numeral\n rule={\"percentages\"}\n dp={6}\n className=\"oui-text-base-contrast-80 oui-text-xs\"\n >\n {item.funding_rate}\n </Text.numeral>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-base-contrast-36 oui-text-2xs\">\n {t(\"funding.annualRate\")}\n </Text>\n <Text.numeral\n rule={\"percentages\"}\n dp={6}\n className=\"oui-text-base-contrast-80 oui-text-xs\"\n >\n {item.annual_rate}\n </Text.numeral>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-base-contrast-36 oui-text-2xs\">\n {t(\"funding.fundingFee\")}{\" \"}\n <Text className=\"oui-text-base-contrast-20\">(USDC)</Text>\n </Text>\n <Text.numeral\n dp={6}\n ignoreDP={true}\n coloring={true}\n showIdentifier={true}\n className=\"oui-text-xs oui-self-end\"\n >\n {Number(item.funding_fee) * -1}\n </Text.numeral>\n </Flex>\n </Flex>\n </Flex>\n );\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"symbol\",\n isCombine: true,\n options: [\n {\n label: \"All\",\n value: \"All\",\n },\n ...Object.keys(symbols).map((symbol) => {\n const s = symbol.split(\"_\")[1];\n return {\n label: s,\n value: symbol,\n };\n }),\n ],\n value: symbol,\n valueFormatter: (value) => {\n if (value === \"All\") {\n return \"All\";\n }\n return value.split(\"_\")[1];\n },\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-px-3 oui-py-2 oui-sticky oui-top-[44px] oui-z-10 oui-bg-base-10\"\n />\n <ListView\n dataSource={dataSource}\n renderItem={renderHistoryItem}\n contentClassName=\"!oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n />\n </>\n );\n};\n","import { useFundingFeeHistory } from \"@kodiak-finance/orderly-hooks\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { useMemo, useState } from \"react\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\n\nexport const useFundingHistoryHook = () => {\n // const today = useRef(setMinutes(setHours(new Date(), 23), 59));\n\n const [today] = useState(() => {\n const d = new Date();\n\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n const [symbol, setSymbol] = useState<string>(\"All\");\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const [data, { isLoading, meta, isValidating }] = useFundingFeeHistory(\n {\n // dataRange: dateRange.map((date) => date.getTime()),\n dataRange: [\n dateRange[0].getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })\n // addDays(dateRange[1], 1)\n .getTime(),\n ],\n symbol,\n page,\n pageSize,\n },\n {\n keepPreviousData: true,\n }\n );\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"symbol\") {\n setSymbol(filter.value);\n setPage(1);\n }\n\n if (filter.name === \"dateRange\") {\n // setDateRange([filter.value.from, filter.value.to]);\n setDateRange(parseDateRangeForFilter(filter.value));\n setPage(1);\n }\n };\n\n const pagination = useMemo(\n () => parsePagination(meta),\n [parsePagination, meta]\n );\n\n return {\n dataSource: data,\n isLoading,\n isValidating,\n // onDateRangeChange,\n queryParameter: {\n symbol,\n dateRange,\n },\n onFilter,\n pagination,\n } as const;\n};\n\nexport type UseFundingHistoryReturn = ReturnType<typeof useFundingHistoryHook>;\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { FundingHistoryDesktop } from \"./fundingHistory.ui\";\nimport { FundingHistoryMobile } from \"./fundingHistory.ui.mobile\";\nimport { useFundingHistoryHook } from \"./useDataSource.script\";\n\nexport const FundingHistoryWidget: React.FC = () => {\n const state = useFundingHistoryHook();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <FundingHistoryMobile {...state} />;\n }\n return <FundingHistoryDesktop {...state} />;\n};\n","export { FundingHistoryWidget } from \"./fundingHistory.widget\";\nexport { FundingHistoryDesktop } from \"./fundingHistory.ui\";\nexport { FundingHistoryMobile } from \"./fundingHistory.ui.mobile\";\nexport { useFundingHistoryColumns } from \"./column\";\nexport { useFundingHistoryHook } from \"./useDataSource.script\";\n","import { useMemo } from \"react\";\nimport { useTranslation, i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Flex, type Column, TokenIcon } from \"@kodiak-finance/orderly-ui\";\n\nexport const useColumns = () => {\n const { t } = useTranslation();\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n width: 80,\n // rule: \"symbol\",\n render: (value, record) => {\n return (\n <Flex gapX={2}>\n <TokenIcon name={value} size=\"xs\" />\n <span>{value}</span>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"updated_time\",\n width: 120,\n rule: \"date\",\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n width: 120,\n formatter(value, record, index) {\n switch (value) {\n case \"CREATED\":\n case \"SPLIT\":\n return t(\"assetHistory.status.processing\");\n case \"COMPLETED\":\n default:\n return t(\"assetHistory.status.completed\");\n }\n },\n },\n\n {\n title: t(\"common.type\"),\n dataIndex: \"type\",\n width: 80,\n formatter: (value: any) => {\n switch (value) {\n case \"REFERRER_REBATE\":\n return t(\n \"portfolio.overview.distribution.type.referralCommission\",\n );\n case \"REFEREE_REBATE\":\n return t(\"portfolio.overview.distribution.type.refereeRebate\");\n case \"BROKER_FEE\":\n return t(\"portfolio.overview.distribution.type.brokerFee\");\n default:\n return \"-\";\n }\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount\",\n width: 80,\n // rule: \"price\",\n },\n ] as Column<API.FundingFeeRow & { annual_rate: number }>[];\n }, [t]);\n\n return columns;\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useColumns } from \"./column\";\nimport { type useDistributionHistoryHookReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & useDistributionHistoryHookReturn;\n\nexport const DistributionHistoryDesktop: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading, isValidating } =\n props;\n const columns = useColumns();\n const { type, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const TYPES = useMemo(() => {\n return [\n { label: t(\"common.all\"), value: \"All\" },\n {\n label: t(\"portfolio.overview.distribution.type.referralCommission\"),\n value: \"REFERRER_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.refereeRebate\"),\n value: \"REFEREE_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.brokerFee\"),\n value: \"BROKER_FEE\",\n },\n ];\n }, [t]);\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"type\",\n options: TYPES,\n value: type,\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n />\n <AuthGuardDataTable\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n // isValidating={isValidating}\n className=\"oui-font-semibold\"\n classNames={{\n root: \"oui-h-[calc(100%_-_49px)]\",\n }}\n pagination={props.pagination}\n />\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter, Flex, Text, TokenIcon } from \"@kodiak-finance/orderly-ui\";\nimport { ListView } from \"@kodiak-finance/orderly-ui\";\nimport { type useDistributionHistoryHookReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & useDistributionHistoryHookReturn;\n\nexport const DistributionHistoryMobile: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading, pagination } = props;\n const { type, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const TYPES = useMemo(() => {\n return [\n { label: t(\"common.all\"), value: \"All\" },\n {\n label: t(\"portfolio.overview.distribution.type.referralCommission\"),\n value: \"REFERRER_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.refereeRebate\"),\n value: \"REFEREE_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.brokerFee\"),\n value: \"BROKER_FEE\",\n },\n ];\n }, [t]);\n\n const getStatusText = (status: string) => {\n switch (status) {\n case \"CREATED\":\n case \"SPLIT\":\n return t(\"assetHistory.status.processing\") as string;\n case \"COMPLETED\":\n default:\n return t(\"assetHistory.status.completed\") as string;\n }\n };\n\n const getTypeText = (type: string) => {\n switch (type) {\n case \"REFERRER_REBATE\":\n return t(\"portfolio.overview.distribution.type.referralCommission\");\n case \"REFEREE_REBATE\":\n return t(\"portfolio.overview.distribution.type.refereeRebate\");\n case \"BROKER_FEE\":\n return t(\"portfolio.overview.distribution.type.brokerFee\");\n default:\n return \"-\";\n }\n };\n\n const renderItem = (item: any) => {\n return (\n <Flex\n p={2}\n direction=\"column\"\n gapY={2}\n className=\"oui-rounded-xl oui-bg-base-9 oui-font-semibold\"\n >\n <Flex direction=\"row\" justify=\"between\" width=\"100%\" height=\"20px\">\n <Text.formatted\n rule=\"date\"\n className=\"oui-text-2xs oui-text-base-contrast-36\"\n >\n {item.created_time}\n </Text.formatted>\n <Text className=\"oui-text-sm oui-text-base-contrast-80\">\n {getStatusText(item.status)}\n </Text>\n </Flex>\n <div className=\"oui-h-px oui-w-full oui-bg-base-6\" />\n <Flex direction=\"row\" justify=\"between\" width=\"100%\">\n <Flex direction=\"column\">\n <Text className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.token\")}\n </Text>\n <Flex gapX={2}>\n <TokenIcon name={item.token} size=\"xs\" />\n <span className=\"oui-text-xs oui-text-base-contrast-80\">\n {item.token}\n </span>\n </Flex>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.type\")}\n </Text>\n <Text className=\"oui-text-xs oui-text-base-contrast-80\">\n {getTypeText(item.type)}\n </Text>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.amount\")}\n </Text>\n <Text className=\"oui-text-xs oui-text-base-contrast-80\">\n {item.amount}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n );\n };\n\n const loadMore = () => {\n if (dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange &&\n pagination.onPageSizeChange(pagination?.pageSize + 50);\n }\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"picker\",\n name: \"type\",\n options: TYPES,\n value: type,\n size: \"md\",\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-px-3 oui-py-2 oui-sticky oui-top-[44px] oui-z-10 oui-bg-base-10\"\n />\n <ListView\n dataSource={dataSource}\n renderItem={renderItem}\n contentClassName=\"oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n />\n </>\n );\n};\n","import { useDistributionHistory } from \"@kodiak-finance/orderly-hooks\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { useMemo, useState } from \"react\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\n\nexport const useDistributionHistoryHook = () => {\n // const today = useRef(setMinutes(setHours(new Date(), 23), 59));\n\n const [today] = useState(() => {\n const d = new Date();\n\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n const [type, setType] = useState<string>(\"All\");\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const [data, { isLoading, meta, isValidating }] = useDistributionHistory({\n // dataRange: dateRange.map((date) => date.getTime()),\n dataRange: [\n dateRange[0].getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n }).getTime(),\n ],\n type,\n pageSize,\n page,\n });\n\n // console.log(\"----\", isLoading, isValidating);\n\n // const res = useQuery(\"v1/public/info/funding_period\");\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"type\") {\n setType(filter.value);\n setPage(1);\n }\n\n if (filter.name === \"dateRange\") {\n // setDateRange([filter.value.from, filter.value.to]);\n setDateRange(parseDateRangeForFilter(filter.value));\n setPage(1);\n }\n };\n\n const pagination = useMemo(\n () => parsePagination(meta),\n [parsePagination, meta]\n );\n\n return {\n dataSource: data,\n isLoading,\n isValidating,\n // onDateRangeChange,\n queryParameter: {\n type,\n dateRange,\n },\n onFilter,\n pagination,\n } as const;\n};\n\nexport type useDistributionHistoryHookReturn = ReturnType<\n typeof useDistributionHistoryHook\n>;\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { DistributionHistoryDesktop } from \"./distribution.ui\";\nimport { DistributionHistoryMobile } from \"./distribution.ui.mobile\";\nimport { useDistributionHistoryHook } from \"./useDataSource.script\";\n\nexport const DistributionHistoryWidget: React.FC = () => {\n const state = useDistributionHistoryHook();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <DistributionHistoryMobile {...state} />;\n }\n return <DistributionHistoryDesktop {...state} />;\n};\n","export { DistributionHistoryWidget } from \"./distribution.widget\";\nexport { DistributionHistoryMobile } from \"./distribution.ui.mobile\";\nexport { DistributionHistoryDesktop } from \"./distribution.ui\";\n","import React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API, EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { Flex, TokenIcon, Text, toast, Badge } from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport const useColumns = () => {\n const { t } = useTranslation();\n const onCopy = () => {\n toast.success(t(\"common.copy.copied\"));\n };\n const { state } = useAccount();\n const sub = state.subAccounts ?? [];\n const columns = React.useMemo<Column<API.TransferHistoryRow>[]>(() => {\n return [\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n width: 80,\n render(val: string) {\n return (\n <Flex gapX={2}>\n <TokenIcon name={val} size=\"xs\" />\n <span>{val}</span>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"updated_time\",\n width: 120,\n rule: \"date\",\n },\n {\n title: `${t(\"transfer.internalTransfer.from\")} (Account ID)`,\n dataIndex: \"from_account_id\",\n render(val: string) {\n const isMainAccount = val === state.mainAccountId;\n const subAccount = sub.find((item) => item.id === val);\n return (\n <Flex itemAlign=\"start\" py={2} gap={1} direction=\"column\">\n <Text.formatted onCopy={onCopy} copyable rule=\"address\">\n {val}\n </Text.formatted>\n <Badge className=\"oui-select-none\" color=\"neutral\" size=\"xs\">\n {isMainAccount\n ? t(\"common.mainAccount\")\n : subAccount?.description || t(\"common.subAccount\")}\n </Badge>\n </Flex>\n );\n },\n },\n {\n title: `${t(\"transfer.internalTransfer.to\")} (Account ID)`,\n dataIndex: \"to_account_id\",\n render(val: string) {\n const isMainAccount = val === state.mainAccountId;\n const subAccount = sub.find((item) => item.id === val);\n return (\n <Flex itemAlign=\"start\" py={2} gap={1} direction=\"column\">\n <Text.formatted onCopy={onCopy} copyable rule=\"address\">\n {val}\n </Text.formatted>\n <Badge className=\"oui-select-none\" color=\"neutral\" size=\"xs\">\n {isMainAccount\n ? t(\"common.mainAccount\")\n : subAccount?.description || t(\"common.subAccount\")}\n </Badge>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n width: 120,\n render(val: string) {\n return capitalizeString(val);\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount\",\n width: 80,\n },\n ];\n }, [t, state.mainAccountId, sub]);\n return columns;\n};\n","import React, { useMemo } from \"react\";\nimport { produce } from \"immer\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { DataFilter, formatAddress } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport type { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport { useColumns } from \"./column\";\nimport type { useTransferHistoryHookReturn } from \"./useDataSource.script\";\n\ntype HistoryProps = useTransferHistoryHookReturn;\n\nexport enum AccountType {\n ALL = \"All accounts\",\n MAIN = \"Main accounts\",\n}\n\nexport const TransferHistoryUI: React.FC<\n Readonly<HistoryProps & ReturnType<typeof useAccount>>\n> = (props) => {\n const {\n dataSource,\n queryParameter,\n state,\n isMainAccount,\n isLoading,\n selectedAccount,\n onFilter,\n } = props;\n const { side, dateRange } = queryParameter;\n\n const { t } = useTranslation();\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const subAccounts = state.subAccounts ?? [];\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [subAccounts]);\n\n const columns = useColumns();\n\n return (\n <>\n <DataFilter\n onFilter={onFilter}\n items={produce(\n [\n {\n type: \"select\",\n name: \"side\",\n value: side,\n options: [\n { value: \"OUT\", label: \"Outflow\" },\n { value: \"IN\", label: \"Inflow\" },\n ],\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ],\n (draft) => {\n if (isMainAccount) {\n draft.unshift({\n type: \"select\",\n name: \"account\",\n value: selectedAccount as any,\n options: memoizedOptions,\n });\n }\n },\n )}\n />\n <AuthGuardDataTable<API.TransferHistoryRow>\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n // isValidating={isValidating}\n className=\"oui-font-semibold\"\n classNames={{ root: \"oui-h-[calc(100%_-_49px)]\" }}\n pagination={props.pagination}\n generatedRowKey={(row) => row.id}\n />\n </>\n );\n};\n","import React from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport { useAccount, useTransferHistory } from \"@kodiak-finance/orderly-hooks\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport type { PaginationMeta } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\nimport { AccountType } from \"./transfer.ui\";\n\nexport const useTransferHistoryHook = () => {\n // const today = useRef(setMinutes(setHours(new Date(), 23), 59));\n\n const today = React.useMemo<Date>(() => {\n const date = new Date();\n return new Date(getYear(date), getMonth(date), getDate(date), 0, 0, 0);\n }, []);\n\n const [dateRange, setDateRange] = React.useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const { state } = useAccount();\n\n const [selectedAccount, setAccount] = React.useState<string>(AccountType.ALL);\n\n const [side, setSide] = React.useState<\"IN\" | \"OUT\">(\"OUT\");\n\n const [data, { isLoading, meta }] = useTransferHistory({\n dataRange: [\n dateRange[0]?.getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })?.getTime(),\n ],\n side: side,\n size: pageSize,\n page: page,\n main_sub_only: true,\n });\n\n const filteredData = React.useMemo(() => {\n return data.filter((item) => {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return (\n item.from_account_id === state.mainAccountId ||\n item.to_account_id === state.mainAccountId\n );\n } else {\n return (\n item.from_account_id === selectedAccount ||\n item.to_account_id === selectedAccount\n );\n }\n });\n }, [data, selectedAccount]);\n\n const onAccountFilter = React.useCallback(\n (filter: { value: string; name: string }) => {\n if (filter.name === \"account\") {\n setAccount(filter.value);\n }\n if (filter.name === \"side\") {\n setSide(filter.value as \"IN\" | \"OUT\");\n }\n if (filter.name === \"dateRange\") {\n setDateRange(parseDateRangeForFilter(filter.value as any));\n }\n setPage(1);\n },\n [setPage],\n );\n\n const pagination = React.useMemo<PaginationMeta>(\n () => parsePagination(meta),\n [parsePagination, meta],\n );\n\n return {\n dataSource: filteredData,\n isLoading,\n // onDateRangeChange,\n queryParameter: {\n side,\n dateRange,\n },\n selectedAccount,\n onFilter: onAccountFilter,\n pagination,\n } as const;\n};\n\nexport type useTransferHistoryHookReturn = ReturnType<\n typeof useTransferHistoryHook\n>;\n","import React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { TransferHistoryUI } from \"./transfer.ui\";\nimport { useTransferHistoryHook } from \"./useDataSource.script\";\n\nexport const TransferHistoryWidget: React.FC = () => {\n const state = useTransferHistoryHook();\n const accountState = useAccount();\n return <TransferHistoryUI {...state} {...accountState} />;\n};\n","export { TransferHistoryWidget } from \"./transfer.widget\";\nexport { TransferHistoryUI } from \"./transfer.ui\";\n","import React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { Flex, TokenIcon, Text, cn } from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport const useColumns = () => {\n const { t } = useTranslation();\n const columns = React.useMemo<Column<API.StrategyVaultHistoryRow>[]>(() => {\n return [\n {\n title: t(\"common.type\"),\n dataIndex: \"type\",\n className: (record) => {\n if (record?.type === \"deposit\") {\n return \"oui-text-success\";\n }\n if (record?.type === \"withdrawal\") {\n return \"oui-text-danger\";\n }\n return \"\";\n },\n render(val: string) {\n if (val === \"deposit\") {\n return t(\"common.deposit\");\n }\n if (val === \"withdrawal\") {\n return t(\"common.withdraw\");\n }\n return null;\n },\n },\n {\n title: t(\"portfolio.overview.vaultName\"),\n dataIndex: \"vaultName\",\n },\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n render(val: string) {\n return (\n <Flex justify=\"start\" itemAlign=\"center\" gap={2}>\n <TokenIcon name={val} />\n {val}\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n rule: \"date\",\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n render(val: string) {\n return capitalizeString(val);\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount_change\",\n render(val: number) {\n return (\n <Text.numeral\n showIdentifier\n className={cn(\n \"oui-select-none\",\n val >= 0 ? \"oui-text-success\" : \"oui-text-danger\",\n )}\n >\n {val}\n </Text.numeral>\n );\n },\n },\n ];\n }, [t]);\n return columns;\n};\n","import React from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useColumns } from \"./column\";\nimport type { useVaultsHistoryHookReturn } from \"./useDataSource.script\";\n\ntype HistoryProps = useVaultsHistoryHookReturn;\n\nexport const VaultsHistoryUI: React.FC<Readonly<HistoryProps>> = (props) => {\n const { dataSource, dateRange, isLoading, onFilter } = props;\n\n const columns = useColumns();\n\n return (\n <>\n <DataFilter\n onFilter={onFilter}\n items={[\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n />\n <AuthGuardDataTable<API.StrategyVaultHistoryRow>\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n className=\"oui-font-semibold\"\n classNames={{ root: \"oui-h-[calc(100%_-_49px)]\" }}\n pagination={props.pagination}\n generatedRowKey={(row) => row.id}\n />\n </>\n );\n};\n","import React from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport { useVaultsHistory } from \"@kodiak-finance/orderly-hooks\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport type { PaginationMeta } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\n\nexport const useVaultsHistoryHook = () => {\n const today = React.useMemo<Date>(() => {\n const date = new Date();\n return new Date(getYear(date), getMonth(date), getDate(date), 0, 0, 0);\n }, []);\n\n const [dateRange, setDateRange] = React.useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const [data, { isLoading, meta }] = useVaultsHistory({\n dataRange: [\n dateRange[0]?.getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })?.getTime(),\n ],\n size: pageSize,\n page: page,\n });\n\n const dataSource = React.useMemo(() => {\n if (!Array.isArray(data) || !data.length) {\n return [];\n }\n return data.map<API.StrategyVaultHistoryRow>((item) => ({\n ...item,\n token: \"USDC\", // need to hard code for now\n vaultName: \"Orderly OmniVault\",\n amount_change:\n item.type === \"withdrawal\" ? -item.amount_change : item.amount_change,\n }));\n }, [data]);\n\n const onDateRangeFilter = React.useCallback(\n (filter: { value: string; name: string }) => {\n if (filter.name === \"dateRange\") {\n setDateRange(parseDateRangeForFilter(filter.value as any));\n }\n setPage(1);\n },\n [setPage],\n );\n\n const pagination = React.useMemo<PaginationMeta>(\n () => parsePagination(meta),\n [parsePagination, meta],\n );\n\n return {\n dataSource: dataSource,\n isLoading,\n dateRange,\n onFilter: onDateRangeFilter,\n pagination,\n } as const;\n};\n\nexport type useVaultsHistoryHookReturn = ReturnType<\n typeof useVaultsHistoryHook\n>;\n","import { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Divider } from \"@kodiak-finance/orderly-ui\";\nimport { DataFilter, TokenIcon, ListView, Text } from \"@kodiak-finance/orderly-ui\";\nimport { useVaultsHistoryHookReturn } from \"./useDataSource.script\";\n\nexport const VaultsHistoryMobile = (props: useVaultsHistoryHookReturn) => {\n const { dateRange, onFilter, dataSource, isLoading, pagination } = props;\n const { t } = useTranslation();\n\n const loadMore = () => {\n if (dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange?.(pagination?.pageSize + 50);\n }\n };\n\n const renderHistoryItem = (item: any) => {\n const typeColor = item.type === \"deposit\" ? \"buy\" : \"sell\";\n const typeText =\n item.type === \"deposit\" ? t(\"common.deposit\") : t(\"common.withdraw\");\n const amountText = item.amount_change ? Math.abs(item.amount_change) : \"-\";\n return (\n <div className=\"oui-flex oui-flex-col oui-rounded-xl oui-bg-base-9 oui-p-2 oui-font-semibold\">\n <div className=\"oui-flex oui-items-center oui-justify-between oui-text-sm oui-text-base-contrast-80\">\n <div>{item.vaultName}</div>\n <div>\n {item.status?.slice(0, 1).toUpperCase() + item.status?.slice(1)}\n </div>\n </div>\n <Text.formatted rule=\"date\" intensity={36} size=\"2xs\">\n {item.created_time}\n </Text.formatted>\n <Divider className=\"oui-my-2\" />\n <div className=\"oui-flex oui-items-center [&>div]:oui-flex-1 [&>div]:oui-text-2xs [&>div]:oui-text-base-contrast-36\">\n <div>\n <div>{t(\"common.token\")}</div>\n <div className=\"oui-flex oui-items-center oui-gap-1 oui-text-xs oui-text-base-contrast-80\">\n <TokenIcon name={\"USDC\"} size=\"2xs\" />\n <Text>USDC</Text>\n </div>\n </div>\n <div>\n <div>{t(\"common.type\")}</div>\n <Text color={typeColor} className=\"oui-text-xs\">\n {typeText}\n </Text>\n </div>\n <div className=\"oui-text-right\">\n <div>{t(\"common.amount\")}</div>\n <div className=\"oui-text-xs oui-text-base-contrast-80\">\n {amountText}\n </div>\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-sticky oui-top-[44px] oui-z-10 oui-border-none oui-bg-base-10 oui-px-3 oui-py-2\"\n />\n <ListView\n dataSource={dataSource}\n renderItem={renderHistoryItem}\n contentClassName=\"!oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n />\n </>\n );\n};\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { VaultsHistoryUI } from \"./transfer.ui\";\nimport { useVaultsHistoryHook } from \"./useDataSource.script\";\nimport { VaultsHistoryMobile } from \"./vaults.ui.mobile\";\n\nexport const VaultsHistoryWidget: React.FC = () => {\n const state = useVaultsHistoryHook();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <VaultsHistoryMobile {...state} />;\n }\n return <VaultsHistoryUI {...state} />;\n};\n","export { VaultsHistoryWidget } from \"./transfer.widget\";\nexport { VaultsHistoryUI } from \"./transfer.ui\";\n","import React, { useEffect } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport {\n ArrowDownSquareFillIcon,\n ArrowLeftRightSquareFill,\n ArrowUpSquareFillIcon,\n Card,\n FeeTierIcon,\n ServerFillIcon,\n TabPanel,\n Tabs,\n VaultsIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { TabName } from \"./historyDataGroup.script\";\n\nconst LazyAssetHistoryWidget = React.lazy(() =>\n import(\"../assetHistory\").then((mod) => {\n return { default: mod.AssetHistoryWidget };\n }),\n);\n\nconst LazyFundingHistoryWidget = React.lazy(() =>\n import(\"../funding\").then((mod) => {\n return { default: mod.FundingHistoryWidget };\n }),\n);\n\nconst LazyDistributionHistoryWidget = React.lazy(() =>\n import(\"../distribution\").then((mod) => {\n return { default: mod.DistributionHistoryWidget };\n }),\n);\n\nconst LazyTransferHistoryWidget = React.lazy(() =>\n import(\"../TransferHistory\").then((mod) => {\n return { default: mod.TransferHistoryWidget };\n }),\n);\n\nconst LazyVaultsHistoryWidget = React.lazy(() =>\n import(\"../VaultsHistory\").then((mod) => {\n return { default: mod.VaultsHistoryWidget };\n }),\n);\n\nexport const HistoryDataGroupDesktop: React.FC<{\n active?: TabName;\n onTabChange: (tab: string) => void;\n}> = (props) => {\n const { active = \"deposit\", onTabChange } = props;\n const { t } = useTranslation();\n const { isMainAccount } = useAccount();\n useEffect(() => {\n if (active === \"vaults\" && !isMainAccount) {\n onTabChange(\"deposit\");\n }\n }, [active, isMainAccount]);\n return (\n <Card>\n <Tabs\n value={active}\n onValueChange={onTabChange}\n variant=\"contained\"\n size=\"xl\"\n >\n <TabPanel\n title={t(\"common.deposits\")}\n icon={<ArrowDownSquareFillIcon />}\n value={\"deposit\"}\n >\n <React.Suspense fallback={null}>\n <LazyAssetHistoryWidget side={AssetHistorySideEnum.DEPOSIT} />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"common.withdrawals\")}\n icon={<ArrowUpSquareFillIcon />}\n value={\"withdraw\"}\n >\n <React.Suspense fallback={null}>\n <LazyAssetHistoryWidget side={AssetHistorySideEnum.WITHDRAW} />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"common.funding\")}\n icon={<FeeTierIcon />}\n value={\"funding\"}\n >\n <React.Suspense fallback={null}>\n <LazyFundingHistoryWidget />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.distribution\")}\n icon={<ServerFillIcon />}\n value={\"distribution\"}\n >\n <React.Suspense fallback={null}>\n <LazyDistributionHistoryWidget />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.transferHistory\")}\n icon={<ArrowLeftRightSquareFill />}\n value={\"transfer\"}\n >\n <React.Suspense fallback={null}>\n <LazyTransferHistoryWidget />\n </React.Suspense>\n </TabPanel>\n {isMainAccount && (\n <TabPanel\n value={\"vaults\"}\n icon={<VaultsIcon />}\n title={t(\"portfolio.overview.vaults\")}\n >\n <React.Suspense fallback={null}>\n <LazyVaultsHistoryWidget />\n </React.Suspense>\n </TabPanel>\n )}\n </Tabs>\n </Card>\n );\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\nimport { produce } from \"immer\";\nimport { useAccount, useCollateral } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\n\nconst EMPTY_HOLDING: Partial<API.Holding> = {\n token: \"USDC\",\n holding: 0,\n frozen: 0,\n};\n\n// Account data structure used in assets display\nexport interface AccountWithChildren {\n account_id: string;\n id?: string;\n description?: string;\n children: Array<API.Holding & { account_id: string }>;\n}\n\n// Hook to transform raw account data into display format\nexport const useAccountsData = (): AccountWithChildren[] => {\n const { t } = useTranslation();\n const { state, isMainAccount } = useAccount();\n const { holding = [] } = useCollateral();\n const subAccounts = state.subAccounts ?? [];\n\n return useMemo(() => {\n return produce<any[]>(subAccounts, (draft) => {\n // Process sub accounts\n for (const sub of draft) {\n sub.account_id = sub.id;\n if (Array.isArray(sub.holding) && sub.holding.length) {\n sub.children = sub.holding.map((item: API.Holding) => ({\n ...item,\n account_id: sub.id,\n }));\n } else {\n sub.children = [{ ...EMPTY_HOLDING, account_id: sub.id }];\n }\n // Remove original holding to avoid confusion\n Reflect.deleteProperty(sub, \"holding\");\n }\n\n // Add main account at the beginning if user is main account\n if (isMainAccount) {\n draft.unshift({\n account_id: state.mainAccountId!,\n description: t(\"common.mainAccount\"),\n children:\n Array.isArray(holding) && holding.length\n ? holding.map((item: API.Holding) => ({\n ...item,\n account_id: state.mainAccountId!,\n }))\n : [\n {\n ...EMPTY_HOLDING,\n account_id: state.mainAccountId!,\n },\n ],\n });\n }\n });\n }, [holding, subAccounts, isMainAccount, state.mainAccountId, t]);\n};\n","import { useMemo } from \"react\";\nimport {\n useAccount,\n useCollateral,\n useIndexPricesStream,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { SubAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useAccountsData } from \"./useAccountsData\";\n\nconst isNumber = (val: unknown): val is number => {\n return typeof val === \"number\" && !Number.isNaN(val);\n};\n\nexport const calculateTotalHolding = (\n data: SubAccount[] | SubAccount[\"holding\"],\n getIndexPrice: (token: string) => number,\n) => {\n let total = new Decimal(0);\n for (const item of data) {\n if (Array.isArray(item.holding)) {\n for (const hol of item.holding) {\n if (isNumber(hol.holding)) {\n const indexPrice = getIndexPrice(hol.token);\n total = total.plus(new Decimal(hol.holding).mul(indexPrice));\n }\n }\n } else if (isNumber(item.holding) && \"token\" in item) {\n const indexPrice = getIndexPrice(item.token);\n total = total.plus(new Decimal(item.holding).mul(indexPrice));\n }\n }\n return total;\n};\n\nexport const useAssetTotalValue = () => {\n const { state, isMainAccount } = useAccount();\n const { holding = [] } = useCollateral();\n const { getIndexPrice } = useIndexPricesStream();\n const allAccounts = useAccountsData();\n\n const subAccounts = state.subAccounts ?? [];\n\n // Calculate main account total value\n const mainTotalValue = useMemo<Decimal>(\n () => calculateTotalHolding(holding, getIndexPrice),\n [holding, getIndexPrice],\n );\n\n // Calculate sub accounts total value\n const subTotalValue = useMemo<Decimal>(\n () => calculateTotalHolding(subAccounts, getIndexPrice),\n [subAccounts, getIndexPrice],\n );\n\n // Calculate final total value\n const totalValue = useMemo<number>(() => {\n if (isMainAccount) {\n return mainTotalValue.plus(subTotalValue).toNumber();\n } else {\n const find = allAccounts.find((item) => item.id === state.accountId);\n if (Array.isArray(find?.children)) {\n return calculateTotalHolding(find.children, getIndexPrice).toNumber();\n }\n return 0;\n }\n }, [\n isMainAccount,\n mainTotalValue,\n subTotalValue,\n allAccounts,\n state.accountId,\n getIndexPrice,\n ]);\n\n return totalValue;\n};\n","import React, { useMemo } from \"react\";\nimport pick from \"ramda/es/pick\";\nimport { SubAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport {\n Text,\n Card,\n Flex,\n gradientTextVariants,\n EyeIcon,\n EyeCloseIcon,\n cn,\n DataFilter,\n formatAddress,\n Tabs,\n TabPanel,\n ArrowDownShortIcon,\n Button,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport type { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport type { useAssetsScriptReturn } from \"./assets.script\";\nimport type { AssetsWidgetProps } from \"./assets.widget\";\n\nconst LazyConvertHistoryWidget = React.lazy(() =>\n import(\"../convertPage/convert.widget\").then((mod) => {\n return { default: mod.ConvertHistoryWidget };\n }),\n);\n\nexport type AssetsProps = useAssetsScriptReturn;\n\nexport enum AccountType {\n ALL = \"All accounts\",\n MAIN = \"Main accounts\",\n}\n\nconst TotalValueInfo: React.FC<\n Readonly<\n Pick<AssetsWidgetProps, \"totalValue\" | \"visible\" | \"onToggleVisibility\">\n >\n> = (props) => {\n const { totalValue, visible, onToggleVisibility } = props;\n const { t } = useTranslation();\n const Icon = visible ? EyeIcon : EyeCloseIcon;\n return (\n <Flex direction=\"column\" gap={1} className=\"oui-text-2xs\" itemAlign=\"start\">\n <Flex gap={1} justify=\"start\" itemAlign=\"center\">\n <Text size=\"2xs\" color=\"neutral\" weight=\"semibold\">\n {t(\"common.totalValue\")}\n </Text>\n <button onClick={onToggleVisibility}>\n <Icon size={18} className={cn(\"oui-text-base-contrast-54\")} />\n </button>\n </Flex>\n <Flex justify={\"start\"} itemAlign=\"end\" gap={1}>\n <Text.numeral\n visible={visible}\n weight=\"bold\"\n size=\"2xl\"\n className={gradientTextVariants({ color: \"brand\" })}\n as=\"div\"\n padding={false}\n dp={2}\n >\n {totalValue ?? \"--\"}\n </Text.numeral>\n <Text as=\"div\" weight=\"bold\">\n USDC\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nconst DepositAndWithdrawButton: React.FC<\n Readonly<\n Pick<AssetsWidgetProps, \"isMainAccount\" | \"onWithdraw\" | \"onDeposit\">\n >\n> = (props) => {\n const { t } = useTranslation();\n const { isMainAccount, onWithdraw, onDeposit } = props;\n const { wrongNetwork, disabledConnect } = useAppContext();\n if (!isMainAccount) {\n return null;\n }\n const mergedDisabled = wrongNetwork || disabledConnect;\n return (\n <Flex\n className=\"oui-text-2xs oui-text-base-contrast-54\"\n itemAlign=\"center\"\n gap={3}\n >\n <Button\n disabled={mergedDisabled}\n data-testid=\"oui-testid-assetView-deposit-button\"\n fullWidth\n size=\"md\"\n onClick={onDeposit}\n >\n <ArrowDownShortIcon\n color=\"white\"\n opacity={mergedDisabled ? 0.4 : 1}\n className=\"oui-rotate-0\"\n />\n <Text>{t(\"common.deposit\")}</Text>\n </Button>\n <Button\n fullWidth\n disabled={mergedDisabled}\n color=\"secondary\"\n size=\"md\"\n onClick={onWithdraw}\n data-testid=\"oui-testid-assetView-withdraw-button\"\n >\n <ArrowDownShortIcon\n color=\"white\"\n opacity={mergedDisabled ? 0.4 : 1}\n className=\"oui-rotate-180\"\n />\n <Text>{t(\"common.withdraw\")}</Text>\n </Button>\n </Flex>\n );\n};\n\nconst DataFilterSection: React.FC<\n Pick<\n AssetsWidgetProps,\n | \"isMainAccount\"\n | \"onFilter\"\n | \"selectedAccount\"\n | \"selectedAsset\"\n | \"assetsOptions\"\n | \"state\"\n >\n> = (props) => {\n const { t } = useTranslation();\n const {\n isMainAccount,\n onFilter,\n selectedAccount,\n selectedAsset,\n assetsOptions,\n state,\n } = props;\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const ALL_ASSETS: SelectOption = {\n label: t(\"common.allAssets\", \"All assets\"),\n value: \"all\",\n };\n\n const subAccounts = useMemo<SubAccount[]>(() => {\n return state.subAccounts ?? [];\n }, [state.subAccounts]);\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value?.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [ALL_ACCOUNTS, MAIN_ACCOUNT, subAccounts]);\n\n const memoizedAssetOptions = useMemo(() => {\n return [ALL_ASSETS, ...assetsOptions];\n }, [ALL_ASSETS, assetsOptions]);\n\n if (!isMainAccount) {\n return null;\n }\n\n return (\n <DataFilter\n className=\"oui-border-none oui-py-0\"\n onFilter={onFilter}\n items={[\n {\n type: \"select\",\n name: \"account\",\n value: selectedAccount,\n options: memoizedOptions,\n },\n {\n type: \"select\",\n name: \"asset\",\n value: selectedAsset,\n options: memoizedAssetOptions,\n },\n ]}\n />\n );\n};\n\nexport const AssetsDataTable: React.FC<\n Pick<\n AssetsWidgetProps,\n | \"columns\"\n | \"dataSource\"\n | \"isMainAccount\"\n | \"onFilter\"\n | \"selectedAccount\"\n | \"selectedAsset\"\n | \"assetsOptions\"\n | \"state\"\n >\n> = (props) => {\n const { columns, dataSource } = props;\n return (\n <Flex width=\"100%\" direction={\"column\"}>\n <DataFilterSection\n {...pick(\n [\n \"isMainAccount\",\n \"onFilter\",\n \"selectedAccount\",\n \"selectedAsset\",\n \"assetsOptions\",\n \"state\",\n ],\n props,\n )}\n />\n {dataSource.map((item, index) => {\n return (\n <Flex\n key={`item-${index}`}\n className=\"oui-rounded-xl oui-bg-base-9 oui-p-6\"\n direction={\"column\"}\n itemAlign={\"start\"}\n justify={\"between\"}\n my={4}\n >\n <Text\n className=\"oui-mb-4\"\n intensity={98}\n weight=\"semibold\"\n size=\"lg\"\n >\n {item?.description || formatAddress(item?.id ?? \"\")}\n </Text>\n <AuthGuardDataTable\n bordered\n className=\"oui-font-semibold\"\n classNames={{\n root: \"oui-bg-transparent\",\n scroll: \"oui-min-h-0\",\n }}\n columns={columns}\n dataSource={item.children}\n />\n </Flex>\n );\n })}\n </Flex>\n );\n};\n\nexport const AssetsTable: React.FC<AssetsWidgetProps> = (props) => {\n const { t } = useTranslation();\n return (\n <Card\n className={\"oui-bg-transparent oui-p-0\"}\n classNames={{ content: \"!oui-pt-0\" }}\n >\n <Tabs\n defaultValue=\"assets\"\n variant=\"contained\"\n classNames={{ tabsList: \"\" }}\n size=\"lg\"\n >\n <TabPanel value=\"assets\" className=\"\" title={t(\"common.assets\")}>\n <Flex\n className=\"oui-rounded-xl oui-bg-base-9 oui-p-6\"\n direction={\"row\"}\n itemAlign={\"center\"}\n justify={\"between\"}\n my={4}\n >\n <TotalValueInfo\n {...pick([\"totalValue\", \"visible\", \"onToggleVisibility\"], props)}\n />\n <DepositAndWithdrawButton\n {...pick([\"isMainAccount\", \"onDeposit\", \"onWithdraw\"], props)}\n />\n </Flex>\n <AssetsDataTable\n {...pick(\n [\n \"columns\",\n \"dataSource\",\n \"isMainAccount\",\n \"onFilter\",\n \"selectedAccount\",\n \"selectedAsset\",\n \"assetsOptions\",\n \"state\",\n ],\n props,\n )}\n />\n </TabPanel>\n <TabPanel\n value=\"convertHistory\"\n className=\"oui-rounded-xl oui-bg-base-9 oui-px-6\"\n title={t(\"portfolio.overview.tab.convert.history\")}\n >\n <React.Suspense fallback={null}>\n <LazyConvertHistoryWidget />\n </React.Suspense>\n </TabPanel>\n </Tabs>\n </Card>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountType } from \"../pages/assets/assetsPage/assets.ui.desktop\";\n\n// Account filter function type\nexport type AccountFilterFunction<T = any> = (\n data: T[],\n selectedAccount: string,\n accountState: ReturnType<typeof useAccount>,\n) => T[];\n\n// Generic account filter utility\nexport const createAccountFilter = <T extends { account_id?: string }>(\n getAccountId?: (item: T) => string | undefined,\n): AccountFilterFunction<T> => {\n return (data, selectedAccount, accountState) => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n const accountId = getAccountId ? getAccountId(item) : item.account_id;\n\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return accountId === state.mainAccountId;\n } else {\n return accountId === selectedAccount;\n }\n } else {\n return accountId === state.accountId;\n }\n });\n };\n};\n\n// Hook for standard account-based data filtering\nexport const useAccountFilter = <T extends { account_id?: string }>(\n data: T[],\n selectedAccount: string,\n getAccountId?: (item: T) => string | undefined,\n): T[] => {\n const accountState = useAccount();\n\n return useMemo(() => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n const accountId = getAccountId ? getAccountId(item) : item.account_id;\n\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return accountId === state.mainAccountId;\n } else {\n return accountId === selectedAccount;\n }\n } else {\n return accountId === state.accountId;\n }\n });\n }, [data, selectedAccount, accountState, getAccountId]);\n};\n\n// Hook specifically for transfer history filtering\nexport const useTransferHistoryAccountFilter = <\n T extends { from_account_id?: string; to_account_id?: string },\n>(\n data: T[],\n selectedAccount: string,\n): T[] => {\n const accountState = useAccount();\n\n return useMemo(() => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return (\n item.from_account_id === state.mainAccountId ||\n item.to_account_id === state.mainAccountId\n );\n } else {\n return (\n item.from_account_id === selectedAccount ||\n item.to_account_id === selectedAccount\n );\n }\n } else {\n return (\n item.from_account_id === state.accountId ||\n item.to_account_id === state.accountId\n );\n }\n });\n }, [data, selectedAccount, accountState]);\n};\n\n// Pre-defined account filters for common use cases\nexport const AccountFilters = {\n // Standard account filter factory\n standard: <T extends { account_id?: string }>() => createAccountFilter<T>(),\n\n // Transfer history filter factory\n transferHistory:\n <T extends { from_account_id?: string; to_account_id?: string }>() =>\n (\n data: T[],\n selectedAccount: string,\n accountState: ReturnType<typeof useAccount>,\n ): T[] => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return (\n item.from_account_id === state.mainAccountId ||\n item.to_account_id === state.mainAccountId\n );\n } else {\n return (\n item.from_account_id === selectedAccount ||\n item.to_account_id === selectedAccount\n );\n }\n } else {\n return (\n item.from_account_id === state.accountId ||\n item.to_account_id === state.accountId\n );\n }\n });\n },\n\n // Custom account ID filter factory\n customAccountId: <T extends Record<string, any>>(accountIdKey: keyof T) =>\n createAccountFilter<T>((item) => item[accountIdKey] as string),\n};\n","import React, { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountType } from \"../pages/assets/assetsPage/assets.ui.desktop\";\n\n// Account filter hook for assets-like data structures\nexport const useAssetsAccountFilter = <T extends { account_id?: string }>(\n data: T[],\n) => {\n const { state, isMainAccount } = useAccount();\n const [selectedAccount, setSelectedAccount] = React.useState<string>(\n AccountType.ALL,\n );\n\n // Filter data based on selected account\n const filteredData = useMemo(() => {\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return item.account_id === state.mainAccountId;\n } else {\n return item.account_id === selectedAccount;\n }\n } else {\n return item.account_id === state.accountId;\n }\n });\n }, [data, selectedAccount, isMainAccount, state]);\n\n // Handle filter changes\n const onAccountFilter = React.useCallback(\n (filter: { name: string; value: string }) => {\n const { name, value } = filter;\n if (name === \"account\") {\n setSelectedAccount(value);\n }\n },\n [],\n );\n\n return {\n selectedAccount,\n filteredData,\n onAccountFilter,\n setSelectedAccount,\n };\n};\n\n// Enhanced account and asset combined filter hook\nexport const useAssetsMultiFilter = <\n T extends {\n account_id?: string;\n children?: Array<{ token: string; [key: string]: any }>;\n },\n>(\n data: T[],\n) => {\n const { state, isMainAccount } = useAccount();\n const [selectedAccount, setSelectedAccount] = React.useState<string>(\n AccountType.ALL,\n );\n const [selectedAsset, setSelectedAsset] = React.useState<string>(\"all\");\n\n // Filter data based on both account and asset\n const filteredData = useMemo(() => {\n let accountFiltered = data;\n\n // First apply account filter\n if (isMainAccount) {\n if (selectedAccount && selectedAccount !== AccountType.ALL) {\n if (selectedAccount === AccountType.MAIN) {\n accountFiltered = data.filter(\n (item) => item.account_id === state.mainAccountId,\n );\n } else {\n accountFiltered = data.filter(\n (item) => item.account_id === selectedAccount,\n );\n }\n }\n } else {\n accountFiltered = data.filter(\n (item) => item.account_id === state.accountId,\n );\n }\n\n // Then apply asset filter\n if (selectedAsset && selectedAsset !== \"all\") {\n accountFiltered = accountFiltered\n .map((account) => {\n if (account.children) {\n const filteredChildren = account.children.filter(\n (child) => child.token === selectedAsset,\n );\n // Only include accounts that have the selected asset\n return filteredChildren.length > 0\n ? { ...account, children: filteredChildren }\n : null;\n }\n return account;\n })\n .filter(Boolean) as T[];\n }\n\n return accountFiltered;\n }, [data, selectedAccount, selectedAsset, isMainAccount, state]);\n\n // Handle combined filter changes\n const onFilter = React.useCallback(\n (filter: { name: string; value: string }) => {\n const { name, value } = filter;\n if (name === \"account\") {\n setSelectedAccount(value);\n } else if (name === \"asset\") {\n setSelectedAsset(value);\n }\n },\n [],\n );\n\n return {\n selectedAccount,\n selectedAsset,\n filteredData,\n onFilter,\n setSelectedAccount,\n setSelectedAsset,\n };\n};\n\n// Generic account filter function that can be used standalone\nexport const filterByAccount = <T extends { account_id?: string }>(\n data: T[],\n selectedAccount: string,\n accountState: {\n isMainAccount: boolean;\n state: {\n mainAccountId?: string;\n accountId?: string;\n };\n },\n): T[] => {\n const { isMainAccount, state } = accountState;\n\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return item.account_id === state.mainAccountId;\n } else {\n return item.account_id === selectedAccount;\n }\n } else {\n return item.account_id === state.accountId;\n }\n });\n};\n","export * from \"./useAssetTotalValue\";\nexport * from \"./useAccountFilter\";\nexport * from \"./useAssetsAccountFilter\";\nexport * from \"./useAccountsData\";\n","import React, { useMemo, useState } from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport {\n useAccount,\n useCollateral,\n useIndexPricesStream,\n useSubAccountQuery,\n useTokensInfo,\n useChainInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { useAccountsData, useAssetsAccountFilter } from \"../../../hooks\";\nimport { parseDateRangeForFilter } from \"../../overview/helper/date\";\nimport type { ConvertRecord } from \"../type\";\n\nexport const useConvertScript = () => {\n const { isMainAccount, state } = useAccount();\n const { holding = [] } = useCollateral();\n const { data: indexPrices } = useIndexPricesStream();\n\n const { data: chainsInfo } = useChainInfo();\n\n // Pagination\n const { page, pageSize, setPage, parsePagination } = usePagination({\n page: 1,\n pageSize: 20,\n });\n\n // Use the same account data structure as assets\n const allAccounts = useAccountsData();\n\n const tokensInfo = useTokensInfo();\n\n // Use the same account filter logic as assets\n const { selectedAccount, onAccountFilter } =\n useAssetsAccountFilter(allAccounts);\n\n // Simple date range handling like other scripts\n const [today] = useState(() => {\n const d = new Date();\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n // Filter states (matching API fields)\n const [statusFilter, setStatusFilter] = useState<string>(\"all\");\n const [convertedAssetFilter, setConvertedAssetFilter] =\n useState<string>(\"all\");\n\n // Create asset options from holding data - similar to assets script\n const convertedAssetOptions = useMemo(() => {\n // Create options array\n const assetOptions =\n tokensInfo?.map((item) => ({\n value: item.token,\n label: item.token,\n })) || [];\n\n return [{ label: \"All assets\", value: \"all\" }, ...assetOptions];\n }, [tokensInfo]);\n\n // Handle all filters (including account filter and date range)\n const onFilter = React.useCallback(\n (filter: { name: string; value: string | { from: Date; to: Date } }) => {\n const { name, value } = filter;\n\n // Delegate account filter to the hook\n if (name === \"account\") {\n onAccountFilter(filter as { name: string; value: string });\n } else if (name === \"status\") {\n setStatusFilter(value as string);\n setPage(1); // Reset to first page when filter changes\n } else if (name === \"converted_asset\") {\n setConvertedAssetFilter(value as string);\n setPage(1);\n } else if (name === \"time\" || name === \"dateRange\") {\n setDateRange(\n parseDateRangeForFilter(value as { from: Date; to: Date }),\n );\n setPage(1);\n }\n },\n [onAccountFilter, setPage],\n );\n\n // Build query URL with parameters\n const queryUrl = React.useMemo(() => {\n const params = new URLSearchParams();\n\n // Add pagination parameters\n params.set(\"page\", page.toString());\n params.set(\"size\", pageSize.toString());\n\n // Add date range parameters\n if (dateRange[0]) {\n params.set(\"start_t\", dateRange[0].getTime().toString());\n }\n if (dateRange[1]) {\n params.set(\n \"end_t\",\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })\n .getTime()\n .toString(),\n );\n }\n\n // Add filter parameters (only if not \"all\")\n if (statusFilter !== \"all\") {\n params.set(\"status\", statusFilter);\n }\n\n if (convertedAssetFilter !== \"all\") {\n params.set(\"converted_asset\", convertedAssetFilter);\n }\n\n return `/v1/asset/convert_history?${params.toString()}`;\n }, [page, pageSize, dateRange, statusFilter, convertedAssetFilter]);\n\n // Query convert history with all parameters\n const { data, isLoading } = useSubAccountQuery<{\n rows: ConvertRecord[];\n meta: {\n total: number;\n current_page: number;\n records_per_page: number;\n };\n }>(queryUrl, {\n accountId: isMainAccount ? state.mainAccountId : state.accountId,\n formatter: (data) => {\n return data;\n },\n });\n\n // Parse pagination from API response meta\n const pagination = useMemo(() => {\n if (data?.meta) {\n return parsePagination(data.meta);\n }\n return {\n page,\n pageSize,\n onPageChange: setPage,\n onPageSizeChange: () => {\n // Handle page size change if needed\n },\n };\n }, [data?.meta, parsePagination, page, pageSize, setPage]);\n\n // Calculate summary\n const summary = useMemo(() => {\n const dataRows = data?.rows || [];\n\n const totalConversions = dataRows.length;\n const totalUSDCReceived = dataRows.reduce(\n (sum, record) => sum + record.received_qty,\n 0,\n );\n const totalFees = dataRows.reduce(\n (sum, record) =>\n sum +\n record.details.reduce(\n (detailSum, detail) => detailSum + detail.haircut,\n 0,\n ),\n 0,\n );\n\n return {\n totalConversions,\n totalUSDCReceived,\n totalFees,\n };\n }, [data]);\n\n return {\n // Data\n dataSource: data?.rows || EMPTY_LIST,\n summary,\n pagination,\n\n // Filter state and handlers (compatible with assets)\n selectedAccount,\n onFilter,\n\n // Query parameters (consistent with other scripts)\n dateRange,\n\n // Filter states\n statusFilter,\n convertedAssetFilter,\n convertedAssetOptions,\n\n // State\n isMainAccount,\n isLoading,\n holding,\n\n // Index prices\n indexPrices,\n chainsInfo,\n };\n};\n\nexport type UseConvertScriptReturn = ReturnType<typeof useConvertScript>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Button,\n Flex,\n Text,\n TokenIcon,\n Tooltip,\n toast,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport type { ConvertRecord, ConvertTransaction } from \"../type\";\n\nexport interface ConvertColumnsOptions {\n onDetailsClick?: (convertId: number) => void;\n}\n\nexport interface ConvertDetailColumnsOptions {\n onTxClick?: (txId: string) => void;\n indexPrices: Record<string, number>;\n chainsInfo: any[];\n}\n\nexport const ConvertedAssetColumn = ({\n convertedAssets,\n}: {\n convertedAssets: Record<string, number>;\n}) => {\n const { t } = useTranslation();\n const assets = useMemo(() => {\n return Object.keys(convertedAssets);\n }, [convertedAssets]);\n\n const tooltipContent = useMemo(() => {\n return (\n <Flex\n direction=\"column\"\n gap={2}\n className=\"oui-w-[275px] oui-font-semibold oui-text-base-contrast-80\"\n >\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n className=\"oui-w-full oui-text-2xs oui-text-base-contrast-36\"\n >\n <div>{t(\"common.assets\")}</div>\n <div>{t(\"common.qty\")}</div>\n </Flex>\n {assets.map((asset) => (\n <Flex\n key={asset}\n itemAlign=\"center\"\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Flex itemAlign=\"center\" gap={1}>\n <TokenIcon size=\"xs\" name={asset} />\n <Text.formatted>{asset}</Text.formatted>\n </Flex>\n <div>\n <Text.formatted>{convertedAssets[asset]}</Text.formatted>\n </div>\n </Flex>\n ))}\n </Flex>\n );\n }, [assets]);\n\n return (\n <Flex itemAlign=\"center\" gap={2}>\n <div className=\"oui-relative oui-flex\">\n {assets.slice(0, 3).map((asset, index) => (\n <div\n key={asset}\n className=\"oui-relative\"\n style={{\n marginLeft: index > 0 ? \"-8px\" : \"0\",\n zIndex: assets.length + index,\n }}\n >\n <TokenIcon size=\"xs\" name={asset} />\n </div>\n ))}\n </div>\n <Tooltip content={tooltipContent}>\n <Text.formatted className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\">\n {assets.slice(0, 3).join(\", \")}{\" \"}\n {assets.length > 3 && `+${assets.length - 3}`}\n </Text.formatted>\n </Tooltip>\n </Flex>\n );\n};\n\nexport const useConvertColumns = (options: ConvertColumnsOptions) => {\n const { onDetailsClick } = options;\n const { t } = useTranslation();\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n\n const columns = React.useMemo<Column[]>(() => {\n return [\n {\n title: t(\"portfolio.overview.column.convert.convertedAsset\"),\n dataIndex: \"converted_asset\",\n align: \"left\",\n width: 200,\n maxWidth: 200,\n render(convertedAssets: Record<string, number>) {\n return <ConvertedAssetColumn convertedAssets={convertedAssets} />;\n },\n },\n {\n title: t(\"portfolio.overview.column.convert.usdcAmount\"),\n dataIndex: \"received_qty\",\n align: \"left\",\n width: 150,\n render(qty: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {qty}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.fee\"),\n dataIndex: \"details\",\n align: \"left\",\n width: 120,\n render(details: ConvertRecord[\"details\"]) {\n const totalHaircut = details.reduce(\n (sum, detail) => sum + detail.haircut,\n 0,\n );\n return (\n <Text.numeral dp={6} padding={false}>\n {totalHaircut}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.type\"),\n dataIndex: \"type\",\n align: \"left\",\n width: 150,\n render(type: string) {\n return <Text>{type.charAt(0).toUpperCase() + type.slice(1)}</Text>;\n },\n },\n {\n title: t(\"portfolio.overview.column.convert.convertId\"),\n dataIndex: \"convert_id\",\n align: \"left\",\n width: 150,\n render(convertId: number) {\n return (\n <Text.formatted onCopy={onCopy} copyable>\n {convertId}\n </Text.formatted>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n align: \"left\",\n width: 160,\n rule: \"date\",\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n align: \"left\",\n width: 150,\n render(status: string) {\n return (\n <Text>{status.charAt(0).toUpperCase() + status.slice(1)}</Text>\n );\n },\n },\n {\n title: \"\",\n dataIndex: \"updated_time\",\n align: \"center\",\n width: 80,\n render(convertId: number, record: ConvertRecord) {\n return (\n <Button\n size=\"sm\"\n variant=\"text\"\n className=\"oui-text-primary\"\n onClick={() => onDetailsClick?.(record.convert_id)}\n >\n {t(\"portfolio.overview.column.convert.details\")}\n </Button>\n );\n },\n },\n ];\n }, [onDetailsClick]);\n\n return columns;\n};\n\n// Converted asset, Qty., USDC amount, Fee, TxID, Network, Status\nexport const useConvertDetailColumns = (\n options: ConvertDetailColumnsOptions,\n) => {\n const { t } = useTranslation();\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n const columns = React.useMemo<Column[]>(() => {\n return [\n {\n title: t(\"portfolio.overview.column.convert.convertedAsset\"),\n dataIndex: \"converted_asset\",\n align: \"left\",\n width: 150,\n render(asset: string) {\n return (\n <Flex itemAlign=\"center\" gap={2}>\n <TokenIcon name={asset} />\n {asset}\n </Flex>\n );\n },\n },\n {\n title: t(\"common.qty\"),\n dataIndex: \"converted_qty\",\n align: \"left\",\n width: 100,\n render(qty: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {qty}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.convert.usdcAmount\"),\n dataIndex: \"received_qty\",\n align: \"left\",\n width: 100,\n render(qty: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {qty}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.fee\"),\n dataIndex: \"haircut\",\n align: \"left\",\n width: 100,\n render(haircut: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {haircut}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.txId\"),\n dataIndex: \"tx_id\",\n align: \"left\",\n width: 150,\n render(txId: string, record: ConvertTransaction) {\n if (!txId) return <Text intensity={54}>-</Text>;\n const chainInfo = (options.chainsInfo as any[])?.find(\n (item) => record.chain_id === parseInt(item.chain_id),\n );\n const explorer_base_url = chainInfo?.explorer_base_url;\n const href = `${explorer_base_url}/tx/${txId}`;\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n <Text.formatted\n onCopy={onCopy}\n rule=\"txId\"\n copyable={!!txId}\n className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n >\n {txId}\n </Text.formatted>\n </a>\n );\n },\n },\n {\n title: t(\"transfer.network\"),\n dataIndex: \"chain_id\",\n align: \"left\",\n width: 150,\n render(venue: string, record: ConvertTransaction) {\n return (\n <Text>\n {options.chainsInfo.find(\n (item) => item.chain_id == record.chain_id,\n )?.name || \"-\"}\n </Text>\n );\n },\n },\n {\n title: t(\"common.result\"),\n dataIndex: \"result\",\n align: \"left\",\n width: 100,\n render(result: string) {\n return (\n <Text>{result?.charAt(0).toUpperCase() + result?.slice(1)}</Text>\n );\n },\n },\n ];\n }, []);\n\n return columns;\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n DataFilter,\n Flex,\n DataTable,\n modal,\n SimpleDialog,\n Divider,\n} from \"@kodiak-finance/orderly-ui\";\nimport { useModal } from \"@kodiak-finance/orderly-ui\";\nimport type { ConvertRecord } from \"../type\";\nimport { useConvertColumns, useConvertDetailColumns } from \"./convert.column\";\nimport { useConvertScript } from \"./convert.script\";\n\ntype ConvertDesktopUIProps = {\n convertState: ReturnType<typeof useConvertScript>;\n};\n\nexport const CONVERT_STATUS_OPTIONS = [\n {\n label: \"All status\",\n value: \"all\",\n },\n {\n label: \"Completed\",\n value: \"completed\",\n },\n {\n label: \"Pending\",\n value: \"pending\",\n },\n];\n\n// Convert Details Modal Component\nconst ConvertDetailsModal = modal.create<{\n record: ConvertRecord;\n indexPrices: Record<string, number>;\n chainsInfo: any[];\n}>((props) => {\n const { t } = useTranslation();\n const { visible, onOpenChange } = useModal();\n // console.log(props);\n\n const detailColumns = useConvertDetailColumns({\n indexPrices: props.indexPrices,\n chainsInfo: props.chainsInfo,\n });\n\n return (\n <SimpleDialog\n open={visible}\n onOpenChange={onOpenChange}\n title={t(\"portfolio.overview.convert.dialog.title.details\")}\n size=\"lg\"\n closable\n classNames={{\n content: \"oui-max-w-4xl\",\n }}\n >\n <DataTable\n columns={detailColumns}\n dataSource={props.record.details}\n bordered\n className=\"oui-w-full\"\n classNames={{\n header: \"oui-h-10\",\n root: \"oui-bg-base-8 oui-max-h-[60vh] oui-overflow-y-scroll\",\n }}\n onRow={() => ({\n className: \"oui-h-[40px]\",\n })}\n generatedRowKey={(record) =>\n record.transaction_id || Math.random().toString()\n }\n />\n </SimpleDialog>\n );\n});\n\nexport const ConvertDesktopUI: React.FC<ConvertDesktopUIProps> = ({\n convertState,\n}) => {\n const handleDetailsClick = (convertId: number) => {\n // Find the convert record by ID\n const record = convertState.dataSource.find(\n (item) => item.convert_id === convertId,\n );\n if (record) {\n modal.show(ConvertDetailsModal, {\n record,\n indexPrices: convertState.indexPrices,\n chainsInfo: convertState.chainsInfo as any,\n });\n }\n };\n\n const columns = useConvertColumns({\n onDetailsClick: handleDetailsClick,\n });\n\n const {\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n } = convertState;\n\n const dataFilter = useMemo(() => {\n return (\n <DataFilter\n className=\"\"\n onFilter={onFilter}\n items={[\n // {\n // type: \"select\",\n // name: \"account\",\n // value: selectedAccount,\n // options: memoizedOptions,\n // },\n {\n type: \"select\",\n name: \"converted_asset\",\n value: convertedAssetFilter,\n options: convertedAssetOptions,\n },\n {\n type: \"select\",\n name: \"status\",\n value: statusFilter,\n options: CONVERT_STATUS_OPTIONS,\n },\n {\n type: \"range\",\n name: \"time\",\n value: {\n from: dateRange?.[0],\n to: dateRange?.[1],\n },\n },\n ]}\n />\n );\n }, [\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n ]);\n\n return (\n <Flex direction=\"column\" mt={4} itemAlign=\"center\" className=\"oui-w-full\">\n <Divider className=\"oui-w-full oui-border-b oui-border-line-4 oui-pt-6\" />\n <Flex direction=\"row\" className=\"oui-w-full\">\n {dataFilter}\n </Flex>\n <DataTable\n columns={columns}\n dataSource={convertState.dataSource}\n loading={convertState.isLoading}\n bordered\n pagination={convertState.pagination}\n manualPagination\n className=\"oui-mt-4 oui-w-full\"\n classNames={{\n root: \"oui-h-[calc(100vh_-_200px)]\",\n header: \"oui-h-12\",\n }}\n onRow={() => ({\n className: \"oui-h-[48px] oui-cursor-pointer\",\n })}\n generatedRowKey={(record) => {\n return record.convert_id.toString();\n }}\n />\n </Flex>\n );\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n useModal,\n modal,\n Text,\n Divider,\n TokenIcon,\n Flex,\n DataFilter,\n SimpleSheet,\n toast,\n ScrollIndicator,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ConvertRecord, ConvertTransaction } from \"../type\";\nimport { ConvertedAssetColumn } from \"./convert.column\";\nimport { useConvertScript } from \"./convert.script\";\nimport { CONVERT_STATUS_OPTIONS } from \"./convert.ui.desktop\";\n\ntype ConvertMobileUIProps = {\n convertState: ReturnType<typeof useConvertScript>;\n};\n\ntype ConvertMobileItemProps = {\n item?: any;\n chainsInfo: any[];\n};\n\ntype ConvertMobileFieldProps = {\n label: string;\n value?: string | number;\n className?: string;\n copyable?: boolean;\n rule?: \"address\" | \"txId\";\n onClick?: () => void;\n};\n\nexport const ConvertMobileUI: React.FC<ConvertMobileUIProps> = ({\n convertState,\n}) => {\n const { t } = useTranslation();\n\n const {\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n } = convertState;\n\n const dataFilter = useMemo(() => {\n return (\n <DataFilter\n onFilter={onFilter}\n items={[\n // {\n // size: \"sm\",\n // type: \"picker\",\n // name: \"account\",\n // value: selectedAccount,\n // options: memoizedOptions,\n // },\n {\n size: \"md\",\n type: \"picker\",\n name: \"converted_asset\",\n value: convertedAssetFilter,\n options: convertedAssetOptions,\n className: \"oui-whitespace-nowrap\",\n },\n {\n size: \"md\",\n type: \"picker\",\n name: \"status\",\n value: statusFilter,\n options: CONVERT_STATUS_OPTIONS,\n className: \"oui-whitespace-nowrap\",\n },\n {\n type: \"range\",\n name: \"time\",\n value: {\n from: dateRange?.[0],\n to: dateRange?.[1],\n },\n },\n ]}\n />\n );\n }, [\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n ]);\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1 oui-px-3\">\n <ScrollIndicator className=\"oui-pr-5\">\n <Flex direction=\"row\">{dataFilter}</Flex>\n </ScrollIndicator>\n {convertState.dataSource.map((item) => (\n <ConvertMobileItem\n key={item.convert_id}\n item={item}\n chainsInfo={convertState.chainsInfo as any}\n />\n ))}\n </div>\n );\n};\n\nconst ConvertMobileField: React.FC<ConvertMobileFieldProps> = ({\n label,\n value,\n rule,\n copyable = false,\n className = \"\",\n onClick,\n}) => {\n const { t } = useTranslation();\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n return (\n <div\n className={`oui-text-2xs oui-font-semibold oui-text-base-contrast-80 [&_p]:oui-text-base-contrast-36 ${className}`}\n onClick={onClick}\n >\n <p>{label}</p>\n <Text.formatted rule={rule} copyable={copyable} onCopy={onCopy}>\n {value || \"-\"}\n </Text.formatted>\n </div>\n );\n};\n\nconst ConvertMobileItem: React.FC<ConvertMobileItemProps> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n if (!item) {\n return null;\n }\n\n const totalHaircut = item.details.reduce(\n (sum: number, detail: ConvertTransaction) => sum + detail.haircut,\n 0,\n );\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <div className=\"oui-flex oui-justify-between\">\n <div className=\"oui-flex oui-items-center oui-text-xs oui-font-semibold oui-text-base-contrast-80\">\n <ConvertedAssetColumn convertedAssets={item.converted_asset} />\n <div\n className=\"oui-ml-2 oui-text-primary\"\n onClick={() => {\n modal.show(ConverHistoryItemDetailsDialog, {\n item,\n chainsInfo: props.chainsInfo,\n });\n }}\n >\n {t(\"portfolio.overview.column.convert.details\")}\n </div>\n </div>\n <Text.formatted\n className=\"oui-text-2xs oui-text-base-contrast-36\"\n rule=\"date\"\n >\n {item.created_time}\n </Text.formatted>\n </div>\n\n {/* 5 fields in grid container: 3 per row, wrap to next line */}\n <div className=\"oui-grid oui-grid-cols-3 oui-gap-2\">\n <ConvertMobileField\n label={t(\"portfolio.overview.column.convert.usdcAmount\")}\n value={item.received_qty}\n />\n <ConvertMobileField label={t(\"common.fee\")} value={totalHaircut} />\n <ConvertMobileField\n label={t(\"portfolio.overview.column.convert.convertId\")}\n value={item.convert_id}\n copyable={true}\n />\n <ConvertMobileField\n label={t(\"common.type\")}\n value={item.type?.charAt(0).toUpperCase() + item.type?.slice(1)}\n />\n <ConvertMobileField\n label={t(\"common.status\")}\n value={item.status?.charAt(0).toUpperCase() + item.status?.slice(1)}\n />\n </div>\n </div>\n );\n};\n\ntype ConvertHistoryItemDetailsDialogProps = {\n item: ConvertRecord;\n chainsInfo: any[];\n};\n\nconst ConverHistoryItemDetailsDialog =\n modal.create<ConvertHistoryItemDetailsDialogProps>((props) => {\n const { item, chainsInfo } = props;\n const { t } = useTranslation();\n const { visible, hide, resolve, reject, onOpenChange } = useModal();\n\n return (\n <SimpleSheet\n title={t(\"portfolio.overview.convert.dialog.title.details\")}\n open={visible}\n onOpenChange={onOpenChange}\n >\n <div className=\"oui-flex oui-h-[300px] oui-flex-col oui-gap-3 oui-overflow-y-auto oui-rounded-lg oui-bg-base-7 oui-p-2\">\n {item.details.map((detail, index) => (\n <>\n <div className=\"oui-flex oui-flex-col oui-gap-2\">\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <TokenIcon name={detail.converted_asset} size=\"xs\" />\n <div className=\"oui-text-xs oui-text-base-contrast-80\">\n {detail.converted_asset}\n </div>\n </div>\n <div className=\"oui-grid oui-grid-cols-3 oui-gap-2\">\n <ConvertMobileField\n label={t(\"common.qty\")}\n value={detail.converted_qty}\n />\n <ConvertMobileField\n label={t(\"portfolio.overview.column.convert.usdcAmount\")}\n value={detail.received_qty}\n />\n <ConvertMobileField label=\"Fee\" value={detail.haircut} />\n <ConvertMobileField\n label={t(\"common.txId\")}\n copyable={!!detail.tx_id}\n rule=\"txId\"\n value={detail.tx_id}\n onClick={() => {\n if (detail.tx_id) {\n const chainInfo = chainsInfo.find(\n (item) => item.chain_id == detail.chain_id,\n );\n if (chainInfo?.explorer_base_url) {\n window.open(\n `${chainInfo.explorer_base_url}/tx/${detail.tx_id}`,\n \"_blank\",\n );\n }\n }\n }}\n />\n <ConvertMobileField\n label={t(\"transfer.network\")}\n value={\n chainsInfo.find(\n (item) => item.chain_id == detail.chain_id,\n )?.name || \"-\"\n }\n />\n <ConvertMobileField\n label={t(\"common.result\")}\n value={\n detail.result\n ? detail.result.charAt(0).toUpperCase() +\n detail.result.slice(1)\n : \"-\"\n }\n />\n </div>\n </div>\n {index < item.details.length - 1 && <Divider />}\n </>\n ))}\n </div>\n </SimpleSheet>\n );\n });\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useConvertScript } from \"./convert.script\";\nimport { ConvertDesktopUI } from \"./convert.ui.desktop\";\nimport { ConvertMobileUI } from \"./convert.ui.mobile\";\n\nexport const ConvertHistoryWidget: React.FC = () => {\n const convertState = useConvertScript();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <ConvertMobileUI convertState={convertState} />;\n }\n return <ConvertDesktopUI convertState={convertState} />;\n};\n","import React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport { TabPanel, Tabs } from \"@kodiak-finance/orderly-ui\";\nimport { ConvertHistoryWidget } from \"../../assets/convertPage/convert.widget\";\nimport { VaultsHistoryWidget } from \"../VaultsHistory/transfer.widget\";\nimport { AssetHistoryWidget } from \"../assetHistory\";\nimport { DistributionHistoryWidget } from \"../distribution\";\nimport { FundingHistoryWidget } from \"../funding\";\nimport { TabName } from \"./historyDataGroup.script\";\n\nexport const HistoryDataGroupMobile: React.FC<{\n active?: TabName;\n onTabChange: (tab: string) => void;\n}> = (props) => {\n const { active = \"deposit\", onTabChange } = props;\n const { t } = useTranslation();\n\n return (\n <Tabs\n value={active}\n onValueChange={onTabChange}\n variant=\"contained\"\n size=\"lg\"\n classNames={{\n tabsList: \"oui-px-3 oui-py-2\",\n scrollIndicator: \"oui-pr-3\",\n }}\n showScrollIndicator\n >\n <TabPanel title={t(\"common.deposits\")} value={\"deposit\"}>\n <AssetHistoryWidget side={AssetHistorySideEnum.DEPOSIT} />\n </TabPanel>\n <TabPanel title={t(\"common.withdrawals\")} value={\"withdraw\"}>\n <AssetHistoryWidget side={AssetHistorySideEnum.WITHDRAW} />\n </TabPanel>\n <TabPanel title={t(\"common.funding\")} value={\"funding\"}>\n <FundingHistoryWidget />\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.distribution\")}\n value={\"distribution\"}\n >\n <DistributionHistoryWidget />\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.tab.convert.history\")}\n value={\"convert\"}\n >\n <ConvertHistoryWidget />\n </TabPanel>\n <TabPanel title={t(\"common.vaults\")} value={\"vaults\"}>\n <VaultsHistoryWidget />\n </TabPanel>\n </Tabs>\n );\n};\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useHistoryDataGroupScript } from \"./historyDataGroup.script\";\nimport { HistoryDataGroupDesktop } from \"./historyDataGroup.ui.desktop\";\nimport { HistoryDataGroupMobile } from \"./historyDataGroup.ui.mobile\";\n\nexport const HistoryDataGroupWidget: React.FC = () => {\n const state = useHistoryDataGroupScript();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <HistoryDataGroupMobile {...state} />;\n }\n return <HistoryDataGroupDesktop {...state} />;\n};\n","export { HistoryDataGroupWidget } from \"./historyDataGroup.widget\";\n","import { createContext, useContext } from \"react\";\nimport { TWType } from \"@kodiak-finance/orderly-hooks\";\nimport { UseRewardsDataReturn } from \"../mobile/useRewardsData.script\";\nimport { useAssetsHistoryDataReturn } from \"../shared/useAssetHistory\";\n\nexport type OverviewContextState = {\n // period: PeriodType;\n type?: TWType;\n} & useAssetsHistoryDataReturn &\n UseRewardsDataReturn;\n\nexport const OverviewContext = createContext<OverviewContextState>(\n {} as OverviewContextState,\n);\n\nexport const useOverviewContext = () => {\n return useContext(OverviewContext);\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext, useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useOverviewContext } from \"../provider/overviewContext\";\n\nexport const useAssetsChartScript = () => {\n const assetHistory = useOverviewContext();\n\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n\n const filteredData = useDataTap(assetHistory.data, {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n fallbackData: assetHistory.createFakeData(\n { account_value: 0 },\n { account_value: 500 },\n ),\n });\n\n const _data = useMemo(() => {\n if (filteredData?.length) {\n return filteredData;\n }\n return assetHistory.createFakeData(\n { account_value: 0 },\n { account_value: 500 },\n );\n }, [filteredData, assetHistory]);\n\n const invisible =\n wrongNetwork || disabledConnect || !assetHistory.data.length;\n\n return {\n ...assetHistory,\n data: _data,\n invisible,\n } as const;\n};\n\nexport type useAssetsChartScriptReturn = ReturnType<\n typeof useAssetsChartScript\n>;\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { subDays, format, differenceInDays } from \"date-fns\";\nimport {\n useAccount,\n useAssetsHistory,\n useCollateral,\n useIndexPricesStream,\n useLocalStorage,\n usePrivateQuery,\n useStatisticsDaily,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\n\nexport enum PeriodType {\n DAY = \"1D\",\n WEEK = \"7D\",\n MONTH = \"30D\",\n QUARTER = \"90D\",\n}\n\nexport const useAssetsHistoryData = (\n localKey: string,\n options?: { isRealtime?: boolean },\n) => {\n const [today] = useState(() => new Date());\n\n const { getIndexPrice } = useIndexPricesStream();\n // const { account } = useAccount();\n\n const { t } = useTranslation();\n\n const { isRealtime = false } = options || {};\n const periodTypes = Object.values(PeriodType);\n\n const [period, setPeriod] = useLocalStorage<PeriodType | null>(\n localKey,\n PeriodType.MONTH,\n );\n\n const convertToUSDCAndOperate = useCallback(\n (inputs: {\n token: string;\n amount: string | number;\n value: Decimal;\n op?: \"add\" | \"sub\";\n }): Decimal => {\n const { token, amount, value, op = \"sub\" } = inputs;\n if (token.toUpperCase() === \"USDC\") {\n return op === \"add\" ? value.add(amount) : value.sub(amount);\n } else {\n const indexPrice = getIndexPrice(token);\n if (indexPrice) {\n const delta = new Decimal(amount).mul(indexPrice);\n return op === \"add\" ? value.add(delta) : value.sub(delta);\n }\n return value;\n }\n },\n [getIndexPrice],\n );\n\n const periodLabel = useMemo<Record<PeriodType, string>>(() => {\n return {\n [PeriodType.DAY]: t(\"common.select.1d\"),\n [PeriodType.WEEK]: t(\"common.select.7d\"),\n [PeriodType.MONTH]: t(\"common.select.30d\"),\n [PeriodType.QUARTER]: t(\"common.select.90d\"),\n };\n }, [t]);\n\n const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n };\n\n const getExpectedDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1),\n to: new Date(),\n };\n };\n\n const getMatchingPeriodType = (from: Date, to: Date): PeriodType | null => {\n // Calculate days difference (inclusive - add 1 to include both start and end dates)\n const offsetDay = Math.abs(differenceInDays(from, to)) + 1;\n\n // Check against predefined periods\n const filterDays = [1, 7, 30, 90] as const;\n if (!filterDays.includes(offsetDay as any)) {\n return null;\n }\n\n // Validate that the date range matches the expected range for this period\n const expectedRange = getExpectedDateRange(offsetDay);\n if (\n formatDateRange(expectedRange.from) === formatDateRange(from) &&\n formatDateRange(expectedRange.to) === formatDateRange(to)\n ) {\n switch (offsetDay) {\n case 1:\n return PeriodType.DAY;\n case 7:\n return PeriodType.WEEK;\n case 30:\n return PeriodType.MONTH;\n case 90:\n return PeriodType.QUARTER;\n }\n }\n\n return null;\n };\n\n const getCustomDateRangeLabel = (from: Date, to: Date): string => {\n // Calculate days difference (inclusive - add 1 to include both start and end dates)\n const offsetDay = Math.abs(differenceInDays(from, to)) + 1;\n return `${offsetDay}D`;\n };\n\n const { totalValue } = useCollateral();\n\n const getStartDate = (value: PeriodType) => {\n switch (value) {\n case PeriodType.DAY:\n return subDays(today, 1);\n case PeriodType.WEEK:\n return subDays(today, 6);\n case PeriodType.MONTH:\n return subDays(today, 29);\n case PeriodType.QUARTER:\n return subDays(today, 89);\n default:\n return subDays(today, 6);\n }\n };\n\n const [startDate, setStartDate] = useState(getStartDate(period));\n const [endDate, setEndDate] = useState(today);\n\n const periodValue = useMemo(() => {\n if (period) {\n switch (period) {\n case PeriodType.DAY:\n return 1;\n case PeriodType.WEEK:\n return 7;\n case PeriodType.MONTH:\n return 30;\n case PeriodType.QUARTER:\n return 90;\n }\n }\n // For custom date ranges, calculate actual days\n return Math.abs(differenceInDays(startDate, endDate)) + 1;\n }, [period, startDate, endDate]);\n // const nowStamp = useRef(new Date().getTime().toString());\n // const now = useRef(new Date());\n\n // const endDate = useMemo(() => addDays(today, 1), [today]);\n\n const totalDeposit = useRef<Decimal>(zero);\n\n // get transfer history\n const { data: transferOutHistory } = usePrivateQuery<API.TransferHistory>(\n `/v1/internal_transfer_history?page=1&size=200&side=OUT&main_sub_only=true&start_t=${startDate.getTime()}&end_t=${endDate.getTime()}`,\n {\n revalidateOnFocus: false,\n },\n );\n const { data: transferInHistory } = usePrivateQuery<API.TransferHistory>(\n `/v1/internal_transfer_history?page=1&size=200&side=IN&main_sub_only=true&start_t=${startDate.getTime()}&end_t=${endDate.getTime()}`,\n {\n revalidateOnFocus: false,\n },\n );\n\n const [data] = useStatisticsDaily(\n {\n startDate: startDate.toISOString().split(\"T\")[0],\n endDate: endDate.toISOString().split(\"T\")[0],\n },\n {\n ignoreAggregation: true,\n },\n );\n\n // get deposit & withdraw records to calculate the current PNL\n const [assetHistory] = useAssetsHistory({\n startTime: subDays(today, 2).getTime(),\n endTime: endDate.getTime(),\n pageSize: 50,\n });\n\n // get all deposit records to calculate the ROI\n const [allDepositHistory] = useAssetsHistory({\n side: \"DEPOSIT\",\n startTime: subDays(today, periodValue).getTime(),\n endTime: endDate.getTime(),\n pageSize: 200,\n });\n\n const totalDepositForROI = useMemo(() => {\n return allDepositHistory\n ?.filter((item) => item.trans_status === \"COMPLETED\")\n .reduce((acc, item) => {\n return acc.add(\n // item.amount\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [allDepositHistory, convertToUSDCAndOperate]);\n\n const totalTransferInForROI = useMemo(() => {\n if (!Array.isArray(transferInHistory)) {\n return zero;\n }\n return transferInHistory\n ?.filter((item) => item.status === \"COMPLETED\")\n .reduce((acc, item) => {\n return acc.add(\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [transferInHistory, convertToUSDCAndOperate]);\n\n const dateRange = useMemo(\n () => ({\n from: startDate,\n to: endDate,\n }),\n [startDate, endDate],\n );\n\n const onPeriodChange = (value: PeriodType) => {\n const newStartDate = getStartDate(value);\n setStartDate(newStartDate);\n setEndDate(today);\n setPeriod(value);\n };\n\n const setDateRange = (newRange: {\n from: Date | string;\n to: Date | string;\n }) => {\n const fromDate =\n newRange.from instanceof Date ? newRange.from : new Date(newRange.from);\n const toDate =\n newRange.to instanceof Date ? newRange.to : new Date(newRange.to);\n setStartDate(fromDate);\n setEndDate(toDate);\n\n // Check if the selected range matches a predefined period\n const matchingPeriod = getMatchingPeriodType(fromDate, toDate);\n if (matchingPeriod) {\n setPeriod(matchingPeriod);\n } else {\n // Reset period to null to indicate custom date range selection\n setPeriod(null);\n }\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n setDateRange(filter.value);\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\" as const,\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n // const lastItem = data[data.length - 1];\n\n const lastItem = useMemo(() => {\n return data.length > 0 ? data[data.length - 1] : null;\n }, [data]);\n\n const totalTransferIn = useMemo(() => {\n if (!Array.isArray(transferInHistory)) {\n return null;\n }\n if (\n lastItem == null ||\n transferInHistory?.length === 0 ||\n typeof lastItem.snapshot_time === \"undefined\"\n ) {\n return zero;\n }\n const list = transferInHistory?.filter((item) => {\n return (\n item.status === \"COMPLETED\" &&\n item.created_time > lastItem?.snapshot_time\n );\n });\n return list?.reduce((acc, item) => {\n return acc.add(\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [transferInHistory, lastItem, convertToUSDCAndOperate]);\n\n const totalTransferOut = useMemo(() => {\n if (!Array.isArray(transferOutHistory)) {\n return null;\n }\n if (\n lastItem == null ||\n transferOutHistory?.length === 0 ||\n typeof lastItem.snapshot_time === \"undefined\"\n ) {\n return zero;\n }\n const list = transferOutHistory?.filter((item) => {\n return (\n item.status === \"COMPLETED\" &&\n item.created_time > lastItem?.snapshot_time\n );\n });\n return list?.reduce((acc, item) => {\n return acc.add(\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [transferOutHistory, lastItem, convertToUSDCAndOperate]);\n\n const calculateLastPnl = (inputs: {\n lastItem: API.DailyRow;\n assetHistory: ReadonlyArray<API.AssetHistoryRow> | API.AssetHistoryRow[];\n transferHistory: {\n OUT: Decimal;\n IN: Decimal;\n };\n totalValue: number | null;\n }) => {\n if (totalValue == null) {\n return null;\n }\n // today daily pnl = totalValue - lastItem.account_value - deposit + withdraw\n let value = new Decimal(totalValue).sub(inputs.lastItem.account_value);\n\n // subtraction of deposit and withdraw\n if (\n Array.isArray(inputs.assetHistory) &&\n inputs.assetHistory.length > 0 &&\n typeof inputs.lastItem.snapshot_time !== \"undefined\"\n ) {\n // find a list with the timestamp greater than the last item timestamp and trans_status = success;\n const list = [];\n\n for (let i = 0; i < inputs.assetHistory.length; i++) {\n const item = inputs.assetHistory[i];\n if (item.created_time > inputs.lastItem.snapshot_time) {\n list.push(item);\n }\n }\n\n // calculate the sum of deposit and withdraw\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (item.side === \"DEPOSIT\") {\n if (item.trans_status === \"COMPLETED\") {\n value = convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value,\n op: \"sub\",\n });\n\n totalDeposit.current = convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: totalDeposit.current,\n op: \"add\",\n });\n }\n } else if (item.side === \"WITHDRAW\") {\n if (item.trans_status !== \"FAILED\") {\n value = convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value,\n op: \"add\",\n });\n }\n }\n }\n }\n\n value = value\n .sub(inputs.transferHistory.IN)\n .add(inputs.transferHistory.OUT);\n\n return value.toNumber();\n };\n\n const calculate = (\n data: API.DailyRow[],\n totalValue: number | null,\n totalTransferIn: Decimal,\n totalTransferOut: Decimal,\n ) => {\n const lastItem = data[data.length - 1];\n\n return {\n ...lastItem,\n date: getUTCStr(today),\n perp_volume: 0,\n account_value:\n totalValue !== null ? totalValue : (lastItem?.account_value ?? 0),\n pnl:\n calculateLastPnl({\n lastItem,\n assetHistory,\n totalValue,\n transferHistory: {\n OUT: totalTransferOut,\n IN: totalTransferIn,\n },\n }) ?? 0,\n __isCalculated: true,\n };\n };\n\n const mergeData = (\n data: ReadonlyArray<API.DailyRow> | API.DailyRow[],\n totalValue: number | null,\n totalTransferIn: Decimal,\n totalTransferOut: Decimal,\n ) => {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n\n if (data[data.length - 1].date === getUTCStr(today)) {\n return data;\n }\n\n return data.concat([\n calculate(data, totalValue, totalTransferIn, totalTransferOut),\n ]);\n };\n\n const calculateData = (\n data: ReadonlyArray<API.DailyRow> | API.DailyRow[],\n realtime: boolean,\n totalValue: number | null,\n totalTransferIn: Decimal,\n totalTransferOut: Decimal,\n ) => {\n const _data = !realtime\n ? data\n : mergeData(data, totalValue, totalTransferIn, totalTransferOut);\n\n return _data.slice(Math.max(0, _data.length - periodValue));\n };\n\n const calculatedData = useMemo(() => {\n /**\n * need the totalValue and data are all ready, else return null;\n */\n if (totalValue === null) {\n return [];\n }\n // if the transferOutHistory or transferInHistory is not ready, return null;\n\n if (totalTransferOut === null || totalTransferIn === null) {\n return [];\n }\n return calculateData(\n data,\n isRealtime,\n totalValue,\n totalTransferIn,\n totalTransferOut,\n );\n }, [\n data,\n totalValue,\n assetHistory,\n isRealtime,\n getIndexPrice,\n // transferOutHistory,\n // transferInHistory,\n totalTransferIn,\n totalTransferOut,\n ]);\n\n const aggregateValue = useMemo(() => {\n let vol = zero;\n let pnl = zero;\n let roi = zero;\n\n if (Array.isArray(calculatedData) && calculatedData.length) {\n calculatedData.forEach((d) => {\n // vol = vol.add(d.perp_volume);\n pnl = pnl.add(d.pnl);\n });\n\n const tail = calculatedData[0];\n\n const dataTailIndex = data.findIndex((d) => d.date === tail.date);\n\n const lastAccountValue = data[dataTailIndex - 1]?.account_value;\n\n // console.log(data, calculatedData, tail, dataTailIndex);\n\n if (typeof lastAccountValue === \"undefined\" || lastAccountValue === 0) {\n roi = zero;\n } else {\n roi = pnl.div(\n totalTransferInForROI.add(lastAccountValue).add(totalDepositForROI),\n );\n }\n }\n\n if (data.length > 0) {\n for (let i = 0; i < periodValue; i++) {\n const item = data[data.length - 1 - i];\n\n if (item) {\n vol = vol.add(item.perp_volume ?? 0);\n }\n }\n }\n\n // console.log(\"---------------------------\");\n\n return { vol: vol.toNumber(), pnl: pnl.toNumber(), roi: roi.toNumber() };\n }, [\n calculatedData,\n data,\n periodValue,\n totalTransferInForROI,\n totalDepositForROI,\n ]);\n\n const createFakeData = (\n start: Partial<API.DailyRow>,\n end: Partial<API.DailyRow>,\n ) => {\n return Array.from({ length: 2 }, (_, i) => {\n const date = format(i === 0 ? startDate : new Date(), \"yyyy-MM-dd\");\n return { date, ...(i === 0 ? start : end) };\n });\n };\n\n return {\n periodTypes,\n period: period as PeriodType | null,\n onPeriodChange: onPeriodChange,\n periodLabel: periodLabel,\n curPeriod: period\n ? periodLabel[period as PeriodType]\n : getCustomDateRangeLabel(startDate, endDate),\n // data: calculatedDataUpdateByIndexPrice, // calculatedData,\n data: calculatedData, // calculatedData,\n aggregateValue,\n createFakeData,\n volumeUpdateDate: data?.[data.length - 1]?.date ?? \"\",\n filterItems,\n onFilter,\n dateRange,\n setDateRange,\n } as const;\n};\n\nexport type useAssetsHistoryDataReturn = ReturnType<\n typeof useAssetsHistoryData\n>;\n\nfunction getUTCStr(date: Date) {\n const year = date.getUTCFullYear();\n const month = `0${date.getUTCMonth() + 1}`.slice(-2);\n const day = `0${date.getUTCDate()}`.slice(-2);\n\n return `${year}-${month}-${day}`;\n}\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { CardTitle, Flex, DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { PeriodType } from \"./useAssetHistory\";\n\nexport const PeriodTitle: React.FC<{\n onPeriodChange: (period: PeriodType) => void;\n periodTypes: string[];\n period: PeriodType | null;\n title: string;\n filterItems?: any[];\n onFilter?: (filter: { name: string; value: any }) => void;\n}> = (props) => {\n const { t } = useTranslation();\n\n const periodLabel = useMemo(() => {\n return {\n [PeriodType.DAY]: t(\"common.select.1d\"),\n [PeriodType.WEEK]: t(\"common.select.7d\"),\n [PeriodType.MONTH]: t(\"common.select.30d\"),\n [PeriodType.QUARTER]: t(\"common.select.90d\"),\n };\n }, [t]);\n\n const periodOrder = [\n PeriodType.DAY,\n PeriodType.WEEK,\n PeriodType.MONTH,\n PeriodType.QUARTER,\n ];\n\n return (\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <CardTitle>{props.title}</CardTitle>\n <Flex gap={2} itemAlign=\"center\">\n {props.filterItems && props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={props.onFilter || (() => {})}\n className=\"oui-border-none oui-py-0\"\n />\n )}\n {periodOrder.map((periodType) => (\n <button\n key={periodType}\n className={`oui-px-3 oui-rounded oui-text-xs oui-font-medium oui-transition-colors ${\n props.period === periodType\n ? \"oui-bg-primary oui-text-white\"\n : \"oui-bg-base-6 oui-text-base-contrast-60 hover:oui-bg-base-4 hover:oui-text-base-contrast\"\n }`}\n onClick={() => props.onPeriodChange(periodType)}\n >\n {periodLabel[periodType]}\n </button>\n ))}\n </Flex>\n </Flex>\n );\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from \"react\";\nimport { AssetAreaChart } from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Card, Box } from \"@kodiak-finance/orderly-ui\";\nimport { useAssetsChartScriptReturn } from \"./assetsChart.script\";\n\nconst LazyPeriodTitle = React.lazy(() =>\n import(\"../shared/periodHeader\").then((mod) => {\n return { default: mod.PeriodTitle };\n }),\n);\n\nexport type AssetsLineChartProps = {} & useAssetsChartScriptReturn;\n\nexport const AssetsChart: React.FC<AssetsLineChartProps> = (props) => {\n const { onPeriodChange, data, periodTypes, period, filterItems, onFilter } =\n props;\n const { t } = useTranslation();\n return (\n <Card\n title={\n <Box>\n <React.Suspense fallback={null}>\n <LazyPeriodTitle\n onPeriodChange={onPeriodChange}\n periodTypes={periodTypes}\n period={period}\n title={t(\"common.assets\")}\n filterItems={filterItems}\n onFilter={onFilter}\n />\n </React.Suspense>\n </Box>\n }\n id=\"portfolio-overview-assets-chart\"\n classNames={{ content: \"oui-h-[168px] oui-pb-0\" }}\n >\n <React.Suspense fallback={null}>\n <AssetAreaChart data={data as any} invisible={props.invisible} />\n </React.Suspense>\n </Card>\n );\n};\n","import React from \"react\";\nimport { useAssetsChartScript } from \"./assetsChart.script\";\nimport { AssetsChart } from \"./assetsChart.ui\";\n\nexport const AssetsChartWidget: React.FC = () => {\n const state = useAssetsChartScript();\n return <AssetsChart {...state} />;\n};\n","export { AssetsChartWidget } from \"./assetsChart.widget\";\nexport { useAssetsChartScript } from \"./assetsChart.script\";\nexport { AssetsChart } from \"./assetsChart.ui\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useState } from \"react\";\nimport {\n PnlAreaChart,\n PnLBarChart,\n VolBarChart,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport {\n Card,\n Grid,\n Box,\n Statistic,\n Text,\n Flex,\n Tooltip,\n cn,\n Tabs,\n TabPanel,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { UsePerformanceScriptReturn } from \"./performance.script\";\n\nconst LazyPeriodTitle = React.lazy(() =>\n import(\"../shared/periodHeader\").then((mod) => {\n return { default: mod.PeriodTitle };\n }),\n);\n\nexport type PerformanceUIProps = {\n // periodTypes: string[];\n // period: string;\n // onPeriodChange: (period: string) => void;\n} & UsePerformanceScriptReturn;\n\ntype LabelWithHintProps = {\n label: string;\n hint?: React.ReactNode;\n};\n\nconst LabelWithHint: React.FC<LabelWithHintProps> = (props) => {\n const { label, hint } = props;\n return (\n <Tooltip\n open={hint ? undefined : false}\n content={hint}\n className=\"oui-max-w-[240px] oui-bg-base-6 \"\n arrow={{ className: \"oui-fill-base-6\" }}\n delayDuration={300}\n >\n <Text\n size=\"xs\"\n intensity={36}\n className={cn(\n hint &&\n \"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\",\n )}\n >\n {label}\n </Text>\n </Tooltip>\n );\n};\n\nexport const PerformancePnL: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n return (\n <Box mt={4} height={\"188px\"}>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {t(\"portfolio.overview.performance.dailyPnl\")}\n </Text>\n <Box r=\"md\" className=\"oui-h-[188px] oui-border oui-border-line-4\">\n <PnLBarChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </Box>\n );\n};\n\nexport const CumulativePnlChart: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n return (\n <Box mt={4}>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {t(\"portfolio.overview.performance.cumulativePnl\")}\n </Text>\n <Box r=\"md\" className=\"oui-h-[188px] oui-border oui-border-line-4\">\n <PnlAreaChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </Box>\n );\n};\n\nexport const PerformancePnLTabs: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState(\"daily\");\n\n return (\n <Box mt={4}>\n <Tabs value={activeTab} onValueChange={setActiveTab} variant=\"contained\">\n <TabPanel\n value=\"daily\"\n title={t(\"portfolio.overview.performance.dailyPnl\")}\n >\n <Box\n r=\"md\"\n className=\"oui-mt-4 oui-h-[188px] oui-border oui-border-line-4\"\n >\n <PnLBarChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </TabPanel>\n <TabPanel\n value=\"cumulative\"\n title={t(\"portfolio.overview.performance.cumulativePnl\")}\n >\n <Box\n r=\"md\"\n className=\"oui-mt-4 oui-h-[188px] oui-border oui-border-line-4\"\n >\n <PnlAreaChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </TabPanel>\n </Tabs>\n </Box>\n );\n};\n\nexport const VolumeChart: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n curPeriod?: string;\n}> = (props) => {\n const { t } = useTranslation();\n\n const volumeData = (props.data ?? []).map((item: any) => ({\n date: item.date,\n volume: item.perp_volume ?? 0,\n opacity: (item.perp_volume ?? 0) > 0 ? 1 : 0,\n }));\n\n const shouldHide = props.invisible || (props.data?.length ?? 0) <= 2;\n\n return (\n <Box mt={4}>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {t(\"portfolio.overview.performance.volume\", {\n period: props.curPeriod ?? \"\",\n })}\n </Text>\n <Box\n r=\"md\"\n className={cn(\n \"oui-mt-6 oui-h-[188px] oui-border oui-border-line-4\",\n shouldHide && \"chart-invisible\",\n )}\n >\n <VolBarChart data={volumeData} className=\"oui-size-full\" />\n </Box>\n </Box>\n );\n};\n\nexport const PerformanceUI: React.FC<PerformanceUIProps> = (props) => {\n const {\n periodTypes,\n period,\n onPeriodChange,\n aggregateValue,\n invisible,\n visible,\n volumeUpdateDate,\n curPeriod,\n filterItems,\n onFilter,\n } = props;\n const { t } = useTranslation();\n\n return (\n <Card\n title={\n <Box pt={6}>\n <React.Suspense fallback={null}>\n <LazyPeriodTitle\n onPeriodChange={onPeriodChange}\n periodTypes={periodTypes}\n period={period}\n title={t(\"portfolio.overview.performance\")}\n filterItems={filterItems}\n onFilter={onFilter}\n />\n </React.Suspense>\n </Box>\n }\n id=\"portfolio-overview-performance\"\n >\n <Box pb={4}>\n <Grid cols={3} gap={4}>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={4}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n <Statistic\n label={\n <LabelWithHint\n label={t(\"portfolio.overview.performance.roi\", {\n period: curPeriod,\n })}\n hint={t(\"portfolio.overview.performance.roi.tooltip\")}\n />\n }\n valueProps={{ rule: \"percentages\", coloring: true, visible }}\n >\n {invisible ? \"--\" : aggregateValue.roi}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={4}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n <Statistic\n label={\n <LabelWithHint\n label={t(\"portfolio.overview.performance.pnl\", {\n period: curPeriod,\n })}\n hint={t(\"portfolio.overview.performance.pnl.tooltip\")}\n />\n }\n valueProps={{ coloring: true, showIdentifier: true, visible }}\n >\n {invisible ? \"--\" : aggregateValue.pnl}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={4}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n <Statistic\n classNames={{\n label: \"oui-w-full\",\n }}\n label={\n <Flex justify={\"between\"}>\n <span>\n <LabelWithHint\n label={t(\"portfolio.overview.performance.volume\", {\n period: curPeriod,\n })}\n hint={t(\"portfolio.overview.performance.volume.tooltip\")}\n />\n </span>\n <span>{volumeUpdateDate}</span>\n </Flex>\n }\n valueProps={{ visible }}\n >\n {invisible ? \"--\" : aggregateValue.vol}\n </Statistic>\n </Box>\n </Grid>\n <Grid cols={2} gap={4} mb={4}>\n <PerformancePnLTabs\n data={props.data ?? EMPTY_LIST}\n invisible={props.invisible}\n />\n <VolumeChart\n data={props.data ?? EMPTY_LIST}\n invisible={props.invisible}\n curPeriod={props.curPeriod}\n />\n </Grid>\n </Box>\n </Card>\n );\n};\n","// Asset conversion types\nexport interface ConvertedAssets {\n [asset: string]: number;\n}\n\nexport interface ConvertTransaction {\n transaction_id: number;\n venue: \"on_chain\" | \"internal_fund\";\n converted_asset: string;\n received_asset: string;\n converted_qty: number;\n received_qty: number;\n haircut: number;\n chain_id?: number; // Optional, only for on_chain venue\n tx_id?: string; // Optional, only for on_chain venue\n result?: string;\n}\n\nexport interface ConvertRecord {\n convert_id: number;\n converted_asset: ConvertedAssets;\n received_asset: string;\n received_qty: number;\n type: \"auto\" | \"manual\";\n status: \"completed\" | \"pending\" | \"failed\" | \"cancelled\";\n created_time: number;\n updated_time: number;\n details: ConvertTransaction[];\n}\n\n// Additional utility types\nexport type ConvertType = \"auto\" | \"manual\";\n\nexport type ConvertStatus = \"completed\" | \"pending\" | \"failed\" | \"cancelled\";\n\nexport type VenueType = \"on_chain\" | \"internal_fund\";\n\nexport const ORDERLY_ASSETS_VISIBLE_KEY = \"orderly_assets_visible\";\n","import { useMemo } from \"react\";\nimport { useAccount, useLocalStorage } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext, useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { ORDERLY_ASSETS_VISIBLE_KEY } from \"../../assets/type\";\nimport { useOverviewContext } from \"../provider/overviewContext\";\n\nexport const usePerformanceScript = () => {\n const ctx = useOverviewContext();\n const [visible, setVisible] = useLocalStorage<boolean>(\n ORDERLY_ASSETS_VISIBLE_KEY,\n true,\n );\n\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n const filteredData = useDataTap(ctx?.data, {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n fallbackData: ctx?.createFakeData?.(\n { account_value: 0, pnl: 0 },\n { account_value: 500, pnl: 500 },\n ),\n });\n\n const _data = useMemo(() => {\n if (filteredData?.length) {\n return filteredData;\n }\n return ctx?.createFakeData?.(\n { account_value: 0, pnl: 0 },\n { account_value: 500, pnl: 500 },\n );\n }, [ctx, filteredData]);\n\n const invisible =\n wrongNetwork ||\n disabledConnect ||\n (state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected);\n\n return {\n ...ctx,\n data: _data as ReadonlyArray<any>,\n invisible,\n visible: visible as boolean,\n setVisible: setVisible,\n };\n};\n\nexport type UsePerformanceScriptReturn = ReturnType<\n typeof usePerformanceScript\n>;\n","import React from \"react\";\nimport { usePerformanceScript } from \"./performance.script\";\nimport { PerformanceUI } from \"./performance.ui\";\n\nexport const PerformanceWidget: React.FC = () => {\n const state = usePerformanceScript();\n return <PerformanceUI {...state} />;\n};\n","export { PerformanceUI } from \"./performance.ui\";\nexport { PerformanceWidget } from \"./performance.widget\";\nexport { usePerformanceScript } from \"./performance.script\";\n","import React, { useId } from \"react\";\n\nexport const EffectiveFee = React.forwardRef<\n SVGSVGElement,\n React.SVGAttributes<SVGSVGElement>\n>((props, ref) => {\n const linearId = useId();\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={14}\n height={14}\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n ref={ref}\n focusable={false}\n {...props}\n >\n <path\n d=\"M6.16411 1.53106C6.61974 1.07566 7.35888 1.07551 7.81442 1.53106L8.48833 2.20496C8.6797 2.39624 8.93064 2.51452 9.19755 2.54106L9.3132 2.54676H10.2662C10.9104 2.54691 11.4328 3.06926 11.4329 3.71343V4.66647C11.4329 4.97589 11.5559 5.27312 11.7747 5.49191L12.4492 6.16582C12.9047 6.62142 12.9047 7.36054 12.4492 7.81613L11.7753 8.49004L11.6972 8.57549C11.5272 8.78302 11.433 9.04426 11.4329 9.31491V10.2685L11.4272 10.3876C11.3715 10.9366 10.9348 11.373 10.3859 11.4289L10.2662 11.4352H9.3132L9.19755 11.4409C8.93066 11.4674 8.67969 11.5857 8.48833 11.777L7.81442 12.4509L7.72555 12.5306C7.29789 12.8795 6.68066 12.8794 6.25297 12.5306L6.16411 12.4509L5.4902 11.777C5.29887 11.5857 5.04786 11.4675 4.78097 11.4409L4.66533 11.4352H3.71171L3.59265 11.4289C3.04358 11.3731 2.60705 10.9367 2.55131 10.3876L2.54505 10.2685V9.31491C2.54499 9.04416 2.45089 8.78306 2.28072 8.57549L2.20325 8.49004L1.52934 7.81613C1.10213 7.38905 1.07534 6.71297 1.44902 6.25469L1.52934 6.16582L2.20382 5.49191C2.42248 5.27314 2.54505 4.97579 2.54505 4.66647V3.71343C2.54513 3.10945 3.00442 2.61221 3.59265 2.55246L3.71171 2.54676H4.66533L4.78097 2.54106C5.00968 2.51826 5.22694 2.4281 5.40475 2.28244L5.4902 2.20496L6.16411 1.53106ZM6.31507 3.02983C5.87756 3.46727 5.28401 3.71336 4.66533 3.71343H3.71171V4.66647C3.71171 5.28521 3.46614 5.87922 3.02869 6.31678L2.35421 6.99069L3.02812 7.6646C3.46577 8.10214 3.71164 8.69607 3.71171 9.31491V10.2685H4.66533C5.28396 10.2686 5.87757 10.5142 6.31507 10.9515L6.98898 11.6255L7.66289 10.9515C8.10045 10.5141 8.69446 10.2685 9.3132 10.2685H10.2662V9.31491C10.2663 8.69604 10.5127 8.10214 10.9504 7.6646L11.6243 6.99069L10.9498 6.31678C10.5122 5.8792 10.2662 5.28531 10.2662 4.66647V3.71343H9.3132C8.69438 3.71343 8.10047 3.46739 7.66289 3.02983L6.98898 2.35592L6.31507 3.02983ZM8.52934 4.64255C8.7571 4.41479 9.12639 4.41489 9.35421 4.64255C9.58202 4.87035 9.58202 5.23961 9.35421 5.46742L5.4657 9.35593C5.2379 9.58372 4.86863 9.58373 4.64083 9.35593C4.41318 9.12811 4.41308 8.75881 4.64083 8.53106L8.52934 4.64255ZM8.66435 7.83265C9.1245 7.83272 9.49777 8.2059 9.49777 8.66607C9.49769 9.12616 9.12445 9.49941 8.66435 9.49948C8.20419 9.49948 7.83101 9.12621 7.83094 8.66607C7.83094 8.20586 8.20415 7.83265 8.66435 7.83265ZM5.33126 4.49956C5.79141 4.49963 6.16468 4.87282 6.16468 5.33298C6.1646 5.79307 5.79136 6.16575 5.33126 6.16582C4.87111 6.16582 4.49793 5.79311 4.49785 5.33298C4.49785 4.87277 4.87106 4.49956 5.33126 4.49956Z\"\n fill={`url(#${linearId})`}\n />\n <defs>\n <linearGradient\n id={linearId}\n x1=\"12.7908\"\n y1=\"6.99084\"\n x2=\"1.1875\"\n y2=\"6.99084\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop stopColor=\"rgb(var(--oui-gradient-brand-start))\" offset={1} />\n </linearGradient>\n </defs>\n </svg>\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n EffectiveFee.displayName = \"EffectiveFee\";\n}\n","export * from \"./effectiveFee\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\nimport { useFeeState } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Flex,\n modal,\n Text,\n Tooltip,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { EffectiveFee } from \"./icons\";\n\nexport type FeeTierHeaderItemProps = {\n label: string;\n value: React.ReactNode;\n interactive?: boolean;\n};\n\nexport type FeeTierHeaderProps = {\n tier?: number | null;\n vol?: number | null;\n headerDataAdapter?: (original: any[]) => any[];\n};\n\nconst isEffective = (val?: unknown) =>\n typeof val !== \"undefined\" && val !== null;\n\nexport const MobileHeaderItem: React.FC<FeeTierHeaderItemProps> = (props) => {\n const { label, value, interactive } = props;\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" width=\"100%\">\n <Text\n as=\"div\"\n intensity={36}\n size=\"xs\"\n weight=\"semibold\"\n className=\"oui-leading-[18px]\"\n >\n {label}\n </Text>\n <Flex className=\"oui-gap-1.5\" itemAlign=\"center\" justify=\"between\">\n <Text size=\"xs\" intensity={80} className=\"oui-leading-[24px]\">\n {value}\n </Text>\n {interactive && (\n <Flex\n gap={1}\n justify=\"center\"\n itemAlign=\"center\"\n className=\"oui-cursor-pointer oui-rounded oui-bg-gradient-to-r oui-from-[rgb(var(--oui-gradient-brand-start)_/_0.12)] oui-to-[rgb(var(--oui-gradient-brand-end)_/_0.12)] oui-px-1\"\n onClick={() => {\n modal.dialog({\n size: \"sm\",\n title: t(\"common.tips\"),\n content: t(\"portfolio.feeTier.effectiveFee.tooltip\"),\n });\n }}\n >\n <EffectiveFee />\n <Text.gradient\n className=\"oui-select-none\"\n color={\"brand\"}\n size=\"3xs\"\n weight=\"regular\"\n >\n {t(\"common.effectiveFee\")}\n </Text.gradient>\n </Flex>\n )}\n </Flex>\n </Flex>\n );\n};\n\nexport const DesktopHeaderItem: React.FC<FeeTierHeaderItemProps> = (props) => {\n const { label, value, interactive } = props;\n const { t } = useTranslation();\n return (\n <Box\n gradient=\"neutral\"\n r=\"lg\"\n px={4}\n py={2}\n angle={184}\n width=\"100%\"\n border\n borderColor={6}\n >\n <Text\n as=\"div\"\n intensity={36}\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-leading-[18px]\"\n >\n {label}\n </Text>\n <Flex\n className=\"oui-mt-1 oui-w-full\"\n itemAlign=\"center\"\n justify=\"between\"\n >\n <Text size=\"base\" intensity={80} className=\"oui-leading-[24px]\">\n {value}\n </Text>\n {interactive && (\n <Tooltip\n content={t(\"portfolio.feeTier.effectiveFee.tooltip\")}\n className=\"oui-p-1.5 oui-text-base-contrast-54\"\n >\n <Flex\n gap={1}\n justify=\"center\"\n itemAlign=\"center\"\n className=\"oui-cursor-pointer oui-rounded oui-bg-gradient-to-r oui-from-[rgb(var(--oui-gradient-brand-start)_/_0.12)] oui-to-[rgb(var(--oui-gradient-brand-end)_/_0.12)] oui-px-1\"\n >\n <EffectiveFee />\n <Text.gradient\n className=\"oui-select-none\"\n color={\"brand\"}\n size=\"xs\"\n weight=\"regular\"\n >\n {t(\"common.effectiveFee\")}\n </Text.gradient>\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </Box>\n );\n};\n\nexport const FeeTierHeader: React.FC<FeeTierHeaderProps> = (props) => {\n const { t } = useTranslation();\n const { tier, vol, headerDataAdapter } = props;\n const { isMobile } = useScreen();\n const { refereeRebate, ...others } = useFeeState();\n const isEffectiveFee = isEffective(refereeRebate);\n const items: FeeTierHeaderItemProps[] = [\n {\n label: t(\"portfolio.feeTier.header.yourTier\"),\n interactive: false,\n value: (\n <Text.gradient\n color={\"brand\"}\n angle={270}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {tier || \"--\"}\n </Text.gradient>\n ),\n },\n {\n label: `${t(\"portfolio.feeTier.header.30dVolume\")} (USDC)`,\n interactive: false,\n value: (\n <Text.numeral\n rule=\"price\"\n dp={2}\n rm={Decimal.ROUND_DOWN}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {vol !== undefined && vol !== null ? `${vol}` : \"-\"}\n </Text.numeral>\n ),\n },\n {\n label: t(\"portfolio.feeTier.header.takerFeeRate\"),\n interactive: isEffectiveFee,\n value: (\n <Text.gradient\n color={\"brand\"}\n angle={270}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {isEffectiveFee\n ? others.effectiveTakerFee || \"--\"\n : others.takerFee || \"--\"}\n </Text.gradient>\n ),\n },\n {\n label: t(\"portfolio.feeTier.header.makerFeeRate\"),\n interactive: isEffectiveFee,\n value: (\n <Text.gradient\n color={\"brand\"}\n angle={270}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {isEffectiveFee\n ? others.effectiveMakerFee || \"--\"\n : others.makerFee || \"--\"}\n </Text.gradient>\n ),\n },\n ];\n\n const mergedData = useMemo<FeeTierHeaderItemProps[]>(() => {\n if (typeof headerDataAdapter === \"function\") {\n return headerDataAdapter(items);\n }\n return items;\n }, [headerDataAdapter, items]);\n\n if (!Array.isArray(mergedData)) {\n return null;\n }\n\n if (isMobile) {\n return (\n <Flex\n className=\"oui-rounded-xl oui-bg-base-9 oui-p-3\"\n direction=\"column\"\n gap={2}\n itemAlign={\"stretch\"}\n >\n {mergedData.map((item, index) => (\n <MobileHeaderItem {...item} key={`mobile-item-${index}`} />\n ))}\n </Flex>\n );\n }\n\n return (\n <Flex className=\"\" direction=\"row\" gapX={4} my={4} itemAlign={\"stretch\"}>\n {mergedData.map((item, index) => (\n <DesktopHeaderItem {...item} key={`desktop-item-${index}`} />\n ))}\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n APIKeyItem,\n ScopeType,\n useAccount,\n useApiKeyManager,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext, useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { toast, usePagination } from \"@kodiak-finance/orderly-ui\";\n\nexport type GenerateKeyInfo = {\n key: string;\n screctKey: string;\n ip?: string;\n permissions?: string;\n};\n\nexport const useApiManagerScript = (props?: {\n filterTags?: [string];\n keyStatus?: string;\n}) => {\n const { filterTags, keyStatus } = props ?? {};\n const [showCreateDialog, setShowCreateDialog] = useState(false);\n const [showCreatedDialog, setShowCreatedDialog] = useState(false);\n const [generateKey, setGenerateKey] = useState<GenerateKeyInfo | undefined>();\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state, account } = useAccount();\n const { t } = useTranslation();\n\n const canCreateApiKey =\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const [\n keys,\n {\n generateOrderlyKey,\n setIPRestriction,\n removeOrderlyKey,\n resetOrderlyKeyIPRestriction,\n refresh,\n isLoading,\n error,\n },\n ] = useApiKeyManager({\n keyInfo: { key_status: keyStatus },\n });\n\n const [curPubKey, setCurPubKey] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n account.keyStore\n .getOrderlyKey()\n ?.getPublicKey()\n .then((pubKey) => {\n setCurPubKey(pubKey);\n });\n }, [account, state]);\n\n const onCreateApiKey = () => {\n setShowCreateDialog(true);\n };\n const onReadApiGuide = () => {\n window.open(\n \"https://orderly.network/docs/build-on-omnichain/evm-api/api-authentication#api-authentication\",\n \"_blank\",\n );\n };\n\n const hideCreateDialog = () => {\n setShowCreateDialog(false);\n };\n\n const doCreate = async (\n ipRestriction?: string,\n scope?: ScopeType,\n ): Promise<number> => {\n try {\n const createdSuccess = (\n res: {\n key: string;\n secretKey: string;\n },\n ip?: string,\n ) => {\n const { key, secretKey } = res;\n hideCreateDialog();\n setGenerateKey({\n key: key,\n screctKey: secretKey,\n ip: ip,\n permissions: scope\n ?.split(\",\")\n ?.map((e) => capitalizeFirstChar(e))\n .join(\", \"),\n });\n setShowCreatedDialog(true);\n };\n\n const generateKeyRes = await generateOrderlyKey(scope);\n\n toast.success(t(\"portfolio.apiKey.created\"));\n console.log(\"xxx generateKeyRes\", generateKeyRes);\n\n if ((ipRestriction?.length || 0) > 0) {\n const key = generateKeyRes.key.startsWith(\"ed25519:\")\n ? generateKeyRes.key\n : `ed25519:${generateKeyRes.key}`;\n const res = await setIPRestriction(key, ipRestriction!);\n console.log(\"set ip res\", res);\n if (res.success) {\n createdSuccess(\n generateKeyRes,\n res.data.ip_restriction_list?.join(\",\"),\n );\n }\n } else {\n createdSuccess(generateKeyRes, undefined);\n }\n } catch (err: any) {\n if (err?.message) toast.error(err?.message);\n }\n\n return Promise.resolve(0);\n };\n\n const hideCreatedDialog = () => {\n setShowCreatedDialog(false);\n refresh();\n };\n\n const onCopyApiKeyInfo = () => {\n navigator.clipboard.writeText(JSON.stringify(generateKey));\n toast.success(t(\"portfolio.apiKey.apiInfo.copied\"));\n };\n const doConfirm = () => {\n hideCreatedDialog();\n };\n\n const doDelete = (item: APIKeyItem): Promise<any> => {\n return new Promise(async (resolve) => {\n await removeOrderlyKey(item.orderly_key)\n .then(\n async (data) => {\n if (data?.success) {\n toast.success(t(\"portfolio.apiKey.deleted\"));\n refresh();\n // delete current api key, wiil disconnect\n const curKey = await account.keyStore\n .getOrderlyKey()\n ?.getPublicKey();\n if (item.orderly_key === curKey) {\n account.destroyOrderlyKey();\n }\n }\n resolve(1);\n },\n (reject) => {},\n )\n .catch((err) => {});\n });\n };\n\n const doEdit = async (item: APIKeyItem, ip?: string): Promise<void> => {\n let future;\n if ((ip?.length || 0) === 0) {\n future = resetOrderlyKeyIPRestriction(item.orderly_key, \"ALLOW_ALL_IPS\");\n } else {\n future = setIPRestriction(item.orderly_key, ip!);\n }\n\n const data = await future;\n\n if (data.success) {\n toast.success(t(\"portfolio.apiKey.updated\"));\n refresh();\n return Promise.resolve();\n } else {\n toast.error(data.message);\n }\n return Promise.reject();\n };\n\n const onCopyAccountId = () =>\n toast.success(t(\"portfolio.apiKey.accountId.copied\"));\n const onCopyApiKey = (key?: string) => {\n if (typeof key !== \"undefined\") {\n navigator.clipboard.writeText(key.replace(\"ed25519:\", \"\"));\n }\n toast.success(t(\"portfolio.apiKey.column.apiKey.copy\"));\n };\n const onCopyApiSecretKey = () =>\n toast.success(t(\"portfolio.apiKey.secretKey.copied\"));\n const onCopyIP = () =>\n toast.success(t(\"portfolio.apiKey.column.restrictedIP.copy\"));\n\n const keyList = useMemo(() => {\n return keys?.filter((e) => {\n const filterTag = filterTags ? filterTags?.includes(e.tag) : true;\n const filterCurKey = curPubKey\n ? !e.orderly_key.includes(curPubKey)\n : true;\n return filterTag && filterCurKey;\n });\n }, [keys, filterTags, curPubKey]);\n\n const verifyIP = (ip: string) => {\n const ipRegex =\n /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(,((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]))*$/;\n return ipRegex.test(ip)\n ? \"\"\n : \"The IP restriction format is incorrect. Please use the correct format: [xx.xx.xxx.x],[xx.xxx.xxx.xxx]\";\n };\n\n const accountStatus =\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading;\n\n const accountId = useDataTap(state.accountId, {\n accountStatus,\n });\n\n const userId = useDataTap(state.userId, {\n accountStatus,\n });\n\n const { pagination } = usePagination();\n\n return {\n accountId: accountId ?? \"--\",\n userId: userId ?? \"--\",\n onCreateApiKey,\n onReadApiGuide,\n showCreateDialog,\n hideCreateDialog,\n doCreate,\n showCreatedDialog,\n hideCreatedDialog,\n onCopyApiKeyInfo,\n doConfirm,\n doDelete,\n doEdit,\n canCreateApiKey,\n status: state.status,\n keys: keyList,\n generateKey,\n onCopyAccountId,\n wrongNetwork,\n onCopyApiKey,\n onCopyApiSecretKey,\n onCopyIP,\n verifyIP,\n isLoading,\n pagination,\n };\n};\n\nexport function capitalizeFirstChar(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport type ApiManagerScriptReturns = ReturnType<typeof useApiManagerScript>;\n","import { FC, useEffect, useState } from \"react\";\nimport { ScopeType } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, SimpleDialog, Statistic, Text } from \"@kodiak-finance/orderly-ui\";\nimport { ApiManagerScriptReturns } from \"../apiManager.script\";\n\nexport const CreateAPIKeyDialog: FC<ApiManagerScriptReturns> = (props) => {\n const [ipText, setIpText] = useState(\"\");\n const [read, setRead] = useState(true);\n const [trade, setTrade] = useState(true);\n const [hint, setHint] = useState(\"\");\n const { t } = useTranslation();\n\n useEffect(() => {\n if (!props.showCreateDialog) {\n setIpText(\"\");\n setRead(true);\n setTrade(true);\n setHint(\"\");\n }\n }, [props.showCreateDialog]);\n\n useEffect(() => {\n if (ipText.length === 0) setHint(\"\");\n }, [ipText]);\n\n return (\n <SimpleDialog\n size=\"sm\"\n open={props.showCreateDialog}\n onOpenChange={(open) => {\n props.hideCreateDialog?.();\n }}\n title={t(\"portfolio.apiKey.create.dialog.title\")}\n actions={{\n primary: {\n label: t(\"common.confirm\"),\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n \"data-testid\": \"oui-testid-apiKey-createApiKey-dialog-comfirm-btn\",\n onClick: async () => {\n if (ipText.length > 0) {\n const hint = props.verifyIP(ipText);\n setHint(hint);\n if (hint.length > 0) {\n return;\n }\n }\n\n const scopes: string[] = [];\n if (read) {\n scopes.push(\"read\");\n }\n if (trade) {\n scopes.push(\"trading\");\n }\n await props.doCreate(ipText, scopes.join(\",\") as ScopeType);\n },\n disabled: !trade && !read,\n size: \"md\",\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n }}\n >\n <Flex direction={\"column\"} gap={6}>\n <Flex direction={\"column\"} gap={1} width={\"100%\"} itemAlign={\"start\"}>\n <Text intensity={54} size=\"2xs\">\n {t(\"portfolio.apiKey.create.ipRestriction\")}\n </Text>\n <textarea\n data-testid=\"oui-testid-apiKey-createApiKey-dialog-textarea\"\n placeholder={t(\"portfolio.apiKey.create.ipRestriction.placeholder\")}\n className={cn(\n \"oui-h-[100px] oui-w-full oui-rounded-xl oui-bg-base-6 oui-p-3 oui-text-sm oui-text-base-contrast-80\",\n \"oui-border-0 oui-outline-none focus:oui-border-2 focus:oui-border-primary-darken\",\n \"oui-placeholder-base-contrast-20\",\n hint.length > 0 &&\n \"oui-outline-1 oui-outline-danger focus:oui-outline-none\",\n )}\n value={ipText}\n onChange={(e) => {\n setIpText(e.target.value);\n }}\n style={{\n resize: \"none\",\n }}\n />\n {hint.length > 0 && (\n <Flex gap={1} className=\"oui-relative\">\n <div\n className={cn(\n \"oui-absolute oui-top-[10px]\",\n \"oui-size-1 oui-rounded-full oui-bg-danger\",\n )}\n />\n <Text color=\"danger\" size=\"xs\" className=\"oui-ml-2\">\n {hint}\n </Text>\n </Flex>\n )}\n </Flex>\n <Statistic\n label={\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.apiKey.permissions\")}\n </Text>\n }\n className=\"oui-w-full\"\n >\n <Flex\n direction={\"row\"}\n gap={6}\n itemAlign={\"start\"}\n className=\"oui-mt-2\"\n >\n <Checkbox\n size={18}\n checked={read}\n onCheckedChange={(e) => setRead(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.read\")}\n testid=\"oui-testid-apiKey-createApiKey-dialog-read-checkbox\"\n />\n <Checkbox\n size={18}\n checked={trade}\n onCheckedChange={(e) => setTrade(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.trading\")}\n testid=\"oui-testid-apiKey-createApiKey-dialog-trading-checkbox\"\n />\n </Flex>\n </Statistic>\n </Flex>\n </SimpleDialog>\n );\n};\n\nexport const Checkbox: FC<{\n size?: number;\n checked: boolean;\n onCheckedChange: (checked?: boolean) => void;\n disabled?: boolean;\n label: string;\n testid?: string;\n}> = (props) => {\n return (\n <button\n disabled={props.disabled}\n onClick={(e) => {\n props.onCheckedChange(!props.checked);\n }}\n className={\n \"oui-flex oui-items-center oui-gap-2 disabled:oui-cursor-not-allowed disabled:oui-opacity-50\"\n }\n data-testid={props.testid}\n >\n {props.checked ? (\n <svg\n width={\"props.size\"}\n height={props.size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.99072 2.92981C4.78172 2.92981 2.99072 4.72071 2.99072 6.92981V16.9298C2.99072 19.1389 4.78172 20.9298 6.99072 20.9298H16.9907C19.1997 20.9298 20.9907 19.1389 20.9907 16.9298V6.92981C20.9907 4.72071 19.1997 2.92981 16.9907 2.92981H6.99072ZM16.9853 7.31211C17.2125 7.09537 17.5236 7 17.8218 7C18.1201 7 18.4312 7.09537 18.6584 7.31211C19.1139 7.74546 19.1139 8.47384 18.6584 8.9072L10.5077 16.675C10.0534 17.1083 9.28909 17.1083 8.83472 16.675L5.34077 13.3459C4.88641 12.9126 4.88641 12.1841 5.34077 11.7508C5.79631 11.3175 6.56057 11.3175 7.01493 11.7508L9.67122 14.2822L16.9853 7.31211Z\"\n fill=\"white\"\n fillOpacity=\"0.54\"\n />\n </svg>\n ) : (\n <svg\n width={props.size}\n height={props.size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.99072 2.92981C4.78172 2.92981 2.99072 4.72071 2.99072 6.92981V16.9298C2.99072 19.1389 4.78172 20.9298 6.99072 20.9298H16.9907C19.1997 20.9298 20.9907 19.1389 20.9907 16.9298V6.92981C20.9907 4.72071 19.1997 2.92981 16.9907 2.92981H6.99072ZM6.99072 4.92981H16.9907C18.0957 4.92981 18.9907 5.82521 18.9907 6.92981V16.9298C18.9907 18.0344 18.0957 18.9298 16.9907 18.9298H6.99072C5.88572 18.9298 4.99072 18.0344 4.99072 16.9298V6.92981C4.99072 5.82521 5.88572 4.92981 6.99072 4.92981Z\"\n fill=\"white\"\n fillOpacity=\"0.54\"\n />\n </svg>\n )}\n\n <Text\n intensity={54}\n size=\"sm\"\n className=\"oui-whitespace-nowrap oui-break-normal\"\n >\n {props.label}\n </Text>\n </button>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CopyIcon,\n Flex,\n SimpleDialog,\n Statistic,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ApiManagerScriptReturns } from \"../apiManager.script\";\n\nexport const CreatedAPIKeyDialog: FC<ApiManagerScriptReturns> = (props) => {\n const ip = props.generateKey?.ip ?? \"--\";\n const { t } = useTranslation();\n return (\n <SimpleDialog\n size=\"sm\"\n open={props.showCreatedDialog}\n onOpenChange={(open) => {\n props.hideCreatedDialog?.();\n }}\n title={t(\"portfolio.apiKey.created\")}\n actions={{\n primary: {\n label: t(\"common.ok\"),\n \"data-testid\": \"oui-testid-apiKey-createdApiKey-dialog-ok-btn\",\n className:\n \"oui-w-[120px] lg:oui-w-[154px] oui-bg-base-2 hover:oui-bg-base-3\",\n size: \"md\",\n onClick: async () => {\n return props.doConfirm();\n },\n },\n secondary: {\n label: t(\"portfolio.apiKey.created.button.copyApiInfo\"),\n \"data-testid\": \"oui-testid-apiKey-createdApiKey-dialog-copy-btn\",\n className:\n \"oui-w-[120px] lg:oui-w-[154px] oui-bg-primary-darken hover:oui-opacity-80\",\n size: \"md\",\n onClick: async () => {\n return props.onCopyApiKeyInfo();\n },\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n body: \"oui-py-0 oui-pt-5\",\n }}\n >\n <Flex direction={\"column\"} gap={4} itemAlign={\"start\"}>\n <Statistic label={t(\"common.accountId\")}>\n <Text.formatted\n size=\"sm\"\n intensity={80}\n copyable\n copyIconSize={16}\n className=\"oui-break-all\"\n onCopy={props.onCopyAccountId}\n data-testid=\"oui-testid-apiKey-createdApiKey-dialog-key-span\"\n >\n {props.accountId}\n </Text.formatted>\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.column.apiKey\")}>\n <Text.formatted\n size=\"sm\"\n intensity={80}\n copyable\n copyIconSize={16}\n className=\"oui-break-all\"\n onCopy={() => props.onCopyApiKey(props.generateKey?.key)}\n data-testid=\"oui-testid-apiKey-createdApiKey-dialog-key-span\"\n >\n {props.generateKey?.key}\n </Text.formatted>\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.secretKey\")}>\n <Text.formatted\n size=\"sm\"\n intensity={80}\n copyable\n copyIconSize={16}\n className=\"oui-break-all\"\n onCopy={props.onCopyApiSecretKey}\n >\n {props.generateKey?.screctKey}\n </Text.formatted>{\" \"}\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.ip\")}>\n <Flex\n width={320}\n gap={1}\n itemAlign={\"center\"}\n className=\"oui-text-base-contrast-80 oui-text-sm\"\n >\n <Box className=\"oui-max-h-[100px] oui-flex-1 oui-overflow-hidden oui-text-ellipsis oui-line-clamp-5 oui-break-all\">\n {ip}\n </Box>\n {ip !== \"--\" && (\n <Box\n width={16}\n height={16}\n className=\"oui-cursor-pointer oui-flex-shrink-0\"\n >\n <CopyIcon\n color=\"white\"\n opacity={0.54}\n size={16}\n onClick={(e) => {\n if (props.generateKey?.ip)\n navigator.clipboard.writeText(props.generateKey?.ip);\n props?.onCopyIP();\n }}\n />\n </Box>\n )}\n </Flex>\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.permissions\")}>\n <Text\n size=\"sm\"\n intensity={80}\n data-testid=\"oui-testid-apiKey-createdApiKey-dialog-permissions-span\"\n >\n {props.generateKey?.permissions}\n </Text>\n </Statistic>\n <div></div>\n <Text color=\"warning\" size=\"xs\" className=\"oui-text-center\">\n {t(\"portfolio.apiKey.created.warning\")}\n </Text>\n </Flex>\n </SimpleDialog>\n );\n};\n","import { FC } from \"react\";\nimport { Flex, SimpleDialog, Text } from \"@kodiak-finance/orderly-ui\";\nimport { APIKeyItem } from \"@kodiak-finance/orderly-hooks\";\nimport { formatKey } from \"../apiManager.ui\";\nimport { useTranslation, Trans } from \"@kodiak-finance/orderly-i18n\";\n\nexport const DeleteAPIKeyDialog: FC<{\n item: APIKeyItem;\n open: boolean;\n setOpen?: any;\n onDelete?: (item: APIKeyItem) => Promise<void>;\n}> = (props) => {\n const { item, open, setOpen, onDelete } = props;\n const { t } = useTranslation();\n return (\n <SimpleDialog\n size=\"sm\"\n open={open}\n onOpenChange={setOpen}\n title={t(\"portfolio.apiKey.delete.dialog.title\")}\n actions={{\n primary: {\n label: t(\"common.confirm\"),\n \"data-testid\": \"oui-testid-apiKey-deleteApiKey-dialog-confirm-btn\",\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n size: \"md\",\n onClick: async () => {\n await props.onDelete?.(item);\n setOpen(false);\n },\n },\n secondary: {\n label: t(\"common.cancel\"),\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n size: \"md\",\n onClick: async () => {\n setOpen(false);\n },\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n }}\n >\n <Flex className=\"oui-text-xs\">\n {/* @ts-ignore */}\n <Trans\n i18nKey=\"portfolio.apiKey.delete.dialog.description\"\n values={{ apiKey: formatKey(item?.orderly_key) }}\n components={[<Text color=\"primary\" className=\"oui-px-1\" />]}\n />\n </Flex>\n </SimpleDialog>\n );\n};\n","import { FC, useEffect, useState } from \"react\";\nimport { APIKeyItem } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, SimpleDialog, Statistic, Text } from \"@kodiak-finance/orderly-ui\";\nimport { Checkbox } from \"./createApiKey\";\n\nexport const EditAPIKeyDialog: FC<{\n item: APIKeyItem;\n open: boolean;\n setOpen?: any;\n onUpdate?: (item: APIKeyItem, ip?: string) => Promise<void>;\n verifyIP: (ip: string) => string;\n}> = (props) => {\n const { item, open, setOpen, onUpdate } = props;\n const [ipText, setIpText] = useState(item.ip_restriction_list?.join(\",\"));\n const [read, setRead] = useState(true);\n const [trade, setTrade] = useState(true);\n const [hint, setHint] = useState(\"\");\n const { t } = useTranslation();\n\n useEffect(() => {\n setIpText(item.ip_restriction_list.join(\",\"));\n const scope = item.scope?.toLocaleLowerCase() || \"\";\n\n setRead(scope.includes(\"read\"));\n setTrade(scope.includes(\"trading\"));\n }, [item]);\n\n useEffect(() => {\n if (ipText.length === 0) setHint(\"\");\n }, [ipText]);\n\n return (\n <SimpleDialog\n size=\"sm\"\n open={open}\n onOpenChange={setOpen}\n title={t(\"portfolio.apiKey.edit.dialog.title\")}\n actions={{\n primary: {\n label: t(\"common.confirm\"),\n \"data-testid\": \"oui-testid-apiKey-editApiKey-dialog-confirm-btn\",\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n onClick: async () => {\n if (ipText.length > 0) {\n const hint = props.verifyIP(ipText);\n setHint(hint);\n if (hint.length > 0) {\n return;\n }\n }\n await props.onUpdate?.(item, ipText);\n setOpen(false);\n },\n disabled: item.ip_restriction_list.join(\",\") === ipText,\n size: \"md\",\n fullWidth: true,\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n }}\n >\n <Flex direction={\"column\"} gap={6}>\n {/* <TextField label={\"IP restriction (optional)\"} rows={5} className=\"oui-w-full oui-h-auto\" classNames={{\n input: \"oui-h-[100px]\",\n root: \"oui-h-[100px]\"\n }}/> */}\n <Flex direction={\"column\"} gap={1} width={\"100%\"} itemAlign={\"start\"}>\n <Text intensity={54} size=\"2xs\">\n {t(\"portfolio.apiKey.create.ipRestriction\")}\n </Text>\n <textarea\n data-testid=\"oui-testid-apiKey-editApiKey-dialog-textarea\"\n placeholder={t(\"portfolio.apiKey.create.ipRestriction.placeholder\")}\n className={cn(\n \"oui-h-[100px] oui-w-full oui-rounded-xl oui-bg-base-6 oui-p-3 oui-text-sm oui-text-base-contrast-80\",\n \"oui-border-0 oui-outline-none focus:oui-border-2 focus:oui-border-primary-darken\",\n \"oui-placeholder-base-contrast-20\",\n hint.length > 0 &&\n \"oui-outline-1 oui-outline-danger focus:oui-outline-none\",\n )}\n value={ipText}\n onChange={(e) => {\n setIpText(e.target.value);\n }}\n style={{\n resize: \"none\",\n }}\n />\n {hint.length > 0 && (\n <Flex gap={1} className=\"oui-relative\">\n <div\n className={cn(\n \"oui-absolute oui-top-[10px]\",\n \"oui-size-1 oui-rounded-full oui-bg-danger\",\n )}\n />\n <Text color=\"danger\" size=\"xs\" className=\"oui-ml-2\">\n {hint}\n </Text>\n </Flex>\n )}\n </Flex>\n <Statistic\n label={\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.apiKey.permissions\")}\n </Text>\n }\n className=\"oui-w-full\"\n >\n <Flex\n direction={\"row\"}\n gap={6}\n itemAlign={\"start\"}\n className=\"oui-mt-2\"\n >\n <Checkbox\n disabled\n size={18}\n checked={read}\n onCheckedChange={(e) => setRead(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.read\")}\n />\n <Checkbox\n disabled\n size={18}\n checked={trade}\n onCheckedChange={(e) => setTrade(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.trading\")}\n />\n </Flex>\n </Statistic>\n </Flex>\n </SimpleDialog>\n );\n};\n","import React, { useState } from \"react\";\nimport { APIKeyItem } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Button,\n Card,\n CopyIcon,\n Flex,\n PlusIcon,\n Column,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AuthGuardEmpty,\n AuthGuardDataTable,\n AuthGuardTooltip,\n} from \"@kodiak-finance/orderly-ui-connector\";\nimport {\n type ApiManagerScriptReturns,\n capitalizeFirstChar,\n} from \"./apiManager.script\";\n\nconst LazyCreateAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/createApiKey\").then((mod) => {\n return { default: mod.CreateAPIKeyDialog };\n }),\n);\n\nconst LazyCreatedAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/createdApiKey\").then((mod) => {\n return { default: mod.CreatedAPIKeyDialog };\n }),\n);\n\nconst LazyDeleteAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/deleteApiKey\").then((mod) => {\n return { default: mod.DeleteAPIKeyDialog };\n }),\n);\n\nconst LazyEditAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/editApiKey\").then((mod) => {\n return { default: mod.EditAPIKeyDialog };\n }),\n);\n\nexport const APIManager: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n return (\n <Card\n title={t(\"portfolio.apiKeys\")}\n id=\"portfolio-apikey-manager\"\n className=\"oui-bg-base-9 oui-font-semibold\"\n >\n <Flex\n direction={\"column\"}\n gap={4}\n width={\"100%\"}\n className=\"oui-font-semibold\"\n >\n <AccountInfo {...props} />\n <Subtitle {...props} />\n </Flex>\n <div>\n <KeyList {...props} />\n <React.Suspense fallback={null}>\n <LazyCreateAPIKeyDialog {...props} />\n </React.Suspense>\n <React.Suspense fallback={null}>\n <LazyCreatedAPIKeyDialog {...props} />\n </React.Suspense>\n </div>\n </Card>\n );\n};\n\nconst AccountInfo: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n width={\"100%\"}\n gap={4}\n className=\"oui-border-t-2 oui-border-line-6 oui-pt-4\"\n >\n <Flex\n py={2}\n px={4}\n direction={\"column\"}\n itemAlign={\"start\"}\n r=\"xl\"\n gradient=\"neutral\"\n angle={27}\n border\n className=\"oui-w-1/2\"\n >\n <Text size=\"xs\" intensity={36}>\n {t(\"common.accountId\")}\n </Text>\n <Text.formatted\n size=\"base\"\n inlist={80}\n rule={\"address\"}\n copyable={props.accountId !== \"--\"}\n copyIconSize={16}\n onCopy={props.onCopyAccountId}\n copyIconTestid=\"oui-testid-apiKey-accountInfo-accountId-copy-btn\"\n >\n {props.accountId}\n </Text.formatted>\n </Flex>\n <Flex\n py={2}\n px={4}\n direction={\"column\"}\n itemAlign={\"start\"}\n r=\"xl\"\n gradient=\"neutral\"\n angle={27}\n border\n className=\"oui-w-1/2\"\n >\n <Text size=\"xs\" intensity={36}>\n {t(\"portfolio.apiKey.uid\")}\n </Text>\n <Text size=\"base\" inlist={80}>\n {props.userId}\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nconst Subtitle: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n width={\"100%\"}\n direction={\"row\"}\n className=\"oui-text-sm oui-border-b-2 oui-border-line-6 oui-pb-4\"\n >\n <Flex direction={\"column\"} itemAlign={\"start\"} width={\"100%\"} gap={1}>\n <Text intensity={54}>{t(\"portfolio.apiKey.description\")}</Text>\n <Flex\n itemAlign={\"center\"}\n className=\"oui-text-primary-light oui-fill-primary-light hover:oui-text-primary-darken oui-cursor-pointer oui-text-2xs md:oui-text-xs xl:oui-text-sm\"\n onClick={props.onReadApiGuide}\n >\n <Text>{t(\"portfolio.apiKey.readApiGuide\")}</Text>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M4.008 7.995c0-.368.298-.666.666-.666H9.71L7.733 5.331l.937-.936 3.143 3.122c.13.13.195.304.195.479a.67.67 0 0 1-.195.478L8.67 11.596l-.937-.937 1.978-1.998H4.674a.666.666 0 0 1-.666-.666\" />\n </svg>\n </Flex>\n </Flex>\n <AuthGuardTooltip\n side=\"top\"\n tooltip={{\n connectWallet: t(\"portfolio.apiKey.create.connectWallet.tooltip\"),\n signIn: t(\"portfolio.apiKey.create.createAccount.tooltip\"),\n enableTrading: t(\"portfolio.apiKey.create.enableTrading.tooltip\"),\n wrongNetwork: t(\"portfolio.apiKey.create.wrongNetwork.tooltip\"),\n }}\n >\n <Button\n size=\"md\"\n icon={<PlusIcon />}\n variant=\"contained\"\n color=\"primary\"\n onClick={props.onCreateApiKey}\n disabled={!props.canCreateApiKey}\n // className=\"disabled:oui-cursor-default\"\n data-testid=\"oui-testid-apiKey-createApiKey-btn\"\n >\n {t(\"portfolio.apiKey.create.dialog.title\")}\n </Button>\n </AuthGuardTooltip>\n </Flex>\n );\n};\n\nconst KeyList: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n const columns: Column<APIKeyItem>[] = [\n {\n title: t(\"portfolio.apiKey.column.apiKey\"),\n dataIndex: \"orderly_key\",\n render: (value) => {\n return (\n <Text.formatted\n rule={\"\"}\n copyable\n copyIconSize={16}\n onCopy={() => {\n props.onCopyApiKey?.(value);\n }}\n >\n {formatKey(value)}\n </Text.formatted>\n );\n },\n },\n {\n title: t(\"portfolio.apiKey.column.permissionType\"),\n dataIndex: \"scope\",\n render: (value) =>\n value\n ?.split(\",\")\n .map((e: any) => capitalizeFirstChar(`${e}`))\n .join(\", \"),\n },\n {\n title: t(\"portfolio.apiKey.column.restrictedIP\"),\n dataIndex: \"ip_restriction_list\",\n render: (value) => {\n let ip = value.join(\",\");\n if (ip.length === 0) {\n ip = \"--\";\n }\n return (\n <Tooltip content={ip} className=\"oui-max-w-[200px] oui-break-all\">\n <Flex gap={1}>\n <div className=\" oui-overflow-ellipsis oui-overflow-hidden\">\n {ip}\n </div>\n {ip !== \"--\" && (\n <Box width={16} height={16} className=\"oui-cursor-pointer\">\n <CopyIcon\n color=\"white\"\n opacity={0.54}\n size={16}\n onClick={(e) => {\n navigator.clipboard.writeText(ip);\n props?.onCopyIP();\n }}\n />\n </Box>\n )}\n </Flex>\n </Tooltip>\n );\n },\n },\n {\n title: t(\"portfolio.apiKey.column.expirationDate\"),\n dataIndex: \"expiration\",\n render: (value) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd\">\n {value}\n </Text.formatted>\n ),\n },\n {\n title: \"\",\n type: \"action\",\n dataIndex: \"action\",\n width: 120,\n render: (_, item) => {\n return (\n <Flex direction={\"row\"} gap={2}>\n <EditButton\n item={item}\n onUpdate={props.doEdit}\n verifyIP={props.verifyIP}\n />\n <DeleteButton item={item} onDelete={props.doDelete} />\n </Flex>\n );\n },\n },\n ];\n return (\n <AuthGuardDataTable\n bordered\n columns={columns}\n loading={props.isLoading}\n dataSource={props.keys}\n emptyView={<AuthGuardEmpty />}\n classNames={{}}\n pagination={props.pagination}\n manualPagination={false}\n />\n );\n};\n\nconst EditButton: React.FC<{\n item: APIKeyItem;\n onUpdate: (item: APIKeyItem, ip?: string) => Promise<void>;\n verifyIP: (ip: string) => string;\n}> = (props) => {\n const { item, onUpdate, verifyIP } = props;\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n\n return (\n <>\n <Button\n size=\"xs\"\n color=\"primary\"\n variant=\"contained\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n data-testid=\"oui-testid-apiKey-keyList-edit-btn\"\n >\n {t(\"common.edit\")}\n </Button>\n {open && (\n <React.Suspense fallback={null}>\n <LazyEditAPIKeyDialog\n item={item}\n open={open}\n setOpen={setOpen}\n onUpdate={onUpdate}\n verifyIP={verifyIP}\n />\n </React.Suspense>\n )}\n </>\n );\n};\n\nconst DeleteButton: React.FC<{\n item: APIKeyItem;\n onDelete: (item: APIKeyItem) => Promise<void>;\n}> = (props) => {\n const { item, onDelete } = props;\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n return (\n <>\n <Button\n size=\"xs\"\n color=\"gray\"\n variant=\"contained\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n data-testid=\"oui-testid-apiKey-keyList-delete-btn\"\n >\n {t(\"common.delete\")}\n </Button>\n {open && (\n <React.Suspense fallback={null}>\n <LazyDeleteAPIKeyDialog\n item={item}\n open={open}\n setOpen={setOpen}\n onDelete={onDelete}\n />\n </React.Suspense>\n )}\n </>\n );\n};\n\nexport function formatKey(value: string): string {\n if (typeof value === \"undefined\") {\n return \"-\";\n }\n const key = `${value}`.replace(\"ed25519:\", \"\").slice(0, 6);\n return `${key}*****`;\n}\n","import { FC, PropsWithChildren } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { usePortfolioLayoutScript } from \"./layout.script\";\nimport { PortfolioLayout, PortfolioLayoutProps } from \"./layout.ui\";\nimport { PortfolioLayoutMobile } from \"./layout.ui.mobile\";\n\nexport type PortfolioLayoutWidgetProps = PortfolioLayoutProps;\n\nexport const PortfolioLayoutWidget: FC<\n PropsWithChildren<PortfolioLayoutWidgetProps>\n> = (props) => {\n const state = usePortfolioLayoutScript({\n current: props.leftSideProps?.current,\n });\n const { isMobile } = useScreen();\n\n return (\n <>\n {isMobile ? (\n // @ts-ignore\n <PortfolioLayoutMobile {...state} {...props} />\n ) : (\n <PortfolioLayout {...state} {...props} />\n )}\n </>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n SideMenuItem,\n useScaffoldContext,\n} from \"@kodiak-finance/orderly-ui-scaffold\";\n\nexport enum PortfolioLeftSidebarPath {\n Overview = \"/portfolio\",\n Positions = \"/portfolio/positions\",\n Orders = \"/portfolio/orders\",\n Assets = \"/portfolio/assets\",\n FeeTier = \"/portfolio/feeTier\",\n ApiKey = \"/portfolio/apiKey\",\n Setting = \"/portfolio/setting\",\n History = \"/portfolio/history\",\n SymbolPerformance = \"/portfolio/symbol-performance\",\n}\n\nexport type UseLayoutBuilderOptions = {\n current?: string;\n};\n\nexport const usePortfolioLayoutScript = (props: UseLayoutBuilderOptions) => {\n const { routerAdapter } = useScaffoldContext();\n const [current, setCurrent] = useState(\n props.current ?? routerAdapter?.currentPath ?? \"/portfolio\",\n );\n const { t } = useTranslation();\n\n useEffect(() => {\n if (props.current || routerAdapter?.currentPath) {\n setCurrent(props.current || routerAdapter?.currentPath || \"/portfolio\");\n }\n }, [props.current, routerAdapter?.currentPath]);\n\n const items = useMemo(() => {\n return [\n {\n name: t(\"common.overview\"),\n href: PortfolioLeftSidebarPath.Overview,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.24316 2.19727C3.58641 2.19727 2.24316 3.54044 2.24316 5.19727V12.6973C2.24316 14.3541 3.58641 15.6973 5.24316 15.6973H12.7432C14.3999 15.6973 15.7432 14.3541 15.7432 12.6973V5.19727C15.7432 3.54044 14.3999 2.19727 12.7432 2.19727H5.24316ZM5.24316 3.69727H12.7432C13.5719 3.69727 14.2432 4.36882 14.2432 5.19727V12.6973C14.2432 13.2484 13.9319 13.734 13.4894 13.9947C13.3454 12.2235 11.4427 11.1973 8.99316 11.1973C6.54366 11.1973 4.60341 12.251 4.48566 13.9997C4.04241 13.739 3.74316 13.2484 3.74316 12.6973V5.19727C3.74316 4.36882 4.41441 3.69727 5.24316 3.69727ZM8.99316 5.19727C7.54341 5.19727 6.36816 6.37252 6.36816 7.82227C6.36816 9.27202 7.54341 10.4473 8.99316 10.4473C10.4429 10.4473 11.6182 9.27202 11.6182 7.82227C11.6182 6.37252 10.4429 5.19727 8.99316 5.19727Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"common.positions\"),\n href: PortfolioLeftSidebarPath.Positions,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.51 3.021a3 3 0 0 0-3 3v6a3 3 0 0 0 3 3h9a3 3 0 0 0 3-3v-6a3 3 0 0 0-3-3zm2.25 3a.76.76 0 0 1 .54.211.77.77 0 0 1 0 1.078l-.75.75a.77.77 0 0 1-.54.211h-.75a.75.75 0 0 1 0-1.5h.422l.54-.539a.76.76 0 0 1 .539-.21m3 .75h3a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5m-3 2.25a.76.76 0 0 1 .54.211.77.77 0 0 1 0 1.079l-.75.75a.77.77 0 0 1-.54.21h-.75a.75.75 0 0 1 0-1.5h.422l.54-.539a.76.76 0 0 1 .539-.21m3 .75h3a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"common.orders\"),\n href: PortfolioLeftSidebarPath.Orders,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.693 1.5C4.229 1.5 3.02 2.61 3.02 4.006v9.984c0 1.398 1.208 2.508 2.672 2.508h6.657c1.463 0 2.671-1.11 2.671-2.508V6.726c0-2.672-2.579-5.227-5.25-5.227zm4.828 1.593c1.33.352 2.562 1.58 2.906 2.906h-1.734c-.667 0-1.172-.472-1.172-1.008zm-3.75 2.906h.75a.75.75 0 0 1 0 1.5h-.75a.75.75 0 0 1 0-1.5m0 3h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5m0 3h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"common.assets\"),\n href: PortfolioLeftSidebarPath.Assets,\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n >\n <path\n d=\"M9 1.5C4.85 1.5 1.5 4.85 1.5 9C1.5 13.15 4.85 16.5 9 16.5C13.15 16.5 16.5 13.15 16.5 9C16.5 4.85 13.15 1.5 9 1.5ZM8.17529 3.75H9.67529V4.94971L10.125 5.17529C10.35 5.32529 10.5756 5.47471 10.7256 5.69971C10.8756 5.92471 11.0256 6.14971 11.1006 6.44971C11.1756 6.74971 11.25 7.05029 11.25 7.42529H9.82471C9.82471 6.97529 9.75059 6.67471 9.60059 6.44971C9.45059 6.22471 9.3 6.14941 9 6.14941C8.85 6.14941 8.7 6.15059 8.625 6.22559L8.39941 6.44971C8.32441 6.52471 8.325 6.675 8.25 6.75C8.175 6.825 8.17529 6.975 8.17529 7.125C8.17529 7.275 8.25 7.35 8.25 7.5C8.25 7.65 8.32441 7.72529 8.39941 7.80029C8.47441 7.95029 8.54971 8.02559 8.69971 8.10059C8.77471 8.17559 8.92441 8.24971 9.14941 8.32471C9.44941 8.47471 9.75059 8.62441 9.97559 8.77441C10.2756 8.92441 10.4994 9.07529 10.6494 9.30029C10.8744 9.52529 11.0256 9.75059 11.1006 9.97559C11.1756 10.2006 11.25 10.5 11.25 10.875C11.25 11.25 11.1756 11.5494 11.1006 11.7744C11.0256 12.0744 10.8756 12.2247 10.7256 12.4497C10.5756 12.5997 10.35 12.7494 10.125 12.8994C9.975 12.9744 9.9 13.0503 9.75 13.0503V14.25H8.25V12.9756C8.1 12.9006 7.95029 12.8997 7.80029 12.8247C7.50029 12.7497 7.35 12.6 7.125 12.375C6.975 12.225 6.82529 11.925 6.67529 11.625C6.60029 11.25 6.52441 10.8753 6.52441 10.4253H8.02441C8.02441 10.6503 8.02559 10.8756 8.10059 11.1006C8.17559 11.3256 8.24971 11.4753 8.32471 11.5503C8.39971 11.6253 8.475 11.6994 8.625 11.7744C8.775 11.8494 8.85 11.8506 9 11.8506C9.15 11.8506 9.225 11.8494 9.375 11.7744C9.525 11.6994 9.60029 11.6253 9.67529 11.5503C9.75029 11.4753 9.74971 11.4 9.82471 11.25C9.89971 11.175 9.89941 11.025 9.89941 10.875C9.89941 10.725 9.82471 10.575 9.82471 10.5C9.82471 10.425 9.75029 10.2747 9.67529 10.1997C9.60029 10.0497 9.525 9.97441 9.375 9.89941L8.92529 9.67529C8.62529 9.52529 8.32559 9.37559 8.10059 9.22559C7.80059 9.07559 7.57529 8.92471 7.42529 8.69971C7.20029 8.54971 7.05059 8.32441 6.97559 8.02441C6.90059 7.79941 6.82471 7.5 6.82471 7.125C6.82471 6.825 6.82441 6.52529 6.89941 6.30029C7.04941 6.07529 7.12559 5.85 7.35059 5.625C7.50059 5.4 7.65029 5.25029 7.80029 5.17529C7.95029 5.10029 8.02529 5.02441 8.17529 5.02441V3.75Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.feeTier\"),\n href: PortfolioLeftSidebarPath.FeeTier,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.99829 1.51062C4.34154 1.51062 2.99829 2.85387 2.99829 4.51062V13.5106C2.99829 15.1674 4.34154 16.5106 5.99829 16.5106H11.9983C13.655 16.5106 14.9983 15.1674 14.9983 13.5106V4.51062C14.9983 2.85387 13.655 1.51062 11.9983 1.51062H5.99829ZM5.99829 3.76062H11.9983C12.4123 3.76062 12.7483 4.09662 12.7483 4.51062V6.01062C12.7483 6.42462 12.4123 6.76062 11.9983 6.76062H5.99829C5.58429 6.76062 5.24829 6.42462 5.24829 6.01062V4.51062C5.24829 4.09662 5.58429 3.76062 5.99829 3.76062ZM5.99829 8.26062C6.41229 8.26062 6.74829 8.59662 6.74829 9.01062C6.74829 9.42462 6.41229 9.76062 5.99829 9.76062C5.58429 9.76062 5.24829 9.42462 5.24829 9.01062C5.24829 8.59662 5.58429 8.26062 5.99829 8.26062ZM8.99829 8.26062C9.41229 8.26062 9.74829 8.59662 9.74829 9.01062C9.74829 9.42462 9.41229 9.76062 8.99829 9.76062C8.58429 9.76062 8.24829 9.42462 8.24829 9.01062C8.24829 8.59662 8.58429 8.26062 8.99829 8.26062ZM11.9983 8.26062C12.4123 8.26062 12.7483 8.59662 12.7483 9.01062C12.7483 9.42462 12.4123 9.76062 11.9983 9.76062C11.5843 9.76062 11.2483 9.42462 11.2483 9.01062C11.2483 8.59662 11.5843 8.26062 11.9983 8.26062ZM5.99829 10.5106C6.41229 10.5106 6.74829 10.8466 6.74829 11.2606C6.74829 11.6746 6.41229 12.0106 5.99829 12.0106C5.58429 12.0106 5.24829 11.6746 5.24829 11.2606C5.24829 10.8466 5.58429 10.5106 5.99829 10.5106ZM8.99829 10.5106C9.41229 10.5106 9.74829 10.8466 9.74829 11.2606C9.74829 11.6746 9.41229 12.0106 8.99829 12.0106C8.58429 12.0106 8.24829 11.6746 8.24829 11.2606C8.24829 10.8466 8.58429 10.5106 8.99829 10.5106ZM11.9983 10.5106C12.4123 10.5106 12.7483 10.8466 12.7483 11.2606V13.5106C12.7483 13.9246 12.4123 14.2606 11.9983 14.2606C11.5843 14.2606 11.2483 13.9246 11.2483 13.5106V11.2606C11.2483 10.8466 11.5843 10.5106 11.9983 10.5106ZM5.99829 12.7606C6.41229 12.7606 6.74829 13.0966 6.74829 13.5106C6.74829 13.9246 6.41229 14.2606 5.99829 14.2606C5.58429 14.2606 5.24829 13.9246 5.24829 13.5106C5.24829 13.0966 5.58429 12.7606 5.99829 12.7606ZM8.99829 12.7606C9.41229 12.7606 9.74829 13.0966 9.74829 13.5106C9.74829 13.9246 9.41229 14.2606 8.99829 14.2606C8.58429 14.2606 8.24829 13.9246 8.24829 13.5106C8.24829 13.0966 8.58429 12.7606 8.99829 12.7606Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.apiKeys\"),\n href: PortfolioLeftSidebarPath.ApiKey,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.02124 1.49915C7.77849 1.49915 6.77124 2.5064 6.77124 3.74915C6.77124 4.70015 7.40049 5.55517 8.26974 5.86942L8.27124 8.24915H5.27124C4.85724 8.24915 4.52124 8.58515 4.52124 8.99915L4.52048 12.1304C3.65723 12.4274 3.02124 13.2981 3.02124 14.2491C3.02124 15.4919 4.02849 16.4991 5.27124 16.4991C6.51399 16.4991 7.52124 15.4919 7.52124 14.2491C7.52124 13.2981 6.92499 12.4596 6.02949 12.1206L6.02124 9.74915H9.02124H12.0212L12.0265 12.1319C11.1257 12.4446 10.5212 13.2981 10.5212 14.2491C10.5212 15.4919 11.5285 16.4991 12.7712 16.4991C14.014 16.4991 15.0212 15.4919 15.0212 14.2491C15.0212 13.2981 14.407 12.4611 13.5272 12.1281L13.5212 8.99915C13.5212 8.58515 13.1852 8.24915 12.7712 8.24915H9.77124L9.76899 5.86639C10.642 5.55814 11.2712 4.70015 11.2712 3.74915C11.2712 2.5064 10.264 1.49915 9.02124 1.49915Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.symbolPerformance\"),\n href: PortfolioLeftSidebarPath.SymbolPerformance,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 3.75C12.8096 3.75 12.375 4.18467 12.375 4.875V12.375C12.375 13.0654 12.8096 13.5 13.5 13.5H14.625C15.3154 13.5 15.75 13.0654 15.75 12.375V4.875C15.75 4.18467 15.3154 3.75 14.625 3.75H13.5ZM13.5 5.25H14.625V12.375H13.5V5.25ZM8.25 6.75C7.55964 6.75 7.125 7.18467 7.125 7.875V12.375C7.125 13.0654 7.55964 13.5 8.25 13.5H9.375C10.0654 13.5 10.5 13.0654 10.5 12.375V7.875C10.5 7.18467 10.0654 6.75 9.375 6.75H8.25ZM8.25 8.25H9.375V12.375H8.25V8.25ZM3 9.75C2.30964 9.75 1.875 10.1847 1.875 10.875V12.375C1.875 13.0654 2.30964 13.5 3 13.5H4.125C4.81536 13.5 5.25 13.0654 5.25 12.375V10.875C5.25 10.1847 4.81536 9.75 4.125 9.75H3ZM3 11.25H4.125V12.375H3V11.25Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.setting\"),\n href: PortfolioLeftSidebarPath.Setting,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.72601 1.84159C5.66251 2.17834 4.74527 2.7296 3.93677 3.48185C3.68702 3.7151 3.61052 4.09534 3.77252 4.39609C4.37327 5.50684 3.74476 6.69484 2.39026 6.76309C2.05801 6.78034 1.76477 7.02559 1.68677 7.34884C1.55252 7.90759 1.49927 8.37559 1.49927 8.98984C1.49927 9.50509 1.55476 10.0878 1.66351 10.6068C1.73101 10.9308 2.01302 11.1641 2.34302 11.1933C3.70652 11.3111 4.38152 12.3506 3.77252 13.6773C3.63752 13.9721 3.69902 14.3246 3.93677 14.5443C4.73327 15.2816 5.64826 15.8006 6.72601 16.1381C7.03351 16.2348 7.38076 16.1186 7.56976 15.8568C8.40376 14.7033 9.61352 14.6988 10.4055 15.8568C10.5923 16.1298 10.9343 16.2611 11.2493 16.1613C12.2895 15.8343 13.2585 15.2771 14.0618 14.5443C14.3093 14.3193 14.3745 13.9541 14.226 13.6541C13.602 12.3948 14.3198 11.2383 15.6083 11.2166C15.9503 11.2106 16.2548 10.9856 16.335 10.6541C16.4648 10.1163 16.4993 9.64759 16.4993 8.98984C16.4993 8.42434 16.4325 7.86709 16.3118 7.32559C16.2353 6.98359 15.936 6.74059 15.585 6.73984C14.3168 6.73759 13.6058 5.49109 14.226 4.39609C14.3985 4.09084 14.3445 3.71735 14.085 3.48185C13.2675 2.73935 12.2708 2.15959 11.226 1.84159C10.905 1.74409 10.5638 1.86409 10.3823 2.14609C9.65776 3.27109 8.30477 3.29135 7.59302 2.16935C7.41077 1.8821 7.05001 1.73809 6.72601 1.84159ZM8.99927 5.98984C10.656 5.98984 11.9993 7.33309 11.9993 8.98984C11.9993 10.6466 10.656 11.9898 8.99927 11.9898C7.34252 11.9898 5.99927 10.6466 5.99927 8.98984C5.99927 7.33309 7.34252 5.98984 8.99927 5.98984Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"trading.history\"),\n href: PortfolioLeftSidebarPath.History,\n hide: true,\n },\n ];\n }, [t]);\n\n const hideSideBar = useMediaQuery(\"(max-width: 768px)\");\n\n return {\n items,\n current,\n hideSideBar,\n onItemSelect: (item: SideMenuItem) => {\n if (typeof item.href === \"undefined\") {\n console.warn(\"Item href is not defined\");\n return;\n }\n setCurrent(item.href!);\n routerAdapter?.onRouteChange({\n href: item.href,\n name: item.name,\n });\n },\n };\n};\n\nexport const useCustomSidebarHook = () => {\n const { expanded, setExpand } = useScaffoldContext();\n\n return {\n open: expanded,\n onOpenChange: (open: boolean) => {\n setExpand(open);\n },\n };\n};\n\nexport type usePortfolioLayoutScriptType = ReturnType<\n typeof usePortfolioLayoutScript\n>;\n","import { FC, PropsWithChildren } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport {\n ScaffoldProps,\n RouterAdapter,\n Scaffold,\n SideBar,\n SideBarProps,\n useScaffoldContext,\n} from \"@kodiak-finance/orderly-ui-scaffold\";\n\nexport type PortfolioLayoutProps = ScaffoldProps & {\n hideSideBar?: boolean;\n items?: SideBarProps[\"items\"];\n};\n\nexport const PortfolioLayout: FC<PropsWithChildren<PortfolioLayoutProps>> = (\n props,\n) => {\n const { children, leftSideProps, classNames, ...rest } = props;\n\n return (\n <Scaffold\n leftSidebar={\n props.hideSideBar ? null : (\n <LeftSidebar\n current={props.routerAdapter?.currentPath}\n routerAdapter={props.routerAdapter}\n items={props.items}\n {...leftSideProps}\n />\n )\n }\n routerAdapter={props.routerAdapter}\n classNames={{\n ...classNames,\n content: cn(\"oui-my-6 oui-px-3\", classNames?.content),\n topNavbar: cn(\"oui-bg-base-9\", classNames?.topNavbar),\n leftSidebar: cn(\n \"oui-rounded-xl oui-bg-base-9\",\n \"oui-m-3 oui-p-4\",\n \"oui-border oui-border-line\",\n classNames?.leftSidebar,\n ),\n }}\n {...rest}\n >\n {children}\n </Scaffold>\n );\n};\n\ntype LeftSidebarProps = SideBarProps & {\n routerAdapter?: RouterAdapter;\n};\n\nconst LeftSidebar: FC<LeftSidebarProps> = (props) => {\n const { expanded, setExpand } = useScaffoldContext();\n const { t } = useTranslation();\n return (\n <SideBar\n title={t(\"common.portfolio\")}\n {...props}\n open={expanded}\n onOpenChange={(open) => setExpand(open)}\n onItemSelect={(e) => {\n props.onItemSelect?.(e);\n props.routerAdapter?.onRouteChange?.({\n href: e.href || \"\",\n name: e.name,\n });\n }}\n />\n );\n};\n","import { FC, PropsWithChildren } from \"react\";\nimport { Flex, Box } from \"@kodiak-finance/orderly-ui\";\nimport {\n MainNavMobile,\n BottomNav,\n type ScaffoldProps,\n} from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { LayoutProvider } from \"./context\";\nimport { usePortfolioLayoutScriptType } from \"./layout.script\";\n\nexport const PortfolioLayoutMobile: FC<\n PropsWithChildren<\n ScaffoldProps & usePortfolioLayoutScriptType & { current?: string }\n >\n> = (props) => {\n return (\n <LayoutProvider {...props}>\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n height={\"100%\"}\n className=\"oui-h-full-screen oui-bg-base-10\"\n >\n <header className=\"oui-scaffold-topNavbar oui-sticky oui-top-0 oui-z-10 oui-w-full oui-bg-base-10\">\n <MainNavMobile\n {...props.mainNavProps}\n current={props?.current}\n subItems={props?.items}\n routerAdapter={props.routerAdapter}\n />\n </header>\n <Box className=\"oui-scaffold-container oui-min-h-[calc(100vh-44px-64px-env(safe-area-inset-bottom))] oui-w-full\">\n {props.children}\n </Box>\n <footer className=\"oui-scaffold-bottomNav oui-fixed oui-bottom-0 oui-z-10 oui-w-full oui-bg-base-9 oui-pb-[calc(env(safe-area-inset-bottom))]\">\n <BottomNav\n mainMenus={props.bottomNavProps?.mainMenus}\n current={props?.current}\n onRouteChange={props.routerAdapter?.onRouteChange}\n />\n </footer>\n </Flex>\n </LayoutProvider>\n );\n};\n","import React, { createContext, useContext, useState, useMemo } from \"react\";\nimport type { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\n\ntype LayoutContextValue = {\n sideOpen: boolean;\n onSideOpenChange: (open: boolean) => void;\n routerAdapter?: RouterAdapter;\n};\n\nconst LayoutContext = createContext<LayoutContextValue>({\n sideOpen: true,\n} as LayoutContextValue);\n\nexport const useLayoutContext = () => {\n return useContext(LayoutContext);\n};\n\nexport const LayoutProvider: React.FC<\n React.PropsWithChildren<{ routerAdapter?: RouterAdapter }>\n> = (props) => {\n const { routerAdapter, children } = props;\n const [sideOpen, setSideOpen] = useState(true);\n const memoizedValue = useMemo<LayoutContextValue>(\n () => ({\n sideOpen: sideOpen,\n onSideOpenChange: setSideOpen,\n routerAdapter: routerAdapter,\n }),\n [sideOpen, setSideOpen, routerAdapter],\n );\n return (\n <LayoutContext.Provider value={memoizedValue}>\n {children}\n </LayoutContext.Provider>\n );\n};\n","export { AssetWidget, AssetsUI } from \"./assets\";\nexport { HistoryDataGroupWidget } from \"./historyDataGroup\";\n\nexport * from \"./assetChart\";\nexport * from \"./assetHistory\";\n\nexport {\n PerformanceUI,\n PerformanceWidget,\n usePerformanceScript,\n} from \"./performance\";\n\nexport * from \"./performanceMobileDialog\";\n\nexport {\n FundingHistoryWidget,\n useFundingHistoryColumns,\n useFundingHistoryHook,\n} from \"./funding\";\n\nexport {\n DistributionHistoryWidget,\n DistributionHistoryMobile,\n DistributionHistoryDesktop,\n} from \"./distribution\";\n\nexport { OverviewPage } from \"./main\";\n\nexport { OverviewProvider } from \"./provider/overviewProvider\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from \"react\";\nimport {\n AssetLineChart,\n PnlAreaChart,\n PnLBarChart,\n VolBarChart,\n PnlLineChartProps,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Tabs,\n TabPanel,\n Flex,\n Text,\n DataFilter,\n Box,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { UsePerformanceScriptReturn } from \"../performance/performance.script\";\nimport {\n PeriodType,\n useAssetsHistoryDataReturn,\n} from \"../shared/useAssetHistory\";\n\nconst responsiveProps: PnlLineChartProps[\"responsiveContainerProps\"] = {\n width: \"100%\",\n minHeight: 144,\n aspect: 2.5,\n};\n\nexport const PerformanceMobileUI: React.FC<\n Pick<\n useAssetsHistoryDataReturn & UsePerformanceScriptReturn,\n | \"data\"\n | \"curPeriod\"\n | \"aggregateValue\"\n | \"onPeriodChange\"\n | \"invisible\"\n | \"visible\"\n | \"createFakeData\"\n | \"period\"\n | \"filterItems\"\n | \"onFilter\"\n >\n> = (props) => {\n const { t } = useTranslation();\n const {\n data,\n aggregateValue,\n visible,\n invisible,\n curPeriod,\n period,\n onPeriodChange,\n createFakeData,\n filterItems,\n onFilter,\n } = props;\n\n const mergedData = data.length\n ? data\n : (createFakeData?.(\n { account_value: 0, pnl: 0 },\n { account_value: 500, pnl: 500 },\n ) as any[]);\n\n return (\n <div>\n {filterItems && filterItems.length > 0 && (\n <Box mb={4}>\n <DataFilter\n items={filterItems}\n onFilter={onFilter || (() => {})}\n className=\"oui-border-none oui-py-0\"\n />\n </Box>\n )}\n <Tabs\n value={period || \"\"}\n defaultValue={PeriodType.MONTH}\n classNames={{ tabsList: \"oui-justify-between\", trigger: \"oui-w-1/4\" }}\n onValueChange={(value) => onPeriodChange(value as PeriodType)}\n >\n <TabPanel\n title={t(\"common.select.1d\")}\n value={PeriodType.DAY}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n title={t(\"common.select.7d\")}\n value={PeriodType.WEEK}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n title={t(\"common.select.30d\")}\n value={PeriodType.MONTH}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n title={t(\"common.select.90d\")}\n value={PeriodType.QUARTER}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n </Tabs>\n <Flex justify=\"between\" itemAlign=\"center\" gap={2} my={4}>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.overview.performance.roi\", { period: curPeriod })}\n </Text>\n <Text.numeral size=\"sm\" visible={visible} rule=\"percentages\" coloring>\n {invisible ? \"--\" : aggregateValue.roi}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.overview.performance.pnl\", { period: curPeriod })}\n </Text>\n <Text.numeral size=\"sm\" visible={visible} coloring showIdentifier>\n {invisible ? \"--\" : aggregateValue.pnl}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.overview.performance.volume\", { period: curPeriod })}\n </Text>\n <Text.numeral size=\"sm\" visible={visible} coloring={false}>\n {invisible ? \"--\" : aggregateValue.vol}\n </Text.numeral>\n </Flex>\n </Flex>\n <Tabs defaultValue={\"dailyPnl\"}>\n <TabPanel\n value={\"dailyPnl\"}\n title={t(\"portfolio.overview.performance.dailyPnl\")}\n className=\"oui-min-h-40\"\n >\n <PnLBarChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n value={\"cumulativePnl\"}\n title={t(\"portfolio.overview.performance.cumulativePnl\")}\n className=\"oui-min-h-40\"\n >\n <PnlAreaChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n value={\"volume\"}\n title={t(\"portfolio.overview.performance.volume\", { period: \"\" })}\n className=\"oui-min-h-40\"\n >\n <div\n className={cn(\n \"oui-h-[144px] oui-w-full\",\n (invisible || (mergedData?.length ?? 0) <= 2) &&\n \"chart-invisible\",\n )}\n >\n <VolBarChart\n data={(mergedData ?? []).map((item: any) => ({\n date: item.date,\n volume: item.perp_volume ?? 0,\n opacity: (item.perp_volume ?? 0) > 0 ? 1 : 0,\n }))}\n className=\"oui-size-full\"\n />\n </div>\n </TabPanel>\n </Tabs>\n </div>\n );\n};\n","import React from \"react\";\nimport { pick } from \"ramda\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport {\n registerSimpleDialog,\n registerSimpleSheet,\n} from \"@kodiak-finance/orderly-ui\";\nimport { usePerformanceScript } from \"..\";\nimport { localKey } from \"../provider/overviewProvider\";\nimport { useAssetsHistoryData } from \"../shared/useAssetHistory\";\nimport { PerformanceMobileUI } from \"./performance.ui\";\n\nexport const PerformanceMobileWidget: React.FC = () => {\n const state = useAssetsHistoryData(localKey, { isRealtime: true });\n const { visible, invisible } = usePerformanceScript();\n return (\n <PerformanceMobileUI\n {...pick(\n [\n \"data\",\n \"curPeriod\",\n \"aggregateValue\",\n \"onPeriodChange\",\n \"createFakeData\",\n \"period\",\n \"filterItems\",\n \"onFilter\",\n ],\n state,\n )}\n visible={visible}\n invisible={invisible}\n />\n );\n};\n\nexport const PerformanceMobileSheetId = \"PerformanceMobileSheetId\";\n\nexport const PerformanceMobileDialogId = \"PerformanceMobileDialogId\";\n\nregisterSimpleSheet(PerformanceMobileSheetId, PerformanceMobileWidget, {\n title: () => i18n.t(\"portfolio.overview.performance\"),\n});\n\nregisterSimpleDialog(PerformanceMobileDialogId, PerformanceMobileWidget, {\n title: () => i18n.t(\"portfolio.overview.performance\"),\n classNames: {\n content: \"oui-w-[420px]\",\n },\n});\n","import { FC, PropsWithChildren, useMemo } from \"react\";\nimport { TWType } from \"@kodiak-finance/orderly-hooks\";\nimport { useRewardsData } from \"../mobile/useRewardsData.script\";\nimport { useAssetsHistoryData } from \"../shared/useAssetHistory\";\nimport { OverviewContext, OverviewContextState } from \"./overviewContext\";\n\nexport const localKey = \"portfolio_performance_period\";\n\nexport const OverviewProvider: FC<PropsWithChildren<{ type?: TWType }>> = (\n props,\n) => {\n const { type, children } = props;\n const state = useAssetsHistoryData(localKey, { isRealtime: true });\n const rewardsData = useRewardsData({ type: type });\n\n const memoizedValue = useMemo<OverviewContextState>(() => {\n return {\n ...state,\n type: type,\n ...rewardsData,\n };\n }, [state, type, rewardsData]);\n\n return (\n <OverviewContext.Provider value={memoizedValue}>\n {children}\n </OverviewContext.Provider>\n );\n};\n","import { useMemo, useRef, useEffect } from \"react\";\nimport {\n useAllBrokers,\n useConfig,\n useCurEpochEstimate,\n useEpochInfo,\n useGetClaimed,\n useAccount,\n RefferalAPI,\n usePrivateQuery,\n noCacheConfig,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { DistributionId, TWType } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useOverviewContext } from \"../provider/overviewContext\";\n\nexport const useRewardsData = ({ type = TWType.normal }: { type?: TWType }) => {\n const totalOrderClaimedReward = useGetClaimed(\n type === TWType.mm ? DistributionId.mmOrder : DistributionId.order,\n );\n const [curEpochEstimate] = useCurEpochEstimate(type);\n const [brokers] = useAllBrokers();\n const { state } = useAccount();\n const { data, mutate } = usePrivateQuery<RefferalAPI.ReferralInfo>(\n \"/v1/referral/info\",\n { revalidateOnFocus: true, errorRetryCount: 3, ...noCacheConfig },\n );\n\n const epochList = useEpochInfo(type as TWType);\n const brokerId = useConfig(\"brokerId\");\n\n const brokerName = useMemo(() => {\n return brokers?.[brokerId];\n }, [brokerId, brokers]);\n\n const lastStete = useRef<AccountStatusEnum>(AccountStatusEnum.NotConnected);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (lastStete.current !== state.status) {\n lastStete.current = state.status;\n timerRef.current = setTimeout(() => {\n mutate();\n }, 1000);\n }\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [state.status]);\n\n return {\n totalOrderClaimedReward,\n curEpochEstimate,\n epochList,\n brokerName,\n referralInfo: data,\n };\n};\n\nexport const useRewardsDataScript = () => {\n const {\n totalOrderClaimedReward,\n curEpochEstimate,\n epochList,\n brokerName,\n referralInfo,\n } = useOverviewContext();\n const { state } = useAccount();\n const { wrongNetwork } = useAppContext();\n const isSignIn =\n state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected;\n\n return {\n totalOrderClaimedReward,\n curEpochEstimate,\n epochList,\n brokerName,\n isSignIn,\n referralInfo,\n wrongNetwork,\n };\n};\n\nexport type UseRewardsDataReturn = ReturnType<typeof useRewardsData>;\n","import React from \"react\";\nimport { Grid, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { MobileOverview } from \"./mobile\";\nimport { OverviewProvider } from \"./provider/overviewProvider\";\n\nconst LazyAssetWidget = React.lazy(() =>\n import(\"./assets\").then((mod) => {\n return { default: mod.AssetWidget };\n }),\n);\n\nconst LazyAssetsChartWidget = React.lazy(() =>\n import(\"./assetChart\").then((mod) => {\n return { default: mod.AssetsChartWidget };\n }),\n);\n\nconst LazyPerformanceWidget = React.lazy(() =>\n import(\"./performance\").then((mod) => {\n return { default: mod.PerformanceWidget };\n }),\n);\n\nconst LazyHistoryDataGroupWidget = React.lazy(() =>\n import(\"./historyDataGroup\").then((mod) => {\n return { default: mod.HistoryDataGroupWidget };\n }),\n);\n\nexport const OverviewPage: React.FC = () => {\n const { isMobile } = useScreen();\n return (\n <OverviewProvider>\n {isMobile ? (\n <MobileOverview />\n ) : (\n <Grid cols={2} gap={4}>\n <React.Suspense fallback={null}>\n <LazyAssetWidget />\n </React.Suspense>\n <React.Suspense fallback={null}>\n <LazyAssetsChartWidget />\n </React.Suspense>\n <Grid.span colSpan={2}>\n <React.Suspense fallback={null}>\n <LazyPerformanceWidget />\n </React.Suspense>\n </Grid.span>\n <Grid.span colSpan={2}>\n <React.Suspense fallback={null}>\n <LazyHistoryDataGroupWidget />\n </React.Suspense>\n </Grid.span>\n </Grid>\n )}\n </OverviewProvider>\n );\n};\n","import React from \"react\";\nimport { ENVType, useGetEnv } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { Flex } from \"@kodiak-finance/orderly-ui\";\nimport { DepositStatusWidget } from \"@kodiak-finance/orderly-ui-transfer\";\nimport { useLayoutContext } from \"../../../layout/context\";\nimport { useAssetScript } from \"../assets\";\nimport { PortfolioChartsMobileWidget } from \"../portfolioChartsMobile\";\nimport { AccountStatusMobile } from \"./accountStatus.ui.mobile\";\nimport { AffiliateCardMobile } from \"./affiliateCard.ui.mobile\";\nimport { PortfolioHandleMobile } from \"./portfolioHandle.ui.mobile\";\nimport { PortfolioValueMobile } from \"./portfolioVaule.ui.mobile\";\nimport { SettingRouterMobile } from \"./settingRouter.ui.mobile\";\nimport { TraderCardMobile } from \"./traderCard.ui.mobile\";\n// import { TradingRewardsCardMobile } from \"./tradingRewardsCard.ui.mobile\";\nimport { useRewardsDataScript } from \"./useRewardsData.script\";\n\nexport const MobileOverview: React.FC = () => {\n const {\n canTrade,\n onWithdraw,\n onDeposit,\n portfolioValue,\n unrealPnL,\n unrealROI,\n visible,\n namespace,\n toggleVisible,\n onTransfer,\n isMainAccount,\n hasSubAccount,\n } = useAssetScript();\n const { t } = useTranslation();\n const rewardsData = useRewardsDataScript();\n const layoutContext = useLayoutContext();\n const { onRouteChange } = useAppContext();\n const env = useGetEnv();\n\n const goToClaim = () => {\n const url = `https://${\n env !== ENVType.prod ? `${env}-` : \"\"\n }app.orderly.network/tradingRewards`;\n window.open(url, \"_blank\");\n };\n\n const navigateToPortfolioHistory =\n typeof onRouteChange === \"function\"\n ? () => {\n onRouteChange({\n href: \"/portfolio/history\",\n name: t(\"trading.history\"),\n });\n }\n : undefined;\n\n const navigateToAnalysis =\n typeof onRouteChange === \"function\"\n ? () => {\n onRouteChange({\n href: \"/portfolio/symbol-performance\",\n name: t(\"portfolio.symbolPerformance\"),\n });\n }\n : undefined;\n\n // console.log('rewards data', rewardsData, layoutContext, props);\n\n return (\n <>\n <div className=\"oui-my-1 oui-px-3\">\n <AccountStatusMobile />\n </div>\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n height={\"100%\"}\n className=\"oui-gap-5 oui-px-3\"\n >\n <Flex direction=\"column\" width=\"100%\" gapY={2}>\n <PortfolioValueMobile\n toggleVisible={toggleVisible}\n portfolioValue={portfolioValue}\n unrealPnL={unrealPnL}\n unrealROI={unrealROI}\n visible={visible}\n canTrade={canTrade}\n namespace={namespace}\n routerAdapter={layoutContext?.routerAdapter}\n />\n <DepositStatusWidget onClick={navigateToPortfolioHistory} />\n <PortfolioChartsMobileWidget />\n </Flex>\n <PortfolioHandleMobile\n disabled={!canTrade}\n onWithdraw={onWithdraw}\n onDeposit={onDeposit}\n onTransfer={onTransfer}\n isMainAccount={isMainAccount}\n routerAdapter={layoutContext?.routerAdapter}\n hasSubAccount={hasSubAccount}\n onAnalysis={navigateToAnalysis}\n />\n <Flex\n direction={\"row\"}\n width={\"100%\"}\n height={\"100%\"}\n className=\"oui-gap-3\"\n >\n {/* Disable trading rewards card for now. Set to row */}\n <Flex direction=\"row\" className=\"oui-flex-1 oui-gap-3\">\n <AffiliateCardMobile\n referralInfo={rewardsData.referralInfo}\n routerAdapter={layoutContext?.routerAdapter}\n />\n <TraderCardMobile\n referralInfo={rewardsData.referralInfo}\n routerAdapter={layoutContext?.routerAdapter}\n />\n </Flex>\n {/* <Flex direction=\"column\" className=\"oui-flex-1\">\n <TradingRewardsCardMobile {...rewardsData} goToClaim={goToClaim} />\n </Flex> */}\n </Flex>\n <SettingRouterMobile routerAdapter={layoutContext?.routerAdapter} />\n </Flex>\n </>\n );\n};\n","import React from \"react\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { useAssetsChartScript } from \"../assetChart\";\nimport { usePortfolioChartsState } from \"./portfolioChartsMobile.script\";\nimport { PortfolioChartsMobileUI } from \"./portfolioChartsMobile.ui\";\n\nexport const PortfolioChartsMobileWidget: React.FC = () => {\n const { data, invisible } = useAssetsChartScript();\n const state = usePortfolioChartsState();\n return (\n <PortfolioChartsMobileUI\n data={data || EMPTY_LIST}\n invisible={invisible}\n {...state}\n />\n );\n};\n","import { useCallback } from \"react\";\nimport { useLocalStorage, usePositionStream } from \"@kodiak-finance/orderly-hooks\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport { ORDERLY_ASSETS_VISIBLE_KEY } from \"../../assets/type\";\nimport { PerformanceMobileSheetId } from \"../performanceMobileDialog\";\n\nexport const usePortfolioChartsState = () => {\n const [data] = usePositionStream();\n const [visible, setVisible] = useLocalStorage<boolean>(\n ORDERLY_ASSETS_VISIBLE_KEY,\n true,\n );\n const onPerformanceClick = useCallback(() => {\n return modal.show(PerformanceMobileSheetId);\n }, []);\n return {\n unrealPnL: data?.aggregated.total_unreal_pnl,\n unrealROI: data?.totalUnrealizedROI,\n visible: visible as boolean,\n setVisible: setVisible,\n onPerformanceClick: onPerformanceClick,\n } as const;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useId } from \"react\";\nimport { Area, AreaChart } from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { ChevronRightIcon, cn, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { usePortfolioChartsState } from \".\";\n\nexport const PortfolioChartsMobileUI: React.FC<\n ReturnType<typeof usePortfolioChartsState> & {\n data: any[];\n invisible?: boolean;\n }\n> = (props) => {\n const { data, invisible, unrealPnL, unrealROI, visible, onPerformanceClick } =\n props;\n const { t } = useTranslation();\n const colorId = useId();\n return (\n <Flex\n p={4}\n width={\"100%\"}\n itemAlign=\"center\"\n justify=\"between\"\n className={cn(\n \"oui-relative oui-overflow-hidden oui-rounded-2xl oui-border oui-border-solid oui-border-line-12 oui-bg-base-9\",\n )}\n >\n <Flex\n width={\"100%\"}\n justify={\"center\"}\n itemAlign={\"start\"}\n direction={\"column\"}\n gap={2}\n >\n <Text size=\"xs\" intensity={54}>\n {t(\"common.unrealizedPnl\")}\n </Text>\n <Flex justify={\"start\"} itemAlign={\"center\"}>\n <Text.numeral\n coloring\n size=\"base\"\n weight=\"semibold\"\n visible={visible}\n >\n {unrealPnL}\n </Text.numeral>\n <Text.numeral\n coloring\n rule=\"percentages\"\n size=\"sm\"\n weight=\"semibold\"\n prefix={\"(\"}\n suffix={\")\"}\n visible={visible}\n >\n {unrealROI}\n </Text.numeral>\n </Flex>\n <Text\n size=\"xs\"\n intensity={54}\n className=\"oui-flex oui-items-center oui-justify-start oui-gap-1\"\n onClick={onPerformanceClick}\n >\n {t(\"portfolio.overview.performance\")}\n <ChevronRightIcon className=\"oui-text-base-contrast-54\" />\n </Text>\n </Flex>\n <Flex\n width={\"100%\"}\n justify={\"center\"}\n itemAlign={\"center\"}\n direction={\"column\"}\n >\n <AreaChart data={data || EMPTY_LIST} width={160} height={52}>\n {!invisible && (\n <>\n <defs>\n <linearGradient id={colorId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop stopColor=\"#00B49E\" offset=\"0%\" stopOpacity={0.5} />\n <stop stopColor=\"#00B49E\" offset=\"100%\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"natural\"\n dataKey=\"account_value\"\n stroke={\"rgb(41, 233, 169)\"}\n strokeWidth={1.5}\n dot={false}\n isAnimationActive={false}\n fill={`url(#${colorId})`}\n />\n </>\n )}\n </AreaChart>\n </Flex>\n </Flex>\n );\n};\n","import { FC, SVGProps, useCallback, useMemo } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useChains,\n useLocalStorage,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum, ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport {\n cn,\n modal,\n toast,\n formatAddress,\n Flex,\n CopyIcon,\n ChainIcon,\n} from \"@kodiak-finance/orderly-ui\";\n\ninterface StatusInfo {\n title: string;\n description: string;\n titleColor?: any;\n titleClsName?: string;\n}\n\nconst useCurrentStatus = () => {\n const { state, account } = useAccount();\n const { wrongNetwork, disabledConnect, connectWallet } = useAppContext();\n const { t } = useTranslation();\n\n const statusText = {\n wrongNetwork: {\n description: t(\"connector.wrongNetwork.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#D25F00_0%,transparent_30%)]\",\n },\n connectWallet: {\n description: t(\"connector.trade.connectWallet.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#27FDFE_0%,transparent_30%)]\",\n },\n notSignedIn: {\n description: t(\"connector.trade.createAccount.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#335FFC_0%,transparent_30%)]\",\n },\n disabledTrading: {\n description: t(\"connector.trade.enableTrading.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#335FFC_0%,transparent_30%)]\",\n },\n default: {\n description: \"\",\n rootClass: \"\",\n arrowIconClass: \"\",\n textClass: \"\",\n },\n };\n\n return useMemo(() => {\n if (disabledConnect) {\n return statusText.connectWallet;\n }\n\n if (wrongNetwork) {\n return statusText.wrongNetwork;\n }\n\n switch (state.status) {\n case AccountStatusEnum.NotConnected:\n return statusText.connectWallet;\n case AccountStatusEnum.NotSignedIn:\n return statusText.notSignedIn;\n case AccountStatusEnum.DisabledTrading:\n return statusText.disabledTrading;\n default:\n return statusText.default;\n }\n }, [state.status, wrongNetwork]);\n};\n\nexport function EVMChainPopover({ children }: { children: React.ReactNode }) {\n // const [chains] = useState(getChainsByNetwork(\"mainnet\"));\n const [chains] = useChains(\"mainnet\", {\n pick: \"network_infos\",\n });\n const { t } = useTranslation();\n\n const showDialog = () => {\n modal.dialog({\n title: t(\"connector.privy.supportedEvmChain\"),\n size: \"xs\",\n content: (\n <div>\n <div className=\"oui-p-1 oui-grid oui-grid-cols-2 oui-gap-x-2 oui-gap-y-3 oui-text-2xs oui-text-base-contrast-54\">\n {chains.map((item, key) => (\n <div\n key={key}\n className=\"oui-flex oui-items-center oui-justify-start oui-gap-1\"\n >\n <ChainIcon chainId={item.chain_id} size=\"2xs\" />\n <div>{item.name}</div>\n </div>\n ))}\n </div>\n </div>\n ),\n });\n };\n\n return <button onClick={showDialog}>{children}</button>;\n}\n\nexport const MoreIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8.00521 6.66797C8.74161 6.66797 9.33854 7.26464 9.33854 8.0013C9.33854 8.73797 8.74161 9.33464 8.00521 9.33464C7.26881 9.33464 6.67188 8.73797 6.67188 8.0013C6.67188 7.26464 7.26881 6.66797 8.00521 6.66797Z\" />\n <path d=\"M3.33333 6.66797C4.06973 6.66797 4.66667 7.26464 4.66667 8.0013C4.66667 8.73797 4.06973 9.33464 3.33333 9.33464C2.59693 9.33464 2 8.73797 2 8.0013C2 7.26464 2.59693 6.66797 3.33333 6.66797Z\" />\n <path d=\"M12.6666 6.66797C13.403 6.66797 14 7.26464 14 8.0013C14 8.73797 13.403 9.33464 12.6666 9.33464C11.9302 9.33464 11.3333 8.73797 11.3333 8.0013C11.3333 7.26464 11.9302 6.66797 12.6666 6.66797Z\" />\n </svg>\n);\n\nconst EVMChains = () => {\n return (\n <div className=\"oui-relative oui-flex oui-items-center oui-justify-center\">\n <div className=\"oui-flex oui-h-[18px] oui-items-center oui-justify-center \">\n <img\n src=\"https://oss.orderly.network/static/sdk/portfolio/chains.png\"\n className=\"oui-relative oui-z-0 oui-h-[18px] oui-w-[49px]\"\n />\n </div>\n <div className=\"oui-relative oui-left-[-9px] oui-flex oui-items-center oui-justify-center oui-gap-1\">\n <div className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-[#282e3a]\">\n <EVMChainPopover>\n <MoreIcon\n className=\"oui-relative oui-z-10 oui-size-3 oui-text-base-contrast-54 hover:oui-text-base-contrast\"\n style={{ zIndex: 1 }}\n />\n </EVMChainPopover>\n </div>\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast\">\n Evm\n </div>\n </div>\n </div>\n );\n};\n\nconst ShowAccount: FC = () => {\n const { state, account } = useAccount();\n const { namespace } = useWalletConnector();\n const { t } = useTranslation();\n const onCopyAddress = () => {\n navigator.clipboard.writeText(state.address ?? \"\");\n toast.success(t(\"common.copy.copied\"));\n };\n\n const currentNamespace = useMemo(() => {\n if (namespace) {\n return namespace;\n }\n if (state.status === AccountStatusEnum.EnableTradingWithoutConnected) {\n return getLinkDeviceStorage()?.chainNamespace;\n }\n return null;\n }, [namespace, state.status]);\n\n const leftNode = useMemo(() => {\n if (!state.address) {\n return;\n }\n return (\n <Flex className=\"oui-text-base oui-text-base-contrast\" gapX={2}>\n {formatAddress(state.address ?? \"\")}\n <button\n className=\"oui-cursor-pointer\"\n onClick={() => {\n onCopyAddress();\n }}\n >\n <CopyIcon\n size={18}\n className=\"oui-text-base-contrast-80\"\n opacity={1}\n />\n </button>\n </Flex>\n );\n }, [state.address]);\n const rightNode = useMemo(() => {\n if (currentNamespace === ChainNamespace.evm) {\n return <EVMChains />;\n }\n\n return (\n <Flex gapX={1} itemAlign={\"center\"} className=\"oui-text-2xs\">\n <img\n src=\"https://oss.orderly.network/static/sdk/solana-logo.png\"\n className=\"oui-w-[15px]\"\n />\n Solana\n </Flex>\n );\n }, [currentNamespace]);\n\n const bgClass = useMemo(() => {\n let bg = \"\";\n if (currentNamespace == ChainNamespace.evm) {\n bg =\n \"oui-bg-[linear-gradient(15deg,#283BEE_-11%,transparent_30%,transparent_77%,#A53411_100%)]\";\n } else if (currentNamespace == ChainNamespace.solana) {\n bg =\n \"oui-bg-[linear-gradient(15deg,#7400D0_-11%,transparent_30%,transparent_77%,#009A7E_100%)]\";\n }\n return bg;\n }, [currentNamespace]);\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[44px] oui-w-full oui-items-center oui-justify-between oui-rounded-[10px] oui-px-3 oui-py-[10px]\",\n bgClass,\n ])}\n >\n {leftNode}\n {rightNode}\n </div>\n );\n};\n\nexport const AccountStatusMobile: FC = () => {\n const { state } = useAccount();\n const { wrongNetwork } = useAppContext();\n const { description, rootClass } = useCurrentStatus();\n\n const alreadyShowAccount = useMemo(() => {\n if (state.status === AccountStatusEnum.EnableTradingWithoutConnected) {\n return true;\n }\n if (wrongNetwork) {\n return false;\n }\n return state.status >= AccountStatusEnum.EnableTrading;\n }, [state.status, wrongNetwork]);\n\n if (alreadyShowAccount) {\n return <ShowAccount />;\n }\n\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[44px] oui-w-full oui-items-center oui-justify-center oui-rounded-[10px] oui-px-3 oui-py-[10px]\",\n rootClass,\n // \"oui-bg-linear-65\",\n // \"oui-from-[-20%]\",\n // \"oui-to-[40%]\",\n // \" oui-from-[#FF7B00]\",\n // \" oui-to-[#FFEA00]\",\n ])}\n >\n <div\n className={cn(\n \"oui-flex oui-items-center oui-justify-end oui-rounded-[10px] oui-text-xs oui-font-semibold\",\n \"oui-text-base-contrast-54\",\n )}\n >\n {description}\n </div>\n </div>\n );\n};\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n","import { FC } from \"react\";\nimport { RefferalAPI as API } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n AffiliateIcon,\n ChevronRightIcon,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\n\nconst isNumber = (val: unknown): val is number => {\n return typeof val === \"number\" && !Number.isNaN(val);\n};\n\ntype AffiliateCardMobileProps = {\n referralInfo?: API.ReferralInfo;\n routerAdapter?: RouterAdapter;\n};\n\nexport const AffiliateCardMobile: FC<AffiliateCardMobileProps> = (props) => {\n const { t } = useTranslation();\n const { referralInfo, routerAdapter } = props;\n const rebate = referralInfo?.referrer_info?.[\"30d_referrer_rebate\"];\n return (\n <Flex\n className=\"\n oui-via-21.6% \n oui-via-83.23% \n oui-relative \n oui-h-[112px] \n oui-w-full \n oui-flex-col \n oui-items-start \n oui-rounded-xl \n oui-border \n oui-border-solid \n oui-border-[rgba(var(--oui-gradient-primary-start)/0.36)] \n oui-bg-gradient-to-r\n oui-from-[rgba(var(--oui-gradient-primary-end)/0.12)]\n oui-to-[rgba(var(--oui-gradient-primary-start)/0.12)]\n oui-p-3\n \"\n >\n <Flex className=\"oui-w-full oui-flex-row oui-justify-between oui-items-center\">\n <Flex className=\"oui-flex-col oui-items-start\">\n <Text className=\"oui-text-base-contrast oui-text-base oui-font-semibold\">\n {t(\"affiliate.asAffiliate.affilates\")}\n </Text>\n <Text className=\"oui-text-2xs oui-font-normal oui-text-base-contrast-54\">\n {t(\"affiliate.commission\")}\n </Text>\n </Flex>\n <AffiliateIcon />\n </Flex>\n <Flex className=\"oui-mt-auto oui-w-full oui-flex-row oui-items-center oui-gap-1\">\n <img\n src=\"https://oss.orderly.network/static/symbol_logo/USDC.png\"\n alt=\"USDC\"\n className=\"oui-size-5\"\n />\n <Text\n className={cn(\n \"oui-text-xs oui-font-semibold\",\n isNumber(rebate) && rebate !== 0\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n >\n {commifyOptional(rebate, { fix: 2, fallback: \"--\" })}\n </Text>\n <Text className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-36\">\n (30D)\n </Text>\n <ChevronRightIcon\n size={18}\n color=\"white\"\n className=\"oui-ml-auto\"\n onClick={() => {\n routerAdapter?.onRouteChange({\n href: \"/rewards/affiliate?tab=affiliate\",\n name: t(\"tradingRewards.rewards\"),\n });\n }}\n />\n </Flex>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n ArrowDownSquareFillIcon,\n ArrowUpSquareFillIcon,\n CalendarMinusIcon,\n ArrowLeftRightIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { PortfolioLeftSidebarPath } from \"../../../layout\";\n\ntype Props = {\n disabled: boolean;\n onWithdraw?: () => void;\n onDeposit?: () => void;\n onTransfer?: () => void;\n isMainAccount?: boolean;\n routerAdapter?: RouterAdapter;\n hasSubAccount?: boolean;\n onAnalysis?: () => void;\n};\n\nexport const PortfolioHandleMobile: FC<Props> = (props) => {\n const { t } = useTranslation();\n\n const onGotoHistory = () => {\n props.routerAdapter?.onRouteChange({\n href: PortfolioLeftSidebarPath.History,\n name: t(\"trading.history\"),\n });\n };\n\n return (\n <Flex\n direction={\"row\"}\n width={\"100%\"}\n height={\"71px\"}\n className=\"oui-gap-3 oui-bg-transparent\"\n >\n {props.isMainAccount && (\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onDeposit}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <ArrowDownSquareFillIcon size={28} color=\"white\" opacity={1} />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"common.deposit\")}\n </Text>\n </Flex>\n )}\n {props.hasSubAccount && (\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onTransfer}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <ArrowLeftRightIcon size={28} color=\"white\" opacity={1} />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"common.transfer\")}\n </Text>\n </Flex>\n )}\n {props.isMainAccount && (\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onWithdraw}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <ArrowUpSquareFillIcon size={28} color=\"white\" opacity={1} />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"common.withdraw\")}\n </Text>\n </Flex>\n )}\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n >\n <div\n className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\"\n onClick={onGotoHistory}\n >\n <CalendarMinusIcon\n size={28}\n color=\"white\"\n opacity={1}\n viewBox=\"0 0 28 28\"\n className=\"oui-w-[28px] oui-h-[28px]\"\n />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"trading.history\")}\n </Text>\n </Flex>\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onAnalysis}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <svg\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 3.75C12.8096 3.75 12.375 4.18467 12.375 4.875V12.375C12.375 13.0654 12.8096 13.5 13.5 13.5H14.625C15.3154 13.5 15.75 13.0654 15.75 12.375V4.875C15.75 4.18467 15.3154 3.75 14.625 3.75H13.5ZM13.5 5.25H14.625V12.375H13.5V5.25ZM8.25 6.75C7.55964 6.75 7.125 7.18467 7.125 7.875V12.375C7.125 13.0654 7.55964 13.5 8.25 13.5H9.375C10.0654 13.5 10.5 13.0654 10.5 12.375V7.875C10.5 7.18467 10.0654 6.75 9.375 6.75H8.25ZM8.25 8.25H9.375V12.375H8.25V8.25ZM3 9.75C2.30964 9.75 1.875 10.1847 1.875 10.875V12.375C1.875 13.0654 2.30964 13.5 3 13.5H4.125C4.81536 13.5 5.25 13.0654 5.25 12.375V10.875C5.25 10.1847 4.81536 9.75 4.125 9.75H3ZM3 11.25H4.125V12.375H3V11.25Z\"\n fill=\"white\"\n />\n </svg>\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"portfolio.symbolPerformance\")}\n </Text>\n </Flex>\n </Flex>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { parseJSON, useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AccountStatusEnum, ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport {\n Flex,\n Text,\n cn,\n ArrowRightShortIcon,\n EyeIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { PortfolioLeftSidebarPath } from \"../../../layout\";\n\ntype Props = {\n portfolioValue: number | null;\n unrealPnL: number;\n unrealROI: number;\n visible: boolean;\n namespace: string | null;\n toggleVisible: () => void;\n canTrade: boolean;\n routerAdapter?: RouterAdapter;\n};\n\nexport const PortfolioValueMobile: FC<Props> = (props) => {\n const { t } = useTranslation();\n const { state } = useAccount();\n\n const currentNamespace = useMemo(() => {\n if (props.namespace) {\n return props.namespace;\n }\n if (state.status === AccountStatusEnum.EnableTradingWithoutConnected) {\n return getLinkDeviceStorage()?.chainNamespace;\n }\n return null;\n }, [props.namespace, state.status]);\n return (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n height={\"100%\"}\n className={cn([\n \"oui-relative oui-items-start oui-overflow-hidden oui-rounded-2xl oui-bg-base-9\",\n currentNamespace === ChainNamespace.evm && \"oui-bg-[#283BEE]\",\n currentNamespace === ChainNamespace.solana && \"oui-bg-[#630EAD]\",\n ])}\n p={4}\n >\n <Flex direction=\"row\" gapX={1} itemAlign={\"center\"}>\n <Text className=\"oui-text-sm oui-text-base-contrast-54\">\n {t(\"portfolio.overview.handle.title\")}\n </Text>\n <EyeIcon\n size={16}\n className={cn(\n props.canTrade ? \"oui-text-base-contrast-54\" : \"oui-hidden\",\n )}\n onClick={props.toggleVisible}\n />\n </Flex>\n <Flex\n direction=\"row\"\n gapX={1}\n itemAlign={\"baseline\"}\n className=\"oui-mt-1\"\n >\n <Text.numeral\n visible={props.visible}\n className=\"oui-text-3xl oui-font-bold oui-text-base-contrast\"\n >\n {props.portfolioValue ?? \"--\"}\n </Text.numeral>\n <Text className=\"oui-text-base oui-font-bold oui-text-base-contrast-80\">\n USDC\n </Text>\n </Flex>\n <Flex\n direction=\"row\"\n gapX={1}\n itemAlign={\"center\"}\n className=\"oui-text-sm oui-text-base-contrast\"\n >\n <Text.numeral visible={props.visible}>\n {props.unrealPnL ?? \"--\"}\n </Text.numeral>\n <Text.numeral\n visible={props.visible}\n rule=\"percentages\"\n prefix={\"(\"}\n suffix={\")\"}\n >\n {props.unrealROI ?? \"--\"}\n </Text.numeral>\n </Flex>\n <div\n className=\"oui-absolute oui-right-0 oui-top-0 oui-flex oui-h-full oui-items-center oui-justify-center oui-px-4\"\n onClick={() =>\n props.routerAdapter?.onRouteChange({\n href: PortfolioLeftSidebarPath.Assets,\n name: \"Assets\",\n })\n }\n >\n <ArrowRightShortIcon size={18} color=\"white\" opacity={0.54} />\n </div>\n </Flex>\n );\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n SettingFillIcon,\n ChevronRightIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { PortfolioLeftSidebarPath } from \"../../../layout\";\n\ntype Props = {\n routerAdapter?: RouterAdapter;\n};\n\nexport const SettingRouterMobile: FC<Props> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n direction={\"row\"}\n width={\"100%\"}\n className=\"oui-cursor-pointer oui-items-center oui-gap-2 oui-rounded-xl oui-bg-base-9 oui-p-4 oui-mb-3\"\n onClick={() =>\n props?.routerAdapter?.onRouteChange({\n href: PortfolioLeftSidebarPath.Setting,\n name: t(\"portfolio.setting\"),\n })\n }\n >\n <SettingFillIcon size={18} opacity={0.98} color=\"white\" />\n <Text className=\"oui-text-base oui-font-semibold oui-text-base-contrast-80\">\n {t(\"portfolio.setting\")}\n </Text>\n <ChevronRightIcon\n className=\"oui-ml-auto\"\n size={18}\n opacity={0.36}\n color=\"white\"\n />\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { RefferalAPI as API } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n TraderMobileIcon,\n ChevronRightIcon,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\n\nconst isNumber = (val: unknown): val is number => {\n return typeof val === \"number\" && !Number.isNaN(val);\n};\n\ntype TraderCardMobileProps = {\n referralInfo?: API.ReferralInfo;\n routerAdapter?: RouterAdapter;\n};\n\nexport const TraderCardMobile: FC<TraderCardMobileProps> = (props) => {\n const { t } = useTranslation();\n const { referralInfo, routerAdapter } = props;\n const rebate = referralInfo?.referee_info?.[\"30d_referee_rebate\"];\n return (\n <Flex\n className=\"\n oui-via-21.6% \n oui-via-83.23% \n oui-relative \n oui-h-[112px] \n oui-w-full \n oui-flex-col \n oui-items-start \n oui-rounded-xl \n oui-border\n oui-border-solid \n oui-border-[rgba(var(--oui-gradient-success-start)/0.36)]\n oui-bg-gradient-to-r\n oui-from-[rgba(var(--oui-gradient-success-end)/0.12)]\n oui-to-[rgba(var(--oui-gradient-success-start)/0.12)]\n oui-p-3\n \"\n >\n <Flex className=\"oui-w-full oui-flex-row oui-justify-between oui-items-center\">\n <Flex className=\"oui-flex-col oui-items-start\">\n <Text className=\"oui-text-base-contrast oui-text-base oui-font-semibold\">\n {t(\"affiliate.trader.rebates\")}\n </Text>\n <Text className=\"oui-text-2xs oui-font-normal oui-text-base-contrast-54\">\n {t(\"affiliate.trader.tradingRebates\")}\n </Text>\n </Flex>\n <TraderMobileIcon />\n </Flex>\n\n <Flex\n className={cn(\n \"oui-mt-auto oui-w-full oui-flex-row oui-items-center oui-gap-1\",\n )}\n >\n <img\n src=\"https://oss.orderly.network/static/symbol_logo/USDC.png\"\n alt=\"USDC\"\n className=\"oui-size-5\"\n />\n <Text\n className={cn(\n \"oui-text-xs oui-font-semibold\",\n isNumber(rebate) && rebate !== 0\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n >\n {commifyOptional(rebate, { fix: 2, fallback: \"--\" })}\n </Text>\n <Text className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-36\">\n (30D)\n </Text>\n <ChevronRightIcon\n size={18}\n color=\"white\"\n className=\"oui-ml-auto\"\n onClick={() => {\n routerAdapter?.onRouteChange({\n href: \"/rewards/affiliate?tab=trader\",\n name: t(\"tradingRewards.rewards\"),\n });\n }}\n />\n </Flex>\n </Flex>\n );\n};\n","export { FeeTierPage } from \"./page\";\nexport { useFeeTierScript } from \"./feeTier.script\";\nexport type { FeeDataType, UseFeeTierScriptOptions } from \"./feeTier.script\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useCallback } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Flex,\n Text,\n Card,\n Divider,\n DataTable,\n Column,\n useScreen,\n cn,\n TanstackColumn,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { FeeDataType, useFeeTierScriptReturn } from \"./feeTier.script\";\n\nconst LazyFeeTierHeader = React.lazy(() =>\n import(\"./feeTierHeader\").then((mod) => {\n return { default: mod.FeeTierHeader };\n }),\n);\n\nexport type FeeTierProps = useFeeTierScriptReturn;\n\nexport type FeeTierHeaderProps = {\n tier?: number;\n vol?: number;\n};\n\ntype FeeTierTableProps = {\n columns: Column<any>[];\n dataSource?: any[];\n page?: number;\n pageSize?: number;\n dataCount?: number;\n tier?: number | null;\n vol?: number | null;\n onRow?: (\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n onCell?: (\n column: TanstackColumn<any>,\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n};\n\nexport const FeeTierTable: React.FC<FeeTierTableProps> = (props) => {\n const { isMobile } = useScreen();\n\n const { tier, columns, dataSource, onRow, onCell } = props;\n\n const internalOnRow = useCallback(\n (record: FeeDataType, index: number) => {\n const config =\n typeof onRow === \"function\"\n ? onRow(record, index)\n : { normal: undefined, active: undefined };\n const active = tier !== undefined && tier !== null && tier === index + 1;\n if (active) {\n return {\n \"data-state\": \"active\",\n className: cn(\n \"oui-pointer-events-none oui-h-[54px] oui-text-[rgba(0,0,0,0.88)] oui-gradient-brand\",\n ),\n ...config.active,\n };\n } else {\n return {\n \"data-state\": \"none\",\n className: cn(\"oui-h-[54px]\"),\n ...config.normal,\n };\n }\n },\n [tier, onRow],\n );\n\n const internalOnCell = useCallback(\n (\n column: TanstackColumn<FeeDataType>,\n record: FeeDataType,\n index: number,\n ) => {\n const config =\n typeof onCell === \"function\"\n ? onCell(column, record, index)\n : { normal: undefined, active: undefined };\n const active = tier !== undefined && tier !== null && tier === index + 1;\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n if (active) {\n return {\n className: cn(\n isFirstColumn && \"oui-rounded-l-lg\",\n isLastColumn && \"oui-rounded-r-lg\",\n ),\n ...config.active,\n };\n } else {\n return {\n className: \"\",\n ...config.normal,\n };\n }\n },\n [tier, onCell],\n );\n\n return (\n <Box\n className={cn(\n \"oui-relative oui-border-b oui-border-line-4\",\n isMobile ? \"oui-mt-2 oui-rounded-xl oui-bg-base-9\" : undefined,\n )}\n >\n <DataTable\n bordered\n className=\"oui-font-semibold\"\n classNames={{ root: \"oui-bg-transparent\" }}\n onRow={internalOnRow}\n onCell={internalOnCell}\n columns={columns}\n dataSource={dataSource}\n />\n </Box>\n );\n};\n\nconst CardTitle: React.FC = () => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n if (isMobile) {\n return (\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={2}>\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.feeTier.updatedDailyBy\")}\n </Text>\n <Text size=\"xs\" intensity={80}>\n ~2:15 UTC\n </Text>\n </Flex>\n );\n }\n return (\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Text size={\"lg\"}>{t(\"portfolio.feeTier\")}</Text>\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={1}>\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.feeTier.updatedDailyBy\")}\n </Text>\n <Text size=\"xs\" intensity={80}>\n ~2:15 UTC\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nexport const FeeTier: React.FC<FeeTierProps> = (props) => {\n const { columns, dataSource, tier, vol, headerDataAdapter, onRow, onCell } =\n props;\n const { isMobile } = useScreen();\n return (\n <Card\n title={<CardTitle />}\n id=\"oui-portfolio-fee-tier\"\n className=\"w-full\"\n classNames={{\n root: isMobile ? \"oui-bg-transparent oui-p-2\" : \"oui-bg-base-9\",\n }}\n >\n {!isMobile && <Divider />}\n <React.Suspense fallback={null}>\n <LazyFeeTierHeader\n vol={vol}\n tier={tier}\n headerDataAdapter={headerDataAdapter}\n />\n </React.Suspense>\n <FeeTierTable\n dataSource={dataSource}\n columns={columns}\n vol={vol}\n tier={tier}\n onRow={onRow}\n onCell={onCell}\n />\n </Card>\n );\n};\n","import React from \"react\";\nimport { useFeeTierScript, type UseFeeTierScriptOptions } from \".\";\nimport { FeeTier } from \"./feeTier.ui\";\n\nexport type FeeTierWidgetProps = UseFeeTierScriptOptions;\n\nexport const FeeTierWidget: React.FC<FeeTierWidgetProps> = (props) => {\n const state = useFeeTierScript(props);\n return <FeeTier {...state} />;\n};\n","import React from \"react\";\nimport { FeeTierWidget, FeeTierWidgetProps } from \"./feeTier.widget\";\n\nexport type FeeTierPageProps = FeeTierWidgetProps;\n\nexport const FeeTierPage: React.FC<FeeTierPageProps> = (props) => {\n return <FeeTierWidget {...props} />;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { on } from \"events\";\nimport {\n useAccount,\n useAccountInfo,\n usePrivateQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum, API } from \"@kodiak-finance/orderly-types\";\nimport type { Column, TanstackColumn } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useFeeTierColumns } from \"./column\";\nimport { dataSource as defaultDataSource } from \"./dataSource\";\n\nexport type useFeeTierScriptReturn = ReturnType<typeof useFeeTierScript>;\n\nexport type UseFeeTierScriptOptions = {\n dataAdapter?: (\n columns: Column<any>[],\n dataSource: any[],\n context?: {\n tier?: number;\n },\n ) => {\n columns: Column<any>[];\n dataSource: any[];\n };\n headerDataAdapter?: (original: any[]) => any[];\n onRow?: (\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n onCell?: (\n column: TanstackColumn<any>,\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n};\n\nexport interface FeeDataType {\n tier: number | null;\n volume_min?: number | null;\n volume_max?: number | null;\n volume_node?: React.ReactNode;\n or?: string | null;\n maker_fee: string;\n taker_fee: string;\n}\n\nconst findCurrentTier = (feeList: FeeDataType[], data: API.AccountInfo) => {\n const { futures_taker_fee_rate = 0, futures_maker_fee_rate = 0 } = data;\n const takerRate = new Decimal(futures_taker_fee_rate).mul(0.01);\n const makerRate = new Decimal(futures_maker_fee_rate).mul(0.01);\n const findItem = feeList.find(\n (item) =>\n item.taker_fee === `${takerRate.toNumber()}%` &&\n item.maker_fee === `${makerRate.toNumber()}%`,\n );\n return findItem?.tier;\n};\n\nexport const useFeeTierScript = (options?: UseFeeTierScriptOptions) => {\n const { dataAdapter, headerDataAdapter, onRow, onCell } = options || {};\n const [tier, setTier] = useState<number | null>();\n const { data, isLoading } = useAccountInfo();\n const { state } = useAccount();\n\n const cols = useFeeTierColumns();\n\n const { data: volumeStatistics } = usePrivateQuery<{\n perp_volume_last_30_days: number;\n }>(\"/v1/volume/user/stats\");\n\n const { columns, dataSource } = useMemo(() => {\n return typeof dataAdapter === \"function\"\n ? dataAdapter(cols, defaultDataSource, { tier: tier! })\n : { columns: cols, dataSource: defaultDataSource };\n }, [dataAdapter, cols, tier]);\n\n useEffect(() => {\n if (!data || isLoading) {\n return;\n }\n setTier(findCurrentTier(dataSource, data));\n }, [data, isLoading, dataSource]);\n\n const authData = useDataTap(\n {\n tier: tier,\n vol: volumeStatistics?.perp_volume_last_30_days,\n },\n {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n },\n );\n\n return {\n ...authData,\n columns: columns,\n dataSource: dataSource,\n onRow: onRow,\n onCell: onCell,\n headerDataAdapter: headerDataAdapter,\n };\n};\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport { numberToHumanStyle } from \"@kodiak-finance/orderly-utils\";\nimport type { FeeDataType } from \"./feeTier.script\";\n\nconst textStyle: React.CSSProperties = {\n fontVariantLigatures: \"none\",\n};\n\nexport const useFeeTierColumns = () => {\n const { t } = useTranslation();\n return useMemo<Column<FeeDataType>[]>(() => {\n return [\n {\n title: t(\"portfolio.feeTier.column.tier\"),\n dataIndex: \"tier\",\n align: \"left\",\n width: 100,\n },\n {\n title: `${t(\"portfolio.feeTier.column.30dVolume\")} (USDC)`,\n dataIndex: \"volume\",\n align: \"center\",\n width: 180,\n render: (val, record) => {\n const { volume_min, volume_max, volume_node } = record;\n if (volume_node) {\n return volume_node;\n }\n if (!volume_min && !volume_max) {\n return <div style={textStyle}>--</div>;\n }\n if (volume_min && !volume_max) {\n return t(\"portfolio.feeTier.column.30dVolume.above\", {\n volume: numberToHumanStyle(\n volume_min,\n volume_min === 2500000 ? 1 : 0,\n ),\n });\n }\n return (\n <div>\n {volume_min &&\n numberToHumanStyle(volume_min, volume_min === 2500000 ? 1 : 0)}\n {` - `}\n {volume_max &&\n numberToHumanStyle(volume_max, volume_max === 2500000 ? 1 : 0)}\n </div>\n );\n },\n },\n {\n title: t(\"portfolio.feeTier.column.maker\"),\n dataIndex: \"maker_fee\",\n align: \"right\",\n width: 100,\n },\n {\n title: t(\"portfolio.feeTier.column.taker\"),\n dataIndex: \"taker_fee\",\n align: \"right\",\n width: 100,\n },\n ];\n }, [t]);\n};\n","import type { FeeDataType } from \"./feeTier.script\";\n\nexport const dataSource: FeeDataType[] = [\n {\n tier: 1,\n volume_min: 0,\n volume_max: 500000,\n maker_fee: \"0.025%\",\n taker_fee: \"0.04%\",\n },\n {\n tier: 2,\n volume_min: 500000,\n volume_max: 1000000,\n maker_fee: \"0.02%\",\n taker_fee: \"0.035%\",\n },\n {\n tier: 3,\n volume_min: 1000000,\n volume_max: 5000000,\n maker_fee: \"0.018%\",\n taker_fee: \"0.03%\",\n },\n {\n tier: 4,\n volume_min: 5000000,\n volume_max: 20000000,\n maker_fee: \"0.012%\",\n taker_fee: \"0.025%\",\n },\n {\n tier: 5,\n volume_min: 20000000,\n volume_max: 50000000,\n or: \"/\",\n maker_fee: \"0.009%\",\n taker_fee: \"0.022%\",\n },\n {\n tier: 6,\n volume_min: 50000000,\n volume_max: 100000000,\n or: \"/\",\n maker_fee: \"0.005%\",\n taker_fee: \"0.018%\",\n },\n {\n tier: 7,\n volume_min: 100000000,\n volume_max: undefined,\n or: \"/\",\n maker_fee: \"0%\",\n taker_fee: \"0.015%\",\n },\n];\n","import { useMemo, useState, useRef } from \"react\";\nimport React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n Divider,\n Box,\n Tabs,\n TabPanel,\n DataFilter,\n formatAddress,\n Tooltip,\n InfoCircleIcon,\n Button,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n LiquidationWidget,\n PositionHistoryWidget,\n PositionHistoryInstance,\n PositionsProps,\n CombinePositionsWidget,\n PositionsWidget,\n PositionsInstance,\n} from \"@kodiak-finance/orderly-ui-positions\";\nimport type { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport { AccountType } from \"../assets/assetsPage/assets.ui.desktop\";\n\nenum TabsType {\n positions = \"Positions\",\n positionHistory = \"Position history\",\n liquidation = \"Liquidation\",\n}\n\nexport const PositionsPage: React.FC<PositionsProps> = (props) => {\n const [tab, setTab] = useState(TabsType.positions);\n const { t } = useTranslation();\n const { state, isMainAccount } = useAccount();\n\n const subAccounts = state.subAccounts ?? [];\n\n const [selectedAccount, setAccount] = React.useState<string>(AccountType.ALL);\n\n const positionsRef = useRef<PositionsInstance>(null);\n const positionHistoryRef = useRef<PositionHistoryInstance>(null);\n\n const onAccountFilter = React.useCallback(\n (filter: { name: string; value: string }) => {\n const { name, value } = filter;\n if (name === \"account\") {\n setAccount(value);\n }\n },\n [],\n );\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [subAccounts]);\n\n return (\n <Flex\n // p={6}\n direction={\"column\"}\n itemAlign={\"start\"}\n gap={4}\n width=\"100%\"\n height=\"100%\"\n >\n <Flex width=\"100%\" justify=\"between\">\n <Text size=\"lg\">{t(\"common.positions\")}</Text>\n <Button color=\"gray\" size=\"sm\" className=\"oui-bg-base-4\" disabled>\n Export to CSV\n </Button>\n </Flex>\n <Divider className=\"oui-w-full\" />\n {/* 26(title height) + 1(divider) + 32 (padding) */}\n <Box width=\"100%\" className=\"oui-h-[calc(100%_-_59px)]\">\n <Tabs\n value={tab}\n onValueChange={(e) => setTab(e as any)}\n classNames={{\n tabsList: \"!oui-border-none oui-pb-1\",\n tabsContent: \"oui-h-[calc(100%_-_28px)]\",\n trigger: \"oui-group\",\n }}\n className=\"oui-h-full\"\n >\n <TabPanel value={TabsType.positions} title={t(\"common.positions\")}>\n <Flex direction=\"column\" gap={3} width=\"100%\" height=\"100%\">\n {isMainAccount ? (\n <>\n <DataFilter\n onFilter={onAccountFilter}\n items={[\n {\n type: \"select\",\n name: \"account\",\n value: selectedAccount,\n options: memoizedOptions,\n },\n ]}\n />\n <CombinePositionsWidget\n ref={positionsRef}\n selectedAccount={selectedAccount}\n {...props}\n />\n </>\n ) : (\n <PositionsWidget\n ref={positionsRef}\n {...props}\n enableSortingStorage={false}\n />\n )}\n </Flex>\n </TabPanel>\n <TabPanel\n value={TabsType.positionHistory}\n title={t(\"positions.positionHistory\")}\n >\n <Flex direction=\"column\" gap={3} width=\"100%\" height=\"100%\">\n <PositionHistoryWidget\n ref={positionHistoryRef}\n {...props}\n enableSortingStorage={false}\n />\n </Flex>\n </TabPanel>\n <TabPanel value={TabsType.liquidation} title={<LiquidationTab />}>\n <LiquidationWidget />\n </TabPanel>\n </Tabs>\n </Box>\n </Flex>\n );\n};\n\nconst LiquidationTab: React.FC = () => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-space-x-1\">\n <span>{t(\"positions.liquidation\")}</span>\n <Tooltip\n className=\"oui-max-w-[275px] oui-bg-base-6\"\n content={\n <div>\n <div className=\"oui-text-pretty\">\n {t(\"positions.Liquidation.tooltip.liquidation\")}\n </div>\n <div>\n <a\n href=\"https://orderly.network/docs/introduction/trade-on-orderly/perpetual-futures/liquidations\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"oui-text-primary\"\n >\n {t(\"positions.Liquidation.tooltip.viewMore\")}\n </a>\n </div>\n </div>\n }\n arrow={{\n className: \"oui-fill-base-6\",\n }}\n >\n <button className=\"oui-hidden group-data-[state=active]:oui-block\">\n <InfoCircleIcon />\n </button>\n </Tooltip>\n </div>\n );\n};\n","import { FC, SVGProps, useRef } from \"react\";\nimport React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Button,\n Divider,\n Flex,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n OrderListInstance,\n OrdersWidget,\n} from \"@kodiak-finance/orderly-ui-orders\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\n\nexport const OrdersPage: React.FC<{ sharePnLConfig?: SharePnLConfig }> = (\n props,\n) => {\n const { sharePnLConfig } = props;\n const { t } = useTranslation();\n\n const ordersRef = useRef<OrderListInstance>(null);\n\n return (\n <Flex\n // p={6}\n direction={\"column\"}\n itemAlign={\"start\"}\n gap={4}\n width=\"100%\"\n height=\"100%\"\n >\n <Flex width=\"100%\" justify=\"between\">\n <Text size=\"lg\">{t(\"common.orders\")}</Text>\n <Tooltip content={t(\"orders.download.tooltip\")}>\n <Button color=\"gray\" size=\"sm\" className=\"oui-bg-base-4\" disabled>\n {t(\"common.download\")}\n <TooltipIcon className=\"oui-text-base-contrast-36 oui-ml-[5px]\" />\n </Button>\n </Tooltip>\n </Flex>\n <Divider className=\"oui-w-full\" />\n {/* 26(title height) + 1(divider) + 32 (padding) */}\n <Box width=\"100%\" className=\"oui-h-[calc(100%_-_59px)]\">\n <OrdersWidget ref={ordersRef} sharePnLConfig={sharePnLConfig} />\n </Box>\n </Flex>\n );\n};\n\nconst TooltipIcon = React.forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path d=\"M5.999 1.007a5 5 0 1 0 0 10 5 5 0 0 0 0-10m0 2.5a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1m0 1.5a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-1 0v-2.5a.5.5 0 0 1 .5-.5\" />\n </svg>\n );\n },\n);\n","export { APIManagerWidget } from \"./apiManager.widget\";\nexport { APIManagerPage } from \"./apiManager.page\";\n","import { APIManager } from \"./apiManager.ui\";\nimport { useApiManagerScript } from \"./apiManager.script\";\n\n\nexport const APIManagerWidget = (props?: {\n filterTags?: [string];\n keyStatus?: string;\n}) => {\n const state = useApiManagerScript(props);\n return <APIManager {...state} />;\n};\n","import { APIManagerWidget } from \"./apiManager.widget\";\n\n/**\n * API key manager page\n * @param filterTags filterTags\n * @param keyStatus filterTags default is \"ACTIVE\"\n * @returns\n */\nexport const APIManagerPage = (props: {\n filterTags?: [string];\n keyStatus?: string;\n}) => {\n const { filterTags, keyStatus = \"ACTIVE\" } = props;\n return <APIManagerWidget filterTags={filterTags} keyStatus={keyStatus}/>;\n};\n","export { SettingWidget } from \"./setting.widget\";\nexport { SettingPage } from \"./setting.page\";\n","import { useEffect, useState } from \"react\";\nimport {\n useAccount,\n useAccountInfo,\n useDebouncedCallback,\n useMutation,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\n\nexport type SettingScriptReturns = {\n maintenance_cancel_orders?: boolean;\n setMaintainConfig: (maintenance_cancel_order_flag: boolean) => void;\n isSetting: boolean;\n canTouch: boolean;\n};\n\nexport const useSettingScript = (): SettingScriptReturns => {\n const { data, mutate: refresh } = useAccountInfo();\n const { wrongNetwork, disabledConnect } = useAppContext();\n const [update, { isMutating }] = useMutation(\"/v1/client/maintenance_config\");\n const [checked, setChecked] = useState(false);\n\n useEffect(() => {\n setChecked(data?.maintenance_cancel_orders || false);\n }, [data]);\n\n const updateCheckState = useDebouncedCallback((value: boolean) => {\n // if (value === data?.maintenance_cancel_orders) return;\n update({\n maintenance_cancel_order_flag: value,\n }).then((data) => {\n if (data.success) {\n toast.success(value ? \"Opened\" : \"Closed\");\n } else {\n setChecked(!value);\n }\n });\n }, 300);\n\n const setMaintainConfig = (maintenance_cancel_order_flag: boolean) => {\n setChecked(maintenance_cancel_order_flag);\n updateCheckState(maintenance_cancel_order_flag);\n };\n const { state } = useAccount();\n\n const canTouch =\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n return {\n maintenance_cancel_orders: checked, //data?.maintenance_cancel_orders,\n setMaintainConfig,\n isSetting: false,\n canTouch,\n };\n};\n","import { FC } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { SettingScriptReturns } from \"./setting.script\";\nimport { SettingDesktop } from \"./setting.ui.desktop\";\nimport { SettingMobile } from \"./setting.ui.mobile\";\n\nexport const Setting: FC<SettingScriptReturns> = (props) => {\n const { isMobile } = useScreen();\n if (isMobile) {\n return (\n <div className=\"oui-px-3\">\n <SettingMobile {...props} />\n </div>\n );\n }\n return <SettingDesktop {...props} />;\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Card, Flex, Switch, Text } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardTooltip } from \"@kodiak-finance/orderly-ui-connector\";\nimport type { SettingScriptReturns } from \"./setting.script\";\n\nexport const SettingDesktop: FC<SettingScriptReturns> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Card\n title={t(\"portfolio.setting.systemUpgrade\")}\n id=\"portfolio-apikey-manager\"\n className=\"oui-bg-base-9 oui-font-semibold\"\n >\n <Flex\n direction={\"row\"}\n gap={4}\n width={\"100%\"}\n itemAlign={\"center\"}\n pt={4}\n className=\"oui-border-t-2 oui-border-line-6 oui-font-semibold\"\n >\n <Flex direction={\"column\"} itemAlign={\"start\"} className=\"oui-flex-1\">\n <Text intensity={80} size=\"base\">\n {t(\"portfolio.setting.cancelOpenOrders\")}\n </Text>\n <Text intensity={54} size=\"sm\">\n {t(\"portfolio.setting.cancelOpenOrders.description\")}\n </Text>\n </Flex>\n\n <AuthGuardTooltip align=\"end\">\n <Switch\n checked={props.maintenance_cancel_orders}\n onCheckedChange={(e) => {\n props.setMaintainConfig(e);\n }}\n disabled={props.isSetting || !props.canTouch}\n data-testid=\"oui-testid-setting-switch-btn\"\n />\n </AuthGuardTooltip>\n </Flex>\n </Card>\n );\n};\n","import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Card,\n Flex,\n Switch,\n Text,\n ChevronRightIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardTooltip } from \"@kodiak-finance/orderly-ui-connector\";\nimport { LanguageSwitcherWidget } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport type { SettingScriptReturns } from \"./setting.script\";\n\nexport const SettingMobile: FC<SettingScriptReturns> = (props) => {\n const { t } = useTranslation();\n const [open, setOpen] = useState<boolean>(false);\n const onLanguageChange = () => {\n setOpen(true);\n };\n\n return (\n <>\n <Flex mt={1} mb={2} p={4} intensity={900} r=\"xl\" itemAlign=\"center\">\n <LanguageSwitcherWidget open={open} onOpenChange={setOpen} />\n <Flex\n className=\"oui-cursor-pointer\"\n itemAlign=\"center\"\n width=\"100%\"\n onClick={onLanguageChange}\n >\n <Text\n size=\"base\"\n weight=\"semibold\"\n intensity={80}\n className=\"oui-ml-2\"\n >\n {t(\"languageSwitcher.language\")}\n </Text>\n <ChevronRightIcon\n size={18}\n className=\"oui-ml-auto oui-text-base-contrast-36\"\n />\n </Flex>\n </Flex>\n\n <Card\n // @ts-ignore\n title={\n <div className=\"oui-text-sm\">\n {t(\"portfolio.setting.systemUpgrade\")}\n </div>\n }\n id=\"portfolio-apikey-manager\"\n className=\"oui-bg-base-9 oui-font-semibold\"\n classNames={{ root: \"oui-p-4\", content: \"!oui-pt-3\" }}\n >\n <Flex\n direction={\"row\"}\n gap={4}\n width={\"100%\"}\n itemAlign={\"center\"}\n pt={3}\n className=\"oui-font-semibold oui-border-t-2 oui-border-line-6\"\n >\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-flex-1 oui-gap-2\"\n >\n <Text intensity={80} size=\"xs\">\n {t(\"portfolio.setting.cancelOpenOrders\")}\n </Text>\n <Text intensity={36} size=\"2xs\" className=\"oui-font-normal\">\n {t(\"portfolio.setting.cancelOpenOrders.description\")}\n </Text>\n <AuthGuardTooltip>\n <Switch\n className=\"oui-mt-1\"\n checked={props.maintenance_cancel_orders}\n onCheckedChange={(e) => {\n props.setMaintainConfig(e);\n }}\n disabled={props.isSetting || !props.canTouch}\n data-testid=\"oui-testid-setting-switch-btn\"\n />\n </AuthGuardTooltip>\n </Flex>\n </Flex>\n </Card>\n </>\n );\n};\n","import React from \"react\";\nimport { useSettingScript } from \"./setting.script\";\nimport { Setting } from \"./setting.ui\";\n\nexport const SettingWidget: React.FC = () => {\n const state = useSettingScript();\n return <Setting {...state} />;\n};\n","import React from \"react\";\nimport { SettingWidget } from \"./setting.widget\";\n\nexport const SettingPage: React.FC = () => {\n return <SettingWidget />;\n};\n","export { AssetsPage } from \"./page\";\nexport {\n AssetsWidget,\n AssetsDataTableWidget,\n} from \"./assetsPage/assets.widget\";\nexport type { AssetsWidgetProps } from \"./assetsPage/assets.widget\";\nexport { AssetsTable, AssetsDataTable } from \"./assetsPage/assets.ui.desktop\";\nexport { AssetsTableMobile } from \"./assetsPage/assets.ui.mobile\";\n","import React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useAssetsScript } from \"./assets.script\";\nimport type { useAssetsScriptReturn } from \"./assets.script\";\nimport { AssetsDataTable, AssetsTable } from \"./assets.ui.desktop\";\nimport { AssetsTableMobile } from \"./assets.ui.mobile\";\n\nexport type AssetsWidgetProps = useAssetsScriptReturn;\n\nexport const AssetsDataTableWidget: React.FC = () => {\n const assetsState = useAssetsScript();\n const accountState = useAccount();\n return <AssetsDataTable {...assetsState} {...accountState} />;\n};\n\nexport const AssetsWidget: React.FC = () => {\n const assetsState = useAssetsScript();\n const accountState = useAccount();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <AssetsTableMobile {...assetsState} {...accountState} />;\n }\n return <AssetsTable {...assetsState} {...accountState} />;\n};\n","import { useCallback, useEffect, useMemo } from \"react\";\nimport {\n useAccount,\n useCollateral,\n useLocalStorage,\n useIndexPricesStream,\n useTokensInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { account } from \"@kodiak-finance/orderly-perp\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport {\n DepositAndWithdrawWithDialogId,\n TransferDialogId,\n} from \"@kodiak-finance/orderly-ui-transfer\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\nimport { useAccountsData, useAssetsMultiFilter } from \"../../../hooks\";\nimport { useAssetTotalValue } from \"../../../hooks/useAssetTotalValue\";\nimport { ORDERLY_ASSETS_VISIBLE_KEY } from \"../type\";\nimport { useAssetsColumns } from \"./assets.column\";\n\nexport const useAssetsScript = () => {\n const [visible, setVisible] = useLocalStorage<boolean>(\n ORDERLY_ASSETS_VISIBLE_KEY,\n true,\n );\n\n const { state, subAccount, isMainAccount } = useAccount();\n const { holding = [] } = useCollateral();\n const { getIndexPrice } = useIndexPricesStream();\n\n const tokensInfo = useTokensInfo();\n\n const subAccounts = state.subAccounts ?? [];\n\n useEffect(() => {\n if (holding.length > 0) {\n subAccount.refresh();\n }\n }, [holding]);\n\n // Use the extracted total value hook\n const totalValue = useAssetTotalValue();\n\n const toggleVisible = () => {\n // @ts-ignore\n setVisible((visible: boolean) => !visible);\n };\n\n const assetsOptions = useMemo(() => {\n return tokensInfo?.map((item) => ({\n label: item.token,\n value: item.token,\n }));\n }, [tokensInfo]);\n\n // Use the extracted accounts data hook\n const allAccounts = useAccountsData();\n\n // Use the extracted account and asset filter hook\n const {\n selectedAccount,\n selectedAsset,\n filteredData: filtered,\n onFilter,\n } = useAssetsMultiFilter(allAccounts);\n\n // Enhanced filtered data with additional calculations for children\n const enhancedFiltered = useMemo(() => {\n return filtered.map((accountData) => {\n // Enhance each child (holding) with calculated fields\n const enhancedChildren =\n accountData.children?.map((holding) => {\n const tokenInfo = tokensInfo?.find(\n (item) => item.token === holding.token,\n );\n\n // Use extracted function for index price calculation\n const indexPrice = getIndexPrice(holding.token);\n\n // Use extracted function for asset value calculation\n const assetValue = new Decimal(holding.holding)\n .mul(indexPrice)\n .toNumber();\n\n // Calculate collateral ratio for this token\n const collateralRatio = tokenInfo\n ? account.collateralRatio({\n baseWeight: tokenInfo.base_weight ?? 0,\n discountFactor: tokenInfo.discount_factor ?? 0,\n collateralQty: holding.holding,\n collateralCap: tokenInfo?.user_max_qty ?? holding.holding,\n indexPrice: indexPrice,\n })\n : zero;\n\n // Calculate collateral contribution for this token\n const collateralContribution = account.collateralContribution({\n collateralQty: holding.holding,\n collateralCap: tokenInfo?.user_max_qty ?? holding.holding,\n collateralRatio: collateralRatio.toNumber(),\n indexPrice: indexPrice,\n });\n\n return {\n ...holding,\n indexPrice,\n assetValue,\n collateralRatio,\n collateralContribution,\n };\n }) || [];\n\n return {\n ...accountData,\n children: enhancedChildren,\n };\n });\n }, [filtered, getIndexPrice, tokensInfo]);\n\n const handleTransfer = useCallback((accountId: string, token: string) => {\n if (!accountId) {\n return;\n }\n modal.show(TransferDialogId, {\n toAccountId: accountId,\n token,\n });\n }, []);\n\n const handleConvert = (accountId: string, token: string) => {\n modal.show(\"ConvertDialogId\", {\n accountId,\n token,\n });\n };\n\n const showTransfer = isMainAccount ? subAccounts.length > 0 : true;\n\n const assetsColumns = useAssetsColumns({\n onTransfer: showTransfer ? handleTransfer : undefined,\n onConvert: handleConvert,\n });\n\n const openDepositAndWithdraw = useCallback(\n (viewName: \"deposit\" | \"withdraw\") => {\n modal.show(DepositAndWithdrawWithDialogId, {\n activeTab: viewName,\n });\n },\n [],\n );\n\n const onDeposit = useCallback(() => {\n openDepositAndWithdraw(\"deposit\");\n }, []);\n\n const onWithdraw = useCallback(() => {\n openDepositAndWithdraw(\"withdraw\");\n }, []);\n\n return {\n columns: assetsColumns,\n dataSource: enhancedFiltered, // Use enhanced filtered data with calculated children\n visible: visible as boolean,\n onToggleVisibility: toggleVisible,\n selectedAccount,\n selectedAsset,\n onFilter,\n totalValue,\n hasSubAccount: subAccounts.length > 0,\n onDeposit,\n onWithdraw,\n holding,\n assetsOptions: assetsOptions ?? EMPTY_LIST,\n };\n};\n\nexport type useAssetsScriptReturn = ReturnType<typeof useAssetsScript> &\n ReturnType<typeof useAccount>;\n","import React from \"react\";\nimport { useTokensInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useWalletConnector } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport { Button, Flex, Text, TokenIcon } from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\n\nexport interface ColumnsOptions {\n onTransfer?: (accountId: string, token: string) => void;\n onConvert?: (accountId: string, token: string) => void;\n}\n\n// Define the enhanced holding interface with calculated fields\ninterface EnhancedHolding {\n token: string;\n holding: number;\n indexPrice: number;\n assetValue: number;\n collateralRatio: number;\n collateralContribution: number;\n account_id: string;\n}\n\nexport const useAssetsColumns = (options: ColumnsOptions) => {\n const { t } = useTranslation();\n const tokensInfo = useTokensInfo();\n const { namespace } = useWalletConnector();\n const { onTransfer, onConvert } = options;\n const columns = React.useMemo<Column[]>(() => {\n return [\n {\n title: t(\"portfolio.overview.column.token\"),\n dataIndex: \"token\",\n align: \"left\",\n width: 150,\n render(val: string) {\n return (\n <Flex itemAlign=\"center\" gap={2}>\n <TokenIcon name={val} />\n {val}\n </Flex>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.qty\"),\n dataIndex: \"holding\",\n align: \"left\",\n width: 140,\n render(val: number, record) {\n const findToken = tokensInfo?.find(\n ({ token }) => token === record.token,\n );\n return (\n <Text.numeral dp={findToken?.decimals ?? 6} padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.indexPrice\"),\n dataIndex: \"indexPrice\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral rule=\"price\" dp={6} currency=\"$\" padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.assetValue\"),\n dataIndex: \"assetValue\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral rule=\"price\" dp={6} currency=\"$\" padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.collateralRatio\"),\n dataIndex: \"collateralRatio\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral dp={2} suffix=\"%\">\n {val * 100}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"transfer.deposit.collateralContribution\"),\n dataIndex: \"collateralContribution\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral rule=\"price\" dp={6} currency=\"$\" padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: null,\n dataIndex: \"account_id\",\n align: \"center\",\n width: 180,\n render(id: string, record: EnhancedHolding) {\n const { token } = record;\n return (\n <Flex itemAlign=\"center\" justify=\"end\" gap={3}>\n {token !== \"USDC\" &&\n namespace !== ChainNamespace.solana &&\n typeof onConvert === \"function\" && (\n <Button\n size={\"sm\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={() => onConvert?.(id, token)}\n >\n {t(\"transfer.convert\")}\n </Button>\n )}\n {typeof onTransfer === \"function\" && (\n <Button\n size={\"sm\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={() => onTransfer?.(id, token)}\n >\n {t(\"common.transfer\")}\n </Button>\n )}\n </Flex>\n );\n },\n },\n ];\n }, [t, tokensInfo, onTransfer, onConvert, namespace]);\n return columns;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo } from \"react\";\nimport { useWalletConnector } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n cn,\n TokenIcon,\n Text,\n formatAddress,\n DataFilter,\n modal,\n Flex,\n} from \"@kodiak-finance/orderly-ui\";\nimport { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport type { useAssetsScriptReturn } from \"./assets.script\";\nimport { AccountType } from \"./assets.ui.desktop\";\n\nconst AccountTag: React.FC<{ name: string }> = ({ name }) => {\n return (\n <div className=\"oui-mt-2 oui-flex oui-h-[18px] oui-w-fit oui-items-center oui-rounded oui-bg-white/[0.06] oui-px-2 oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {name}\n </div>\n );\n};\n\ntype AssetMobileItemProps = {\n item: any;\n};\n\nconst AssetMobileItem: React.FC<AssetMobileItemProps> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n const { namespace } = useWalletConnector();\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <Flex\n width={\"100%\"}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-gap-x-0.5\"\n >\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"common.token\")}\n </div>\n <Flex\n gap={1}\n justify={\"start\"}\n itemAlign={\"center\"}\n className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-80\"\n >\n <TokenIcon name={item.token} size=\"2xs\" />\n {item.token}\n </Flex>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"common.qty\")}\n </div>\n <Text.numeral\n className=\"oui-truncate\"\n size=\"xs\"\n dp={6}\n padding={false}\n >\n {item.holding}\n </Text.numeral>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-w-full oui-text-end oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"common.indexPrice\")}\n </div>\n <Flex\n gap={1}\n width={\"100%\"}\n justify={\"end\"}\n itemAlign={\"center\"}\n className=\"oui-text-end oui-font-semibold oui-text-base-contrast-80\"\n >\n <Text.numeral\n size=\"xs\"\n rule=\"price\"\n dp={6}\n currency=\"$\"\n padding={false}\n >\n {item.indexPrice}\n </Text.numeral>\n <div className=\"oui-text-end oui-text-2xs oui-text-base-contrast-36\">\n USDC\n </div>\n </Flex>\n </Flex>\n </Flex>\n <Flex\n width={\"100%\"}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-gap-x-0.5\"\n >\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"portfolio.overview.column.assetValue\")}\n </div>\n <Text.numeral\n size=\"xs\"\n intensity={80}\n className=\"oui-truncate oui-font-semibold\"\n rule=\"price\"\n dp={6}\n currency=\"$\"\n padding={false}\n >\n {item.assetValue}\n </Text.numeral>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"portfolio.overview.column.collateralRatio\")}\n </div>\n <Text.numeral size=\"xs\" dp={2} suffix=\"%\">\n {item.collateralRatio * 100}\n </Text.numeral>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-w-full oui-text-end oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"transfer.deposit.collateralContribution\")}\n </div>\n <Flex\n gap={1}\n width={\"100%\"}\n justify={\"end\"}\n itemAlign={\"center\"}\n className=\"oui-text-end oui-font-semibold oui-text-base-contrast-80\"\n >\n <Text.numeral\n size=\"xs\"\n rule=\"price\"\n dp={6}\n currency=\"$\"\n padding={false}\n >\n {item.collateralContribution}\n </Text.numeral>\n <div className=\"oui-text-end oui-text-2xs oui-text-base-contrast-36\">\n USDC\n </div>\n </Flex>\n </Flex>\n </Flex>\n <Flex justify={\"between\"} itemAlign={\"center\"} gap={2}>\n {item.token !== \"USDC\" && namespace !== ChainNamespace.solana && (\n <Button\n fullWidth\n variant=\"outlined\"\n size=\"sm\"\n color=\"gray\"\n onClick={() => {\n modal.show(\"ConvertSheetId\", {\n accountId: item.account_id,\n token: item.token,\n });\n }}\n className={cn(\n \"oui-flex-1 oui-border-white/[0.36] oui-text-base-contrast-54\",\n )}\n >\n {t(\"transfer.convert\")}\n </Button>\n )}\n <Button\n fullWidth\n variant=\"outlined\"\n size=\"sm\"\n color=\"gray\"\n onClick={() => {\n modal.show(\"TransferSheetId\", {\n accountId: item.account_id,\n token: item.token,\n });\n }}\n className={cn(\n \"oui-flex-1 oui-border-white/[0.36] oui-text-base-contrast-54\",\n )}\n >\n {t(\"common.transfer\")}\n </Button>\n </Flex>\n </div>\n );\n};\n\nexport const AssetsTableMobile: React.FC<useAssetsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n const {\n assetsOptions,\n state,\n isMainAccount,\n dataSource,\n selectedAccount,\n selectedAsset,\n onFilter,\n } = props;\n\n const subAccounts = state.subAccounts ?? [];\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const ALL_ASSETS: SelectOption = {\n label: \"All assets\",\n value: \"all\",\n };\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [subAccounts]);\n\n // Create asset options from holding data - optimized and consistent with desktop\n const memoizedAssets = useMemo(() => {\n return [ALL_ASSETS, ...assetsOptions];\n }, [assetsOptions]);\n\n return (\n <div className={cn(\"oui-flex oui-flex-col oui-gap-1 oui-px-1 oui-pb-4\")}>\n {isMainAccount && (\n <DataFilter\n onFilter={onFilter}\n className=\"oui-border-none oui-py-2\"\n items={[\n {\n size: \"sm\",\n type: \"picker\",\n name: \"account\",\n value: selectedAccount,\n options: memoizedOptions,\n },\n {\n size: \"sm\",\n type: \"picker\",\n name: \"asset\",\n value: selectedAsset,\n options: memoizedAssets,\n },\n ]}\n />\n )}\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n {dataSource.map((assets, index) => {\n return (\n <React.Fragment key={`item-${index}`}>\n <AccountTag name={assets.description ?? \"sub account\"} />\n {Array.isArray(assets.children) &&\n assets.children.map((child) => (\n <AssetMobileItem\n item={child}\n key={`${child.token}-${child.account_id}`}\n />\n ))}\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { AssetsWidget } from \"./assetsPage/assets.widget\";\nimport type { AssetsWidgetProps } from \"./assetsPage/assets.widget\";\n\nexport type AssetsPageProps = AssetsWidgetProps;\n\nexport const AssetsPage: React.FC = () => {\n return <AssetsWidget />;\n};\n","export { HistoryPage } from \"./history.page\";\nexport { HistoryWidget } from \"./history.page\";\n","import React from \"react\";\nimport { HistoryDataGroupWidget } from \"../overview/historyDataGroup\";\n\nexport const HistoryWidget: React.FC = () => {\n return <HistoryDataGroupWidget />;\n};\n\nexport const HistoryPage: React.FC = () => {\n return <HistoryDataGroupWidget />;\n};\n","export { SymbolPerformancePage } from \"./page\";\nexport { SymbolPerformanceWidget } from \"./symbolPerformance.widget\";\nexport { SymbolPerformanceUI } from \"./symbolPerformance.ui\";\nexport { useSymbolPerformanceScript } from \"./symbolPerformance.script\";\nexport type {\n UseSymbolPerformanceScriptReturn,\n Timeframe,\n} from \"./symbolPerformance.script\";\n","import React from \"react\";\nimport { Box } from \"@kodiak-finance/orderly-ui\";\nimport { SymbolPerformanceWidget } from \"./symbolPerformance.widget\";\n\nexport const SymbolPerformancePage: React.FC = () => {\n return (\n <Box\n p={6}\n pb={0}\n intensity={900}\n r=\"xl\"\n width=\"100%\"\n style={{\n minHeight: 379,\n maxHeight: 2560,\n overflow: \"auto\",\n }}\n >\n <SymbolPerformanceWidget />\n </Box>\n );\n};\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useSymbolPerformanceScript } from \"./symbolPerformance.script\";\nimport { SymbolPerformanceUI } from \"./symbolPerformance.ui\";\nimport { SymbolPerformanceUIMobile } from \"./symbolPerformance.ui.mobile\";\n\nexport const SymbolPerformanceWidget: React.FC<{ symbol?: string }> = ({\n symbol,\n}) => {\n const { isMobile } = useScreen();\n const state = useSymbolPerformanceScript(symbol);\n\n if (isMobile) {\n return <SymbolPerformanceUIMobile {...state} />;\n }\n\n return <SymbolPerformanceUI {...state} />;\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays, subDays, addDays, format, endOfDay } from \"date-fns\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useSymbolPerformanceData } from \"./useSymbolPerformanceData\";\nimport { useTrades } from \"./useTrades\";\n\nexport enum PeriodType {\n DAY = \"1D\",\n WEEK = \"7D\",\n MONTH = \"30D\",\n QUARTER = \"90D\",\n}\n\nexport enum AggregationWindow {\n FIFTEEN_MIN = \"15m\",\n HOURLY = \"1h\",\n DAILY = \"1d\",\n}\n\nexport type Timeframe = \"1D\" | \"7D\" | \"30D\" | \"90D\" | \"ALL\";\n\n/**\n * Number of days in each preset period.\n * DAY = 2 means \"today and yesterday\" (inclusive range)\n */\nconst PRESET_DAYS = {\n [PeriodType.DAY]: 2,\n [PeriodType.WEEK]: 7,\n [PeriodType.MONTH]: 30,\n [PeriodType.QUARTER]: 90,\n} as const;\n\nconst getDateRange = (period: PeriodType | number, today: Date) => {\n const offsetDay = typeof period === \"number\" ? period : PRESET_DAYS[period];\n return {\n from: subDays(today, offsetDay - 1),\n to: today,\n };\n};\n\nconst formatDateOnly = (date: Date): string => {\n return date.toISOString().split(\"T\")[0];\n};\n\nconst formatDateRange = (date?: Date) => {\n if (typeof date === \"undefined\") return undefined;\n return format(date, \"yyyy-MM-dd\");\n};\n\n/**\n * Normalize a date to UTC midnight to prevent timezone-related date shifting.\n * Extracts the date components and reconstructs as UTC to ensure consistency\n * across different timezones.\n *\n * @example\n * // Input: Nov 19 2025 00:00:00 GMT+0100 (which is Nov 18 23:00:00 UTC)\n * // Output: Nov 19 2025 00:00:00 UTC\n *\n * @param date - Date to normalize\n * @returns Date at midnight UTC with same calendar date\n */\nconst normalizeDateToUTC = (date: Date): Date => {\n const dateStr = format(date, \"yyyy-MM-dd\");\n const [year, month, day] = dateStr.split(\"-\").map(Number);\n return new Date(Date.UTC(year, month - 1, day));\n};\n\nexport const useSymbolPerformanceScript = (symbol?: string) => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n const [selectedSymbol, setSelectedSymbol] = useState<string>(\n symbol || \"ALL_SYMBOLS\",\n );\n const [aggregationWindow, setAggregationWindow] = useState<AggregationWindow>(\n AggregationWindow.DAILY,\n );\n const [isNetPnL, setIsNetPnL] = useState(false); // Toggle: Net P&L (fees deducted) vs Gross P&L (default)\n const [today] = useState(() => new Date());\n const [period, setPeriod] = useState<PeriodType | null>(PeriodType.WEEK);\n\n const [dateRange, setDateRange] = useState<{ from: Date; to: Date }>(() => {\n const range = getDateRange(PeriodType.WEEK, today);\n return {\n from: normalizeDateToUTC(range.from),\n to: normalizeDateToUTC(range.to),\n };\n });\n\n const onPeriodChange = (value: PeriodType) => {\n const newRange = getDateRange(value, today);\n setPeriod(value);\n setDateRange({\n from: normalizeDateToUTC(newRange.from),\n to: normalizeDateToUTC(newRange.to),\n });\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n\n // Normalize dates to UTC to avoid timezone issues\n const normalizedRange = {\n from: normalizeDateToUTC(newDateRange.from),\n to: normalizeDateToUTC(newDateRange.to),\n };\n\n setDateRange(normalizedRange);\n\n if (normalizedRange.from && normalizedRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(normalizedRange.from, normalizedRange.to)) +\n 1;\n\n const range = getDateRange(offsetDay, today);\n const normalizedRangeForComparison = {\n from: normalizeDateToUTC(range.from),\n to: normalizeDateToUTC(range.to),\n };\n\n if (\n formatDateRange(normalizedRangeForComparison.from) ===\n formatDateRange(normalizedRange.from) &&\n formatDateRange(normalizedRangeForComparison.to) ===\n formatDateRange(normalizedRange.to)\n ) {\n setPeriod(\n (Object.keys(PRESET_DAYS) as PeriodType[]).find(\n (key) => PRESET_DAYS[key] === offsetDay,\n ) || null,\n );\n } else {\n setPeriod(null);\n }\n }\n }\n };\n\n const startDate = dateRange.from;\n const endDate = dateRange.to;\n\n // Set end date to end of day for API query\n // This ensures we capture all trades up to 23:59:59 UTC of the selected end date\n const endDateForAPI = useMemo(() => {\n if (!endDate) return endDate;\n return endOfDay(endDate);\n }, [endDate]);\n\n const filterItems = useMemo(() => {\n return [\n {\n type: \"range\" as const,\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n },\n ];\n }, [dateRange]);\n\n const { trades, isLoading, error } = useTrades({\n symbol: selectedSymbol === \"ALL_SYMBOLS\" ? undefined : selectedSymbol,\n start_t: startDate ? startDate.getTime() : undefined,\n end_t: endDateForAPI ? endDateForAPI.getTime() : undefined,\n });\n\n // Always calculate actual performance with fees (for stats)\n // The includeFees toggle only affects chart visualization, not stats\n // Use endDateForAPI to ensure all fetched trades are included in aggregation\n const performanceData = useSymbolPerformanceData(\n trades,\n startDate,\n endDateForAPI,\n true,\n );\n\n const invisible =\n wrongNetwork ||\n disabledConnect ||\n (state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected);\n\n const periodTypes = Object.values(PeriodType);\n const aggregationWindowTypes = Object.values(AggregationWindow);\n\n const getAggregatedData = () => {\n if (!performanceData) return null;\n\n let result;\n switch (aggregationWindow) {\n case AggregationWindow.FIFTEEN_MIN:\n result = {\n periodData: performanceData.fifteenMinuteData,\n cumulativePnL: performanceData.cumulativeFifteenMinutePnL,\n cumulativeFees: performanceData.cumulativeFifteenMinuteFees,\n cumulativeVolume: performanceData.cumulativeFifteenMinuteVolume,\n };\n break;\n case AggregationWindow.HOURLY:\n result = {\n periodData: performanceData.hourlyData,\n cumulativePnL: performanceData.cumulativeHourlyPnL,\n cumulativeFees: performanceData.cumulativeHourlyFees,\n cumulativeVolume: performanceData.cumulativeHourlyVolume,\n };\n break;\n case AggregationWindow.DAILY:\n default:\n result = {\n periodData: performanceData.dailyData,\n cumulativePnL: performanceData.cumulativeDailyPnL,\n cumulativeFees: performanceData.cumulativeDailyFees,\n cumulativeVolume: performanceData.cumulativeDailyVolume,\n };\n }\n\n return result;\n };\n\n return {\n selectedSymbol,\n setSelectedSymbol,\n period,\n onPeriodChange,\n periodTypes,\n aggregationWindow,\n setAggregationWindow,\n aggregationWindowTypes,\n isNetPnL,\n setIsNetPnL,\n dateRange,\n filterItems,\n onFilter,\n trades,\n isLoading,\n error,\n performanceData,\n aggregatedData: getAggregatedData(),\n invisible,\n };\n};\n\nexport type UseSymbolPerformanceScriptReturn = ReturnType<\n typeof useSymbolPerformanceScript\n>;\n","import { useMemo } from \"react\";\nimport { addDays } from \"date-fns\";\nimport type { TradeData } from \"./useTrades\";\n\nexport interface SymbolPerformanceMetrics {\n totalPnL: number;\n grossPnL: number;\n totalVolume: number;\n totalFees: number;\n totalTrades: number;\n makerShare: number;\n // daily data\n dailyData: Array<{ date: string; pnl: number; volume: number; fees: number }>;\n cumulativeDailyPnL: Array<{ date: string; cumulativePnl: number }>;\n cumulativeDailyFees: Array<{ date: string; cumulativeFees: number }>;\n cumulativeDailyVolume: Array<{ date: string; cumulativeVolume: number }>;\n // hourly data\n hourlyData: Array<{\n date: string;\n pnl: number;\n fees: number;\n volume: number;\n }>;\n cumulativeHourlyPnL: Array<{ date: string; cumulativePnl: number }>;\n cumulativeHourlyFees: Array<{ date: string; cumulativeFees: number }>;\n cumulativeHourlyVolume: Array<{ date: string; cumulativeVolume: number }>;\n // 15-minute data\n fifteenMinuteData: Array<{\n date: string;\n pnl: number;\n fees: number;\n volume: number;\n }>;\n cumulativeFifteenMinutePnL: Array<{ date: string; cumulativePnl: number }>;\n cumulativeFifteenMinuteFees: Array<{ date: string; cumulativeFees: number }>;\n cumulativeFifteenMinuteVolume: Array<{\n date: string;\n cumulativeVolume: number;\n }>;\n}\n\n/**\n * Generic function to fill gaps in aggregated time-series data.\n * Ensures complete coverage of the date range with zero values for missing periods.\n *\n * @param dataMap - Map of aggregated data keyed by ISO datetime string\n * @param startDate - Start of the period\n * @param endDate - End of the period\n * @param incrementFn - Function to increment the current date\n * @param getKeyFn - Function to extract the key from current date\n * @returns Array of filled data points\n */\nconst fillTimeSeriesGaps = (\n dataMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n incrementFn: (date: Date) => void,\n getKeyFn: (date: Date) => string,\n) => {\n const filledData: Array<{\n date: string;\n pnl: number;\n volume: number;\n fees: number;\n }> = [];\n\n const current = new Date(startDate);\n current.setUTCHours(0, 0, 0, 0);\n\n while (current <= endDate) {\n const key = getKeyFn(current);\n const data = dataMap.get(key) || {\n pnl: 0,\n volume: 0,\n fees: 0,\n };\n filledData.push({ date: key, ...data });\n incrementFn(current);\n }\n\n return filledData;\n};\n\n// Helper function to fill daily gaps\nconst fillDailyGaps = (\n dailyMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n) => {\n return fillTimeSeriesGaps(\n dailyMap,\n startDate,\n endDate,\n (date) => date.setUTCDate(date.getUTCDate() + 1),\n (date) => date.toISOString().split(\"T\")[0],\n );\n};\n\n// Helper function to fill hourly gaps\nconst fillHourlyGaps = (\n hourlyMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n) => {\n return fillTimeSeriesGaps(\n hourlyMap,\n startDate,\n endDate,\n (date) => date.setUTCHours(date.getUTCHours() + 1),\n (date) => date.toISOString(),\n );\n};\n\n// Helper function to fill 15-minute gaps\nconst fillFifteenMinuteGaps = (\n fifteenMinMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n) => {\n return fillTimeSeriesGaps(\n fifteenMinMap,\n startDate,\n endDate,\n (date) => date.setUTCMinutes(date.getUTCMinutes() + 15),\n (date) => date.toISOString(),\n );\n};\n\nexport const useSymbolPerformanceData = (\n tradesData: TradeData[] | null,\n periodStartDate?: Date,\n periodEndDate?: Date,\n includeFees: boolean = true,\n): SymbolPerformanceMetrics | null => {\n return useMemo(() => {\n if (!tradesData || tradesData.length === 0) {\n return null;\n }\n\n // Process trades - each trade already has realized_pnl (which is net, after fees)\n const tradesWithPnL = tradesData.map((trade) => {\n const volume = Math.abs(trade.executed_quantity * trade.executed_price);\n const fees = trade.fee || 0;\n // If includeFees is true: show net PnL (realized_pnl, which already has fees deducted)\n // If includeFees is false: show gross PnL (add fees back to realized_pnl)\n const pnl = includeFees\n ? trade.realized_pnl || 0\n : (trade.realized_pnl || 0) + fees;\n\n return {\n ...trade,\n pnl,\n volume,\n fees,\n date: new Date(trade.executed_timestamp),\n };\n });\n\n // Calculate metrics\n const totalPnL = tradesWithPnL.reduce((sum, trade) => sum + trade.pnl, 0);\n const totalVolume = tradesWithPnL.reduce(\n (sum, trade) => sum + trade.volume,\n 0,\n );\n const totalFees = tradesWithPnL.reduce((sum, trade) => sum + trade.fees, 0);\n const totalTrades = tradesWithPnL.length;\n const grossPnL = totalPnL + totalFees;\n\n // Use provided period dates or fall back to trade dates\n const sortedByDate = [...tradesWithPnL].sort(\n (a, b) => a.date.getTime() - b.date.getTime(),\n );\n const startDate = periodStartDate || sortedByDate[0].date;\n const endDate = periodEndDate || sortedByDate[sortedByDate.length - 1].date;\n\n // Calculate maker volume share\n const makerVolume = tradesData\n .filter((trade) => trade.is_maker === 1)\n .reduce(\n (sum, trade) =>\n sum + Math.abs(trade.executed_quantity * trade.executed_price),\n 0,\n );\n const makerShare = totalVolume > 0 ? (makerVolume / totalVolume) * 100 : 0;\n\n // Group by day for daily PnL, Volume, and Fees\n const dailyPnLMap = new Map<\n string,\n { pnl: number; volume: number; fees: number }\n >();\n tradesWithPnL.forEach((trade) => {\n const dateKey = trade.date.toISOString().split(\"T\")[0];\n const existing = dailyPnLMap.get(dateKey) || {\n pnl: 0,\n volume: 0,\n fees: 0,\n };\n dailyPnLMap.set(dateKey, {\n pnl: existing.pnl + trade.pnl,\n volume: existing.volume + trade.volume,\n fees: existing.fees + trade.fees,\n });\n });\n\n // Fill gaps in daily data\n const dailyData = fillDailyGaps(dailyPnLMap, startDate, endDate);\n\n // Group by hour for hourly PnL and Fees\n const hourlyDataMap = new Map<\n string,\n { pnl: number; fees: number; volume: number }\n >();\n tradesWithPnL.forEach((trade) => {\n // Format: YYYY-MM-DDTHH:00:00.000Z\n // setMinutes(0, 0, 0) normalizes minutes, seconds, and milliseconds to 0\n // This ensures all trades within the same hour share the same key regardless of seconds/milliseconds\n const date = new Date(trade.date);\n date.setUTCMinutes(0, 0, 0);\n const hourKey = date.toISOString();\n const existing = hourlyDataMap.get(hourKey) || {\n pnl: 0,\n fees: 0,\n volume: 0,\n };\n hourlyDataMap.set(hourKey, {\n pnl: existing.pnl + trade.pnl,\n fees: existing.fees + trade.fees,\n volume: existing.volume + trade.volume,\n });\n });\n\n // Check if this is a single-day selection\n const isSingleDay = startDate.getTime() === endDate.getTime();\n\n // Calculate the next calendar day start time (00:00 UTC of the next day)\n const nextDayDate = addDays(startDate, 1);\n const nextDayStartTime = new Date(\n nextDayDate.getUTCFullYear(),\n nextDayDate.getUTCMonth(),\n nextDayDate.getUTCDate(),\n 0,\n 0,\n 0,\n 0,\n ).getTime();\n\n // For single-day: create buckets that span the full calendar day\n // For multi-day: use the provided date range as-is\n const bucketEndDate = isSingleDay ? addDays(startDate, 1) : endDate;\n\n // Fill gaps in hourly data\n let hourlyData = fillHourlyGaps(hourlyDataMap, startDate, bucketEndDate);\n // For single-day selections only, remove any entries from the next day\n if (isSingleDay) {\n hourlyData = hourlyData.filter(\n (item) => new Date(item.date).getTime() < nextDayStartTime,\n );\n }\n\n // Group by 15 minutes for 15-minute PnL, Fees, and Volume\n const fifteenMinuteDataMap = new Map<\n string,\n { pnl: number; fees: number; volume: number }\n >();\n tradesWithPnL.forEach((trade) => {\n const date = new Date(trade.date);\n // Round down to the nearest 15-minute interval (0, 15, 30, 45)\n const minutes = date.getUTCMinutes();\n const roundedMinutes = Math.floor(minutes / 15) * 15;\n // setMinutes(roundedMinutes, 0, 0) normalizes seconds and milliseconds to 0\n // This ensures all trades within the same 15-minute window share the same key regardless of seconds/milliseconds\n date.setUTCMinutes(roundedMinutes, 0, 0);\n const fifteenMinKey = date.toISOString();\n const existing = fifteenMinuteDataMap.get(fifteenMinKey) || {\n pnl: 0,\n fees: 0,\n volume: 0,\n };\n fifteenMinuteDataMap.set(fifteenMinKey, {\n pnl: existing.pnl + trade.pnl,\n fees: existing.fees + trade.fees,\n volume: existing.volume + trade.volume,\n });\n });\n\n // Fill gaps in 15-minute data\n let fifteenMinuteData = fillFifteenMinuteGaps(\n fifteenMinuteDataMap,\n startDate,\n bucketEndDate,\n );\n // For single-day selections only, remove any entries from the next day\n if (isSingleDay) {\n fifteenMinuteData = fifteenMinuteData.filter(\n (item) => new Date(item.date).getTime() < nextDayStartTime,\n );\n }\n\n // Calculate cumulative PnL\n let _pnl = 0;\n const cumulativeDailyPnL = dailyData.map((day) => {\n _pnl += day.pnl;\n return {\n date: day.date,\n cumulativePnl: _pnl,\n };\n });\n\n let _fees = 0;\n const cumulativeDailyFees = dailyData.map((day) => {\n _fees += day.fees;\n return {\n date: day.date,\n cumulativeFees: _fees,\n };\n });\n let _volume = 0;\n const cumulativeDailyVolume = dailyData.map((day) => {\n _volume += day.volume;\n return {\n date: day.date,\n cumulativeVolume: _volume,\n };\n });\n _pnl = 0;\n const cumulativeHourlyPnL = hourlyData.map((hour) => {\n _pnl += hour.pnl;\n return {\n date: hour.date,\n cumulativePnl: _pnl,\n };\n });\n _fees = 0;\n const cumulativeHourlyFees = hourlyData.map((hour) => {\n _fees += hour.fees;\n return {\n date: hour.date,\n cumulativeFees: _fees,\n };\n });\n _volume = 0;\n const cumulativeHourlyVolume = hourlyData.map((hour) => {\n _volume += hour.volume;\n return {\n date: hour.date,\n cumulativeVolume: _volume,\n };\n });\n\n // Calculate cumulative 15-minute data\n _pnl = 0;\n const cumulativeFifteenMinutePnL = fifteenMinuteData.map((fifteenMin) => {\n _pnl += fifteenMin.pnl;\n return {\n date: fifteenMin.date,\n cumulativePnl: _pnl,\n };\n });\n\n _fees = 0;\n const cumulativeFifteenMinuteFees = fifteenMinuteData.map((fifteenMin) => {\n _fees += fifteenMin.fees;\n return {\n date: fifteenMin.date,\n cumulativeFees: _fees,\n };\n });\n\n _volume = 0;\n const cumulativeFifteenMinuteVolume = fifteenMinuteData.map(\n (fifteenMin) => {\n _volume += fifteenMin.volume;\n return {\n date: fifteenMin.date,\n cumulativeVolume: _volume,\n };\n },\n );\n\n return {\n totalPnL,\n grossPnL,\n totalVolume,\n totalFees,\n totalTrades,\n makerShare,\n\n // daily data\n dailyData,\n cumulativeDailyPnL,\n cumulativeDailyFees,\n cumulativeDailyVolume,\n\n // hourly data\n hourlyData,\n cumulativeHourlyPnL,\n cumulativeHourlyFees,\n cumulativeHourlyVolume,\n\n // 15-minute data\n fifteenMinuteData,\n cumulativeFifteenMinutePnL,\n cumulativeFifteenMinuteFees,\n cumulativeFifteenMinuteVolume,\n };\n }, [tradesData, periodStartDate, periodEndDate, includeFees]);\n};\n","import { useMemo, useEffect, useRef } from \"react\";\nimport { usePrivateInfiniteQuery } from \"@kodiak-finance/orderly-hooks\";\n\nexport interface TradeData {\n id: number;\n symbol: string;\n fee: number;\n fee_asset: string;\n side: \"BUY\" | \"SELL\";\n order_id: number;\n executed_price: number;\n executed_quantity: number;\n executed_timestamp: number;\n is_maker: number;\n realized_pnl: number;\n match_id: string;\n}\n\nexport interface TradesResponse {\n rows: TradeData[];\n meta: {\n total: number;\n records_per_page: number;\n current_page: number;\n };\n}\n\nexport const useTrades = (params: {\n symbol?: string;\n start_t?: number;\n end_t?: number;\n size?: number;\n}) => {\n const { symbol, start_t, end_t, size = 500 } = params;\n\n const getKey = useMemo(() => {\n return (pageIndex: number, previousPageData: any): string | null => {\n if (previousPageData) {\n // Use meta.total from API to determine if there's more data to fetch\n const total = previousPageData.meta?.total ?? 0;\n const alreadyFetched = pageIndex * size;\n\n // Stop if we've already fetched all available trades according to the API\n if (alreadyFetched >= total) {\n return null;\n }\n\n // Fallback: stop if current page has fewer items than requested\n if (previousPageData.rows.length < size) {\n return null;\n }\n }\n\n const search = new URLSearchParams();\n search.set(\"size\", size.toString());\n search.set(\"page\", `${pageIndex + 1}`);\n if (symbol) {\n search.set(\"symbol\", symbol);\n }\n if (start_t) {\n search.set(\"start_t\", start_t.toString());\n }\n if (end_t) {\n search.set(\"end_t\", end_t.toString());\n }\n const url = `/v1/trades?${search.toString()}`;\n return url;\n };\n }, [symbol, start_t, end_t, size]);\n\n const result = usePrivateInfiniteQuery<TradesResponse>(getKey, {\n formatter: (data) => data,\n revalidateOnFocus: true,\n keepPreviousData: true,\n });\n\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n // Auto-fetch all pages with rate limiting (10 requests per 1 second = 100ms minimum between requests)\n useEffect(() => {\n if (!result.data) return;\n\n const lastPage = result.data[result.data.length - 1];\n\n // Check if there's more data to fetch (when last page has full size)\n if (lastPage && lastPage.rows.length === size) {\n // Capture next page size before scheduling to avoid stale closure\n const nextPageSize = result.data.length + 1;\n\n // Schedule next fetch with 100ms delay to respect rate limit\n timeoutRef.current = setTimeout(() => {\n result.setSize(nextPageSize);\n }, 100);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [result.data, size]);\n\n // Clear pending pagination fetch when filters change to prevent mixed data states\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [symbol, start_t, end_t]);\n\n // Flatten all trades from paginated response\n const trades = useMemo(() => {\n if (!result.data) return [];\n return result.data\n .map((page) => page.rows)\n .flat()\n .filter((trade): trade is TradeData => trade !== undefined);\n }, [result.data]);\n\n return {\n trades,\n isLoading: result.isLoading,\n error: result.error,\n mutate: result.mutate,\n };\n};\n","import React, { useMemo, useState } from \"react\";\nimport { endOfDay } from \"date-fns\";\nimport {\n CombinedPnLChart,\n CombinedVolumeChart,\n CombinedFeesChart,\n CombinedPriceChart,\n AssetAreaChart,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Card,\n Grid,\n Box,\n Statistic,\n Text,\n Divider,\n Flex,\n Select,\n Switch,\n cn,\n DataTable,\n type Column,\n} from \"@kodiak-finance/orderly-ui\";\nimport { formatDateForChart, getAggregationLabel } from \"./dateUtils\";\nimport { PnLRankingChart } from \"./pnlRankingChart\";\nimport type { UseSymbolPerformanceScriptReturn } from \"./symbolPerformance.script\";\nimport { AggregationWindow } from \"./symbolPerformance.script\";\nimport { SymbolSelector } from \"./symbolSelector\";\nimport { useKlineData } from \"./useKlineData\";\nimport type { TradeData } from \"./useTrades\";\n\nconst LazyPeriodTitle = React.lazy(() =>\n import(\"../overview/shared/periodHeader\").then((mod) => {\n return { default: mod.PeriodTitle };\n }),\n);\n\nexport type SymbolPerformanceUIProps = UseSymbolPerformanceScriptReturn;\n\nconst MakerTakerShare: React.FC<{ makerShare: number }> = ({ makerShare }) => {\n const takerShare = 100 - makerShare;\n return (\n <div className=\"oui-flex oui-items-center oui-justify-center oui-gap-4\">\n <Text weight=\"semibold\">{makerShare.toFixed(1)}%</Text>\n <span className=\"oui-text-base-contrast-54\">/</span>\n <Text weight=\"semibold\">{takerShare.toFixed(1)}%</Text>\n </div>\n );\n};\n\nenum ViewType {\n chart = \"chart\",\n table = \"table\",\n}\n\ntype PerformanceTableRow = {\n date: string;\n pnl: number;\n volume: number;\n fees: number;\n};\n\nexport const SymbolPerformanceUI: React.FC<SymbolPerformanceUIProps> = (\n props,\n) => {\n const {\n selectedSymbol,\n setSelectedSymbol,\n period,\n onPeriodChange,\n periodTypes,\n performanceData,\n filterItems,\n onFilter,\n aggregationWindow,\n setAggregationWindow,\n aggregationWindowTypes,\n aggregatedData,\n trades,\n dateRange,\n isNetPnL,\n setIsNetPnL,\n } = props;\n const { t } = useTranslation();\n const symbolsInfo = useSymbolsInfo();\n const [viewType, setViewType] = useState<ViewType>(ViewType.chart);\n const [showCumulativePnL, setShowCumulativePnL] = useState(true);\n const [showCumulativeVolume, setShowCumulativeVolume] = useState(false);\n const [showCumulativeFees, setShowCumulativeFees] = useState(false);\n\n // Trim all data based on first and last non-zero volume to keep all charts aligned\n // This removes leading empty buckets and trailing empty buckets\n const getTrimmedDataRange = (data: any[]) => {\n if (!data || data.length === 0) return { start: 0, end: 0 };\n\n // Find first non-zero volume\n const startIndex = data.findIndex(\n (item) => item.volume && item.volume !== 0,\n );\n\n // Find last non-zero volume\n const endIndex = data.reduce(\n (lastIdx, item, idx) =>\n item.volume && item.volume !== 0 ? idx : lastIdx,\n -1,\n );\n\n return {\n start: startIndex === -1 ? 0 : startIndex,\n end: endIndex === -1 ? data.length : endIndex + 1,\n };\n };\n\n // Get available symbols\n const availableSymbols = useMemo(() => {\n const symbols = Object.keys(symbolsInfo);\n return [\n { value: \"ALL_SYMBOLS\", label: \"All Symbols\" },\n ...symbols.map((symbol) => ({\n value: symbol,\n label: symbol.replace(\"PERP_\", \"\").replace(\"_USDC\", \"\"),\n })),\n ];\n }, [symbolsInfo]);\n\n // Transform period PnL data for CombinedPnLChart (combines bars + cumulative line)\n // aggregatedData.periodData contains NET PnL (after fees)\n // Toggle allows viewing GROSS PnL (before fees) by adding fees back\n const combinedPnLData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n // Net PnL = actual result (with fees deducted)\n // Gross PnL = add fees back to show hypothetical without fees\n pnl: isNetPnL ? item.pnl : item.pnl + item.fees,\n }));\n }, [aggregatedData, aggregationWindow, isNetPnL]);\n\n // Transform period volume data for CombinedVolumeChart (combines bars + cumulative line)\n const combinedVolumeData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n volume: item.volume ?? 0,\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Transform period fees data for CombinedFeesChart (combines bars + cumulative line)\n // Fees are shown as negative since they're a cost\n const combinedFeesData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n fees: -(item.fees ?? 0),\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Map aggregation window to K-line resolution\n const klineResolution = useMemo(() => {\n switch (aggregationWindow) {\n case \"15m\":\n return \"15m\" as const;\n case \"1h\":\n return \"1h\" as const;\n case \"1d\":\n return \"1d\" as const;\n default:\n return \"1d\" as const;\n }\n }, [aggregationWindow]);\n\n // Fetch K-line data (only if a specific symbol is selected, not \"ALL_SYMBOLS\")\n const isAllSymbols = selectedSymbol === \"ALL_SYMBOLS\";\n const klineEndDate = useMemo(() => {\n if (!dateRange?.to) return undefined;\n // Use endOfDay to capture klines through the full day, not just to midnight\n return endOfDay(dateRange.to);\n }, [dateRange?.to]);\n\n const { klines } = useKlineData({\n symbol: !isAllSymbols && selectedSymbol ? selectedSymbol : undefined,\n resolution: klineResolution,\n from: dateRange ? Math.floor(dateRange.from.getTime() / 1000) : undefined,\n to: klineEndDate ? Math.floor(klineEndDate.getTime() / 1000) : undefined,\n });\n\n // Combine price data - align with trading data range, fill gaps with null\n // This ensures price chart covers the full date range of PnL/Volume/Fees charts\n // Missing price data (due to 1k kline API limit) shows as null, maintaining tooltip sync\n const combinedPriceData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) {\n return [];\n }\n\n // Apply same trim range as volume/fees/pnl to align x-axis\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedTradingData = aggregatedData.periodData.slice(start, end);\n\n if (trimmedTradingData.length === 0 || klines.length === 0) {\n return [];\n }\n\n // Create a map of kline data by formatted date for O(1) lookup\n const klineMap = new Map<string, (typeof klines)[0]>();\n klines.forEach((k) => {\n const date = new Date(k.timestamp * 1000);\n const formattedDate = formatDateForChart(\n date.toISOString(),\n aggregationWindow,\n );\n klineMap.set(formattedDate, k);\n });\n\n // Create price data for all trading data buckets, using null where kline data is missing\n const result = trimmedTradingData.map((tradingItem) => {\n const formattedDate = formatDateForChart(\n tradingItem.date,\n aggregationWindow,\n );\n const kline = klineMap.get(formattedDate);\n\n return {\n date: formattedDate,\n open: kline?.open ?? null,\n high: kline?.high ?? null,\n low: kline?.low ?? null,\n close: kline?.close ?? null,\n };\n });\n\n return result;\n }, [klines, aggregatedData, aggregationWindow]);\n\n // Transform data for table view\n const tableData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n pnl: item.pnl,\n volume: item.volume ?? 0,\n fees: item.fees ?? 0,\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Define table columns\n const tableColumns: Column<PerformanceTableRow>[] = useMemo(\n () => [\n {\n title: t(\"common.date\"),\n dataIndex: \"date\",\n width: 120,\n align: \"left\",\n },\n {\n title: t(\"portfolio.symbolPerformance.realizedPnL\"),\n dataIndex: \"pnl\",\n align: \"right\",\n width: 150,\n render: (value: number) => {\n const isPositive = value >= 0;\n return (\n <Text\n as=\"span\"\n weight=\"semibold\"\n className={\n isPositive ? \"oui-text-profit-500\" : \"oui-text-loss-500\"\n }\n >\n {value.toFixed(2)} USDC\n </Text>\n );\n },\n },\n {\n title: t(\"portfolio.symbolPerformance.volume\"),\n dataIndex: \"volume\",\n align: \"right\",\n width: 150,\n render: (value: number) => {\n return <Text as=\"span\">{formatVolumeValue(value)}</Text>;\n },\n },\n {\n title: t(\"portfolio.symbolPerformance.fees\"),\n dataIndex: \"fees\",\n align: \"right\",\n width: 150,\n render: (value: number) => {\n return <Text as=\"span\">{formatVolumeValue(value)}</Text>;\n },\n },\n ],\n [t],\n );\n\n // Helper function to format volume/fees with K/M/B\n const formatVolumeValue = (value: number): string => {\n const abbreviations = [\"\", \"K\", \"M\", \"B\", \"T\"];\n let index = 0;\n let num = value;\n while (num >= 1000 && index < abbreviations.length - 1) {\n num /= 1000;\n index++;\n }\n const decimalPlaces = num <= 10 ? 2 : num <= 100 ? 1 : 0;\n const rounded = parseFloat(num.toFixed(decimalPlaces));\n return `${rounded}${abbreviations[index]}`;\n };\n\n // Aggregate trades by symbol\n const symbolSummaryData = useMemo(() => {\n if (!trades || trades.length === 0) return [];\n\n const symbolMap = new Map<\n string,\n { pnl: number; volume: number; fees: number; trades: number }\n >();\n\n trades.forEach((trade: TradeData) => {\n const symbol = trade.symbol;\n if (!symbolMap.has(symbol)) {\n symbolMap.set(symbol, { pnl: 0, volume: 0, fees: 0, trades: 0 });\n }\n\n const current = symbolMap.get(symbol)!;\n const tradeVolume = trade.executed_quantity * trade.executed_price;\n\n current.pnl += trade.realized_pnl || 0;\n current.volume += tradeVolume;\n current.fees += trade.fee || 0;\n current.trades += 1;\n });\n\n // Convert map to array and sort by PnL (highest first)\n return Array.from(symbolMap.entries())\n .map(([symbol, data]) => ({\n symbol,\n ...data,\n }))\n .sort((a, b) => b.pnl - a.pnl)\n .slice(0, 10); // Top 10 symbols\n }, [trades]);\n\n return (\n <Card\n title={\n <Box>\n <React.Suspense fallback={null}>\n <LazyPeriodTitle\n onPeriodChange={onPeriodChange}\n periodTypes={periodTypes}\n period={period}\n title={t(\"portfolio.symbolPerformance\")}\n filterItems={filterItems}\n onFilter={onFilter}\n />\n </React.Suspense>\n </Box>\n }\n >\n <Grid cols={1} gap={4}>\n <Flex gap={4} itemAlign=\"end\">\n {/* Symbol Selector - With Logo and Search */}\n <Box className=\"oui-max-w-xs oui-flex-1\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"common.symbol\")}\n </Text>\n <SymbolSelector\n value={selectedSymbol || \"\"}\n onValueChange={(value: string) => setSelectedSymbol(value)}\n options={availableSymbols}\n placeholder={t(\"common.symbol\")}\n />\n </Box>\n\n {/* Aggregation Window Selector */}\n <Box className=\"oui-max-w-xs\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"portfolio.symbolPerformance.aggregation\")}\n </Text>\n <Select.options\n value={aggregationWindow}\n onValueChange={(value) =>\n setAggregationWindow(value as AggregationWindow)\n }\n options={aggregationWindowTypes.map((type) => ({\n label:\n type === \"15m\"\n ? \"15 min\"\n : type === \"1h\"\n ? \"Hourly\"\n : \"Daily\",\n value: type,\n }))}\n classNames={{ trigger: cn(\"oui-h-[2.4rem]\") }}\n />\n </Box>\n </Flex>\n\n <Divider className=\"oui-my-6 oui-border-t-2\" intensity={8} />\n\n <Box pb={4}>\n {/* Key Metrics */}\n <Grid cols={5} gap={4} mb={4}>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total PnL (Gross) */}\n <Statistic\n label=\"Total PnL (Gross)\"\n valueProps={{ coloring: true, showIdentifier: true }}\n >\n {performanceData ? performanceData.grossPnL.toFixed(2) : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total Fees */}\n <Statistic\n label={t(\"portfolio.symbolPerformance.totalFees\")}\n valueProps={{ showIdentifier: false }}\n >\n {performanceData ? performanceData.totalFees.toFixed(2) : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total PnL (Net) */}\n <Statistic\n label=\"Total PnL (Net)\"\n valueProps={{ coloring: true, showIdentifier: true }}\n >\n {performanceData ? performanceData.totalPnL.toFixed(2) : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total Volume */}\n <Statistic label={t(\"portfolio.symbolPerformance.totalVolume\")}>\n {performanceData\n ? performanceData.totalVolume.toFixed(2)\n : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Maker / Taker */}\n <Statistic label=\"Maker / Taker\">\n {performanceData ? (\n <MakerTakerShare makerShare={performanceData.makerShare} />\n ) : (\n <div className=\"oui-text-center\">--</div>\n )}\n </Statistic>\n </Box>\n </Grid>\n\n {/* Chart/Table View Toggle */}\n <Flex gap={2} mb={4}>\n <button\n onClick={() => setViewType(ViewType.chart)}\n className={cn(\n \"oui-px-4 oui-py-2 oui-rounded oui-text-sm oui-font-semibold oui-transition-all\",\n viewType === ViewType.chart\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Chart\n </button>\n <button\n onClick={() => setViewType(ViewType.table)}\n className={cn(\n \"oui-px-4 oui-py-2 oui-rounded oui-text-sm oui-font-semibold oui-transition-all\",\n viewType === ViewType.table\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Table\n </button>\n </Flex>\n\n {/* Charts - Conditional Rendering */}\n {viewType === ViewType.chart && (\n <Grid cols={1} gap={6}>\n {/* Combined PnL Chart (bars + cumulative line) */}\n <Box>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.realizedPnL\")}\n </Text>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-3\">\n <Flex gap={2}>\n <button\n onClick={() => setIsNetPnL(false)}\n className={cn(\n \"oui-px-3 oui-py-1 oui-rounded oui-text-xs oui-font-semibold oui-transition-all\",\n !isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Gross P&L\n </button>\n <button\n onClick={() => setIsNetPnL(true)}\n className={cn(\n \"oui-px-3 oui-py-1 oui-rounded oui-text-xs oui-font-semibold oui-transition-all\",\n isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Net P&L\n </button>\n </Flex>\n <Flex itemAlign=\"center\" gap={2}>\n <label className=\"oui-text-xs oui-text-base-contrast-54\">\n Cumulative\n </label>\n <Switch\n checked={showCumulativePnL}\n onCheckedChange={setShowCumulativePnL}\n />\n </Flex>\n </Flex>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedPnLChart\n key={`combined-pnl-${aggregationWindow}`}\n data={combinedPnLData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n invisible={\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0\n }\n showCumulative={showCumulativePnL}\n />\n </Box>\n </Box>\n\n {/* Combined Volume Chart (bars + cumulative line) */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-3\">\n <Text as=\"div\" size=\"sm\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.volume\")}\n </Text>\n <Flex itemAlign=\"center\" gap={2}>\n <label className=\"oui-text-xs oui-text-base-contrast-54\">\n Cumulative\n </label>\n <Switch\n checked={showCumulativeVolume}\n onCheckedChange={setShowCumulativeVolume}\n />\n </Flex>\n </Flex>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedVolumeChart\n key={`combined-vol-${aggregationWindow}`}\n data={combinedVolumeData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n invisible={\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0\n }\n showCumulative={showCumulativeVolume}\n />\n </Box>\n </Box>\n\n {/* Combined Price Chart - Only show when specific symbol is selected */}\n {!isAllSymbols && (\n <Box>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {getAggregationLabel(aggregationWindow)} Price\n </Text>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedPriceChart\n key={`combined-price-${aggregationWindow}-${selectedSymbol}`}\n data={combinedPriceData}\n aggregationWindow={\n aggregationWindow as \"15m\" | \"1h\" | \"1d\"\n }\n invisible={combinedPriceData.length === 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Combined Fees Chart (bars + cumulative line) */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-3\">\n <Text as=\"div\" size=\"sm\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.fees\")}\n </Text>\n <Flex itemAlign=\"center\" gap={2}>\n <label className=\"oui-text-xs oui-text-base-contrast-54\">\n Cumulative\n </label>\n <Switch\n checked={showCumulativeFees}\n onCheckedChange={setShowCumulativeFees}\n />\n </Flex>\n </Flex>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedFeesChart\n key={`combined-fees-${aggregationWindow}`}\n data={combinedFeesData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n invisible={\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0\n }\n showCumulative={showCumulativeFees}\n />\n </Box>\n </Box>\n </Grid>\n )}\n\n {/* Table View - Conditional Rendering */}\n {viewType === ViewType.table && (\n <Box className=\"oui-h-[600px]\">\n <DataTable<PerformanceTableRow>\n bordered\n columns={tableColumns}\n dataSource={tableData}\n emptyView={\n <Box className=\"oui-text-center oui-py-8\">\n <Text>{t(\"portfolio.symbolPerformance.noData\")}</Text>\n </Box>\n }\n />\n </Box>\n )}\n\n {/* Symbol Summary - Top Symbols by PnL */}\n {symbolSummaryData.length > 0 && (\n <Box mt={8}>\n <Divider className=\"oui-my-6 oui-border-t-2\" intensity={8} />\n <Text as=\"div\" size=\"lg\" weight=\"semibold\" className=\"oui-mb-4\">\n {t(\"portfolio.symbolPerformance.pnlRanking\")}\n </Text>\n <Box className=\"oui-border oui-border-line-4 oui-rounded-md oui-p-4\">\n <PnLRankingChart\n data={symbolSummaryData}\n onSymbolSelect={setSelectedSymbol}\n />\n </Box>\n </Box>\n )}\n </Box>\n </Grid>\n </Card>\n );\n};\n","import { format, parseISO } from \"date-fns\";\nimport { AggregationWindow } from \"./symbolPerformance.script\";\n\n/**\n * Get human-readable label for aggregation window type.\n *\n * @param window - Aggregation window (daily, hourly, 15-min)\n * @returns Display label (e.g., \"Daily\", \"Hourly\", \"15 min\")\n */\nexport const getAggregationLabel = (window: AggregationWindow): string => {\n switch (window) {\n case AggregationWindow.FIFTEEN_MIN:\n return \"15 min\";\n case AggregationWindow.HOURLY:\n return \"Hourly\";\n case AggregationWindow.DAILY:\n return \"Daily\";\n default:\n return \"Daily\";\n }\n};\n\n/**\n * Format a date string for display on charts based on aggregation window.\n * Handles different precision levels for different time intervals.\n *\n * @param dateString - ISO datetime string\n * @param window - Aggregation window (daily, hourly, 15-min)\n * @returns Human-readable formatted date string\n */\nexport const formatDateForChart = (\n dateString: string,\n window: AggregationWindow,\n): string => {\n try {\n const date = parseISO(dateString);\n\n switch (window) {\n case AggregationWindow.FIFTEEN_MIN:\n case AggregationWindow.HOURLY:\n // Show time for hourly/15-min: \"Nov 21, 3:00 AM\"\n return format(date, \"MMM d, h:mm a\");\n case AggregationWindow.DAILY:\n default:\n // Show date only for daily: \"Nov 21\"\n return format(date, \"MMM d\");\n }\n } catch {\n // Fallback if parsing fails\n return dateString;\n }\n};\n\n/**\n * Format a date string to \"yyyy-MM-dd\" format.\n * Used for API calls and date range display.\n *\n * @param dateString - ISO datetime string\n * @returns Date in \"yyyy-MM-dd\" format\n */\nexport const formatDateOnly = (dateString: string): string => {\n try {\n const date = parseISO(dateString);\n return format(date, \"yyyy-MM-dd\");\n } catch {\n return dateString;\n }\n};\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Text, cn } from \"@kodiak-finance/orderly-ui\";\n\nexport type PnLRankingDataItem = {\n symbol: string;\n pnl: number;\n volume: number;\n fees: number;\n};\n\ntype PnLRankingChartProps = {\n data: PnLRankingDataItem[];\n onSymbolSelect?: (symbol: string) => void;\n};\n\nconst formatCurrency = (value: number): string => {\n if (value >= 1e9) return `$${(value / 1e9).toFixed(2)}B`;\n if (value >= 1e6) return `$${(value / 1e6).toFixed(2)}M`;\n if (value >= 1e3) return `$${(value / 1e3).toFixed(2)}K`;\n return `$${value.toFixed(2)}`;\n};\n\nexport const PnLRankingChart: React.FC<PnLRankingChartProps> = ({\n data,\n onSymbolSelect,\n}) => {\n const { t } = useTranslation();\n\n const maxAbsValue = useMemo(\n () => Math.max(...data.map((item) => Math.abs(item.pnl)), 1),\n [data],\n );\n\n return (\n <div className=\"oui-w-full\">\n {/* Header Row */}\n <div className=\"oui-grid oui-gap-4 oui-border-b oui-border-line-4 oui-mb-2 oui-px-4 oui-py-3\">\n <div className=\"oui-grid oui-grid-cols-12 oui-gap-4 oui-items-center\">\n <div className=\"oui-col-span-2\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.symbols\")}\n </Text>\n </div>\n <div className=\"oui-col-span-6\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.pnl\")}\n </Text>\n </div>\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.volume\")}\n </Text>\n </div>\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.fees\")}\n </Text>\n </div>\n </div>\n </div>\n\n {/* Data Rows */}\n <div className=\"oui-space-y-3\">\n {data.map((item) => {\n const isPositive = item.pnl >= 0;\n const barWidth = (Math.abs(item.pnl) / maxAbsValue) * 100;\n\n return (\n <div\n key={item.symbol}\n onClick={() => onSymbolSelect?.(item.symbol)}\n className=\"oui-border oui-border-line-4 hover:oui-border-line-5 oui-rounded-md oui-transition-colors oui-px-4 oui-py-3 oui-cursor-pointer\"\n >\n <div className=\"oui-grid oui-grid-cols-12 oui-gap-4 oui-items-center\">\n {/* Symbol Column */}\n <div className=\"oui-col-span-2\">\n <Text size=\"sm\" weight=\"semibold\" className=\"oui-truncate\">\n {item.symbol}\n </Text>\n </div>\n\n {/* P&L Column with Inline Bar Chart */}\n <div className=\"oui-col-span-6\">\n <div className=\"oui-relative oui-w-full oui-h-8 oui-rounded oui-bg-base-8 oui-overflow-hidden oui-flex oui-items-center\">\n <div\n className=\"oui-absolute oui-h-full oui-rounded oui-transition-all\"\n style={{\n width: `${barWidth}%`,\n backgroundColor: isPositive ? \"#00B49E\" : \"#FF5959\",\n }}\n />\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={cn(\n \"oui-relative oui-z-10 oui-ml-2\",\n isPositive\n ? \"oui-text-profit-500\"\n : \"oui-text-loss-500\",\n )}\n >\n {isPositive ? \"+\" : \"\"}\n {item.pnl.toFixed(2)}\n </Text>\n </div>\n </div>\n\n {/* Volume Column */}\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" weight=\"semibold\">\n {formatCurrency(item.volume)}\n </Text>\n </div>\n\n {/* Fees Column */}\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" weight=\"semibold\" intensity={80}>\n {formatCurrency(item.fees)}\n </Text>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Empty State */}\n {data.length === 0 && (\n <div className=\"oui-flex oui-items-center oui-justify-center oui-py-8\">\n <Text intensity={54}>{t(\"portfolio.symbolPerformance.noData\")}</Text>\n </div>\n )}\n </div>\n );\n};\n","import React, { useMemo, useState } from \"react\";\nimport {\n DropdownMenuRoot,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuPortal,\n Flex,\n Text,\n TokenIcon,\n Input,\n cn,\n CaretDownIcon,\n CaretUpIcon,\n} from \"@kodiak-finance/orderly-ui\";\n\nexport interface SymbolOption {\n value: string;\n label: string;\n}\n\nexport interface SymbolSelectorProps {\n value: string;\n onValueChange: (value: string) => void;\n options: SymbolOption[];\n placeholder?: string;\n}\n\nexport const SymbolSelector: React.FC<SymbolSelectorProps> = ({\n value,\n onValueChange,\n options,\n placeholder = \"Select symbol\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n\n const filteredOptions = useMemo(() => {\n if (!search) return options;\n return options.filter(\n (opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()) ||\n opt.value.toLowerCase().includes(search.toLowerCase()),\n );\n }, [search, options]);\n\n const selectedOption = options.find((opt) => opt.value === value);\n const displayLabel =\n value === \"ALL_SYMBOLS\"\n ? \"All Symbols\"\n : selectedOption?.label || placeholder;\n const isAllSymbols = value === \"ALL_SYMBOLS\";\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button className=\"oui-w-full oui-px-3 oui-py-2 oui-rounded oui-border oui-border-line-6 oui-bg-line-4 oui-text-left oui-flex oui-items-center oui-justify-between hover:oui-bg-line-5\">\n <Flex gap={1} itemAlign=\"center\">\n {!isAllSymbols && displayLabel !== placeholder && (\n <TokenIcon name={displayLabel} size=\"2xs\" />\n )}\n <Text size=\"xs\" className=\"oui-text-base-contrast-80\">\n {displayLabel}\n </Text>\n </Flex>\n\n <CaretDownIcon\n size={12}\n className={cn(\n \"oui-text-base-contrast-54 oui-transition-transform\",\n open && \"oui-rotate-180\",\n )}\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n className=\"oui-w-[var(--radix-dropdown-menu-trigger-width)] oui-bg-base-8 oui-border oui-border-line-6 oui-rounded oui-p-2 oui-z-50\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n {/* Search Input */}\n <div className=\"oui-px-2 oui-py-2 oui-border-b oui-border-base-4 oui-mb-2\">\n <Input\n autoFocus\n placeholder=\"Search symbols...\"\n value={search}\n onValueChange={setSearch}\n size=\"sm\"\n />\n </div>\n\n {/* Options List */}\n <div className=\"oui-max-h-[300px] oui-overflow-y-auto\">\n {filteredOptions.length === 0 ? (\n <div className=\"oui-px-3 oui-py-2 oui-text-center oui-text-base-contrast-54 oui-text-xs\">\n No symbols found\n </div>\n ) : (\n filteredOptions.map((option) => {\n const isSelected = value === option.value;\n const cleanLabel =\n option.value === \"ALL_SYMBOLS\" ? \"All Symbols\" : option.label;\n\n return (\n <button\n key={option.value}\n onClick={() => {\n onValueChange(option.value);\n setOpen(false);\n setSearch(\"\");\n }}\n className={cn(\n \"oui-w-full oui-px-3 oui-py-2 oui-rounded oui-flex oui-items-center oui-gap-2 oui-text-left oui-transition-colors\",\n isSelected ? \"oui-bg-base-7\" : \"hover:oui-bg-base-7\",\n )}\n >\n {option.value !== \"ALL_SYMBOLS\" && (\n <TokenIcon name={cleanLabel} size=\"2xs\" />\n )}\n <Text size=\"xs\" className=\"oui-text-base-contrast-80\">\n {cleanLabel}\n </Text>\n </button>\n );\n })\n )}\n </div>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n","import { useMemo } from \"react\";\nimport { useSWR } from \"@kodiak-finance/orderly-hooks\";\n\nexport interface KlineData {\n symbol: string;\n resolution: string;\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\ninterface KlineResponse {\n s: string; // status: \"ok\"\n o: number[]; // open\n h: number[]; // high\n l: number[]; // low\n c: number[]; // close\n v: number[]; // volume\n a: number[]; // notional\n t: number[]; // timestamps\n}\n\nconst fetcher = (url: string) =>\n fetch(`https://api.orderly.org${url}`).then((res) => res.json());\n\nexport const useKlineData = (params: {\n symbol?: string;\n resolution?: \"15m\" | \"1h\" | \"1d\";\n from?: number;\n to?: number;\n limit?: number;\n}) => {\n const { symbol, resolution, from, to, limit = 1000 } = params;\n\n const getKey = useMemo(() => {\n if (!symbol || !resolution) return null;\n\n // Calculate default from/to timestamps\n const now = Math.floor(Date.now() / 1000);\n\n // Use provided from/to timestamps, or calculate defaults\n let fromTimestamp = from;\n const toTimestamp = to || now;\n\n if (!fromTimestamp) {\n // If no from is provided, calculate based on resolution and limit\n const secondsPerCandle = {\n \"15m\": 900,\n \"1h\": 3600,\n \"1d\": 86400,\n }[resolution];\n\n fromTimestamp = now - limit * secondsPerCandle;\n }\n\n const search = new URLSearchParams();\n search.set(\"symbol\", symbol);\n search.set(\"resolution\", resolution);\n search.set(\"from\", fromTimestamp.toString());\n search.set(\"to\", toTimestamp.toString());\n\n return `/v1/tv/kline_history?${search.toString()}`;\n }, [symbol, resolution, from, to, limit]);\n\n const { data, isLoading, error } = useSWR<KlineResponse>(getKey, fetcher, {\n revalidateOnFocus: false,\n dedupingInterval: 60000, // Cache for 1 minute\n });\n\n // Transform API response to usable format\n const klines = useMemo(() => {\n if (!data?.t || !Array.isArray(data.t)) return [];\n\n const { o, h, l, c, v, t } = data as KlineResponse;\n\n return t.map((timestamp, index) => ({\n symbol: symbol || \"\",\n resolution: resolution || \"\",\n timestamp,\n open: o[index],\n high: h[index],\n low: l[index],\n close: c[index],\n volume: v[index],\n }));\n }, [data, symbol, resolution]);\n\n return {\n klines,\n isLoading,\n error,\n };\n};\n","import React, { useMemo, useState } from \"react\";\nimport {\n CombinedPnLChart,\n CombinedVolumeChart,\n CombinedFeesChart,\n CombinedPriceChart,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Card,\n Text,\n Flex,\n Tabs,\n TabPanel,\n DataFilter,\n Select,\n Grid,\n Divider,\n Switch,\n Statistic,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { formatDateForChart, getAggregationLabel } from \"./dateUtils\";\nimport { PnLRankingChartMobile } from \"./pnlRankingChartMobile\";\nimport type { UseSymbolPerformanceScriptReturn } from \"./symbolPerformance.script\";\nimport { PeriodType, AggregationWindow } from \"./symbolPerformance.script\";\nimport { SymbolSelector } from \"./symbolSelector\";\nimport { useKlineData } from \"./useKlineData\";\nimport type { TradeData } from \"./useTrades\";\n\nexport type SymbolPerformanceUIMobileProps = UseSymbolPerformanceScriptReturn;\n\nconst MakerTakerShare: React.FC<{ makerShare: number }> = ({ makerShare }) => {\n const takerShare = 100 - makerShare;\n return (\n <Flex direction=\"row\" justify=\"center\" gap={1}>\n <Text weight=\"semibold\" size=\"2xs\">\n {makerShare.toFixed(1)}%\n </Text>\n <span className=\"oui-text-base-contrast-54\">/</span>\n <Text weight=\"semibold\" size=\"2xs\">\n {takerShare.toFixed(1)}%\n </Text>\n </Flex>\n );\n};\n\nexport const SymbolPerformanceUIMobile: React.FC<\n SymbolPerformanceUIMobileProps\n> = (props) => {\n const {\n selectedSymbol,\n setSelectedSymbol,\n period,\n onPeriodChange,\n performanceData,\n filterItems,\n onFilter,\n aggregationWindow,\n setAggregationWindow,\n aggregationWindowTypes,\n aggregatedData,\n trades,\n dateRange,\n isNetPnL,\n setIsNetPnL,\n } = props;\n const { t } = useTranslation();\n const symbolsInfo = useSymbolsInfo();\n const [showCumulativePnL, setShowCumulativePnL] = useState(true);\n const [showCumulativeVolume, setShowCumulativeVolume] = useState(false);\n const [showCumulativeFees, setShowCumulativeFees] = useState(false);\n\n // Trim all data based on first non-zero volume to keep all charts aligned\n const getFirstNonZeroVolumeIndex = (data: any[]) => {\n if (!data || data.length === 0) return 0;\n const index = data.findIndex((item) => item.volume && item.volume !== 0);\n return index === -1 ? 0 : index;\n };\n\n // Get available symbols\n const availableSymbols = useMemo(() => {\n const symbols = Object.keys(symbolsInfo);\n return [\n { value: \"ALL_SYMBOLS\", label: \"All Symbols\" },\n ...symbols.map((symbol) => ({\n value: symbol,\n label: symbol.replace(\"PERP_\", \"\").replace(\"_USDC\", \"\"),\n })),\n ];\n }, [symbolsInfo]);\n\n // Combined PnL chart data with trim\n // aggregatedData.periodData contains NET PnL (after fees)\n // Toggle allows viewing GROSS PnL (before fees) by adding fees back\n const combinedPnLData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(trimIndex);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n // Net PnL = actual result (with fees deducted)\n // Gross PnL = add fees back to show hypothetical without fees\n pnl: isNetPnL ? item.pnl : item.pnl + item.fees,\n }));\n }, [aggregatedData, aggregationWindow, isNetPnL]);\n\n // Combined Volume chart data with trim\n const combinedVolumeData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(trimIndex);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n volume: item.volume ?? 0,\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Combined Fees chart data with trim\n // Fees are shown as negative since they're a cost\n const combinedFeesData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(trimIndex);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n fees: -(item.fees ?? 0),\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Map aggregation window to K-line resolution\n const klineResolution = useMemo(() => {\n switch (aggregationWindow) {\n case \"15m\":\n return \"15m\" as const;\n case \"1h\":\n return \"1h\" as const;\n case \"1d\":\n return \"1d\" as const;\n default:\n return \"1d\" as const;\n }\n }, [aggregationWindow]);\n\n // Fetch K-line data (only if a specific symbol is selected, not \"ALL_SYMBOLS\")\n const isAllSymbols = selectedSymbol === \"ALL_SYMBOLS\";\n const { klines } = useKlineData({\n symbol: !isAllSymbols && selectedSymbol ? selectedSymbol : undefined,\n resolution: klineResolution,\n from: dateRange ? Math.floor(dateRange.from.getTime() / 1000) : undefined,\n to: dateRange ? Math.floor(dateRange.to.getTime() / 1000) : undefined,\n });\n\n // Combine price data - trim to match the trading data range for cross-chart alignment\n // This ensures price chart X-axis aligns with PnL/Volume/Fees charts for easy tracing\n const combinedPriceData = useMemo(() => {\n if (klines.length === 0 || !aggregatedData || !aggregatedData.periodData) {\n return [];\n }\n\n // Get the same trim index as trading data\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const firstTrimmedEntry = aggregatedData.periodData[trimIndex];\n\n if (!firstTrimmedEntry) {\n return [];\n }\n\n // Filter klines to only include those on or after the first trimmed trading date\n const firstTrimmedDate = new Date(firstTrimmedEntry.date);\n\n return klines\n .filter((k) => {\n const klineDate = new Date(k.timestamp * 1000);\n return klineDate >= firstTrimmedDate;\n })\n .map((k) => {\n const date = new Date(k.timestamp * 1000);\n const formattedDate = formatDateForChart(\n date.toISOString(),\n aggregationWindow,\n );\n\n return {\n date: formattedDate,\n open: k.open,\n high: k.high,\n low: k.low,\n close: k.close,\n };\n });\n }, [klines, aggregatedData, aggregationWindow]);\n\n const isEmptyData =\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0;\n\n // Build DataFilter items with only date range (symbol selector is separate)\n const dataFilterItems = useMemo(() => {\n const items: Array<{ type: \"range\"; name: string; value: any }> = [];\n\n // Add date range filter if available\n if (filterItems && filterItems.length > 0) {\n const dateRangeFilter = filterItems.find(\n (item) => item.name === \"dateRange\",\n );\n if (dateRangeFilter) {\n items.push({\n type: \"range\" as const,\n name: \"dateRange\",\n value: dateRangeFilter.value,\n });\n }\n }\n\n return items;\n }, [filterItems]);\n\n const handleFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\" && onFilter) {\n onFilter(filter);\n }\n };\n\n // Aggregate trades by symbol\n const symbolSummaryData = useMemo(() => {\n if (!trades || trades.length === 0) return [];\n\n const symbolMap = new Map<\n string,\n { pnl: number; volume: number; fees: number; trades: number }\n >();\n\n trades.forEach((trade: TradeData) => {\n const symbol = trade.symbol;\n if (!symbolMap.has(symbol)) {\n symbolMap.set(symbol, { pnl: 0, volume: 0, fees: 0, trades: 0 });\n }\n\n const current = symbolMap.get(symbol)!;\n const tradeVolume = trade.executed_quantity * trade.executed_price;\n\n current.pnl += trade.realized_pnl || 0;\n current.volume += tradeVolume;\n current.fees += trade.fee || 0;\n current.trades += 1;\n });\n\n // Convert map to array and sort by PnL (highest first)\n return Array.from(symbolMap.entries())\n .map(([symbol, data]) => ({\n symbol,\n ...data,\n }))\n .sort((a, b) => b.pnl - a.pnl)\n .slice(0, 10); // Top 10 symbols\n }, [trades]);\n\n return (\n <div>\n {/* Symbol Selector & Aggregation Window */}\n <Flex gap={2} itemAlign=\"end\" mb={2}>\n <Box className=\"oui-flex-1\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"common.symbol\")}\n </Text>\n <SymbolSelector\n value={selectedSymbol || \"\"}\n onValueChange={(value: string) => setSelectedSymbol(value)}\n options={availableSymbols}\n placeholder={t(\"common.symbol\")}\n />\n </Box>\n\n <Box className=\"oui-flex-1\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"portfolio.symbolPerformance.aggregation\")}\n </Text>\n <Select.combine\n value={aggregationWindow}\n onValueChange={(value) =>\n setAggregationWindow(value as AggregationWindow)\n }\n options={aggregationWindowTypes.map((type) => ({\n label:\n type === \"15m\" ? \"15 min\" : type === \"1h\" ? \"Hourly\" : \"Daily\",\n value: type,\n }))}\n />\n </Box>\n </Flex>\n\n {/* Date Range Filter */}\n {dataFilterItems && dataFilterItems.length > 0 && (\n <Box mb={4}>\n <DataFilter\n items={dataFilterItems}\n onFilter={handleFilter}\n className=\"oui-border-none oui-py-0\"\n />\n </Box>\n )}\n\n {/* Period Buttons - Below Filters */}\n <Box mb={4}>\n <Tabs\n value={period || \"\"}\n defaultValue={PeriodType.WEEK}\n classNames={{ tabsList: \"oui-justify-between\", trigger: \"oui-w-1/4\" }}\n onValueChange={(value) => onPeriodChange(value as PeriodType)}\n >\n <TabPanel\n title={t(\"common.select.1d\")}\n value={PeriodType.DAY}\n className=\"oui-min-h-0 oui-p-0\"\n />\n <TabPanel\n title={t(\"common.select.7d\")}\n value={PeriodType.WEEK}\n className=\"oui-min-h-0 oui-p-0\"\n />\n <TabPanel\n title={t(\"common.select.30d\")}\n value={PeriodType.MONTH}\n className=\"oui-min-h-0 oui-p-0\"\n />\n <TabPanel\n title={t(\"common.select.90d\")}\n value={PeriodType.QUARTER}\n className=\"oui-min-h-0 oui-p-0\"\n />\n </Tabs>\n </Box>\n\n {/* Key Metrics - Above Charts */}\n <Flex justify=\"between\" itemAlign=\"center\" gap={2} mb={4}>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.symbolPerformance.totalPnL\")}\n </Text>\n <Text.numeral size=\"sm\" weight=\"semibold\" coloring>\n {performanceData ? performanceData.totalPnL.toFixed(2) : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.symbolPerformance.totalVolume\")}\n </Text>\n <Text.numeral size=\"sm\" coloring={false}>\n {performanceData ? performanceData.totalVolume.toFixed(2) : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n Maker / Taker\n </Text>\n <div className=\"oui-text-sm\">\n {performanceData ? (\n <MakerTakerShare makerShare={performanceData.makerShare} />\n ) : (\n <Text size=\"sm\">--</Text>\n )}\n </div>\n </Flex>\n </Flex>\n\n {/* Charts - Combined visualization (bars + cumulative line) */}\n <Grid cols={1} gap={4} mb={4}>\n {/* PnL - Combined Bars + Cumulative Line */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-2\">\n <Text as=\"div\" size=\"xs\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.realizedPnL\")}\n </Text>\n <Flex gap={1}>\n <button\n onClick={() => setIsNetPnL(false)}\n className={cn(\n \"oui-px-2 oui-py-0.5 oui-rounded oui-text-2xs oui-font-semibold oui-transition-all\",\n !isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54\",\n )}\n >\n Gross\n </button>\n <button\n onClick={() => setIsNetPnL(true)}\n className={cn(\n \"oui-px-2 oui-py-0.5 oui-rounded oui-text-2xs oui-font-semibold oui-transition-all\",\n isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54\",\n )}\n >\n Net\n </button>\n <Divider direction=\"vertical\" />\n <Flex itemAlign=\"center\" gap={1}>\n <label className=\"oui-text-2xs oui-text-base-contrast-54\">\n Cum.\n </label>\n <Switch\n checked={showCumulativePnL}\n onCheckedChange={setShowCumulativePnL}\n />\n </Flex>\n </Flex>\n </Flex>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedPnLChart\n key={`mobile-pnl-${aggregationWindow}`}\n data={combinedPnLData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={isEmptyData}\n showCumulative={showCumulativePnL}\n />\n </Box>\n </Box>\n\n {/* Volume - Combined Bars + Cumulative Line */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-2\">\n <Text as=\"div\" size=\"xs\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.volume\")}\n </Text>\n <Flex itemAlign=\"center\" gap={1}>\n <label className=\"oui-text-2xs oui-text-base-contrast-54\">\n Cum.\n </label>\n <Switch\n checked={showCumulativeVolume}\n onCheckedChange={setShowCumulativeVolume}\n />\n </Flex>\n </Flex>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedVolumeChart\n key={`mobile-volume-${aggregationWindow}`}\n data={combinedVolumeData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={isEmptyData}\n showCumulative={showCumulativeVolume}\n />\n </Box>\n </Box>\n\n {/* Price Chart - Only show when specific symbol is selected */}\n {!isAllSymbols && (\n <Box>\n <Text as=\"div\" size=\"xs\" className=\"oui-mb-2\">\n {getAggregationLabel(aggregationWindow)} Price\n </Text>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedPriceChart\n key={`mobile-price-${aggregationWindow}-${selectedSymbol}`}\n data={combinedPriceData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={combinedPriceData.length === 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Fees - Combined Bars + Cumulative Line */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-2\">\n <Text as=\"div\" size=\"xs\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.fees\")}\n </Text>\n <Flex itemAlign=\"center\" gap={1}>\n <label className=\"oui-text-2xs oui-text-base-contrast-54\">\n Cum.\n </label>\n <Switch\n checked={showCumulativeFees}\n onCheckedChange={setShowCumulativeFees}\n />\n </Flex>\n </Flex>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedFeesChart\n key={`mobile-fees-${aggregationWindow}`}\n data={combinedFeesData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={isEmptyData}\n showCumulative={showCumulativeFees}\n />\n </Box>\n </Box>\n </Grid>\n\n {/* Symbol Summary - Top Symbols by PnL */}\n {symbolSummaryData.length > 0 && (\n <Box mt={6} mb={4}>\n <Divider className=\"oui-my-6 oui-border-t-2\" intensity={8} />\n <Text as=\"div\" size=\"sm\" weight=\"semibold\" className=\"oui-mb-4\">\n {t(\"portfolio.symbolPerformance.pnlRanking\")}\n </Text>\n <Box className=\"oui-border oui-border-line-4 oui-rounded-md oui-p-3\">\n <PnLRankingChartMobile\n data={symbolSummaryData}\n onSymbolSelect={setSelectedSymbol}\n />\n </Box>\n </Box>\n )}\n </div>\n );\n};\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Text, cn } from \"@kodiak-finance/orderly-ui\";\n\nexport type PnLRankingDataItem = {\n symbol: string;\n pnl: number;\n volume: number;\n fees: number;\n};\n\ntype PnLRankingChartMobileProps = {\n data: PnLRankingDataItem[];\n onSymbolSelect?: (symbol: string) => void;\n};\n\nconst formatCurrency = (value: number): string => {\n if (value >= 1e9) return `$${(value / 1e9).toFixed(2)}B`;\n if (value >= 1e6) return `$${(value / 1e6).toFixed(2)}M`;\n if (value >= 1e3) return `$${(value / 1e3).toFixed(2)}K`;\n return `$${value.toFixed(2)}`;\n};\n\nexport const PnLRankingChartMobile: React.FC<PnLRankingChartMobileProps> = ({\n data,\n onSymbolSelect,\n}) => {\n const { t } = useTranslation();\n\n const maxAbsValue = useMemo(\n () => Math.max(...data.map((item) => Math.abs(item.pnl)), 1),\n [data],\n );\n\n return (\n <div className=\"oui-w-full oui-space-y-3\">\n {/* Header Row */}\n <div className=\"oui-border-b oui-border-line-4 oui-mb-2 oui-px-3 oui-py-2\">\n <div className=\"oui-flex oui-items-center oui-justify-between\">\n <Text size=\"xs\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.symbols\")}\n </Text>\n <Text\n size=\"xs\"\n intensity={54}\n weight=\"semibold\"\n className=\"oui-text-right\"\n >\n {t(\"portfolio.symbolPerformance.pnlRanking.pnl\")}\n </Text>\n </div>\n </div>\n\n {/* Data Rows */}\n {data.map((item) => {\n const isPositive = item.pnl >= 0;\n const barWidth = (Math.abs(item.pnl) / maxAbsValue) * 100;\n\n return (\n <div\n key={item.symbol}\n onClick={() => onSymbolSelect?.(item.symbol)}\n className=\"oui-border oui-border-line-4 hover:oui-border-line-5 oui-rounded oui-transition-colors oui-px-3 oui-py-3 oui-cursor-pointer\"\n >\n {/* Symbol - Full Width, No Truncation */}\n <Text size=\"xs\" weight=\"semibold\" className=\"oui-mb-2\">\n {item.symbol}\n </Text>\n\n {/* Bar with P&L Value - Full Width */}\n <div className=\"oui-relative oui-w-full oui-h-7 oui-rounded oui-bg-base-8 oui-overflow-hidden oui-flex oui-items-center oui-mb-3\">\n <div\n className=\"oui-absolute oui-h-full oui-rounded oui-transition-all\"\n style={{\n width: `${barWidth}%`,\n backgroundColor: isPositive ? \"#00B49E\" : \"#FF5959\",\n }}\n />\n <Text\n size=\"xs\"\n weight=\"semibold\"\n className={cn(\n \"oui-relative oui-z-10 oui-ml-2\",\n isPositive ? \"oui-text-profit-500\" : \"oui-text-loss-500\",\n )}\n >\n {isPositive ? \"+\" : \"\"}\n {item.pnl.toFixed(2)}\n </Text>\n </div>\n\n {/* Volume and Fees - Compact Secondary Info */}\n <div className=\"oui-flex oui-justify-between oui-gap-2 oui-border-t oui-border-line-4 oui-pt-2\">\n <div>\n <Text size=\"2xs\" intensity={54} className=\"oui-mb-0.5\">\n {t(\"portfolio.symbolPerformance.pnlRanking.volume\")}\n </Text>\n <Text size=\"xs\" weight=\"semibold\">\n {formatCurrency(item.volume)}\n </Text>\n </div>\n <div className=\"oui-text-right\">\n <Text size=\"2xs\" intensity={54} className=\"oui-mb-0.5\">\n {t(\"portfolio.symbolPerformance.pnlRanking.fees\")}\n </Text>\n <Text size=\"xs\" weight=\"semibold\" intensity={80}>\n {formatCurrency(item.fees)}\n </Text>\n </div>\n </div>\n </div>\n );\n })}\n\n {/* Empty State */}\n {data.length === 0 && (\n <div className=\"oui-flex oui-items-center oui-justify-center oui-py-8\">\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.symbolPerformance.noData\")}\n </Text>\n </div>\n )}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/pages/overview/assets/assets.script.ts","../src/pages/overview/assets/assetsHeader.tsx","../src/pages/overview/assets/assets.ui.tsx","../src/pages/overview/assets/assets.widget.tsx","../src/pages/overview/assets/index.ts","../src/pages/overview/historyDataGroup/historyDataGroup.script.ts","../src/pages/overview/assetHistory/column.tsx","../src/pages/overview/helper/date.ts","../src/pages/overview/assetHistory/assetHistory.script.ts","../src/pages/overview/assetHistory/assetHistory.ui.tsx","../src/pages/overview/assetHistory/assetHistory.ui.mobile.tsx","../src/pages/overview/assetHistory/assetHistory.widget.tsx","../src/pages/overview/assetHistory/index.tsx","../src/pages/overview/funding/column.tsx","../src/pages/overview/funding/fundingHistory.ui.tsx","../src/pages/overview/funding/fundingHistory.ui.mobile.tsx","../src/pages/overview/funding/useDataSource.script.ts","../src/pages/overview/funding/fundingHistory.widget.tsx","../src/pages/overview/funding/index.tsx","../src/pages/overview/distribution/column.tsx","../src/pages/overview/distribution/distribution.ui.tsx","../src/pages/overview/distribution/distribution.ui.mobile.tsx","../src/pages/overview/distribution/useDataSource.script.ts","../src/pages/overview/distribution/distribution.widget.tsx","../src/pages/overview/distribution/index.tsx","../src/pages/overview/TransferHistory/column.tsx","../src/pages/overview/TransferHistory/transfer.ui.tsx","../src/pages/overview/TransferHistory/useDataSource.script.ts","../src/pages/overview/TransferHistory/transfer.widget.tsx","../src/pages/overview/TransferHistory/index.tsx","../src/pages/overview/VaultsHistory/column.tsx","../src/pages/overview/VaultsHistory/transfer.ui.tsx","../src/pages/overview/VaultsHistory/useDataSource.script.ts","../src/pages/overview/VaultsHistory/vaults.ui.mobile.tsx","../src/pages/overview/VaultsHistory/transfer.widget.tsx","../src/pages/overview/VaultsHistory/index.tsx","../src/pages/overview/historyDataGroup/historyDataGroup.ui.desktop.tsx","../src/hooks/useAccountsData.ts","../src/hooks/useAssetTotalValue.ts","../src/pages/assets/assetsPage/assets.ui.desktop.tsx","../src/hooks/useAccountFilter.ts","../src/hooks/useAssetsAccountFilter.ts","../src/hooks/index.ts","../src/pages/assets/convertPage/convert.script.ts","../src/pages/assets/convertPage/convert.column.tsx","../src/pages/assets/convertPage/convert.ui.desktop.tsx","../src/pages/assets/convertPage/convert.ui.mobile.tsx","../src/pages/assets/convertPage/convert.widget.tsx","../src/pages/overview/historyDataGroup/historyDataGroup.ui.mobile.tsx","../src/pages/overview/historyDataGroup/historyDataGroup.widget.tsx","../src/pages/overview/historyDataGroup/index.ts","../src/pages/overview/provider/overviewContext.tsx","../src/pages/overview/assetChart/assetsChart.script.ts","../src/pages/overview/shared/useAssetHistory.ts","../src/pages/overview/shared/periodHeader.tsx","../src/pages/overview/assetChart/assetsChart.ui.tsx","../src/pages/overview/assetChart/assetsChart.widget.tsx","../src/pages/overview/assetChart/index.ts","../src/pages/overview/performance/performance.ui.tsx","../src/pages/assets/type.ts","../src/pages/overview/performance/performance.script.ts","../src/pages/overview/performance/performance.widget.tsx","../src/pages/overview/performance/index.ts","../src/pages/feeTier/icons/effectiveFee.tsx","../src/pages/feeTier/icons/index.ts","../src/pages/feeTier/feeTierHeader.tsx","../src/pages/api/apiManager.script.tsx","../src/pages/api/dialog/createApiKey.tsx","../src/pages/api/dialog/createdApiKey.tsx","../src/pages/api/dialog/deleteApiKey.tsx","../src/pages/api/dialog/editApiKey.tsx","../src/pages/api/apiManager.ui.tsx","../src/layout/layout.widget.tsx","../src/layout/layout.script.tsx","../src/layout/layout.ui.tsx","../src/layout/layout.ui.mobile.tsx","../src/layout/context.tsx","../src/pages/overview/index.tsx","../src/pages/overview/performanceMobileDialog/performance.ui.tsx","../src/pages/overview/performanceMobileDialog/performance.widget.tsx","../src/pages/overview/provider/overviewProvider.tsx","../src/pages/overview/mobile/useRewardsData.script.ts","../src/pages/overview/main.tsx","../src/pages/overview/mobile/mobile.widget.tsx","../src/pages/overview/portfolioChartsMobile/portfolioChartsMobile.widget.tsx","../src/pages/overview/portfolioChartsMobile/portfolioChartsMobile.script.ts","../src/pages/overview/portfolioChartsMobile/portfolioChartsMobile.ui.tsx","../src/pages/overview/mobile/accountStatus.ui.mobile.tsx","../src/pages/overview/mobile/affiliateCard.ui.mobile.tsx","../src/pages/overview/mobile/portfolioHandle.ui.mobile.tsx","../src/pages/overview/mobile/portfolioVaule.ui.mobile.tsx","../src/pages/overview/mobile/settingRouter.ui.mobile.tsx","../src/pages/overview/mobile/traderCard.ui.mobile.tsx","../src/pages/feeTier/index.tsx","../src/pages/feeTier/feeTier.ui.tsx","../src/pages/feeTier/feeTier.widget.tsx","../src/pages/feeTier/page.tsx","../src/pages/feeTier/feeTier.script.ts","../src/pages/feeTier/column.tsx","../src/pages/feeTier/dataSource.ts","../src/pages/positions/page.tsx","../src/pages/orders/page.tsx","../src/pages/api/index.ts","../src/pages/api/apiManager.widget.tsx","../src/pages/api/apiManager.page.tsx","../src/pages/setting/index.ts","../src/pages/setting/setting.script.tsx","../src/pages/setting/setting.ui.tsx","../src/pages/setting/setting.ui.desktop.tsx","../src/pages/setting/setting.ui.mobile.tsx","../src/pages/setting/setting.widget.tsx","../src/pages/setting/setting.page.tsx","../src/pages/assets/index.tsx","../src/pages/assets/assetsPage/assets.widget.tsx","../src/pages/assets/assetsPage/assets.script.ts","../src/pages/assets/assetsPage/assets.column.tsx","../src/pages/assets/assetsPage/assets.ui.mobile.tsx","../src/pages/assets/page.tsx","../src/pages/history/index.tsx","../src/pages/history/history.page.tsx","../src/pages/symbolPerformance/index.tsx","../src/pages/symbolPerformance/page.tsx","../src/pages/symbolPerformance/symbolPerformance.widget.tsx","../src/pages/symbolPerformance/symbolPerformance.script.ts","../src/pages/symbolPerformance/useSymbolPerformanceData.ts","../src/pages/symbolPerformance/useTrades.ts","../src/pages/symbolPerformance/symbolPerformance.ui.tsx","../src/pages/symbolPerformance/dateUtils.ts","../src/pages/symbolPerformance/pnlRankingChart.tsx","../src/pages/symbolPerformance/symbolSelector.tsx","../src/pages/symbolPerformance/useKlineData.ts","../src/pages/symbolPerformance/symbolPerformance.ui.mobile.tsx","../src/pages/symbolPerformance/pnlRankingChartMobile.tsx"],"names":["useCallback","useMemo","useAccount","useCollateral","useLeverage","useLocalStorage","usePositionStream","useWalletConnector","useAppContext","AccountStatusEnum","modal","useScreen","LeverageWidgetWithDialogId","DepositAndWithdrawWithDialogId","DepositAndWithdrawWithSheetId","TransferDialogId","TransferSheetId","useAssetScript","init_assets_script","__esmMin","connect","namespace","state","isMainAccount","totalValue","freeCollateral","wrongNetwork","disabledConnect","data","curLeverage","visible","setVisible","isMobile","handleDomId","subAccounts","canTrade","onLeverageEdit","onDeposit","onWithdraw","onTransfer","useTranslation","ArrowDownSquareFillIcon","ArrowLeftRightIcon","ArrowUpSquareFillIcon","Button","CardTitle","Flex","jsx","jsxs","AssetsHeader","init_assetsHeader","props","Card","Divider","Grid","Either","Statistic","Text","EyeIcon","gradientTextVariants","EyeCloseIcon","AuthGuard","Fragment","AssetsUI","NoValue","AssetStatistic","init_assets_ui","AssetWidget","init_assets_widget","connectWallet","rest","assets_exports","__export","init_assets","useState","useHistoryDataGroupScript","init_historyDataGroup_script","active","setActive","AssetHistoryStatusEnum","capitalizeFirstLetter","TokenIcon","toast","Decimal","useAssetHistoryColumns","init_column","options","chainsInfo","isDeposit","isWeb3Wallet","t","onCopy","e","txIdColumn","value","record","href","item","accountIdColumn","accountId","recoed","netAmount","differenceInDays","setHours","parseDateRangeForFilter","init_date","dateRange","from","to","getDate","getMonth","getYear","set","useAssetsHistory","useChainInfo","useTokensInfo","useTransferHistory","AssetHistorySideEnum","usePagination","subtractDaysFromCurrentDate","useAssetHistoryScript","init_assetHistory_script","side","today","d","tokensInfo","target","setTarget","setDateRange","page","pageSize","setPage","parsePagination","startTime","endTime","assetData","assetMeta","assetLoading","transferData","transferLoading","transferMeta","onFilter","filter","isLoading","meta","pagination","dataSource","findToken","token","DataFilter","AuthGuardDataTable","AssetHistory","init_assetHistory_ui","queryParameter","columns","Badge","ListView","ArrowRightShortIcon","EmptyDataState","AssetHistoryMobile","init_assetHistory_ui_mobile","loadMore","getStatusText","status","renderHistoryItem","formattedAmount","getTxLink","chainInfo","chain","itemColor","amountView","statusView","timeView","txIdView","accountIdView","AssetHistoryWidget","init_assetHistory_widget","assetHistory_exports","init_assetHistory","useFundingHistoryColumns","index","useSymbolsInfo","FundingHistoryDesktop","init_fundingHistory_ui","symbols","symbol","FundingHistoryMobile","init_fundingHistory_ui_mobile","switchPaymentType","paymentType","useFundingFeeHistory","useFundingHistoryHook","init_useDataSource_script","setSymbol","isValidating","FundingHistoryWidget","init_fundingHistory_widget","funding_exports","init_funding","useColumns","DistributionHistoryDesktop","init_distribution_ui","type","TYPES","DistributionHistoryMobile","init_distribution_ui_mobile","getTypeText","renderItem","useDistributionHistory","useDistributionHistoryHook","setType","DistributionHistoryWidget","init_distribution_widget","distribution_exports","init_distribution","React","capitalizeString","sub","val","subAccount","produce","formatAddress","TransferHistoryUI","init_transfer_ui","selectedAccount","ALL_ACCOUNTS","MAIN_ACCOUNT","memoizedOptions","draft","row","useTransferHistoryHook","date","setAccount","setSide","filteredData","onAccountFilter","TransferHistoryWidget","init_transfer_widget","accountState","TransferHistory_exports","init_TransferHistory","cn","VaultsHistoryUI","useVaultsHistory","useVaultsHistoryHook","onDateRangeFilter","VaultsHistoryMobile","init_vaults_ui_mobile","typeColor","typeText","amountText","VaultsHistoryWidget","VaultsHistory_exports","init_VaultsHistory","useEffect","ArrowLeftRightSquareFill","FeeTierIcon","ServerFillIcon","TabPanel","Tabs","VaultsIcon","LazyAssetHistoryWidget","LazyFundingHistoryWidget","LazyDistributionHistoryWidget","LazyTransferHistoryWidget","LazyVaultsHistoryWidget","HistoryDataGroupDesktop","init_historyDataGroup_ui_desktop","mod","onTabChange","EMPTY_HOLDING","useAccountsData","init_useAccountsData","holding","useIndexPricesStream","isNumber","calculateTotalHolding","useAssetTotalValue","init_useAssetTotalValue","getIndexPrice","total","hol","indexPrice","allAccounts","mainTotalValue","subTotalValue","find","pick","ArrowDownShortIcon","LazyConvertHistoryWidget","TotalValueInfo","DepositAndWithdrawButton","DataFilterSection","AssetsDataTable","AssetsTable","init_assets_ui_desktop","onToggleVisibility","Icon","mergedDisabled","selectedAsset","assetsOptions","ALL_ASSETS","memoizedAssetOptions","init_useAccountFilter","useAssetsAccountFilter","useAssetsMultiFilter","init_useAssetsAccountFilter","setSelectedAccount","name","setSelectedAsset","accountFiltered","account","filteredChildren","child","init_hooks","useSubAccountQuery","EMPTY_LIST","useConvertScript","init_convert_script","indexPrices","statusFilter","setStatusFilter","convertedAssetFilter","setConvertedAssetFilter","convertedAssetOptions","assetOptions","queryUrl","params","summary","dataRows","totalConversions","totalUSDCReceived","sum","totalFees","detailSum","detail","Tooltip","ConvertedAssetColumn","useConvertColumns","useConvertDetailColumns","init_convert_column","convertedAssets","assets","tooltipContent","asset","onDetailsClick","qty","details","totalHaircut","convertId","haircut","txId","venue","result","DataTable","SimpleDialog","useModal","CONVERT_STATUS_OPTIONS","ConvertDetailsModal","ConvertDesktopUI","init_convert_ui_desktop","onOpenChange","detailColumns","convertState","dataFilter","SimpleSheet","ScrollIndicator","ConvertMobileUI","ConvertMobileField","ConvertMobileItem","ConverHistoryItemDetailsDialog","init_convert_ui_mobile","label","rule","copyable","className","onClick","hide","resolve","reject","convert_widget_exports","ConvertHistoryWidget","init_convert_widget","HistoryDataGroupMobile","init_historyDataGroup_ui_mobile","HistoryDataGroupWidget","init_historyDataGroup_widget","historyDataGroup_exports","init_historyDataGroup","createContext","useContext","OverviewContext","useOverviewContext","init_overviewContext","useDataTap","useAssetsChartScript","init_assetsChart_script","assetHistory","_data","invisible","useRef","subDays","format","usePrivateQuery","useStatisticsDaily","zero","getUTCStr","year","month","day","PeriodType","useAssetsHistoryData","init_useAssetHistory","localKey","isRealtime","periodTypes","period","setPeriod","convertToUSDCAndOperate","inputs","amount","op","delta","periodLabel","formatDateRange","getExpectedDateRange","offsetDay","getMatchingPeriodType","expectedRange","getCustomDateRangeLabel","getStartDate","startDate","setStartDate","endDate","setEndDate","periodValue","totalDeposit","transferOutHistory","transferInHistory","allDepositHistory","totalDepositForROI","acc","totalTransferInForROI","onPeriodChange","newStartDate","newRange","fromDate","toDate","matchingPeriod","filterItems","lastItem","totalTransferIn","totalTransferOut","calculateLastPnl","list","i","calculate","mergeData","calculateData","realtime","calculatedData","aggregateValue","vol","pnl","roi","tail","dataTailIndex","lastAccountValue","createFakeData","start","end","_","periodHeader_exports","PeriodTitle","init_periodHeader","periodOrder","periodType","AssetAreaChart","Box","LazyPeriodTitle","AssetsChart","init_assetsChart_ui","AssetsChartWidget","init_assetsChart_widget","assetChart_exports","init_assetChart","PnlAreaChart","PnLBarChart","VolBarChart","LabelWithHint","PerformancePnLTabs","VolumeChart","PerformanceUI","init_performance_ui","hint","activeTab","setActiveTab","volumeData","shouldHide","volumeUpdateDate","curPeriod","ORDERLY_ASSETS_VISIBLE_KEY","init_type","usePerformanceScript","init_performance_script","ctx","PerformanceWidget","init_performance_widget","performance_exports","init_performance","useId","EffectiveFee","init_effectiveFee","ref","linearId","init_icons","feeTierHeader_exports","DesktopHeaderItem","FeeTierHeader","MobileHeaderItem","useFeeState","createElement","isEffective","init_feeTierHeader","interactive","tier","headerDataAdapter","refereeRebate","others","isEffectiveFee","items","mergedData","useApiKeyManager","capitalizeFirstChar","str","useApiManagerScript","init_apiManager_script","filterTags","keyStatus","showCreateDialog","setShowCreateDialog","showCreatedDialog","setShowCreatedDialog","generateKey","setGenerateKey","canCreateApiKey","keys","generateOrderlyKey","setIPRestriction","removeOrderlyKey","resetOrderlyKeyIPRestriction","refresh","error","curPubKey","setCurPubKey","pubKey","onCreateApiKey","onReadApiGuide","hideCreateDialog","doCreate","ipRestriction","scope","createdSuccess","res","ip","key","secretKey","generateKeyRes","err","hideCreatedDialog","onCopyApiKeyInfo","doConfirm","doDelete","curKey","doEdit","future","onCopyAccountId","onCopyApiKey","onCopyApiSecretKey","onCopyIP","keyList","filterTag","filterCurKey","verifyIP","accountStatus","userId","createApiKey_exports","Checkbox","CreateAPIKeyDialog","init_createApiKey","ipText","setIpText","read","setRead","trade","setTrade","setHint","open","scopes","createdApiKey_exports","CreatedAPIKeyDialog","CopyIcon","init_createdApiKey","deleteApiKey_exports","DeleteAPIKeyDialog","Trans","init_deleteApiKey","init_apiManager_ui","setOpen","onDelete","formatKey","editApiKey_exports","EditAPIKeyDialog","init_editApiKey","onUpdate","PlusIcon","AuthGuardEmpty","AuthGuardTooltip","LazyCreateAPIKeyDialog","LazyCreatedAPIKeyDialog","LazyDeleteAPIKeyDialog","LazyEditAPIKeyDialog","APIManager","AccountInfo","Subtitle","KeyList","EditButton","DeleteButton","useMediaQuery","useScaffoldContext","PortfolioLeftSidebarPath","usePortfolioLayoutScript","routerAdapter","current","setCurrent","hideSideBar","Scaffold","SideBar","PortfolioLayout","children","leftSideProps","classNames","LeftSidebar","expanded","setExpand","MainNavMobile","BottomNav","LayoutContext","useLayoutContext","LayoutProvider","sideOpen","setSideOpen","memoizedValue","PortfolioLayoutMobile","PortfolioLayoutWidget","overview_exports","OverviewPage","OverviewProvider","PerformanceMobileDialogId","PerformanceMobileSheetId","PerformanceMobileUI","PerformanceMobileWidget","AssetLineChart","responsiveProps","i18n","registerSimpleDialog","registerSimpleSheet","useAllBrokers","useConfig","useCurEpochEstimate","useEpochInfo","useGetClaimed","noCacheConfig","DistributionId","TWType","useRewardsData","totalOrderClaimedReward","curEpochEstimate","brokers","mutate","epochList","brokerId","brokerName","lastStete","timerRef","useRewardsDataScript","referralInfo","isSignIn","rewardsData","ENVType","useGetEnv","DepositStatusWidget","usePortfolioChartsState","onPerformanceClick","Area","AreaChart","ChevronRightIcon","PortfolioChartsMobileUI","unrealPnL","unrealROI","colorId","PortfolioChartsMobileWidget","parseJSON","useChains","ChainNamespace","ChainIcon","useCurrentStatus","statusText","EVMChainPopover","chains","MoreIcon","EVMChains","ShowAccount","onCopyAddress","currentNamespace","getLinkDeviceStorage","leftNode","rightNode","bgClass","bg","AccountStatusMobile","description","rootClass","linkDeviceStorage","AffiliateIcon","commifyOptional","AffiliateCardMobile","rebate","CalendarMinusIcon","PortfolioHandleMobile","onGotoHistory","PortfolioValueMobile","SettingFillIcon","SettingRouterMobile","TraderMobileIcon","TraderCardMobile","MobileOverview","portfolioValue","toggleVisible","hasSubAccount","layoutContext","onRouteChange","env","goToClaim","url","navigateToPortfolioHistory","LazyAssetWidget","LazyAssetsChartWidget","LazyPerformanceWidget","LazyHistoryDataGroupWidget","feeTier_exports","FeeTierPage","useFeeTierScript","LazyFeeTierHeader","FeeTierTable","onRow","onCell","internalOnRow","config","internalOnCell","column","isFirstColumn","isLastColumn","FeeTier","FeeTierWidget","useAccountInfo","numberToHumanStyle","textStyle","useFeeTierColumns","volume_min","volume_max","volume_node","findCurrentTier","feeList","futures_taker_fee_rate","futures_maker_fee_rate","takerRate","makerRate","dataAdapter","setTier","cols","volumeStatistics","page_exports","PositionsPage","InfoCircleIcon","LiquidationWidget","PositionHistoryWidget","CombinePositionsWidget","PositionsWidget","tab","setTab","positionsRef","positionHistoryRef","LiquidationTab","OrdersPage","OrdersWidget","sharePnLConfig","ordersRef","TooltipIcon","api_exports","APIManagerPage","APIManagerWidget","setting_exports","SettingPage","SettingWidget","useDebouncedCallback","useMutation","useSettingScript","update","isMutating","checked","setChecked","updateCheckState","setMaintainConfig","maintenance_cancel_order_flag","canTouch","Switch","SettingDesktop","LanguageSwitcherWidget","SettingMobile","Setting","AssetsDataTableWidget","AssetsPage","AssetsTableMobile","AssetsWidget","useAssetsColumns","onConvert","id","useAssetsScript","filtered","enhancedFiltered","accountData","enhancedChildren","tokenInfo","assetValue","collateralRatio","collateralContribution","handleTransfer","handleConvert","showTransfer","assetsColumns","openDepositAndWithdraw","viewName","AccountTag","AssetMobileItem","memoizedAssets","assetsState","history_exports","HistoryPage","HistoryWidget","symbolPerformance_exports","SymbolPerformancePage","SymbolPerformanceUI","SymbolPerformanceWidget","useSymbolPerformanceScript","endOfDay","addDays","fillTimeSeriesGaps","dataMap","incrementFn","getKeyFn","filledData","fillDailyGaps","dailyMap","fillHourlyGaps","hourlyMap","fillFifteenMinuteGaps","fifteenMinMap","useSymbolPerformanceData","tradesData","periodStartDate","periodEndDate","includeFees","tradesWithPnL","volume","fees","totalPnL","totalVolume","totalTrades","grossPnL","sortedByDate","a","b","makerVolume","makerShare","dailyPnLMap","dateKey","existing","dailyData","hourlyDataMap","hourKey","isSingleDay","nextDayDate","nextDayStartTime","bucketEndDate","hourlyData","fifteenMinuteDataMap","minutes","roundedMinutes","fifteenMinKey","fifteenMinuteData","_pnl","cumulativeDailyPnL","_fees","cumulativeDailyFees","_volume","cumulativeDailyVolume","cumulativeHourlyPnL","hour","cumulativeHourlyFees","cumulativeHourlyVolume","cumulativeFifteenMinutePnL","fifteenMin","cumulativeFifteenMinuteFees","cumulativeFifteenMinuteVolume","usePrivateInfiniteQuery","useTrades","start_t","end_t","size","getKey","pageIndex","previousPageData","search","timeoutRef","lastPage","nextPageSize","AggregationWindow","PRESET_DAYS","getDateRange","normalizeDateToUTC","dateStr","selectedSymbol","setSelectedSymbol","aggregationWindow","setAggregationWindow","isNetPnL","setIsNetPnL","range","newDateRange","normalizedRange","normalizedRangeForComparison","endDateForAPI","trades","performanceData","aggregationWindowTypes","CombinedPnLChart","CombinedVolumeChart","CombinedFeesChart","CombinedPriceChart","Select","parseISO","getAggregationLabel","window","formatDateForChart","dateString","formatCurrency","PnLRankingChart","onSymbolSelect","maxAbsValue","isPositive","barWidth","DropdownMenuRoot","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuPortal","Input","CaretDownIcon","SymbolSelector","onValueChange","placeholder","setSearch","filteredOptions","opt","selectedOption","displayLabel","option","isSelected","cleanLabel","useSWR","fetcher","useKlineData","resolution","limit","now","fromTimestamp","toTimestamp","secondsPerCandle","o","h","l","c","v","timestamp","MakerTakerShare","takerShare","aggregatedData","symbolsInfo","viewType","setViewType","showCumulativePnL","setShowCumulativePnL","showCumulativeVolume","setShowCumulativeVolume","showCumulativeFees","setShowCumulativeFees","getTrimmedDataRange","startIndex","endIndex","lastIdx","idx","availableSymbols","combinedPnLData","combinedVolumeData","combinedFeesData","klineResolution","isAllSymbols","klineEndDate","klines","combinedPriceData","trimmedTradingData","klineMap","k","formattedDate","tradingItem","kline","tableData","tableColumns","formatVolumeValue","abbreviations","num","decimalPlaces","symbolSummaryData","symbolMap","tradeVolume","PnLRankingChartMobile","SymbolPerformanceUIMobile","getFirstNonZeroVolumeIndex","trimIndex","firstTrimmedEntry","firstTrimmedDate","isEmptyData","dataFilterItems","dateRangeFilter","handleFilter"],"mappings":"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","sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport {\n useAccount,\n useCollateral,\n useLeverage,\n useLocalStorage,\n usePositionStream,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { modal, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { LeverageWidgetWithDialogId } from \"@kodiak-finance/orderly-ui-leverage\";\nimport {\n DepositAndWithdrawWithDialogId,\n DepositAndWithdrawWithSheetId,\n TransferDialogId,\n TransferSheetId,\n} from \"@kodiak-finance/orderly-ui-transfer\";\n\nexport const useAssetScript = () => {\n const { connect, namespace } = useWalletConnector();\n const { state, isMainAccount } = useAccount();\n const { totalValue, freeCollateral } = useCollateral();\n const { wrongNetwork, disabledConnect } = useAppContext();\n const [data] = usePositionStream();\n const { curLeverage } = useLeverage();\n const [visible, setVisible] = useLocalStorage(\"orderly_assets_visible\", true);\n const { isMobile } = useScreen();\n const handleDomId = isMobile\n ? DepositAndWithdrawWithSheetId\n : DepositAndWithdrawWithDialogId;\n const subAccounts = state.subAccounts ?? [];\n\n const canTrade = useMemo(() => {\n return (\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected)\n );\n }, [state.status, wrongNetwork, disabledConnect]);\n\n const onLeverageEdit = () => {\n modal.show(LeverageWidgetWithDialogId);\n };\n\n const onDeposit = useCallback(() => {\n modal.show(handleDomId, { activeTab: \"deposit\" });\n }, [handleDomId]);\n\n const onWithdraw = useCallback(() => {\n modal.show(handleDomId, { activeTab: \"withdraw\" });\n }, []);\n\n const onTransfer = useCallback(() => {\n if (isMobile) {\n modal.show(TransferSheetId);\n } else {\n modal.show(TransferDialogId);\n }\n }, [isMobile]);\n\n return {\n canTrade,\n connect,\n portfolioValue: totalValue,\n freeCollateral,\n unrealPnL: data.aggregated.total_unreal_pnl,\n unrealROI: data.totalUnrealizedROI,\n currentLeverage: curLeverage,\n onLeverageEdit,\n visible,\n wrongNetwork,\n toggleVisible: () => setVisible(!visible),\n onDeposit,\n onWithdraw,\n onTransfer,\n namespace,\n isMainAccount,\n hasSubAccount: subAccounts?.length > 0,\n } as const;\n};\n\nexport type AssetScriptReturn = ReturnType<typeof useAssetScript>;\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n ArrowDownSquareFillIcon,\n ArrowLeftRightIcon,\n ArrowUpSquareFillIcon,\n Button,\n CardTitle,\n Flex,\n} from \"@kodiak-finance/orderly-ui\";\n\ntype Props = {\n disabled: boolean;\n onWithdraw?: () => void;\n onDeposit?: () => void;\n onTransfer?: () => void;\n isMainAccount?: boolean;\n hasSubAccount?: boolean;\n};\n\nexport const AssetsHeader: FC<Props> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex justify={\"between\"}>\n <CardTitle>{t(\"common.overview\")}</CardTitle>\n <Flex gap={3}>\n {props.isMainAccount && (\n <Button\n disabled={props.disabled}\n size=\"md\"\n onClick={() => props.onDeposit?.()}\n icon={<ArrowDownSquareFillIcon />}\n data-testid=\"oui-testid-portfolio-assets-deposit-btn\"\n >\n {t(\"common.deposit\")}\n </Button>\n )}\n {props.hasSubAccount && (\n <Button\n disabled={props.disabled}\n size=\"md\"\n color=\"secondary\"\n onClick={() => props.onTransfer?.()}\n icon={<ArrowLeftRightIcon />}\n >\n {t(\"common.transfer\")}\n </Button>\n )}\n {props.isMainAccount && (\n <Button\n disabled={props.disabled}\n size=\"md\"\n color=\"secondary\"\n onClick={() => props.onWithdraw?.()}\n icon={<ArrowUpSquareFillIcon />}\n data-testid=\"oui-testid-portfolio-assets-withdraw-btn\"\n >\n {t(\"common.withdraw\")}\n </Button>\n )}\n </Flex>\n </Flex>\n );\n};\n","import React, { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Card,\n Divider,\n Flex,\n Grid,\n Either,\n Statistic,\n Text,\n EyeIcon,\n gradientTextVariants,\n EditIcon,\n EyeCloseIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuard } from \"@kodiak-finance/orderly-ui-connector\";\nimport { AssetScriptReturn } from \"./assets.script\";\nimport { AssetsHeader } from \"./assetsHeader\";\n\nexport const AssetsUI: React.FC<\n AssetScriptReturn & { onConnectWallet?: () => void }\n> = (props) => {\n const { t } = useTranslation();\n return (\n <Card\n classNames={{ footer: \"oui-h-[48px]\", root: \"oui-h-[240px]\" }}\n title={\n <AssetsHeader\n disabled={!props.canTrade}\n isMainAccount={props.isMainAccount}\n onDeposit={props.onDeposit}\n onWithdraw={props.onWithdraw}\n onTransfer={props.onTransfer}\n hasSubAccount={props.hasSubAccount}\n />\n }\n >\n <>\n <Statistic\n label={\n <Flex gap={1}>\n <Text intensity={54}>{t(\"common.totalValue\")}</Text>\n <button\n onClick={() => {\n props.toggleVisible();\n }}\n data-testid=\"oui-testid-portfolio-assets-eye-btn\"\n >\n {props.visible ? (\n <EyeIcon size={16} color={\"white\"} />\n ) : (\n <EyeCloseIcon size={16} color={\"white\"} />\n )}\n </button>\n </Flex>\n }\n >\n <Either value={props.canTrade!} left={<NoValue />}>\n <Text.numeral\n visible={props.visible}\n unit=\"USDC\"\n // @ts-ignore\n style={{ \"--oui-gradient-angle\": \"45deg\" }}\n unitClassName=\"oui-text-base oui-text-base-contrast-80 oui-h-9 oui-ml-1\"\n className={gradientTextVariants({\n className: \"oui-font-bold oui-text-3xl\",\n color: \"brand\",\n })}\n >\n {props.portfolioValue ?? \"--\"}\n </Text.numeral>\n </Either>\n </Statistic>\n <Divider className=\"oui-my-4\" intensity={8} />\n <AuthGuard buttonProps={{ size: \"lg\", fullWidth: true }}>\n <AssetStatistic\n unrealROI={props.unrealROI}\n unrealPnL={props.unrealPnL}\n freeCollateral={props.freeCollateral}\n currentLeverage={props.currentLeverage}\n onLeverageEdit={props.onLeverageEdit}\n visible={props.visible}\n />\n </AuthGuard>\n </>\n </Card>\n );\n};\n\nconst NoValue: FC = () => {\n return (\n <Flex gap={1} className={\"oui-h-9\"}>\n <Text.gradient color=\"brand\" weight=\"bold\">\n --\n </Text.gradient>\n <Text>USDC</Text>\n </Flex>\n );\n};\n\ntype AssetStatisticProps = Pick<\n AssetScriptReturn,\n | \"currentLeverage\"\n | \"unrealPnL\"\n | \"unrealROI\"\n | \"freeCollateral\"\n | \"onLeverageEdit\"\n | \"visible\"\n>;\n\nexport const AssetStatistic = (props: AssetStatisticProps) => {\n const { t } = useTranslation();\n\n return (\n <Grid cols={2} className=\"oui-h-12\">\n <Statistic label={t(\"common.unrealizedPnl\")}>\n <Flex>\n <Text.numeral\n coloring\n size=\"lg\"\n weight=\"semibold\"\n visible={props.visible}\n >\n {props.unrealPnL}\n </Text.numeral>\n <Text.numeral\n coloring\n rule=\"percentages\"\n size=\"sm\"\n weight=\"semibold\"\n prefix={\"(\"}\n suffix={\")\"}\n visible={props.visible}\n >\n {props.unrealROI}\n </Text.numeral>\n </Flex>\n </Statistic>\n <Statistic\n label={t(\"portfolio.overview.availableWithdraw\")}\n // @ts-ignore\n align=\"right\"\n // @ts-ignore\n valueProps={{ size: \"lg\", visible: props.visible }}\n >\n {props.freeCollateral}\n </Statistic>\n </Grid>\n );\n};\n","import React from \"react\";\nimport { useAssetScript } from \"./assets.script\";\nimport { AssetsUI } from \"./assets.ui\";\n\nexport const AssetWidget: React.FC = () => {\n const { connect: connectWallet, ...rest } = useAssetScript();\n return (\n <AssetsUI\n // TODO: remove duplicate props\n onConnectWallet={connectWallet}\n connect={connectWallet}\n {...rest}\n />\n );\n};\n","export { useAssetScript } from \"./assets.script\";\nexport { AssetsUI } from \"./assets.ui\";\nexport { AssetWidget } from \"./assets.widget\";\n","import { useState } from \"react\";\n\nexport type TabName =\n | \"deposit\"\n | \"withdraw\"\n | \"funding\"\n | \"distribution\"\n | \"transfer\"\n | \"vaults\";\n\nexport const useHistoryDataGroupScript = () => {\n const [active, setActive] = useState<TabName>(\"deposit\");\n return {\n active,\n onTabChange: setActive as React.Dispatch<React.SetStateAction<string>>,\n } as const;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistoryStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport {\n capitalizeFirstLetter,\n Text,\n Flex,\n TokenIcon,\n toast,\n type Column,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\n\ntype Options = {\n chainsInfo: any[];\n isDeposit: boolean;\n isWeb3Wallet: boolean;\n};\n\nexport const useAssetHistoryColumns = (options: Options) => {\n const { chainsInfo, isDeposit, isWeb3Wallet } = options;\n const { t } = useTranslation();\n\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n\n const columns = useMemo<Column[]>(() => {\n const txIdColumn: Column = {\n title: t(\"common.txId\"),\n dataIndex: \"tx_id\",\n width: 120,\n render: (value, record) => {\n if (!value) {\n return <div className=\"oui-text-base-contrast-54\">-</div>;\n }\n const chainInfo = chainsInfo?.find(\n (item) => parseInt(record.chain_id) === parseInt(item.chain_id),\n );\n const explorer_base_url = chainInfo?.explorer_base_url;\n const href = `${explorer_base_url}/tx/${value}`;\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n {/* <Tooltip content={value} delayDuration={0}> */}\n <Text.formatted\n copyable={!!value}\n rule=\"txId\"\n className=\"oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n onCopy={onCopy}\n >\n {value}\n </Text.formatted>\n {/* </Tooltip> */}\n </a>\n );\n },\n };\n\n const accountIdColumn: Column = {\n title: t(\"common.accountId\"),\n dataIndex: \"account_id\",\n width: 120,\n render: (value, record) => {\n const accountId = isDeposit\n ? record.from_account_id\n : record.to_account_id;\n\n return (\n <Text.formatted rule=\"address\" copyable={!!accountId} onCopy={onCopy}>\n {accountId}\n </Text.formatted>\n );\n },\n };\n\n return [\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n width: 80,\n render: (value) => {\n return (\n <Flex gapX={1}>\n <TokenIcon name={value} size=\"xs\" />\n <span>{value}</span>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n width: 80,\n rule: \"date\",\n },\n isWeb3Wallet ? txIdColumn : accountIdColumn,\n {\n title: t(\"common.status\"),\n dataIndex: \"trans_status\",\n width: 100,\n render: (value, recoed) => {\n value = isWeb3Wallet ? value : recoed.status;\n const statusMap = {\n [AssetHistoryStatusEnum.NEW]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.PENDING]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.CONFIRM]: t(\"assetHistory.status.confirm\"),\n [AssetHistoryStatusEnum.PROCESSING]: t(\n \"assetHistory.status.processing\",\n ),\n [AssetHistoryStatusEnum.COMPLETED]: t(\n \"assetHistory.status.completed\",\n ),\n [AssetHistoryStatusEnum.FAILED]: t(\"assetHistory.status.failed\"),\n };\n return (\n statusMap[value as keyof typeof statusMap] ||\n capitalizeFirstLetter(value?.toLowerCase())\n );\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount\",\n width: 100,\n rule: \"price\",\n render: (value, record) => {\n const netAmount = new Decimal(value).minus(record.fee ?? 0);\n return (\n <Text.numeral\n dp={record.decimals}\n rule=\"price\"\n coloring\n showIdentifier\n padding={false}\n >\n {isDeposit ? netAmount.toNumber() : netAmount.neg().toNumber()}\n </Text.numeral>\n );\n },\n },\n ];\n }, [t, chainsInfo, isDeposit, isWeb3Wallet]);\n\n return columns;\n};\n","import { differenceInDays, setHours } from \"date-fns\";\n\nexport const parseDateRangeForFilter = (dateRange: {\n from: Date;\n to?: Date;\n}) => {\n const { from, to = new Date() } = dateRange;\n\n const diff = differenceInDays(from, to);\n\n if (diff === 0) {\n return [from, setHours(to, 23)];\n }\n\n return [from, to];\n};\n","import { useCallback, useMemo, useState } from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport {\n useAssetsHistory,\n useChainInfo,\n useTokensInfo,\n useTransferHistory,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport { modal, usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { DepositAndWithdrawWithSheetId } from \"@kodiak-finance/orderly-ui-transfer\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\n\nexport enum AssetTarget {\n Web3Wallet = \"Web3Wallet\",\n AccountId = \"AccountId\",\n}\n\nexport type AssetHistoryScriptOptions = {\n side: AssetHistorySideEnum;\n};\n\nexport type AssetHistoryScriptReturn = ReturnType<typeof useAssetHistoryScript>;\n\nexport const useAssetHistoryScript = (options: AssetHistoryScriptOptions) => {\n const { side } = options;\n const isDeposit = side === AssetHistorySideEnum.DEPOSIT;\n\n const [today] = useState(() => {\n const d = new Date();\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const tokensInfo = useTokensInfo();\n\n const [target, setTarget] = useState<AssetTarget>(AssetTarget.Web3Wallet);\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const { startTime, endTime } = useMemo(() => {\n const startTime = dateRange[0].getTime();\n const endTime = set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n }).getTime();\n\n return { startTime, endTime };\n }, [dateRange]);\n\n const [assetData, { meta: assetMeta, isLoading: assetLoading }] =\n useAssetsHistory(\n {\n startTime,\n endTime,\n page,\n pageSize,\n side,\n },\n {\n shouldUpdateOnWalletChanged: (data) => data.side === side,\n },\n );\n\n const [transferData, { isLoading: transferLoading, meta: transferMeta }] =\n useTransferHistory({\n dataRange: [startTime, endTime],\n side: isDeposit ? \"IN\" : \"OUT\",\n size: pageSize,\n page: page,\n main_sub_only: false,\n });\n\n const { data: chainsInfo } = useChainInfo();\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n setDateRange(parseDateRangeForFilter(filter.value));\n setPage(1);\n } else if (filter.name === \"target\") {\n setTarget(filter.value);\n setPage(1);\n }\n };\n\n const isLoading = useMemo(() => {\n if (target === AssetTarget.Web3Wallet) {\n return assetLoading;\n }\n return transferLoading;\n }, [target, assetLoading, transferLoading]);\n\n const meta = useMemo(() => {\n if (target === AssetTarget.Web3Wallet) {\n return assetMeta;\n }\n return transferMeta;\n }, [target, assetMeta, transferMeta]);\n\n const pagination = useMemo(\n () => parsePagination(meta),\n [parsePagination, meta],\n );\n\n const dataSource = useMemo(() => {\n return (target === AssetTarget.Web3Wallet ? assetData : transferData).map(\n (item) => {\n const findToken = tokensInfo?.find(({ token }) => token === item.token);\n return {\n ...item,\n decimals: findToken?.decimals ?? 2,\n };\n },\n );\n }, [target, assetData, transferData, tokensInfo]);\n\n const onDeposit = useCallback(() => {\n modal.show(DepositAndWithdrawWithSheetId, { activeTab: \"deposit\" });\n }, []);\n\n const isWeb3Wallet = target === AssetTarget.Web3Wallet;\n\n return {\n dataSource,\n total: meta?.total,\n isLoading,\n queryParameter: {\n target,\n dateRange,\n },\n onFilter,\n pagination,\n onDeposit,\n chainsInfo: chainsInfo as any[],\n isDeposit,\n isWeb3Wallet,\n };\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport {\n AssetTarget,\n type AssetHistoryScriptReturn,\n} from \"./assetHistory.script\";\nimport { useAssetHistoryColumns } from \"./column\";\n\ntype AssetHistoryProps = AssetHistoryScriptReturn;\n\nexport const AssetHistory: FC<AssetHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading } = props;\n const { dateRange, target } = queryParameter;\n const columns = useAssetHistoryColumns({\n chainsInfo: props.chainsInfo,\n isDeposit: props.isDeposit,\n isWeb3Wallet: props.isWeb3Wallet,\n });\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"common.web3Wallet\"), value: AssetTarget.Web3Wallet },\n { label: t(\"common.accountId\"), value: AssetTarget.AccountId },\n ];\n }, [t]);\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"target\",\n options: options,\n value: target,\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n />\n\n <AuthGuardDataTable\n bordered\n loading={isLoading}\n classNames={{\n root: \"oui-h-[calc(100%_-_49px)]\",\n scroll: \"oui-min-h-[400px]\",\n }}\n columns={columns}\n dataSource={dataSource}\n pagination={props.pagination}\n />\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistoryStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n DataFilter,\n Flex,\n ListView,\n Text,\n capitalizeFirstLetter,\n toast,\n ArrowRightShortIcon,\n EmptyDataState,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AssetTarget,\n type AssetHistoryScriptReturn,\n} from \"./assetHistory.script\";\n\ntype AssetHistoryMobileProps = AssetHistoryScriptReturn;\n\nexport const AssetHistoryMobile: FC<AssetHistoryMobileProps> = (props) => {\n const {\n dataSource,\n queryParameter,\n onFilter,\n isLoading,\n pagination,\n onDeposit,\n chainsInfo,\n isDeposit,\n isWeb3Wallet,\n } = props;\n const { dateRange, target } = queryParameter;\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n { label: t(\"common.web3Wallet\"), value: AssetTarget.Web3Wallet },\n { label: t(\"common.accountId\"), value: AssetTarget.AccountId },\n ];\n }, [t]);\n\n const loadMore = () => {\n if (dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange?.(pagination?.pageSize + 50);\n }\n };\n\n const getStatusText = (item: any) => {\n const status = props.isWeb3Wallet ? item.trans_status : item.status;\n const statusMap = {\n [AssetHistoryStatusEnum.NEW]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.PENDING]: t(\"assetHistory.status.pending\"),\n [AssetHistoryStatusEnum.CONFIRM]: t(\"assetHistory.status.confirm\"),\n [AssetHistoryStatusEnum.PROCESSING]: t(\"assetHistory.status.processing\"),\n [AssetHistoryStatusEnum.COMPLETED]: t(\"assetHistory.status.completed\"),\n [AssetHistoryStatusEnum.FAILED]: t(\"assetHistory.status.failed\"),\n };\n return (\n statusMap[status as keyof typeof statusMap] ||\n capitalizeFirstLetter(status?.toLowerCase())\n );\n };\n\n const renderHistoryItem = (item: any) => {\n // Amount formatting\n const formattedAmount = isDeposit\n ? `+${item.amount - (item.fee ?? 0)}`\n : -(item.amount - (item.fee ?? 0));\n\n // Get tx link\n const getTxLink = () => {\n if (!item.tx_id) {\n return undefined;\n }\n\n const chainInfo =\n chainsInfo && Array.isArray(chainsInfo)\n ? chainsInfo.find(\n (chain: any) =>\n parseInt(item.chain_id) === parseInt(chain.chain_id),\n )\n : undefined;\n\n if (chainInfo?.explorer_base_url) {\n return `${chainInfo.explorer_base_url}/tx/${item.tx_id}`;\n }\n\n return undefined;\n };\n\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n\n const itemColor = isDeposit ? \"buy\" : \"sell\";\n\n const amountView = (\n <Flex className=\"oui-text-xs\">\n <Text color={itemColor}>{formattedAmount}</Text>\n <Text className=\"oui-ml-1\" intensity={80}>\n {item.token}\n </Text>\n {isWeb3Wallet && (\n <Badge color={itemColor} className=\"oui-ml-2\">\n {isDeposit ? t(\"common.deposit\") : t(\"common.withdraw\")}\n </Badge>\n )}\n </Flex>\n );\n\n const statusView = (\n <Text intensity={isWeb3Wallet ? 80 : 36} size=\"xs\">\n {getStatusText(item)}\n </Text>\n );\n\n const timeView = (\n <Text.formatted rule=\"date\" intensity={36} size=\"2xs\">\n {item.created_time}\n </Text.formatted>\n );\n\n const txIdView = item.tx_id ? (\n <a href={getTxLink()} target=\"_blank\" rel=\"noreferrer\">\n <Text.formatted\n copyable={!!item.tx_id}\n className=\"oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n rule=\"txId\"\n onCopy={onCopy}\n intensity={36}\n size=\"xs\"\n >\n {item.tx_id}\n </Text.formatted>\n </a>\n ) : (\n <Text intensity={54}>-</Text>\n );\n\n const accountId = isDeposit ? item.from_account_id : item.to_account_id;\n\n const accountIdView = (\n <Flex gapX={1}>\n <Text intensity={36} size=\"xs\">\n {isDeposit\n ? t(\"transfer.internalTransfer.from\")\n : t(\"transfer.internalTransfer.to\")}\n </Text>\n <Text.formatted\n rule=\"address\"\n copyable={!!accountId}\n onCopy={onCopy}\n intensity={80}\n size=\"xs\"\n >\n {accountId}\n </Text.formatted>\n </Flex>\n );\n\n return (\n <Flex\n p={2}\n direction=\"column\"\n gapY={1}\n intensity={900}\n r=\"xl\"\n className=\"oui-font-semibold\"\n >\n <Flex justify=\"between\" width=\"100%\" height=\"18px\">\n {isWeb3Wallet ? (\n <>\n {amountView}\n {statusView}\n </>\n ) : (\n <>\n {accountIdView}\n {amountView}\n </>\n )}\n </Flex>\n\n <Flex justify=\"between\" width=\"100%\" height=\"18px\">\n {timeView}\n {isWeb3Wallet ? txIdView : statusView}\n </Flex>\n </Flex>\n );\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"picker\",\n name: \"target\",\n options: options,\n value: target,\n size: \"md\",\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-sticky oui-top-[44px] oui-z-10 oui-border-none oui-bg-base-10 oui-px-3 oui-py-2\"\n />\n\n <ListView\n dataSource={dataSource}\n renderItem={renderHistoryItem}\n contentClassName=\"!oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n emptyView={\n <Flex\n direction={\"column\"}\n height={\"100%\"}\n itemAlign={\"center\"}\n justify={\"center\"}\n mt={3}\n >\n <EmptyDataState />\n {dataSource?.length == 0 && (\n <Flex\n direction=\"row\"\n itemAlign=\"center\"\n justify=\"center\"\n onClick={onDeposit}\n className=\"oui-mt-2 oui-h-4 oui-w-full oui-text-secondary\"\n >\n <Text color=\"primary\" size=\"2xs\">\n {t(\"common.deposit\")}\n </Text>\n <ArrowRightShortIcon\n className=\"oui-ml-0.5 oui-size-4 oui-text-primary oui-opacity-100\"\n color=\"primary\"\n size={16}\n opacity={100}\n />\n </Flex>\n )}\n </Flex>\n }\n />\n </>\n );\n};\n","import React from \"react\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useAssetHistoryScript } from \"./assetHistory.script\";\nimport { AssetHistory } from \"./assetHistory.ui\";\nimport { AssetHistoryMobile } from \"./assetHistory.ui.mobile\";\n\ntype AssetHistoryWidgetProps = {\n side: AssetHistorySideEnum;\n};\n\nexport const AssetHistoryWidget: React.FC<AssetHistoryWidgetProps> = (\n props,\n) => {\n const state = useAssetHistoryScript({ side: props.side });\n const { isMobile } = useScreen();\n if (isMobile) {\n return <AssetHistoryMobile {...state} />;\n }\n return <AssetHistory {...state} />;\n};\n","export { useAssetHistoryColumns } from \"./column\";\nexport { useAssetHistoryScript } from \"./assetHistory.script\";\nexport { AssetHistory } from \"./assetHistory.ui\";\nexport { AssetHistoryWidget } from \"./assetHistory.widget\";\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Flex, Text, type Column } from \"@kodiak-finance/orderly-ui\";\n\nexport const useFundingHistoryColumns = () => {\n const { t } = useTranslation();\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n width: 80,\n rule: \"symbol\",\n textProps: {\n showIcon: true,\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n width: 120,\n rule: \"date\",\n },\n {\n title: `${t(\"funding.fundingRate\")} / ${t(\"funding.annualRate\")}`,\n dataIndex: \"funding_rate\",\n width: 80,\n render: (value: any, record) => {\n return (\n <Flex gap={1}>\n {/* <span>{`${record.funding_rate * 100}%`}</span> */}\n <Text.numeral rule={\"percentages\"} dp={6}>\n {record.funding_rate}\n </Text.numeral>\n <span>/</span>\n {/* <span>{`${record.annual_rate * 10}%`}</span> */}\n <Text.numeral rule={\"percentages\"} dp={6}>\n {record.annual_rate}\n </Text.numeral>\n </Flex>\n );\n },\n },\n {\n title: t(\"funding.paymentType\"),\n dataIndex: \"payment_type\",\n width: 80,\n render: (value: any) => {\n switch (value) {\n case \"Pay\":\n case \"Paid\":\n return t(\"funding.paymentType.paid\");\n case \"Receive\":\n case \"Received\":\n return t(\"funding.paymentType.received\");\n default:\n return value;\n }\n },\n },\n {\n title: `${t(\"funding.fundingFee\")} (USDC)`,\n dataIndex: \"funding_fee\",\n width: 80,\n rule: \"price\",\n formatter(value, record, index) {\n return Number(value) * -1;\n },\n numeralProps: {\n coloring: true,\n showIdentifier: true,\n ignoreDP: true,\n },\n },\n ] as Column<API.FundingFeeRow & { annual_rate: number }>[];\n }, [t]);\n\n return columns;\n};\n","import { FC, useMemo } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useFundingHistoryColumns } from \"./column\";\nimport { type UseFundingHistoryReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & UseFundingHistoryReturn;\n\nexport const FundingHistoryDesktop: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading } = props;\n const columns = useFundingHistoryColumns();\n const symbols = useSymbolsInfo();\n const { symbol, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const options = useMemo(() => {\n return [\n {\n label: t(\"common.all\"),\n value: \"All\",\n },\n ...Object.keys(symbols).map((symbol) => {\n const s = symbol.split(\"_\")[1];\n return {\n label: s,\n value: symbol,\n };\n }),\n ];\n }, [t, symbols]);\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"symbol\",\n isCombine: true,\n options,\n value: symbol,\n valueFormatter: (value) => {\n const option = options.find((item) => item.value === value);\n return option?.label || value;\n },\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n />\n <AuthGuardDataTable\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n generatedRowKey={(record) => `${record.updated_time}`}\n classNames={{ root: \"oui-h-[calc(100%_-_49px)]\" }}\n pagination={props.pagination}\n />\n </>\n );\n};\n","import { FC } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter, Flex, ListView, Text, Badge } from \"@kodiak-finance/orderly-ui\";\nimport { type UseFundingHistoryReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & UseFundingHistoryReturn;\n\nexport const FundingHistoryMobile: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading, pagination } = props;\n const symbols = useSymbolsInfo();\n const { symbol, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const switchPaymentType = (paymentType: string) => {\n switch (paymentType) {\n case \"Pay\":\n case \"Paid\":\n return t(\"funding.paymentType.paid\");\n case \"Receive\":\n case \"Received\":\n return t(\"funding.paymentType.received\");\n default:\n return paymentType;\n }\n };\n\n const loadMore = () => {\n if (dataSource && dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange?.(pagination?.pageSize + 50);\n }\n };\n\n const renderHistoryItem = (item: any) => {\n return (\n <Flex\n p={2}\n direction=\"column\"\n gapY={2}\n className=\"oui-rounded-xl oui-bg-base-9 oui-font-semibold\"\n >\n <Flex direction=\"row\" justify=\"between\" width=\"100%\" height=\"20px\">\n <Text.formatted\n rule=\"symbol\"\n className=\"oui-text-base-contrast oui-mr-1 oui-text-sm\"\n >\n {item.symbol}\n </Text.formatted>\n <Badge color=\"neutral\" size=\"xs\">\n {switchPaymentType(item.payment_type)}\n </Badge>\n <Text.formatted\n rule=\"date\"\n className=\"oui-text-base-contrast-36 oui-text-2xs oui-ml-auto\"\n >\n {item.created_time}\n </Text.formatted>\n </Flex>\n <div className=\"oui-w-full oui-h-[1px] oui-bg-base-6\" />\n <Flex direction=\"row\" justify=\"between\" width=\"100%\">\n <Flex direction=\"column\">\n <Text className=\"oui-text-base-contrast-36 oui-text-2xs\">\n {t(\"funding.fundingRate\")}\n </Text>\n <Text.numeral\n rule={\"percentages\"}\n dp={6}\n className=\"oui-text-base-contrast-80 oui-text-xs\"\n >\n {item.funding_rate}\n </Text.numeral>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-base-contrast-36 oui-text-2xs\">\n {t(\"funding.annualRate\")}\n </Text>\n <Text.numeral\n rule={\"percentages\"}\n dp={6}\n className=\"oui-text-base-contrast-80 oui-text-xs\"\n >\n {item.annual_rate}\n </Text.numeral>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-base-contrast-36 oui-text-2xs\">\n {t(\"funding.fundingFee\")}{\" \"}\n <Text className=\"oui-text-base-contrast-20\">(USDC)</Text>\n </Text>\n <Text.numeral\n dp={6}\n ignoreDP={true}\n coloring={true}\n showIdentifier={true}\n className=\"oui-text-xs oui-self-end\"\n >\n {Number(item.funding_fee) * -1}\n </Text.numeral>\n </Flex>\n </Flex>\n </Flex>\n );\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"symbol\",\n isCombine: true,\n options: [\n {\n label: \"All\",\n value: \"All\",\n },\n ...Object.keys(symbols).map((symbol) => {\n const s = symbol.split(\"_\")[1];\n return {\n label: s,\n value: symbol,\n };\n }),\n ],\n value: symbol,\n valueFormatter: (value) => {\n if (value === \"All\") {\n return \"All\";\n }\n return value.split(\"_\")[1];\n },\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-px-3 oui-py-2 oui-sticky oui-top-[44px] oui-z-10 oui-bg-base-10\"\n />\n <ListView\n dataSource={dataSource}\n renderItem={renderHistoryItem}\n contentClassName=\"!oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n />\n </>\n );\n};\n","import { useFundingFeeHistory } from \"@kodiak-finance/orderly-hooks\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { useMemo, useState } from \"react\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\n\nexport const useFundingHistoryHook = () => {\n // const today = useRef(setMinutes(setHours(new Date(), 23), 59));\n\n const [today] = useState(() => {\n const d = new Date();\n\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n const [symbol, setSymbol] = useState<string>(\"All\");\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const [data, { isLoading, meta, isValidating }] = useFundingFeeHistory(\n {\n // dataRange: dateRange.map((date) => date.getTime()),\n dataRange: [\n dateRange[0].getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })\n // addDays(dateRange[1], 1)\n .getTime(),\n ],\n symbol,\n page,\n pageSize,\n },\n {\n keepPreviousData: true,\n }\n );\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"symbol\") {\n setSymbol(filter.value);\n setPage(1);\n }\n\n if (filter.name === \"dateRange\") {\n // setDateRange([filter.value.from, filter.value.to]);\n setDateRange(parseDateRangeForFilter(filter.value));\n setPage(1);\n }\n };\n\n const pagination = useMemo(\n () => parsePagination(meta),\n [parsePagination, meta]\n );\n\n return {\n dataSource: data,\n isLoading,\n isValidating,\n // onDateRangeChange,\n queryParameter: {\n symbol,\n dateRange,\n },\n onFilter,\n pagination,\n } as const;\n};\n\nexport type UseFundingHistoryReturn = ReturnType<typeof useFundingHistoryHook>;\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { FundingHistoryDesktop } from \"./fundingHistory.ui\";\nimport { FundingHistoryMobile } from \"./fundingHistory.ui.mobile\";\nimport { useFundingHistoryHook } from \"./useDataSource.script\";\n\nexport const FundingHistoryWidget: React.FC = () => {\n const state = useFundingHistoryHook();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <FundingHistoryMobile {...state} />;\n }\n return <FundingHistoryDesktop {...state} />;\n};\n","export { FundingHistoryWidget } from \"./fundingHistory.widget\";\nexport { FundingHistoryDesktop } from \"./fundingHistory.ui\";\nexport { FundingHistoryMobile } from \"./fundingHistory.ui.mobile\";\nexport { useFundingHistoryColumns } from \"./column\";\nexport { useFundingHistoryHook } from \"./useDataSource.script\";\n","import { useMemo } from \"react\";\nimport { useTranslation, i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Flex, type Column, TokenIcon } from \"@kodiak-finance/orderly-ui\";\n\nexport const useColumns = () => {\n const { t } = useTranslation();\n\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n width: 80,\n // rule: \"symbol\",\n render: (value, record) => {\n return (\n <Flex gapX={2}>\n <TokenIcon name={value} size=\"xs\" />\n <span>{value}</span>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"updated_time\",\n width: 120,\n rule: \"date\",\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n width: 120,\n formatter(value, record, index) {\n switch (value) {\n case \"CREATED\":\n case \"SPLIT\":\n return t(\"assetHistory.status.processing\");\n case \"COMPLETED\":\n default:\n return t(\"assetHistory.status.completed\");\n }\n },\n },\n\n {\n title: t(\"common.type\"),\n dataIndex: \"type\",\n width: 80,\n formatter: (value: any) => {\n switch (value) {\n case \"REFERRER_REBATE\":\n return t(\n \"portfolio.overview.distribution.type.referralCommission\",\n );\n case \"REFEREE_REBATE\":\n return t(\"portfolio.overview.distribution.type.refereeRebate\");\n case \"BROKER_FEE\":\n return t(\"portfolio.overview.distribution.type.brokerFee\");\n default:\n return \"-\";\n }\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount\",\n width: 80,\n // rule: \"price\",\n },\n ] as Column<API.FundingFeeRow & { annual_rate: number }>[];\n }, [t]);\n\n return columns;\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useColumns } from \"./column\";\nimport { type useDistributionHistoryHookReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & useDistributionHistoryHookReturn;\n\nexport const DistributionHistoryDesktop: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading, isValidating } =\n props;\n const columns = useColumns();\n const { type, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const TYPES = useMemo(() => {\n return [\n { label: t(\"common.all\"), value: \"All\" },\n {\n label: t(\"portfolio.overview.distribution.type.referralCommission\"),\n value: \"REFERRER_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.refereeRebate\"),\n value: \"REFEREE_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.brokerFee\"),\n value: \"BROKER_FEE\",\n },\n ];\n }, [t]);\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"select\",\n name: \"type\",\n options: TYPES,\n value: type,\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n />\n <AuthGuardDataTable\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n // isValidating={isValidating}\n className=\"oui-font-semibold\"\n classNames={{\n root: \"oui-h-[calc(100%_-_49px)]\",\n }}\n pagination={props.pagination}\n />\n </>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { DataFilter, Flex, Text, TokenIcon } from \"@kodiak-finance/orderly-ui\";\nimport { ListView } from \"@kodiak-finance/orderly-ui\";\nimport { type useDistributionHistoryHookReturn } from \"./useDataSource.script\";\n\ntype FundingHistoryProps = {} & useDistributionHistoryHookReturn;\n\nexport const DistributionHistoryMobile: FC<FundingHistoryProps> = (props) => {\n const { dataSource, queryParameter, onFilter, isLoading, pagination } = props;\n const { type, dateRange } = queryParameter;\n const { t } = useTranslation();\n\n const TYPES = useMemo(() => {\n return [\n { label: t(\"common.all\"), value: \"All\" },\n {\n label: t(\"portfolio.overview.distribution.type.referralCommission\"),\n value: \"REFERRER_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.refereeRebate\"),\n value: \"REFEREE_REBATE\",\n },\n {\n label: t(\"portfolio.overview.distribution.type.brokerFee\"),\n value: \"BROKER_FEE\",\n },\n ];\n }, [t]);\n\n const getStatusText = (status: string) => {\n switch (status) {\n case \"CREATED\":\n case \"SPLIT\":\n return t(\"assetHistory.status.processing\") as string;\n case \"COMPLETED\":\n default:\n return t(\"assetHistory.status.completed\") as string;\n }\n };\n\n const getTypeText = (type: string) => {\n switch (type) {\n case \"REFERRER_REBATE\":\n return t(\"portfolio.overview.distribution.type.referralCommission\");\n case \"REFEREE_REBATE\":\n return t(\"portfolio.overview.distribution.type.refereeRebate\");\n case \"BROKER_FEE\":\n return t(\"portfolio.overview.distribution.type.brokerFee\");\n default:\n return \"-\";\n }\n };\n\n const renderItem = (item: any) => {\n return (\n <Flex\n p={2}\n direction=\"column\"\n gapY={2}\n className=\"oui-rounded-xl oui-bg-base-9 oui-font-semibold\"\n >\n <Flex direction=\"row\" justify=\"between\" width=\"100%\" height=\"20px\">\n <Text.formatted\n rule=\"date\"\n className=\"oui-text-2xs oui-text-base-contrast-36\"\n >\n {item.created_time}\n </Text.formatted>\n <Text className=\"oui-text-sm oui-text-base-contrast-80\">\n {getStatusText(item.status)}\n </Text>\n </Flex>\n <div className=\"oui-h-px oui-w-full oui-bg-base-6\" />\n <Flex direction=\"row\" justify=\"between\" width=\"100%\">\n <Flex direction=\"column\">\n <Text className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.token\")}\n </Text>\n <Flex gapX={2}>\n <TokenIcon name={item.token} size=\"xs\" />\n <span className=\"oui-text-xs oui-text-base-contrast-80\">\n {item.token}\n </span>\n </Flex>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.type\")}\n </Text>\n <Text className=\"oui-text-xs oui-text-base-contrast-80\">\n {getTypeText(item.type)}\n </Text>\n </Flex>\n <Flex direction=\"column\">\n <Text className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.amount\")}\n </Text>\n <Text className=\"oui-text-xs oui-text-base-contrast-80\">\n {item.amount}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n );\n };\n\n const loadMore = () => {\n if (dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange &&\n pagination.onPageSizeChange(pagination?.pageSize + 50);\n }\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"picker\",\n name: \"type\",\n options: TYPES,\n value: type,\n size: \"md\",\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-px-3 oui-py-2 oui-sticky oui-top-[44px] oui-z-10 oui-bg-base-10\"\n />\n <ListView\n dataSource={dataSource}\n renderItem={renderItem}\n contentClassName=\"oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n />\n </>\n );\n};\n","import { useDistributionHistory } from \"@kodiak-finance/orderly-hooks\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { useMemo, useState } from \"react\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\n\nexport const useDistributionHistoryHook = () => {\n // const today = useRef(setMinutes(setHours(new Date(), 23), 59));\n\n const [today] = useState(() => {\n const d = new Date();\n\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n const [type, setType] = useState<string>(\"All\");\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const [data, { isLoading, meta, isValidating }] = useDistributionHistory({\n // dataRange: dateRange.map((date) => date.getTime()),\n dataRange: [\n dateRange[0].getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n }).getTime(),\n ],\n type,\n pageSize,\n page,\n });\n\n // console.log(\"----\", isLoading, isValidating);\n\n // const res = useQuery(\"v1/public/info/funding_period\");\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"type\") {\n setType(filter.value);\n setPage(1);\n }\n\n if (filter.name === \"dateRange\") {\n // setDateRange([filter.value.from, filter.value.to]);\n setDateRange(parseDateRangeForFilter(filter.value));\n setPage(1);\n }\n };\n\n const pagination = useMemo(\n () => parsePagination(meta),\n [parsePagination, meta]\n );\n\n return {\n dataSource: data,\n isLoading,\n isValidating,\n // onDateRangeChange,\n queryParameter: {\n type,\n dateRange,\n },\n onFilter,\n pagination,\n } as const;\n};\n\nexport type useDistributionHistoryHookReturn = ReturnType<\n typeof useDistributionHistoryHook\n>;\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { DistributionHistoryDesktop } from \"./distribution.ui\";\nimport { DistributionHistoryMobile } from \"./distribution.ui.mobile\";\nimport { useDistributionHistoryHook } from \"./useDataSource.script\";\n\nexport const DistributionHistoryWidget: React.FC = () => {\n const state = useDistributionHistoryHook();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <DistributionHistoryMobile {...state} />;\n }\n return <DistributionHistoryDesktop {...state} />;\n};\n","export { DistributionHistoryWidget } from \"./distribution.widget\";\nexport { DistributionHistoryMobile } from \"./distribution.ui.mobile\";\nexport { DistributionHistoryDesktop } from \"./distribution.ui\";\n","import React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API, EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { Flex, TokenIcon, Text, toast, Badge } from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport const useColumns = () => {\n const { t } = useTranslation();\n const onCopy = () => {\n toast.success(t(\"common.copy.copied\"));\n };\n const { state } = useAccount();\n const sub = state.subAccounts ?? [];\n const columns = React.useMemo<Column<API.TransferHistoryRow>[]>(() => {\n return [\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n width: 80,\n render(val: string) {\n return (\n <Flex gapX={2}>\n <TokenIcon name={val} size=\"xs\" />\n <span>{val}</span>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"updated_time\",\n width: 120,\n rule: \"date\",\n },\n {\n title: `${t(\"transfer.internalTransfer.from\")} (Account ID)`,\n dataIndex: \"from_account_id\",\n render(val: string) {\n const isMainAccount = val === state.mainAccountId;\n const subAccount = sub.find((item) => item.id === val);\n return (\n <Flex itemAlign=\"start\" py={2} gap={1} direction=\"column\">\n <Text.formatted onCopy={onCopy} copyable rule=\"address\">\n {val}\n </Text.formatted>\n <Badge className=\"oui-select-none\" color=\"neutral\" size=\"xs\">\n {isMainAccount\n ? t(\"common.mainAccount\")\n : subAccount?.description || t(\"common.subAccount\")}\n </Badge>\n </Flex>\n );\n },\n },\n {\n title: `${t(\"transfer.internalTransfer.to\")} (Account ID)`,\n dataIndex: \"to_account_id\",\n render(val: string) {\n const isMainAccount = val === state.mainAccountId;\n const subAccount = sub.find((item) => item.id === val);\n return (\n <Flex itemAlign=\"start\" py={2} gap={1} direction=\"column\">\n <Text.formatted onCopy={onCopy} copyable rule=\"address\">\n {val}\n </Text.formatted>\n <Badge className=\"oui-select-none\" color=\"neutral\" size=\"xs\">\n {isMainAccount\n ? t(\"common.mainAccount\")\n : subAccount?.description || t(\"common.subAccount\")}\n </Badge>\n </Flex>\n );\n },\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n width: 120,\n render(val: string) {\n return capitalizeString(val);\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount\",\n width: 80,\n },\n ];\n }, [t, state.mainAccountId, sub]);\n return columns;\n};\n","import React, { useMemo } from \"react\";\nimport { produce } from \"immer\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { DataFilter, formatAddress } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport type { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport { useColumns } from \"./column\";\nimport type { useTransferHistoryHookReturn } from \"./useDataSource.script\";\n\ntype HistoryProps = useTransferHistoryHookReturn;\n\nexport enum AccountType {\n ALL = \"All accounts\",\n MAIN = \"Main accounts\",\n}\n\nexport const TransferHistoryUI: React.FC<\n Readonly<HistoryProps & ReturnType<typeof useAccount>>\n> = (props) => {\n const {\n dataSource,\n queryParameter,\n state,\n isMainAccount,\n isLoading,\n selectedAccount,\n onFilter,\n } = props;\n const { side, dateRange } = queryParameter;\n\n const { t } = useTranslation();\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const subAccounts = state.subAccounts ?? [];\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [subAccounts]);\n\n const columns = useColumns();\n\n return (\n <>\n <DataFilter\n onFilter={onFilter}\n items={produce(\n [\n {\n type: \"select\",\n name: \"side\",\n value: side,\n options: [\n { value: \"OUT\", label: \"Outflow\" },\n { value: \"IN\", label: \"Inflow\" },\n ],\n },\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ],\n (draft) => {\n if (isMainAccount) {\n draft.unshift({\n type: \"select\",\n name: \"account\",\n value: selectedAccount as any,\n options: memoizedOptions,\n });\n }\n },\n )}\n />\n <AuthGuardDataTable<API.TransferHistoryRow>\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n // isValidating={isValidating}\n className=\"oui-font-semibold\"\n classNames={{ root: \"oui-h-[calc(100%_-_49px)]\" }}\n pagination={props.pagination}\n generatedRowKey={(row) => row.id}\n />\n </>\n );\n};\n","import React from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport { useAccount, useTransferHistory } from \"@kodiak-finance/orderly-hooks\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport type { PaginationMeta } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\nimport { AccountType } from \"./transfer.ui\";\n\nexport const useTransferHistoryHook = () => {\n // const today = useRef(setMinutes(setHours(new Date(), 23), 59));\n\n const today = React.useMemo<Date>(() => {\n const date = new Date();\n return new Date(getYear(date), getMonth(date), getDate(date), 0, 0, 0);\n }, []);\n\n const [dateRange, setDateRange] = React.useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const { state } = useAccount();\n\n const [selectedAccount, setAccount] = React.useState<string>(AccountType.ALL);\n\n const [side, setSide] = React.useState<\"IN\" | \"OUT\">(\"OUT\");\n\n const [data, { isLoading, meta }] = useTransferHistory({\n dataRange: [\n dateRange[0]?.getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })?.getTime(),\n ],\n side: side,\n size: pageSize,\n page: page,\n main_sub_only: true,\n });\n\n const filteredData = React.useMemo(() => {\n return data.filter((item) => {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return (\n item.from_account_id === state.mainAccountId ||\n item.to_account_id === state.mainAccountId\n );\n } else {\n return (\n item.from_account_id === selectedAccount ||\n item.to_account_id === selectedAccount\n );\n }\n });\n }, [data, selectedAccount]);\n\n const onAccountFilter = React.useCallback(\n (filter: { value: string; name: string }) => {\n if (filter.name === \"account\") {\n setAccount(filter.value);\n }\n if (filter.name === \"side\") {\n setSide(filter.value as \"IN\" | \"OUT\");\n }\n if (filter.name === \"dateRange\") {\n setDateRange(parseDateRangeForFilter(filter.value as any));\n }\n setPage(1);\n },\n [setPage],\n );\n\n const pagination = React.useMemo<PaginationMeta>(\n () => parsePagination(meta),\n [parsePagination, meta],\n );\n\n return {\n dataSource: filteredData,\n isLoading,\n // onDateRangeChange,\n queryParameter: {\n side,\n dateRange,\n },\n selectedAccount,\n onFilter: onAccountFilter,\n pagination,\n } as const;\n};\n\nexport type useTransferHistoryHookReturn = ReturnType<\n typeof useTransferHistoryHook\n>;\n","import React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { TransferHistoryUI } from \"./transfer.ui\";\nimport { useTransferHistoryHook } from \"./useDataSource.script\";\n\nexport const TransferHistoryWidget: React.FC = () => {\n const state = useTransferHistoryHook();\n const accountState = useAccount();\n return <TransferHistoryUI {...state} {...accountState} />;\n};\n","export { TransferHistoryWidget } from \"./transfer.widget\";\nexport { TransferHistoryUI } from \"./transfer.ui\";\n","import React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { Flex, TokenIcon, Text, cn } from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport const useColumns = () => {\n const { t } = useTranslation();\n const columns = React.useMemo<Column<API.StrategyVaultHistoryRow>[]>(() => {\n return [\n {\n title: t(\"common.type\"),\n dataIndex: \"type\",\n className: (record) => {\n if (record?.type === \"deposit\") {\n return \"oui-text-success\";\n }\n if (record?.type === \"withdrawal\") {\n return \"oui-text-danger\";\n }\n return \"\";\n },\n render(val: string) {\n if (val === \"deposit\") {\n return t(\"common.deposit\");\n }\n if (val === \"withdrawal\") {\n return t(\"common.withdraw\");\n }\n return null;\n },\n },\n {\n title: t(\"portfolio.overview.vaultName\"),\n dataIndex: \"vaultName\",\n },\n {\n title: t(\"common.token\"),\n dataIndex: \"token\",\n render(val: string) {\n return (\n <Flex justify=\"start\" itemAlign=\"center\" gap={2}>\n <TokenIcon name={val} />\n {val}\n </Flex>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n rule: \"date\",\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n render(val: string) {\n return capitalizeString(val);\n },\n },\n {\n title: t(\"common.amount\"),\n dataIndex: \"amount_change\",\n render(val: number) {\n return (\n <Text.numeral\n showIdentifier\n className={cn(\n \"oui-select-none\",\n val >= 0 ? \"oui-text-success\" : \"oui-text-danger\",\n )}\n >\n {val}\n </Text.numeral>\n );\n },\n },\n ];\n }, [t]);\n return columns;\n};\n","import React from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { useColumns } from \"./column\";\nimport type { useVaultsHistoryHookReturn } from \"./useDataSource.script\";\n\ntype HistoryProps = useVaultsHistoryHookReturn;\n\nexport const VaultsHistoryUI: React.FC<Readonly<HistoryProps>> = (props) => {\n const { dataSource, dateRange, isLoading, onFilter } = props;\n\n const columns = useColumns();\n\n return (\n <>\n <DataFilter\n onFilter={onFilter}\n items={[\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n />\n <AuthGuardDataTable<API.StrategyVaultHistoryRow>\n bordered\n columns={columns}\n dataSource={dataSource}\n loading={isLoading}\n className=\"oui-font-semibold\"\n classNames={{ root: \"oui-h-[calc(100%_-_49px)]\" }}\n pagination={props.pagination}\n generatedRowKey={(row) => row.id}\n />\n </>\n );\n};\n","import React from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport { useVaultsHistory } from \"@kodiak-finance/orderly-hooks\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport type { PaginationMeta } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { parseDateRangeForFilter } from \"../helper/date\";\n\nexport const useVaultsHistoryHook = () => {\n const today = React.useMemo<Date>(() => {\n const date = new Date();\n return new Date(getYear(date), getMonth(date), getDate(date), 0, 0, 0);\n }, []);\n\n const [dateRange, setDateRange] = React.useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n const { page, pageSize, setPage, parsePagination } = usePagination();\n\n const [data, { isLoading, meta }] = useVaultsHistory({\n dataRange: [\n dateRange[0]?.getTime(),\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })?.getTime(),\n ],\n size: pageSize,\n page: page,\n });\n\n const dataSource = React.useMemo(() => {\n if (!Array.isArray(data) || !data.length) {\n return [];\n }\n return data.map<API.StrategyVaultHistoryRow>((item) => ({\n ...item,\n token: \"USDC\", // need to hard code for now\n vaultName: \"Orderly OmniVault\",\n amount_change:\n item.type === \"withdrawal\" ? -item.amount_change : item.amount_change,\n }));\n }, [data]);\n\n const onDateRangeFilter = React.useCallback(\n (filter: { value: string; name: string }) => {\n if (filter.name === \"dateRange\") {\n setDateRange(parseDateRangeForFilter(filter.value as any));\n }\n setPage(1);\n },\n [setPage],\n );\n\n const pagination = React.useMemo<PaginationMeta>(\n () => parsePagination(meta),\n [parsePagination, meta],\n );\n\n return {\n dataSource: dataSource,\n isLoading,\n dateRange,\n onFilter: onDateRangeFilter,\n pagination,\n } as const;\n};\n\nexport type useVaultsHistoryHookReturn = ReturnType<\n typeof useVaultsHistoryHook\n>;\n","import { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Divider } from \"@kodiak-finance/orderly-ui\";\nimport { DataFilter, TokenIcon, ListView, Text } from \"@kodiak-finance/orderly-ui\";\nimport { useVaultsHistoryHookReturn } from \"./useDataSource.script\";\n\nexport const VaultsHistoryMobile = (props: useVaultsHistoryHookReturn) => {\n const { dateRange, onFilter, dataSource, isLoading, pagination } = props;\n const { t } = useTranslation();\n\n const loadMore = () => {\n if (dataSource.length < (pagination?.count || 0)) {\n pagination?.onPageSizeChange?.(pagination?.pageSize + 50);\n }\n };\n\n const renderHistoryItem = (item: any) => {\n const typeColor = item.type === \"deposit\" ? \"buy\" : \"sell\";\n const typeText =\n item.type === \"deposit\" ? t(\"common.deposit\") : t(\"common.withdraw\");\n const amountText = item.amount_change ? Math.abs(item.amount_change) : \"-\";\n return (\n <div className=\"oui-flex oui-flex-col oui-rounded-xl oui-bg-base-9 oui-p-2 oui-font-semibold\">\n <div className=\"oui-flex oui-items-center oui-justify-between oui-text-sm oui-text-base-contrast-80\">\n <div>{item.vaultName}</div>\n <div>\n {item.status?.slice(0, 1).toUpperCase() + item.status?.slice(1)}\n </div>\n </div>\n <Text.formatted rule=\"date\" intensity={36} size=\"2xs\">\n {item.created_time}\n </Text.formatted>\n <Divider className=\"oui-my-2\" />\n <div className=\"oui-flex oui-items-center [&>div]:oui-flex-1 [&>div]:oui-text-2xs [&>div]:oui-text-base-contrast-36\">\n <div>\n <div>{t(\"common.token\")}</div>\n <div className=\"oui-flex oui-items-center oui-gap-1 oui-text-xs oui-text-base-contrast-80\">\n <TokenIcon name={\"USDC\"} size=\"2xs\" />\n <Text>USDC</Text>\n </div>\n </div>\n <div>\n <div>{t(\"common.type\")}</div>\n <Text color={typeColor} className=\"oui-text-xs\">\n {typeText}\n </Text>\n </div>\n <div className=\"oui-text-right\">\n <div>{t(\"common.amount\")}</div>\n <div className=\"oui-text-xs oui-text-base-contrast-80\">\n {amountText}\n </div>\n </div>\n </div>\n </div>\n );\n };\n\n return (\n <>\n <DataFilter\n items={[\n {\n type: \"range\",\n name: \"dateRange\",\n value: {\n from: dateRange[0],\n to: dateRange[1],\n },\n },\n ]}\n onFilter={(value) => {\n onFilter(value);\n }}\n className=\"oui-sticky oui-top-[44px] oui-z-10 oui-border-none oui-bg-base-10 oui-px-3 oui-py-2\"\n />\n <ListView\n dataSource={dataSource}\n renderItem={renderHistoryItem}\n contentClassName=\"!oui-space-y-1\"\n loadMore={loadMore}\n isLoading={isLoading}\n className=\"oui-px-1\"\n />\n </>\n );\n};\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { VaultsHistoryUI } from \"./transfer.ui\";\nimport { useVaultsHistoryHook } from \"./useDataSource.script\";\nimport { VaultsHistoryMobile } from \"./vaults.ui.mobile\";\n\nexport const VaultsHistoryWidget: React.FC = () => {\n const state = useVaultsHistoryHook();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <VaultsHistoryMobile {...state} />;\n }\n return <VaultsHistoryUI {...state} />;\n};\n","export { VaultsHistoryWidget } from \"./transfer.widget\";\nexport { VaultsHistoryUI } from \"./transfer.ui\";\n","import React, { useEffect } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport {\n ArrowDownSquareFillIcon,\n ArrowLeftRightSquareFill,\n ArrowUpSquareFillIcon,\n Card,\n FeeTierIcon,\n ServerFillIcon,\n TabPanel,\n Tabs,\n VaultsIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { TabName } from \"./historyDataGroup.script\";\n\nconst LazyAssetHistoryWidget = React.lazy(() =>\n import(\"../assetHistory\").then((mod) => {\n return { default: mod.AssetHistoryWidget };\n }),\n);\n\nconst LazyFundingHistoryWidget = React.lazy(() =>\n import(\"../funding\").then((mod) => {\n return { default: mod.FundingHistoryWidget };\n }),\n);\n\nconst LazyDistributionHistoryWidget = React.lazy(() =>\n import(\"../distribution\").then((mod) => {\n return { default: mod.DistributionHistoryWidget };\n }),\n);\n\nconst LazyTransferHistoryWidget = React.lazy(() =>\n import(\"../TransferHistory\").then((mod) => {\n return { default: mod.TransferHistoryWidget };\n }),\n);\n\nconst LazyVaultsHistoryWidget = React.lazy(() =>\n import(\"../VaultsHistory\").then((mod) => {\n return { default: mod.VaultsHistoryWidget };\n }),\n);\n\nexport const HistoryDataGroupDesktop: React.FC<{\n active?: TabName;\n onTabChange: (tab: string) => void;\n}> = (props) => {\n const { active = \"deposit\", onTabChange } = props;\n const { t } = useTranslation();\n const { isMainAccount } = useAccount();\n useEffect(() => {\n if (active === \"vaults\" && !isMainAccount) {\n onTabChange(\"deposit\");\n }\n }, [active, isMainAccount]);\n return (\n <Card>\n <Tabs\n value={active}\n onValueChange={onTabChange}\n variant=\"contained\"\n size=\"xl\"\n >\n <TabPanel\n title={t(\"common.deposits\")}\n icon={<ArrowDownSquareFillIcon />}\n value={\"deposit\"}\n >\n <React.Suspense fallback={null}>\n <LazyAssetHistoryWidget side={AssetHistorySideEnum.DEPOSIT} />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"common.withdrawals\")}\n icon={<ArrowUpSquareFillIcon />}\n value={\"withdraw\"}\n >\n <React.Suspense fallback={null}>\n <LazyAssetHistoryWidget side={AssetHistorySideEnum.WITHDRAW} />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"common.funding\")}\n icon={<FeeTierIcon />}\n value={\"funding\"}\n >\n <React.Suspense fallback={null}>\n <LazyFundingHistoryWidget />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.distribution\")}\n icon={<ServerFillIcon />}\n value={\"distribution\"}\n >\n <React.Suspense fallback={null}>\n <LazyDistributionHistoryWidget />\n </React.Suspense>\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.transferHistory\")}\n icon={<ArrowLeftRightSquareFill />}\n value={\"transfer\"}\n >\n <React.Suspense fallback={null}>\n <LazyTransferHistoryWidget />\n </React.Suspense>\n </TabPanel>\n {isMainAccount && (\n <TabPanel\n value={\"vaults\"}\n icon={<VaultsIcon />}\n title={t(\"portfolio.overview.vaults\")}\n >\n <React.Suspense fallback={null}>\n <LazyVaultsHistoryWidget />\n </React.Suspense>\n </TabPanel>\n )}\n </Tabs>\n </Card>\n );\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\nimport { produce } from \"immer\";\nimport { useAccount, useCollateral } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\n\nconst EMPTY_HOLDING: Partial<API.Holding> = {\n token: \"USDC\",\n holding: 0,\n frozen: 0,\n};\n\n// Account data structure used in assets display\nexport interface AccountWithChildren {\n account_id: string;\n id?: string;\n description?: string;\n children: Array<API.Holding & { account_id: string }>;\n}\n\n// Hook to transform raw account data into display format\nexport const useAccountsData = (): AccountWithChildren[] => {\n const { t } = useTranslation();\n const { state, isMainAccount } = useAccount();\n const { holding = [] } = useCollateral();\n const subAccounts = state.subAccounts ?? [];\n\n return useMemo(() => {\n return produce<any[]>(subAccounts, (draft) => {\n // Process sub accounts\n for (const sub of draft) {\n sub.account_id = sub.id;\n if (Array.isArray(sub.holding) && sub.holding.length) {\n sub.children = sub.holding.map((item: API.Holding) => ({\n ...item,\n account_id: sub.id,\n }));\n } else {\n sub.children = [{ ...EMPTY_HOLDING, account_id: sub.id }];\n }\n // Remove original holding to avoid confusion\n Reflect.deleteProperty(sub, \"holding\");\n }\n\n // Add main account at the beginning if user is main account\n if (isMainAccount) {\n draft.unshift({\n account_id: state.mainAccountId!,\n description: t(\"common.mainAccount\"),\n children:\n Array.isArray(holding) && holding.length\n ? holding.map((item: API.Holding) => ({\n ...item,\n account_id: state.mainAccountId!,\n }))\n : [\n {\n ...EMPTY_HOLDING,\n account_id: state.mainAccountId!,\n },\n ],\n });\n }\n });\n }, [holding, subAccounts, isMainAccount, state.mainAccountId, t]);\n};\n","import { useMemo } from \"react\";\nimport {\n useAccount,\n useCollateral,\n useIndexPricesStream,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { SubAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useAccountsData } from \"./useAccountsData\";\n\nconst isNumber = (val: unknown): val is number => {\n return typeof val === \"number\" && !Number.isNaN(val);\n};\n\nexport const calculateTotalHolding = (\n data: SubAccount[] | SubAccount[\"holding\"],\n getIndexPrice: (token: string) => number,\n) => {\n let total = new Decimal(0);\n for (const item of data) {\n if (Array.isArray(item.holding)) {\n for (const hol of item.holding) {\n if (isNumber(hol.holding)) {\n const indexPrice = getIndexPrice(hol.token);\n total = total.plus(new Decimal(hol.holding).mul(indexPrice));\n }\n }\n } else if (isNumber(item.holding) && \"token\" in item) {\n const indexPrice = getIndexPrice(item.token);\n total = total.plus(new Decimal(item.holding).mul(indexPrice));\n }\n }\n return total;\n};\n\nexport const useAssetTotalValue = () => {\n const { state, isMainAccount } = useAccount();\n const { holding = [] } = useCollateral();\n const { getIndexPrice } = useIndexPricesStream();\n const allAccounts = useAccountsData();\n\n const subAccounts = state.subAccounts ?? [];\n\n // Calculate main account total value\n const mainTotalValue = useMemo<Decimal>(\n () => calculateTotalHolding(holding, getIndexPrice),\n [holding, getIndexPrice],\n );\n\n // Calculate sub accounts total value\n const subTotalValue = useMemo<Decimal>(\n () => calculateTotalHolding(subAccounts, getIndexPrice),\n [subAccounts, getIndexPrice],\n );\n\n // Calculate final total value\n const totalValue = useMemo<number>(() => {\n if (isMainAccount) {\n return mainTotalValue.plus(subTotalValue).toNumber();\n } else {\n const find = allAccounts.find((item) => item.id === state.accountId);\n if (Array.isArray(find?.children)) {\n return calculateTotalHolding(find.children, getIndexPrice).toNumber();\n }\n return 0;\n }\n }, [\n isMainAccount,\n mainTotalValue,\n subTotalValue,\n allAccounts,\n state.accountId,\n getIndexPrice,\n ]);\n\n return totalValue;\n};\n","import React, { useMemo } from \"react\";\nimport pick from \"ramda/es/pick\";\nimport { SubAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport {\n Text,\n Card,\n Flex,\n gradientTextVariants,\n EyeIcon,\n EyeCloseIcon,\n cn,\n DataFilter,\n formatAddress,\n Tabs,\n TabPanel,\n ArrowDownShortIcon,\n Button,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport type { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport type { useAssetsScriptReturn } from \"./assets.script\";\nimport type { AssetsWidgetProps } from \"./assets.widget\";\n\nconst LazyConvertHistoryWidget = React.lazy(() =>\n import(\"../convertPage/convert.widget\").then((mod) => {\n return { default: mod.ConvertHistoryWidget };\n }),\n);\n\nexport type AssetsProps = useAssetsScriptReturn;\n\nexport enum AccountType {\n ALL = \"All accounts\",\n MAIN = \"Main accounts\",\n}\n\nconst TotalValueInfo: React.FC<\n Readonly<\n Pick<AssetsWidgetProps, \"totalValue\" | \"visible\" | \"onToggleVisibility\">\n >\n> = (props) => {\n const { totalValue, visible, onToggleVisibility } = props;\n const { t } = useTranslation();\n const Icon = visible ? EyeIcon : EyeCloseIcon;\n return (\n <Flex direction=\"column\" gap={1} className=\"oui-text-2xs\" itemAlign=\"start\">\n <Flex gap={1} justify=\"start\" itemAlign=\"center\">\n <Text size=\"2xs\" color=\"neutral\" weight=\"semibold\">\n {t(\"common.totalValue\")}\n </Text>\n <button onClick={onToggleVisibility}>\n <Icon size={18} className={cn(\"oui-text-base-contrast-54\")} />\n </button>\n </Flex>\n <Flex justify={\"start\"} itemAlign=\"end\" gap={1}>\n <Text.numeral\n visible={visible}\n weight=\"bold\"\n size=\"2xl\"\n className={gradientTextVariants({ color: \"brand\" })}\n as=\"div\"\n padding={false}\n dp={2}\n >\n {totalValue ?? \"--\"}\n </Text.numeral>\n <Text as=\"div\" weight=\"bold\">\n USDC\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nconst DepositAndWithdrawButton: React.FC<\n Readonly<\n Pick<AssetsWidgetProps, \"isMainAccount\" | \"onWithdraw\" | \"onDeposit\">\n >\n> = (props) => {\n const { t } = useTranslation();\n const { isMainAccount, onWithdraw, onDeposit } = props;\n const { wrongNetwork, disabledConnect } = useAppContext();\n if (!isMainAccount) {\n return null;\n }\n const mergedDisabled = wrongNetwork || disabledConnect;\n return (\n <Flex\n className=\"oui-text-2xs oui-text-base-contrast-54\"\n itemAlign=\"center\"\n gap={3}\n >\n <Button\n disabled={mergedDisabled}\n data-testid=\"oui-testid-assetView-deposit-button\"\n fullWidth\n size=\"md\"\n onClick={onDeposit}\n >\n <ArrowDownShortIcon\n color=\"white\"\n opacity={mergedDisabled ? 0.4 : 1}\n className=\"oui-rotate-0\"\n />\n <Text>{t(\"common.deposit\")}</Text>\n </Button>\n <Button\n fullWidth\n disabled={mergedDisabled}\n color=\"secondary\"\n size=\"md\"\n onClick={onWithdraw}\n data-testid=\"oui-testid-assetView-withdraw-button\"\n >\n <ArrowDownShortIcon\n color=\"white\"\n opacity={mergedDisabled ? 0.4 : 1}\n className=\"oui-rotate-180\"\n />\n <Text>{t(\"common.withdraw\")}</Text>\n </Button>\n </Flex>\n );\n};\n\nconst DataFilterSection: React.FC<\n Pick<\n AssetsWidgetProps,\n | \"isMainAccount\"\n | \"onFilter\"\n | \"selectedAccount\"\n | \"selectedAsset\"\n | \"assetsOptions\"\n | \"state\"\n >\n> = (props) => {\n const { t } = useTranslation();\n const {\n isMainAccount,\n onFilter,\n selectedAccount,\n selectedAsset,\n assetsOptions,\n state,\n } = props;\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const ALL_ASSETS: SelectOption = {\n label: t(\"common.allAssets\", \"All assets\"),\n value: \"all\",\n };\n\n const subAccounts = useMemo<SubAccount[]>(() => {\n return state.subAccounts ?? [];\n }, [state.subAccounts]);\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value?.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [ALL_ACCOUNTS, MAIN_ACCOUNT, subAccounts]);\n\n const memoizedAssetOptions = useMemo(() => {\n return [ALL_ASSETS, ...assetsOptions];\n }, [ALL_ASSETS, assetsOptions]);\n\n if (!isMainAccount) {\n return null;\n }\n\n return (\n <DataFilter\n className=\"oui-border-none oui-py-0\"\n onFilter={onFilter}\n items={[\n {\n type: \"select\",\n name: \"account\",\n value: selectedAccount,\n options: memoizedOptions,\n },\n {\n type: \"select\",\n name: \"asset\",\n value: selectedAsset,\n options: memoizedAssetOptions,\n },\n ]}\n />\n );\n};\n\nexport const AssetsDataTable: React.FC<\n Pick<\n AssetsWidgetProps,\n | \"columns\"\n | \"dataSource\"\n | \"isMainAccount\"\n | \"onFilter\"\n | \"selectedAccount\"\n | \"selectedAsset\"\n | \"assetsOptions\"\n | \"state\"\n >\n> = (props) => {\n const { columns, dataSource } = props;\n return (\n <Flex width=\"100%\" direction={\"column\"}>\n <DataFilterSection\n {...pick(\n [\n \"isMainAccount\",\n \"onFilter\",\n \"selectedAccount\",\n \"selectedAsset\",\n \"assetsOptions\",\n \"state\",\n ],\n props,\n )}\n />\n {dataSource.map((item, index) => {\n return (\n <Flex\n key={`item-${index}`}\n className=\"oui-rounded-xl oui-bg-base-9 oui-p-6\"\n direction={\"column\"}\n itemAlign={\"start\"}\n justify={\"between\"}\n my={4}\n >\n <Text\n className=\"oui-mb-4\"\n intensity={98}\n weight=\"semibold\"\n size=\"lg\"\n >\n {item?.description || formatAddress(item?.id ?? \"\")}\n </Text>\n <AuthGuardDataTable\n bordered\n className=\"oui-font-semibold\"\n classNames={{\n root: \"oui-bg-transparent\",\n scroll: \"oui-min-h-0\",\n }}\n columns={columns}\n dataSource={item.children}\n />\n </Flex>\n );\n })}\n </Flex>\n );\n};\n\nexport const AssetsTable: React.FC<AssetsWidgetProps> = (props) => {\n const { t } = useTranslation();\n return (\n <Card\n className={\"oui-bg-transparent oui-p-0\"}\n classNames={{ content: \"!oui-pt-0\" }}\n >\n <Tabs\n defaultValue=\"assets\"\n variant=\"contained\"\n classNames={{ tabsList: \"\" }}\n size=\"lg\"\n >\n <TabPanel value=\"assets\" className=\"\" title={t(\"common.assets\")}>\n <Flex\n className=\"oui-rounded-xl oui-bg-base-9 oui-p-6\"\n direction={\"row\"}\n itemAlign={\"center\"}\n justify={\"between\"}\n my={4}\n >\n <TotalValueInfo\n {...pick([\"totalValue\", \"visible\", \"onToggleVisibility\"], props)}\n />\n <DepositAndWithdrawButton\n {...pick([\"isMainAccount\", \"onDeposit\", \"onWithdraw\"], props)}\n />\n </Flex>\n <AssetsDataTable\n {...pick(\n [\n \"columns\",\n \"dataSource\",\n \"isMainAccount\",\n \"onFilter\",\n \"selectedAccount\",\n \"selectedAsset\",\n \"assetsOptions\",\n \"state\",\n ],\n props,\n )}\n />\n </TabPanel>\n <TabPanel\n value=\"convertHistory\"\n className=\"oui-rounded-xl oui-bg-base-9 oui-px-6\"\n title={t(\"portfolio.overview.tab.convert.history\")}\n >\n <React.Suspense fallback={null}>\n <LazyConvertHistoryWidget />\n </React.Suspense>\n </TabPanel>\n </Tabs>\n </Card>\n );\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountType } from \"../pages/assets/assetsPage/assets.ui.desktop\";\n\n// Account filter function type\nexport type AccountFilterFunction<T = any> = (\n data: T[],\n selectedAccount: string,\n accountState: ReturnType<typeof useAccount>,\n) => T[];\n\n// Generic account filter utility\nexport const createAccountFilter = <T extends { account_id?: string }>(\n getAccountId?: (item: T) => string | undefined,\n): AccountFilterFunction<T> => {\n return (data, selectedAccount, accountState) => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n const accountId = getAccountId ? getAccountId(item) : item.account_id;\n\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return accountId === state.mainAccountId;\n } else {\n return accountId === selectedAccount;\n }\n } else {\n return accountId === state.accountId;\n }\n });\n };\n};\n\n// Hook for standard account-based data filtering\nexport const useAccountFilter = <T extends { account_id?: string }>(\n data: T[],\n selectedAccount: string,\n getAccountId?: (item: T) => string | undefined,\n): T[] => {\n const accountState = useAccount();\n\n return useMemo(() => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n const accountId = getAccountId ? getAccountId(item) : item.account_id;\n\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return accountId === state.mainAccountId;\n } else {\n return accountId === selectedAccount;\n }\n } else {\n return accountId === state.accountId;\n }\n });\n }, [data, selectedAccount, accountState, getAccountId]);\n};\n\n// Hook specifically for transfer history filtering\nexport const useTransferHistoryAccountFilter = <\n T extends { from_account_id?: string; to_account_id?: string },\n>(\n data: T[],\n selectedAccount: string,\n): T[] => {\n const accountState = useAccount();\n\n return useMemo(() => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return (\n item.from_account_id === state.mainAccountId ||\n item.to_account_id === state.mainAccountId\n );\n } else {\n return (\n item.from_account_id === selectedAccount ||\n item.to_account_id === selectedAccount\n );\n }\n } else {\n return (\n item.from_account_id === state.accountId ||\n item.to_account_id === state.accountId\n );\n }\n });\n }, [data, selectedAccount, accountState]);\n};\n\n// Pre-defined account filters for common use cases\nexport const AccountFilters = {\n // Standard account filter factory\n standard: <T extends { account_id?: string }>() => createAccountFilter<T>(),\n\n // Transfer history filter factory\n transferHistory:\n <T extends { from_account_id?: string; to_account_id?: string }>() =>\n (\n data: T[],\n selectedAccount: string,\n accountState: ReturnType<typeof useAccount>,\n ): T[] => {\n const { state, isMainAccount } = accountState;\n\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return (\n item.from_account_id === state.mainAccountId ||\n item.to_account_id === state.mainAccountId\n );\n } else {\n return (\n item.from_account_id === selectedAccount ||\n item.to_account_id === selectedAccount\n );\n }\n } else {\n return (\n item.from_account_id === state.accountId ||\n item.to_account_id === state.accountId\n );\n }\n });\n },\n\n // Custom account ID filter factory\n customAccountId: <T extends Record<string, any>>(accountIdKey: keyof T) =>\n createAccountFilter<T>((item) => item[accountIdKey] as string),\n};\n","import React, { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountType } from \"../pages/assets/assetsPage/assets.ui.desktop\";\n\n// Account filter hook for assets-like data structures\nexport const useAssetsAccountFilter = <T extends { account_id?: string }>(\n data: T[],\n) => {\n const { state, isMainAccount } = useAccount();\n const [selectedAccount, setSelectedAccount] = React.useState<string>(\n AccountType.ALL,\n );\n\n // Filter data based on selected account\n const filteredData = useMemo(() => {\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return item.account_id === state.mainAccountId;\n } else {\n return item.account_id === selectedAccount;\n }\n } else {\n return item.account_id === state.accountId;\n }\n });\n }, [data, selectedAccount, isMainAccount, state]);\n\n // Handle filter changes\n const onAccountFilter = React.useCallback(\n (filter: { name: string; value: string }) => {\n const { name, value } = filter;\n if (name === \"account\") {\n setSelectedAccount(value);\n }\n },\n [],\n );\n\n return {\n selectedAccount,\n filteredData,\n onAccountFilter,\n setSelectedAccount,\n };\n};\n\n// Enhanced account and asset combined filter hook\nexport const useAssetsMultiFilter = <\n T extends {\n account_id?: string;\n children?: Array<{ token: string; [key: string]: any }>;\n },\n>(\n data: T[],\n) => {\n const { state, isMainAccount } = useAccount();\n const [selectedAccount, setSelectedAccount] = React.useState<string>(\n AccountType.ALL,\n );\n const [selectedAsset, setSelectedAsset] = React.useState<string>(\"all\");\n\n // Filter data based on both account and asset\n const filteredData = useMemo(() => {\n let accountFiltered = data;\n\n // First apply account filter\n if (isMainAccount) {\n if (selectedAccount && selectedAccount !== AccountType.ALL) {\n if (selectedAccount === AccountType.MAIN) {\n accountFiltered = data.filter(\n (item) => item.account_id === state.mainAccountId,\n );\n } else {\n accountFiltered = data.filter(\n (item) => item.account_id === selectedAccount,\n );\n }\n }\n } else {\n accountFiltered = data.filter(\n (item) => item.account_id === state.accountId,\n );\n }\n\n // Then apply asset filter\n if (selectedAsset && selectedAsset !== \"all\") {\n accountFiltered = accountFiltered\n .map((account) => {\n if (account.children) {\n const filteredChildren = account.children.filter(\n (child) => child.token === selectedAsset,\n );\n // Only include accounts that have the selected asset\n return filteredChildren.length > 0\n ? { ...account, children: filteredChildren }\n : null;\n }\n return account;\n })\n .filter(Boolean) as T[];\n }\n\n return accountFiltered;\n }, [data, selectedAccount, selectedAsset, isMainAccount, state]);\n\n // Handle combined filter changes\n const onFilter = React.useCallback(\n (filter: { name: string; value: string }) => {\n const { name, value } = filter;\n if (name === \"account\") {\n setSelectedAccount(value);\n } else if (name === \"asset\") {\n setSelectedAsset(value);\n }\n },\n [],\n );\n\n return {\n selectedAccount,\n selectedAsset,\n filteredData,\n onFilter,\n setSelectedAccount,\n setSelectedAsset,\n };\n};\n\n// Generic account filter function that can be used standalone\nexport const filterByAccount = <T extends { account_id?: string }>(\n data: T[],\n selectedAccount: string,\n accountState: {\n isMainAccount: boolean;\n state: {\n mainAccountId?: string;\n accountId?: string;\n };\n },\n): T[] => {\n const { isMainAccount, state } = accountState;\n\n return data.filter((item) => {\n if (isMainAccount) {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return true;\n }\n if (selectedAccount === AccountType.MAIN) {\n return item.account_id === state.mainAccountId;\n } else {\n return item.account_id === selectedAccount;\n }\n } else {\n return item.account_id === state.accountId;\n }\n });\n};\n","export * from \"./useAssetTotalValue\";\nexport * from \"./useAccountFilter\";\nexport * from \"./useAssetsAccountFilter\";\nexport * from \"./useAccountsData\";\n","import React, { useMemo, useState } from \"react\";\nimport { getDate, getMonth, getYear, set } from \"date-fns\";\nimport {\n useAccount,\n useCollateral,\n useIndexPricesStream,\n useSubAccountQuery,\n useTokensInfo,\n useChainInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { subtractDaysFromCurrentDate } from \"@kodiak-finance/orderly-utils\";\nimport { useAccountsData, useAssetsAccountFilter } from \"../../../hooks\";\nimport { parseDateRangeForFilter } from \"../../overview/helper/date\";\nimport type { ConvertRecord } from \"../type\";\n\nexport const useConvertScript = () => {\n const { isMainAccount, state } = useAccount();\n const { holding = [] } = useCollateral();\n const { data: indexPrices } = useIndexPricesStream();\n\n const { data: chainsInfo } = useChainInfo();\n\n // Pagination\n const { page, pageSize, setPage, parsePagination } = usePagination({\n page: 1,\n pageSize: 20,\n });\n\n // Use the same account data structure as assets\n const allAccounts = useAccountsData();\n\n const tokensInfo = useTokensInfo();\n\n // Use the same account filter logic as assets\n const { selectedAccount, onAccountFilter } =\n useAssetsAccountFilter(allAccounts);\n\n // Simple date range handling like other scripts\n const [today] = useState(() => {\n const d = new Date();\n return new Date(getYear(d), getMonth(d), getDate(d), 0, 0, 0);\n });\n\n const [dateRange, setDateRange] = useState<Date[]>([\n subtractDaysFromCurrentDate(90, today),\n today,\n ]);\n\n // Filter states (matching API fields)\n const [statusFilter, setStatusFilter] = useState<string>(\"all\");\n const [convertedAssetFilter, setConvertedAssetFilter] =\n useState<string>(\"all\");\n\n // Create asset options from holding data - similar to assets script\n const convertedAssetOptions = useMemo(() => {\n // Create options array\n const assetOptions =\n tokensInfo?.map((item) => ({\n value: item.token,\n label: item.token,\n })) || [];\n\n return [{ label: \"All assets\", value: \"all\" }, ...assetOptions];\n }, [tokensInfo]);\n\n // Handle all filters (including account filter and date range)\n const onFilter = React.useCallback(\n (filter: { name: string; value: string | { from: Date; to: Date } }) => {\n const { name, value } = filter;\n\n // Delegate account filter to the hook\n if (name === \"account\") {\n onAccountFilter(filter as { name: string; value: string });\n } else if (name === \"status\") {\n setStatusFilter(value as string);\n setPage(1); // Reset to first page when filter changes\n } else if (name === \"converted_asset\") {\n setConvertedAssetFilter(value as string);\n setPage(1);\n } else if (name === \"time\" || name === \"dateRange\") {\n setDateRange(\n parseDateRangeForFilter(value as { from: Date; to: Date }),\n );\n setPage(1);\n }\n },\n [onAccountFilter, setPage],\n );\n\n // Build query URL with parameters\n const queryUrl = React.useMemo(() => {\n const params = new URLSearchParams();\n\n // Add pagination parameters\n params.set(\"page\", page.toString());\n params.set(\"size\", pageSize.toString());\n\n // Add date range parameters\n if (dateRange[0]) {\n params.set(\"start_t\", dateRange[0].getTime().toString());\n }\n if (dateRange[1]) {\n params.set(\n \"end_t\",\n set(dateRange[1], {\n hours: 23,\n minutes: 59,\n seconds: 59,\n milliseconds: 0,\n })\n .getTime()\n .toString(),\n );\n }\n\n // Add filter parameters (only if not \"all\")\n if (statusFilter !== \"all\") {\n params.set(\"status\", statusFilter);\n }\n\n if (convertedAssetFilter !== \"all\") {\n params.set(\"converted_asset\", convertedAssetFilter);\n }\n\n return `/v1/asset/convert_history?${params.toString()}`;\n }, [page, pageSize, dateRange, statusFilter, convertedAssetFilter]);\n\n // Query convert history with all parameters\n const { data, isLoading } = useSubAccountQuery<{\n rows: ConvertRecord[];\n meta: {\n total: number;\n current_page: number;\n records_per_page: number;\n };\n }>(queryUrl, {\n accountId: isMainAccount ? state.mainAccountId : state.accountId,\n formatter: (data) => {\n return data;\n },\n });\n\n // Parse pagination from API response meta\n const pagination = useMemo(() => {\n if (data?.meta) {\n return parsePagination(data.meta);\n }\n return {\n page,\n pageSize,\n onPageChange: setPage,\n onPageSizeChange: () => {\n // Handle page size change if needed\n },\n };\n }, [data?.meta, parsePagination, page, pageSize, setPage]);\n\n // Calculate summary\n const summary = useMemo(() => {\n const dataRows = data?.rows || [];\n\n const totalConversions = dataRows.length;\n const totalUSDCReceived = dataRows.reduce(\n (sum, record) => sum + record.received_qty,\n 0,\n );\n const totalFees = dataRows.reduce(\n (sum, record) =>\n sum +\n record.details.reduce(\n (detailSum, detail) => detailSum + detail.haircut,\n 0,\n ),\n 0,\n );\n\n return {\n totalConversions,\n totalUSDCReceived,\n totalFees,\n };\n }, [data]);\n\n return {\n // Data\n dataSource: data?.rows || EMPTY_LIST,\n summary,\n pagination,\n\n // Filter state and handlers (compatible with assets)\n selectedAccount,\n onFilter,\n\n // Query parameters (consistent with other scripts)\n dateRange,\n\n // Filter states\n statusFilter,\n convertedAssetFilter,\n convertedAssetOptions,\n\n // State\n isMainAccount,\n isLoading,\n holding,\n\n // Index prices\n indexPrices,\n chainsInfo,\n };\n};\n\nexport type UseConvertScriptReturn = ReturnType<typeof useConvertScript>;\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Button,\n Flex,\n Text,\n TokenIcon,\n Tooltip,\n toast,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport type { ConvertRecord, ConvertTransaction } from \"../type\";\n\nexport interface ConvertColumnsOptions {\n onDetailsClick?: (convertId: number) => void;\n}\n\nexport interface ConvertDetailColumnsOptions {\n onTxClick?: (txId: string) => void;\n indexPrices: Record<string, number>;\n chainsInfo: any[];\n}\n\nexport const ConvertedAssetColumn = ({\n convertedAssets,\n}: {\n convertedAssets: Record<string, number>;\n}) => {\n const { t } = useTranslation();\n const assets = useMemo(() => {\n return Object.keys(convertedAssets);\n }, [convertedAssets]);\n\n const tooltipContent = useMemo(() => {\n return (\n <Flex\n direction=\"column\"\n gap={2}\n className=\"oui-w-[275px] oui-font-semibold oui-text-base-contrast-80\"\n >\n <Flex\n itemAlign=\"center\"\n justify=\"between\"\n className=\"oui-w-full oui-text-2xs oui-text-base-contrast-36\"\n >\n <div>{t(\"common.assets\")}</div>\n <div>{t(\"common.qty\")}</div>\n </Flex>\n {assets.map((asset) => (\n <Flex\n key={asset}\n itemAlign=\"center\"\n justify=\"between\"\n className=\"oui-w-full\"\n >\n <Flex itemAlign=\"center\" gap={1}>\n <TokenIcon size=\"xs\" name={asset} />\n <Text.formatted>{asset}</Text.formatted>\n </Flex>\n <div>\n <Text.formatted>{convertedAssets[asset]}</Text.formatted>\n </div>\n </Flex>\n ))}\n </Flex>\n );\n }, [assets]);\n\n return (\n <Flex itemAlign=\"center\" gap={2}>\n <div className=\"oui-relative oui-flex\">\n {assets.slice(0, 3).map((asset, index) => (\n <div\n key={asset}\n className=\"oui-relative\"\n style={{\n marginLeft: index > 0 ? \"-8px\" : \"0\",\n zIndex: assets.length + index,\n }}\n >\n <TokenIcon size=\"xs\" name={asset} />\n </div>\n ))}\n </div>\n <Tooltip content={tooltipContent}>\n <Text.formatted className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\">\n {assets.slice(0, 3).join(\", \")}{\" \"}\n {assets.length > 3 && `+${assets.length - 3}`}\n </Text.formatted>\n </Tooltip>\n </Flex>\n );\n};\n\nexport const useConvertColumns = (options: ConvertColumnsOptions) => {\n const { onDetailsClick } = options;\n const { t } = useTranslation();\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n\n const columns = React.useMemo<Column[]>(() => {\n return [\n {\n title: t(\"portfolio.overview.column.convert.convertedAsset\"),\n dataIndex: \"converted_asset\",\n align: \"left\",\n width: 200,\n maxWidth: 200,\n render(convertedAssets: Record<string, number>) {\n return <ConvertedAssetColumn convertedAssets={convertedAssets} />;\n },\n },\n {\n title: t(\"portfolio.overview.column.convert.usdcAmount\"),\n dataIndex: \"received_qty\",\n align: \"left\",\n width: 150,\n render(qty: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {qty}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.fee\"),\n dataIndex: \"details\",\n align: \"left\",\n width: 120,\n render(details: ConvertRecord[\"details\"]) {\n const totalHaircut = details.reduce(\n (sum, detail) => sum + detail.haircut,\n 0,\n );\n return (\n <Text.numeral dp={6} padding={false}>\n {totalHaircut}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.type\"),\n dataIndex: \"type\",\n align: \"left\",\n width: 150,\n render(type: string) {\n return <Text>{type.charAt(0).toUpperCase() + type.slice(1)}</Text>;\n },\n },\n {\n title: t(\"portfolio.overview.column.convert.convertId\"),\n dataIndex: \"convert_id\",\n align: \"left\",\n width: 150,\n render(convertId: number) {\n return (\n <Text.formatted onCopy={onCopy} copyable>\n {convertId}\n </Text.formatted>\n );\n },\n },\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n align: \"left\",\n width: 160,\n rule: \"date\",\n },\n {\n title: t(\"common.status\"),\n dataIndex: \"status\",\n align: \"left\",\n width: 150,\n render(status: string) {\n return (\n <Text>{status.charAt(0).toUpperCase() + status.slice(1)}</Text>\n );\n },\n },\n {\n title: \"\",\n dataIndex: \"updated_time\",\n align: \"center\",\n width: 80,\n render(convertId: number, record: ConvertRecord) {\n return (\n <Button\n size=\"sm\"\n variant=\"text\"\n className=\"oui-text-primary\"\n onClick={() => onDetailsClick?.(record.convert_id)}\n >\n {t(\"portfolio.overview.column.convert.details\")}\n </Button>\n );\n },\n },\n ];\n }, [onDetailsClick]);\n\n return columns;\n};\n\n// Converted asset, Qty., USDC amount, Fee, TxID, Network, Status\nexport const useConvertDetailColumns = (\n options: ConvertDetailColumnsOptions,\n) => {\n const { t } = useTranslation();\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n const columns = React.useMemo<Column[]>(() => {\n return [\n {\n title: t(\"portfolio.overview.column.convert.convertedAsset\"),\n dataIndex: \"converted_asset\",\n align: \"left\",\n width: 150,\n render(asset: string) {\n return (\n <Flex itemAlign=\"center\" gap={2}>\n <TokenIcon name={asset} />\n {asset}\n </Flex>\n );\n },\n },\n {\n title: t(\"common.qty\"),\n dataIndex: \"converted_qty\",\n align: \"left\",\n width: 100,\n render(qty: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {qty}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.convert.usdcAmount\"),\n dataIndex: \"received_qty\",\n align: \"left\",\n width: 100,\n render(qty: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {qty}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.fee\"),\n dataIndex: \"haircut\",\n align: \"left\",\n width: 100,\n render(haircut: number) {\n return (\n <Text.numeral dp={6} padding={false}>\n {haircut}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"common.txId\"),\n dataIndex: \"tx_id\",\n align: \"left\",\n width: 150,\n render(txId: string, record: ConvertTransaction) {\n if (!txId) return <Text intensity={54}>-</Text>;\n const chainInfo = (options.chainsInfo as any[])?.find(\n (item) => record.chain_id === parseInt(item.chain_id),\n );\n const explorer_base_url = chainInfo?.explorer_base_url;\n const href = `${explorer_base_url}/tx/${txId}`;\n return (\n <a href={href} target=\"_blank\" rel=\"noreferrer\">\n <Text.formatted\n onCopy={onCopy}\n rule=\"txId\"\n copyable={!!txId}\n className=\"oui-cursor-pointer oui-underline oui-decoration-line-16 oui-decoration-dashed oui-underline-offset-4\"\n >\n {txId}\n </Text.formatted>\n </a>\n );\n },\n },\n {\n title: t(\"transfer.network\"),\n dataIndex: \"chain_id\",\n align: \"left\",\n width: 150,\n render(venue: string, record: ConvertTransaction) {\n return (\n <Text>\n {options.chainsInfo.find(\n (item) => item.chain_id == record.chain_id,\n )?.name || \"-\"}\n </Text>\n );\n },\n },\n {\n title: t(\"common.result\"),\n dataIndex: \"result\",\n align: \"left\",\n width: 100,\n render(result: string) {\n return (\n <Text>{result?.charAt(0).toUpperCase() + result?.slice(1)}</Text>\n );\n },\n },\n ];\n }, []);\n\n return columns;\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n DataFilter,\n Flex,\n DataTable,\n modal,\n SimpleDialog,\n Divider,\n} from \"@kodiak-finance/orderly-ui\";\nimport { useModal } from \"@kodiak-finance/orderly-ui\";\nimport type { ConvertRecord } from \"../type\";\nimport { useConvertColumns, useConvertDetailColumns } from \"./convert.column\";\nimport { useConvertScript } from \"./convert.script\";\n\ntype ConvertDesktopUIProps = {\n convertState: ReturnType<typeof useConvertScript>;\n};\n\nexport const CONVERT_STATUS_OPTIONS = [\n {\n label: \"All status\",\n value: \"all\",\n },\n {\n label: \"Completed\",\n value: \"completed\",\n },\n {\n label: \"Pending\",\n value: \"pending\",\n },\n];\n\n// Convert Details Modal Component\nconst ConvertDetailsModal = modal.create<{\n record: ConvertRecord;\n indexPrices: Record<string, number>;\n chainsInfo: any[];\n}>((props) => {\n const { t } = useTranslation();\n const { visible, onOpenChange } = useModal();\n // console.log(props);\n\n const detailColumns = useConvertDetailColumns({\n indexPrices: props.indexPrices,\n chainsInfo: props.chainsInfo,\n });\n\n return (\n <SimpleDialog\n open={visible}\n onOpenChange={onOpenChange}\n title={t(\"portfolio.overview.convert.dialog.title.details\")}\n size=\"lg\"\n closable\n classNames={{\n content: \"oui-max-w-4xl\",\n }}\n >\n <DataTable\n columns={detailColumns}\n dataSource={props.record.details}\n bordered\n className=\"oui-w-full\"\n classNames={{\n header: \"oui-h-10\",\n root: \"oui-bg-base-8 oui-max-h-[60vh] oui-overflow-y-scroll\",\n }}\n onRow={() => ({\n className: \"oui-h-[40px]\",\n })}\n generatedRowKey={(record) =>\n record.transaction_id || Math.random().toString()\n }\n />\n </SimpleDialog>\n );\n});\n\nexport const ConvertDesktopUI: React.FC<ConvertDesktopUIProps> = ({\n convertState,\n}) => {\n const handleDetailsClick = (convertId: number) => {\n // Find the convert record by ID\n const record = convertState.dataSource.find(\n (item) => item.convert_id === convertId,\n );\n if (record) {\n modal.show(ConvertDetailsModal, {\n record,\n indexPrices: convertState.indexPrices,\n chainsInfo: convertState.chainsInfo as any,\n });\n }\n };\n\n const columns = useConvertColumns({\n onDetailsClick: handleDetailsClick,\n });\n\n const {\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n } = convertState;\n\n const dataFilter = useMemo(() => {\n return (\n <DataFilter\n className=\"\"\n onFilter={onFilter}\n items={[\n // {\n // type: \"select\",\n // name: \"account\",\n // value: selectedAccount,\n // options: memoizedOptions,\n // },\n {\n type: \"select\",\n name: \"converted_asset\",\n value: convertedAssetFilter,\n options: convertedAssetOptions,\n },\n {\n type: \"select\",\n name: \"status\",\n value: statusFilter,\n options: CONVERT_STATUS_OPTIONS,\n },\n {\n type: \"range\",\n name: \"time\",\n value: {\n from: dateRange?.[0],\n to: dateRange?.[1],\n },\n },\n ]}\n />\n );\n }, [\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n ]);\n\n return (\n <Flex direction=\"column\" mt={4} itemAlign=\"center\" className=\"oui-w-full\">\n <Divider className=\"oui-w-full oui-border-b oui-border-line-4 oui-pt-6\" />\n <Flex direction=\"row\" className=\"oui-w-full\">\n {dataFilter}\n </Flex>\n <DataTable\n columns={columns}\n dataSource={convertState.dataSource}\n loading={convertState.isLoading}\n bordered\n pagination={convertState.pagination}\n manualPagination\n className=\"oui-mt-4 oui-w-full\"\n classNames={{\n root: \"oui-h-[calc(100vh_-_200px)]\",\n header: \"oui-h-12\",\n }}\n onRow={() => ({\n className: \"oui-h-[48px] oui-cursor-pointer\",\n })}\n generatedRowKey={(record) => {\n return record.convert_id.toString();\n }}\n />\n </Flex>\n );\n};\n","import { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n useModal,\n modal,\n Text,\n Divider,\n TokenIcon,\n Flex,\n DataFilter,\n SimpleSheet,\n toast,\n ScrollIndicator,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ConvertRecord, ConvertTransaction } from \"../type\";\nimport { ConvertedAssetColumn } from \"./convert.column\";\nimport { useConvertScript } from \"./convert.script\";\nimport { CONVERT_STATUS_OPTIONS } from \"./convert.ui.desktop\";\n\ntype ConvertMobileUIProps = {\n convertState: ReturnType<typeof useConvertScript>;\n};\n\ntype ConvertMobileItemProps = {\n item?: any;\n chainsInfo: any[];\n};\n\ntype ConvertMobileFieldProps = {\n label: string;\n value?: string | number;\n className?: string;\n copyable?: boolean;\n rule?: \"address\" | \"txId\";\n onClick?: () => void;\n};\n\nexport const ConvertMobileUI: React.FC<ConvertMobileUIProps> = ({\n convertState,\n}) => {\n const { t } = useTranslation();\n\n const {\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n } = convertState;\n\n const dataFilter = useMemo(() => {\n return (\n <DataFilter\n onFilter={onFilter}\n items={[\n // {\n // size: \"sm\",\n // type: \"picker\",\n // name: \"account\",\n // value: selectedAccount,\n // options: memoizedOptions,\n // },\n {\n size: \"md\",\n type: \"picker\",\n name: \"converted_asset\",\n value: convertedAssetFilter,\n options: convertedAssetOptions,\n className: \"oui-whitespace-nowrap\",\n },\n {\n size: \"md\",\n type: \"picker\",\n name: \"status\",\n value: statusFilter,\n options: CONVERT_STATUS_OPTIONS,\n className: \"oui-whitespace-nowrap\",\n },\n {\n type: \"range\",\n name: \"time\",\n value: {\n from: dateRange?.[0],\n to: dateRange?.[1],\n },\n },\n ]}\n />\n );\n }, [\n convertedAssetFilter,\n statusFilter,\n dateRange,\n onFilter,\n convertedAssetOptions,\n ]);\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-1 oui-px-3\">\n <ScrollIndicator className=\"oui-pr-5\">\n <Flex direction=\"row\">{dataFilter}</Flex>\n </ScrollIndicator>\n {convertState.dataSource.map((item) => (\n <ConvertMobileItem\n key={item.convert_id}\n item={item}\n chainsInfo={convertState.chainsInfo as any}\n />\n ))}\n </div>\n );\n};\n\nconst ConvertMobileField: React.FC<ConvertMobileFieldProps> = ({\n label,\n value,\n rule,\n copyable = false,\n className = \"\",\n onClick,\n}) => {\n const { t } = useTranslation();\n const onCopy = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n toast.success(t(\"common.copy.copied\"));\n };\n return (\n <div\n className={`oui-text-2xs oui-font-semibold oui-text-base-contrast-80 [&_p]:oui-text-base-contrast-36 ${className}`}\n onClick={onClick}\n >\n <p>{label}</p>\n <Text.formatted rule={rule} copyable={copyable} onCopy={onCopy}>\n {value || \"-\"}\n </Text.formatted>\n </div>\n );\n};\n\nconst ConvertMobileItem: React.FC<ConvertMobileItemProps> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n if (!item) {\n return null;\n }\n\n const totalHaircut = item.details.reduce(\n (sum: number, detail: ConvertTransaction) => sum + detail.haircut,\n 0,\n );\n\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <div className=\"oui-flex oui-justify-between\">\n <div className=\"oui-flex oui-items-center oui-text-xs oui-font-semibold oui-text-base-contrast-80\">\n <ConvertedAssetColumn convertedAssets={item.converted_asset} />\n <div\n className=\"oui-ml-2 oui-text-primary\"\n onClick={() => {\n modal.show(ConverHistoryItemDetailsDialog, {\n item,\n chainsInfo: props.chainsInfo,\n });\n }}\n >\n {t(\"portfolio.overview.column.convert.details\")}\n </div>\n </div>\n <Text.formatted\n className=\"oui-text-2xs oui-text-base-contrast-36\"\n rule=\"date\"\n >\n {item.created_time}\n </Text.formatted>\n </div>\n\n {/* 5 fields in grid container: 3 per row, wrap to next line */}\n <div className=\"oui-grid oui-grid-cols-3 oui-gap-2\">\n <ConvertMobileField\n label={t(\"portfolio.overview.column.convert.usdcAmount\")}\n value={item.received_qty}\n />\n <ConvertMobileField label={t(\"common.fee\")} value={totalHaircut} />\n <ConvertMobileField\n label={t(\"portfolio.overview.column.convert.convertId\")}\n value={item.convert_id}\n copyable={true}\n />\n <ConvertMobileField\n label={t(\"common.type\")}\n value={item.type?.charAt(0).toUpperCase() + item.type?.slice(1)}\n />\n <ConvertMobileField\n label={t(\"common.status\")}\n value={item.status?.charAt(0).toUpperCase() + item.status?.slice(1)}\n />\n </div>\n </div>\n );\n};\n\ntype ConvertHistoryItemDetailsDialogProps = {\n item: ConvertRecord;\n chainsInfo: any[];\n};\n\nconst ConverHistoryItemDetailsDialog =\n modal.create<ConvertHistoryItemDetailsDialogProps>((props) => {\n const { item, chainsInfo } = props;\n const { t } = useTranslation();\n const { visible, hide, resolve, reject, onOpenChange } = useModal();\n\n return (\n <SimpleSheet\n title={t(\"portfolio.overview.convert.dialog.title.details\")}\n open={visible}\n onOpenChange={onOpenChange}\n >\n <div className=\"oui-flex oui-h-[300px] oui-flex-col oui-gap-3 oui-overflow-y-auto oui-rounded-lg oui-bg-base-7 oui-p-2\">\n {item.details.map((detail, index) => (\n <>\n <div className=\"oui-flex oui-flex-col oui-gap-2\">\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <TokenIcon name={detail.converted_asset} size=\"xs\" />\n <div className=\"oui-text-xs oui-text-base-contrast-80\">\n {detail.converted_asset}\n </div>\n </div>\n <div className=\"oui-grid oui-grid-cols-3 oui-gap-2\">\n <ConvertMobileField\n label={t(\"common.qty\")}\n value={detail.converted_qty}\n />\n <ConvertMobileField\n label={t(\"portfolio.overview.column.convert.usdcAmount\")}\n value={detail.received_qty}\n />\n <ConvertMobileField label=\"Fee\" value={detail.haircut} />\n <ConvertMobileField\n label={t(\"common.txId\")}\n copyable={!!detail.tx_id}\n rule=\"txId\"\n value={detail.tx_id}\n onClick={() => {\n if (detail.tx_id) {\n const chainInfo = chainsInfo.find(\n (item) => item.chain_id == detail.chain_id,\n );\n if (chainInfo?.explorer_base_url) {\n window.open(\n `${chainInfo.explorer_base_url}/tx/${detail.tx_id}`,\n \"_blank\",\n );\n }\n }\n }}\n />\n <ConvertMobileField\n label={t(\"transfer.network\")}\n value={\n chainsInfo.find(\n (item) => item.chain_id == detail.chain_id,\n )?.name || \"-\"\n }\n />\n <ConvertMobileField\n label={t(\"common.result\")}\n value={\n detail.result\n ? detail.result.charAt(0).toUpperCase() +\n detail.result.slice(1)\n : \"-\"\n }\n />\n </div>\n </div>\n {index < item.details.length - 1 && <Divider />}\n </>\n ))}\n </div>\n </SimpleSheet>\n );\n });\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useConvertScript } from \"./convert.script\";\nimport { ConvertDesktopUI } from \"./convert.ui.desktop\";\nimport { ConvertMobileUI } from \"./convert.ui.mobile\";\n\nexport const ConvertHistoryWidget: React.FC = () => {\n const convertState = useConvertScript();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <ConvertMobileUI convertState={convertState} />;\n }\n return <ConvertDesktopUI convertState={convertState} />;\n};\n","import React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AssetHistorySideEnum } from \"@kodiak-finance/orderly-types\";\nimport { TabPanel, Tabs } from \"@kodiak-finance/orderly-ui\";\nimport { ConvertHistoryWidget } from \"../../assets/convertPage/convert.widget\";\nimport { VaultsHistoryWidget } from \"../VaultsHistory/transfer.widget\";\nimport { AssetHistoryWidget } from \"../assetHistory\";\nimport { DistributionHistoryWidget } from \"../distribution\";\nimport { FundingHistoryWidget } from \"../funding\";\nimport { TabName } from \"./historyDataGroup.script\";\n\nexport const HistoryDataGroupMobile: React.FC<{\n active?: TabName;\n onTabChange: (tab: string) => void;\n}> = (props) => {\n const { active = \"deposit\", onTabChange } = props;\n const { t } = useTranslation();\n\n return (\n <Tabs\n value={active}\n onValueChange={onTabChange}\n variant=\"contained\"\n size=\"lg\"\n classNames={{\n tabsList: \"oui-px-3 oui-py-2\",\n scrollIndicator: \"oui-pr-3\",\n }}\n showScrollIndicator\n >\n <TabPanel title={t(\"common.deposits\")} value={\"deposit\"}>\n <AssetHistoryWidget side={AssetHistorySideEnum.DEPOSIT} />\n </TabPanel>\n <TabPanel title={t(\"common.withdrawals\")} value={\"withdraw\"}>\n <AssetHistoryWidget side={AssetHistorySideEnum.WITHDRAW} />\n </TabPanel>\n <TabPanel title={t(\"common.funding\")} value={\"funding\"}>\n <FundingHistoryWidget />\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.distribution\")}\n value={\"distribution\"}\n >\n <DistributionHistoryWidget />\n </TabPanel>\n <TabPanel\n title={t(\"portfolio.overview.tab.convert.history\")}\n value={\"convert\"}\n >\n <ConvertHistoryWidget />\n </TabPanel>\n <TabPanel title={t(\"common.vaults\")} value={\"vaults\"}>\n <VaultsHistoryWidget />\n </TabPanel>\n </Tabs>\n );\n};\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useHistoryDataGroupScript } from \"./historyDataGroup.script\";\nimport { HistoryDataGroupDesktop } from \"./historyDataGroup.ui.desktop\";\nimport { HistoryDataGroupMobile } from \"./historyDataGroup.ui.mobile\";\n\nexport const HistoryDataGroupWidget: React.FC = () => {\n const state = useHistoryDataGroupScript();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <HistoryDataGroupMobile {...state} />;\n }\n return <HistoryDataGroupDesktop {...state} />;\n};\n","export { HistoryDataGroupWidget } from \"./historyDataGroup.widget\";\n","import { createContext, useContext } from \"react\";\nimport { TWType } from \"@kodiak-finance/orderly-hooks\";\nimport { UseRewardsDataReturn } from \"../mobile/useRewardsData.script\";\nimport { useAssetsHistoryDataReturn } from \"../shared/useAssetHistory\";\n\nexport type OverviewContextState = {\n // period: PeriodType;\n type?: TWType;\n} & useAssetsHistoryDataReturn &\n UseRewardsDataReturn;\n\nexport const OverviewContext = createContext<OverviewContextState>(\n {} as OverviewContextState,\n);\n\nexport const useOverviewContext = () => {\n return useContext(OverviewContext);\n};\n","import { useMemo } from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext, useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useOverviewContext } from \"../provider/overviewContext\";\n\nexport const useAssetsChartScript = () => {\n const assetHistory = useOverviewContext();\n\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n\n const filteredData = useDataTap(assetHistory.data, {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n fallbackData: assetHistory.createFakeData(\n { account_value: 0 },\n { account_value: 500 },\n ),\n });\n\n const _data = useMemo(() => {\n if (filteredData?.length) {\n return filteredData;\n }\n return assetHistory.createFakeData(\n { account_value: 0 },\n { account_value: 500 },\n );\n }, [filteredData, assetHistory]);\n\n const invisible =\n wrongNetwork || disabledConnect || !assetHistory.data.length;\n\n return {\n ...assetHistory,\n data: _data,\n invisible,\n } as const;\n};\n\nexport type useAssetsChartScriptReturn = ReturnType<\n typeof useAssetsChartScript\n>;\n","import { useCallback, useMemo, useRef, useState } from \"react\";\nimport { subDays, format, differenceInDays } from \"date-fns\";\nimport {\n useAccount,\n useAssetsHistory,\n useCollateral,\n useIndexPricesStream,\n useLocalStorage,\n usePrivateQuery,\n useStatisticsDaily,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\n\nexport enum PeriodType {\n DAY = \"1D\",\n WEEK = \"7D\",\n MONTH = \"30D\",\n QUARTER = \"90D\",\n}\n\nexport const useAssetsHistoryData = (\n localKey: string,\n options?: { isRealtime?: boolean },\n) => {\n const [today] = useState(() => new Date());\n\n const { getIndexPrice } = useIndexPricesStream();\n // const { account } = useAccount();\n\n const { t } = useTranslation();\n\n const { isRealtime = false } = options || {};\n const periodTypes = Object.values(PeriodType);\n\n const [period, setPeriod] = useLocalStorage<PeriodType | null>(\n localKey,\n PeriodType.MONTH,\n );\n\n const convertToUSDCAndOperate = useCallback(\n (inputs: {\n token: string;\n amount: string | number;\n value: Decimal;\n op?: \"add\" | \"sub\";\n }): Decimal => {\n const { token, amount, value, op = \"sub\" } = inputs;\n if (token.toUpperCase() === \"USDC\") {\n return op === \"add\" ? value.add(amount) : value.sub(amount);\n } else {\n const indexPrice = getIndexPrice(token);\n if (indexPrice) {\n const delta = new Decimal(amount).mul(indexPrice);\n return op === \"add\" ? value.add(delta) : value.sub(delta);\n }\n return value;\n }\n },\n [getIndexPrice],\n );\n\n const periodLabel = useMemo<Record<PeriodType, string>>(() => {\n return {\n [PeriodType.DAY]: t(\"common.select.1d\"),\n [PeriodType.WEEK]: t(\"common.select.7d\"),\n [PeriodType.MONTH]: t(\"common.select.30d\"),\n [PeriodType.QUARTER]: t(\"common.select.90d\"),\n };\n }, [t]);\n\n const formatDateRange = (date: Date): string => {\n return format(date, \"yyyy-MM-dd\");\n };\n\n const getExpectedDateRange = (offsetDay: number) => {\n return {\n from: subDays(new Date(), offsetDay - 1),\n to: new Date(),\n };\n };\n\n const getMatchingPeriodType = (from: Date, to: Date): PeriodType | null => {\n // Calculate days difference (inclusive - add 1 to include both start and end dates)\n const offsetDay = Math.abs(differenceInDays(from, to)) + 1;\n\n // Check against predefined periods\n const filterDays = [1, 7, 30, 90] as const;\n if (!filterDays.includes(offsetDay as any)) {\n return null;\n }\n\n // Validate that the date range matches the expected range for this period\n const expectedRange = getExpectedDateRange(offsetDay);\n if (\n formatDateRange(expectedRange.from) === formatDateRange(from) &&\n formatDateRange(expectedRange.to) === formatDateRange(to)\n ) {\n switch (offsetDay) {\n case 1:\n return PeriodType.DAY;\n case 7:\n return PeriodType.WEEK;\n case 30:\n return PeriodType.MONTH;\n case 90:\n return PeriodType.QUARTER;\n }\n }\n\n return null;\n };\n\n const getCustomDateRangeLabel = (from: Date, to: Date): string => {\n // Calculate days difference (inclusive - add 1 to include both start and end dates)\n const offsetDay = Math.abs(differenceInDays(from, to)) + 1;\n return `${offsetDay}D`;\n };\n\n const { totalValue } = useCollateral();\n\n const getStartDate = (value: PeriodType) => {\n switch (value) {\n case PeriodType.DAY:\n return subDays(today, 1);\n case PeriodType.WEEK:\n return subDays(today, 6);\n case PeriodType.MONTH:\n return subDays(today, 29);\n case PeriodType.QUARTER:\n return subDays(today, 89);\n default:\n return subDays(today, 6);\n }\n };\n\n const [startDate, setStartDate] = useState(getStartDate(period));\n const [endDate, setEndDate] = useState(today);\n\n const periodValue = useMemo(() => {\n if (period) {\n switch (period) {\n case PeriodType.DAY:\n return 1;\n case PeriodType.WEEK:\n return 7;\n case PeriodType.MONTH:\n return 30;\n case PeriodType.QUARTER:\n return 90;\n }\n }\n // For custom date ranges, calculate actual days\n return Math.abs(differenceInDays(startDate, endDate)) + 1;\n }, [period, startDate, endDate]);\n // const nowStamp = useRef(new Date().getTime().toString());\n // const now = useRef(new Date());\n\n // const endDate = useMemo(() => addDays(today, 1), [today]);\n\n const totalDeposit = useRef<Decimal>(zero);\n\n // get transfer history\n const { data: transferOutHistory } = usePrivateQuery<API.TransferHistory>(\n `/v1/internal_transfer_history?page=1&size=200&side=OUT&main_sub_only=true&start_t=${startDate.getTime()}&end_t=${endDate.getTime()}`,\n {\n revalidateOnFocus: false,\n },\n );\n const { data: transferInHistory } = usePrivateQuery<API.TransferHistory>(\n `/v1/internal_transfer_history?page=1&size=200&side=IN&main_sub_only=true&start_t=${startDate.getTime()}&end_t=${endDate.getTime()}`,\n {\n revalidateOnFocus: false,\n },\n );\n\n const [data] = useStatisticsDaily(\n {\n startDate: startDate.toISOString().split(\"T\")[0],\n endDate: endDate.toISOString().split(\"T\")[0],\n },\n {\n ignoreAggregation: true,\n },\n );\n\n // get deposit & withdraw records to calculate the current PNL\n const [assetHistory] = useAssetsHistory({\n startTime: subDays(today, 2).getTime(),\n endTime: endDate.getTime(),\n pageSize: 50,\n });\n\n // get all deposit records to calculate the ROI\n const [allDepositHistory] = useAssetsHistory({\n side: \"DEPOSIT\",\n startTime: subDays(today, periodValue).getTime(),\n endTime: endDate.getTime(),\n pageSize: 200,\n });\n\n const totalDepositForROI = useMemo(() => {\n return allDepositHistory\n ?.filter((item) => item.trans_status === \"COMPLETED\")\n .reduce((acc, item) => {\n return acc.add(\n // item.amount\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [allDepositHistory, convertToUSDCAndOperate]);\n\n const totalTransferInForROI = useMemo(() => {\n if (!Array.isArray(transferInHistory)) {\n return zero;\n }\n return transferInHistory\n ?.filter((item) => item.status === \"COMPLETED\")\n .reduce((acc, item) => {\n return acc.add(\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [transferInHistory, convertToUSDCAndOperate]);\n\n const dateRange = useMemo(\n () => ({\n from: startDate,\n to: endDate,\n }),\n [startDate, endDate],\n );\n\n const onPeriodChange = (value: PeriodType) => {\n const newStartDate = getStartDate(value);\n setStartDate(newStartDate);\n setEndDate(today);\n setPeriod(value);\n };\n\n const setDateRange = (newRange: {\n from: Date | string;\n to: Date | string;\n }) => {\n const fromDate =\n newRange.from instanceof Date ? newRange.from : new Date(newRange.from);\n const toDate =\n newRange.to instanceof Date ? newRange.to : new Date(newRange.to);\n setStartDate(fromDate);\n setEndDate(toDate);\n\n // Check if the selected range matches a predefined period\n const matchingPeriod = getMatchingPeriodType(fromDate, toDate);\n if (matchingPeriod) {\n setPeriod(matchingPeriod);\n } else {\n // Reset period to null to indicate custom date range selection\n setPeriod(null);\n }\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n setDateRange(filter.value);\n }\n };\n\n const filterItems = useMemo(() => {\n const dateRangeFilter = {\n type: \"range\" as const,\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n };\n return [dateRangeFilter] as any;\n }, [dateRange]);\n\n // const lastItem = data[data.length - 1];\n\n const lastItem = useMemo(() => {\n return data.length > 0 ? data[data.length - 1] : null;\n }, [data]);\n\n const totalTransferIn = useMemo(() => {\n if (!Array.isArray(transferInHistory)) {\n return null;\n }\n if (\n lastItem == null ||\n transferInHistory?.length === 0 ||\n typeof lastItem.snapshot_time === \"undefined\"\n ) {\n return zero;\n }\n const list = transferInHistory?.filter((item) => {\n return (\n item.status === \"COMPLETED\" &&\n item.created_time > lastItem?.snapshot_time\n );\n });\n return list?.reduce((acc, item) => {\n return acc.add(\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [transferInHistory, lastItem, convertToUSDCAndOperate]);\n\n const totalTransferOut = useMemo(() => {\n if (!Array.isArray(transferOutHistory)) {\n return null;\n }\n if (\n lastItem == null ||\n transferOutHistory?.length === 0 ||\n typeof lastItem.snapshot_time === \"undefined\"\n ) {\n return zero;\n }\n const list = transferOutHistory?.filter((item) => {\n return (\n item.status === \"COMPLETED\" &&\n item.created_time > lastItem?.snapshot_time\n );\n });\n return list?.reduce((acc, item) => {\n return acc.add(\n convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: zero,\n op: \"add\",\n }),\n );\n }, zero);\n }, [transferOutHistory, lastItem, convertToUSDCAndOperate]);\n\n const calculateLastPnl = (inputs: {\n lastItem: API.DailyRow;\n assetHistory: ReadonlyArray<API.AssetHistoryRow> | API.AssetHistoryRow[];\n transferHistory: {\n OUT: Decimal;\n IN: Decimal;\n };\n totalValue: number | null;\n }) => {\n if (totalValue == null) {\n return null;\n }\n // today daily pnl = totalValue - lastItem.account_value - deposit + withdraw\n let value = new Decimal(totalValue).sub(inputs.lastItem.account_value);\n\n // subtraction of deposit and withdraw\n if (\n Array.isArray(inputs.assetHistory) &&\n inputs.assetHistory.length > 0 &&\n typeof inputs.lastItem.snapshot_time !== \"undefined\"\n ) {\n // find a list with the timestamp greater than the last item timestamp and trans_status = success;\n const list = [];\n\n for (let i = 0; i < inputs.assetHistory.length; i++) {\n const item = inputs.assetHistory[i];\n if (item.created_time > inputs.lastItem.snapshot_time) {\n list.push(item);\n }\n }\n\n // calculate the sum of deposit and withdraw\n for (let i = 0; i < list.length; i++) {\n const item = list[i];\n if (item.side === \"DEPOSIT\") {\n if (item.trans_status === \"COMPLETED\") {\n value = convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value,\n op: \"sub\",\n });\n\n totalDeposit.current = convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value: totalDeposit.current,\n op: \"add\",\n });\n }\n } else if (item.side === \"WITHDRAW\") {\n if (item.trans_status !== \"FAILED\") {\n value = convertToUSDCAndOperate({\n token: item.token,\n amount: item.amount,\n value,\n op: \"add\",\n });\n }\n }\n }\n }\n\n value = value\n .sub(inputs.transferHistory.IN)\n .add(inputs.transferHistory.OUT);\n\n return value.toNumber();\n };\n\n const calculate = (\n data: API.DailyRow[],\n totalValue: number | null,\n totalTransferIn: Decimal,\n totalTransferOut: Decimal,\n ) => {\n const lastItem = data[data.length - 1];\n\n return {\n ...lastItem,\n date: getUTCStr(today),\n perp_volume: 0,\n account_value:\n totalValue !== null ? totalValue : (lastItem?.account_value ?? 0),\n pnl:\n calculateLastPnl({\n lastItem,\n assetHistory,\n totalValue,\n transferHistory: {\n OUT: totalTransferOut,\n IN: totalTransferIn,\n },\n }) ?? 0,\n __isCalculated: true,\n };\n };\n\n const mergeData = (\n data: ReadonlyArray<API.DailyRow> | API.DailyRow[],\n totalValue: number | null,\n totalTransferIn: Decimal,\n totalTransferOut: Decimal,\n ) => {\n if (!Array.isArray(data) || data.length === 0) {\n return data;\n }\n\n if (data[data.length - 1].date === getUTCStr(today)) {\n return data;\n }\n\n return data.concat([\n calculate(data, totalValue, totalTransferIn, totalTransferOut),\n ]);\n };\n\n const calculateData = (\n data: ReadonlyArray<API.DailyRow> | API.DailyRow[],\n realtime: boolean,\n totalValue: number | null,\n totalTransferIn: Decimal,\n totalTransferOut: Decimal,\n ) => {\n const _data = !realtime\n ? data\n : mergeData(data, totalValue, totalTransferIn, totalTransferOut);\n\n return _data.slice(Math.max(0, _data.length - periodValue));\n };\n\n const calculatedData = useMemo(() => {\n /**\n * need the totalValue and data are all ready, else return null;\n */\n if (totalValue === null) {\n return [];\n }\n // if the transferOutHistory or transferInHistory is not ready, return null;\n\n if (totalTransferOut === null || totalTransferIn === null) {\n return [];\n }\n return calculateData(\n data,\n isRealtime,\n totalValue,\n totalTransferIn,\n totalTransferOut,\n );\n }, [\n data,\n totalValue,\n assetHistory,\n isRealtime,\n getIndexPrice,\n // transferOutHistory,\n // transferInHistory,\n totalTransferIn,\n totalTransferOut,\n ]);\n\n const aggregateValue = useMemo(() => {\n let vol = zero;\n let pnl = zero;\n let roi = zero;\n\n if (Array.isArray(calculatedData) && calculatedData.length) {\n calculatedData.forEach((d) => {\n // vol = vol.add(d.perp_volume);\n pnl = pnl.add(d.pnl);\n });\n\n const tail = calculatedData[0];\n\n const dataTailIndex = data.findIndex((d) => d.date === tail.date);\n\n const lastAccountValue = data[dataTailIndex - 1]?.account_value;\n\n // console.log(data, calculatedData, tail, dataTailIndex);\n\n if (typeof lastAccountValue === \"undefined\" || lastAccountValue === 0) {\n roi = zero;\n } else {\n roi = pnl.div(\n totalTransferInForROI.add(lastAccountValue).add(totalDepositForROI),\n );\n }\n }\n\n if (data.length > 0) {\n for (let i = 0; i < periodValue; i++) {\n const item = data[data.length - 1 - i];\n\n if (item) {\n vol = vol.add(item.perp_volume ?? 0);\n }\n }\n }\n\n // console.log(\"---------------------------\");\n\n return { vol: vol.toNumber(), pnl: pnl.toNumber(), roi: roi.toNumber() };\n }, [\n calculatedData,\n data,\n periodValue,\n totalTransferInForROI,\n totalDepositForROI,\n ]);\n\n const createFakeData = (\n start: Partial<API.DailyRow>,\n end: Partial<API.DailyRow>,\n ) => {\n return Array.from({ length: 2 }, (_, i) => {\n const date = format(i === 0 ? startDate : new Date(), \"yyyy-MM-dd\");\n return { date, ...(i === 0 ? start : end) };\n });\n };\n\n return {\n periodTypes,\n period: period as PeriodType | null,\n onPeriodChange: onPeriodChange,\n periodLabel: periodLabel,\n curPeriod: period\n ? periodLabel[period as PeriodType]\n : getCustomDateRangeLabel(startDate, endDate),\n // data: calculatedDataUpdateByIndexPrice, // calculatedData,\n data: calculatedData, // calculatedData,\n aggregateValue,\n createFakeData,\n volumeUpdateDate: data?.[data.length - 1]?.date ?? \"\",\n filterItems,\n onFilter,\n dateRange,\n setDateRange,\n } as const;\n};\n\nexport type useAssetsHistoryDataReturn = ReturnType<\n typeof useAssetsHistoryData\n>;\n\nfunction getUTCStr(date: Date) {\n const year = date.getUTCFullYear();\n const month = `0${date.getUTCMonth() + 1}`.slice(-2);\n const day = `0${date.getUTCDate()}`.slice(-2);\n\n return `${year}-${month}-${day}`;\n}\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { CardTitle, Flex, DataFilter } from \"@kodiak-finance/orderly-ui\";\nimport { PeriodType } from \"./useAssetHistory\";\n\nexport const PeriodTitle: React.FC<{\n onPeriodChange: (period: PeriodType) => void;\n periodTypes: string[];\n period: PeriodType | null;\n title: string;\n filterItems?: any[];\n onFilter?: (filter: { name: string; value: any }) => void;\n}> = (props) => {\n const { t } = useTranslation();\n\n const periodLabel = useMemo(() => {\n return {\n [PeriodType.DAY]: t(\"common.select.1d\"),\n [PeriodType.WEEK]: t(\"common.select.7d\"),\n [PeriodType.MONTH]: t(\"common.select.30d\"),\n [PeriodType.QUARTER]: t(\"common.select.90d\"),\n };\n }, [t]);\n\n const periodOrder = [\n PeriodType.DAY,\n PeriodType.WEEK,\n PeriodType.MONTH,\n PeriodType.QUARTER,\n ];\n\n return (\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <CardTitle>{props.title}</CardTitle>\n <Flex gap={2} itemAlign=\"center\">\n {props.filterItems && props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={props.onFilter || (() => {})}\n className=\"oui-border-none oui-py-0\"\n />\n )}\n {periodOrder.map((periodType) => (\n <button\n key={periodType}\n className={`oui-px-3 oui-rounded oui-text-xs oui-font-medium oui-transition-colors ${\n props.period === periodType\n ? \"oui-bg-primary oui-text-white\"\n : \"oui-bg-base-6 oui-text-base-contrast-60 hover:oui-bg-base-4 hover:oui-text-base-contrast\"\n }`}\n onClick={() => props.onPeriodChange(periodType)}\n >\n {periodLabel[periodType]}\n </button>\n ))}\n </Flex>\n </Flex>\n );\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from \"react\";\nimport { AssetAreaChart } from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Card, Box } from \"@kodiak-finance/orderly-ui\";\nimport { useAssetsChartScriptReturn } from \"./assetsChart.script\";\n\nconst LazyPeriodTitle = React.lazy(() =>\n import(\"../shared/periodHeader\").then((mod) => {\n return { default: mod.PeriodTitle };\n }),\n);\n\nexport type AssetsLineChartProps = {} & useAssetsChartScriptReturn;\n\nexport const AssetsChart: React.FC<AssetsLineChartProps> = (props) => {\n const { onPeriodChange, data, periodTypes, period, filterItems, onFilter } =\n props;\n const { t } = useTranslation();\n return (\n <Card\n title={\n <Box>\n <React.Suspense fallback={null}>\n <LazyPeriodTitle\n onPeriodChange={onPeriodChange}\n periodTypes={periodTypes}\n period={period}\n title={t(\"common.assets\")}\n filterItems={filterItems}\n onFilter={onFilter}\n />\n </React.Suspense>\n </Box>\n }\n id=\"portfolio-overview-assets-chart\"\n classNames={{ content: \"oui-h-[168px] oui-pb-0\" }}\n >\n <React.Suspense fallback={null}>\n <AssetAreaChart data={data as any} invisible={props.invisible} />\n </React.Suspense>\n </Card>\n );\n};\n","import React from \"react\";\nimport { useAssetsChartScript } from \"./assetsChart.script\";\nimport { AssetsChart } from \"./assetsChart.ui\";\n\nexport const AssetsChartWidget: React.FC = () => {\n const state = useAssetsChartScript();\n return <AssetsChart {...state} />;\n};\n","export { AssetsChartWidget } from \"./assetsChart.widget\";\nexport { useAssetsChartScript } from \"./assetsChart.script\";\nexport { AssetsChart } from \"./assetsChart.ui\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useState } from \"react\";\nimport {\n PnlAreaChart,\n PnLBarChart,\n VolBarChart,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport {\n Card,\n Grid,\n Box,\n Statistic,\n Text,\n Flex,\n Tooltip,\n cn,\n Tabs,\n TabPanel,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { UsePerformanceScriptReturn } from \"./performance.script\";\n\nconst LazyPeriodTitle = React.lazy(() =>\n import(\"../shared/periodHeader\").then((mod) => {\n return { default: mod.PeriodTitle };\n }),\n);\n\nexport type PerformanceUIProps = {\n // periodTypes: string[];\n // period: string;\n // onPeriodChange: (period: string) => void;\n} & UsePerformanceScriptReturn;\n\ntype LabelWithHintProps = {\n label: string;\n hint?: React.ReactNode;\n};\n\nconst LabelWithHint: React.FC<LabelWithHintProps> = (props) => {\n const { label, hint } = props;\n return (\n <Tooltip\n open={hint ? undefined : false}\n content={hint}\n className=\"oui-max-w-[240px] oui-bg-base-6 \"\n arrow={{ className: \"oui-fill-base-6\" }}\n delayDuration={300}\n >\n <Text\n size=\"xs\"\n intensity={36}\n className={cn(\n hint &&\n \"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\",\n )}\n >\n {label}\n </Text>\n </Tooltip>\n );\n};\n\nexport const PerformancePnL: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n return (\n <Box mt={4} height={\"188px\"}>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {t(\"portfolio.overview.performance.dailyPnl\")}\n </Text>\n <Box r=\"md\" className=\"oui-h-[188px] oui-border oui-border-line-4\">\n <PnLBarChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </Box>\n );\n};\n\nexport const CumulativePnlChart: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n return (\n <Box mt={4}>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {t(\"portfolio.overview.performance.cumulativePnl\")}\n </Text>\n <Box r=\"md\" className=\"oui-h-[188px] oui-border oui-border-line-4\">\n <PnlAreaChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </Box>\n );\n};\n\nexport const PerformancePnLTabs: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n const [activeTab, setActiveTab] = useState(\"daily\");\n\n return (\n <Box mt={4}>\n <Tabs value={activeTab} onValueChange={setActiveTab} variant=\"contained\">\n <TabPanel\n value=\"daily\"\n title={t(\"portfolio.overview.performance.dailyPnl\")}\n >\n <Box\n r=\"md\"\n className=\"oui-mt-4 oui-h-[188px] oui-border oui-border-line-4\"\n >\n <PnLBarChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </TabPanel>\n <TabPanel\n value=\"cumulative\"\n title={t(\"portfolio.overview.performance.cumulativePnl\")}\n >\n <Box\n r=\"md\"\n className=\"oui-mt-4 oui-h-[188px] oui-border oui-border-line-4\"\n >\n <PnlAreaChart\n data={props.data}\n invisible={props.invisible || (props.data?.length ?? 0) <= 2}\n />\n </Box>\n </TabPanel>\n </Tabs>\n </Box>\n );\n};\n\nexport const VolumeChart: React.FC<{\n data: ReadonlyArray<any> | any[];\n invisible: boolean;\n curPeriod?: string;\n}> = (props) => {\n const { t } = useTranslation();\n\n const volumeData = (props.data ?? []).map((item: any) => ({\n date: item.date,\n volume: item.perp_volume ?? 0,\n opacity: (item.perp_volume ?? 0) > 0 ? 1 : 0,\n }));\n\n const shouldHide = props.invisible || (props.data?.length ?? 0) <= 2;\n\n return (\n <Box mt={4}>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {t(\"portfolio.overview.performance.volume\", {\n period: props.curPeriod ?? \"\",\n })}\n </Text>\n <Box\n r=\"md\"\n className={cn(\n \"oui-mt-6 oui-h-[188px] oui-border oui-border-line-4\",\n shouldHide && \"chart-invisible\",\n )}\n >\n <VolBarChart data={volumeData} className=\"oui-size-full\" />\n </Box>\n </Box>\n );\n};\n\nexport const PerformanceUI: React.FC<PerformanceUIProps> = (props) => {\n const {\n periodTypes,\n period,\n onPeriodChange,\n aggregateValue,\n invisible,\n visible,\n volumeUpdateDate,\n curPeriod,\n filterItems,\n onFilter,\n } = props;\n const { t } = useTranslation();\n\n return (\n <Card\n title={\n <Box pt={6}>\n <React.Suspense fallback={null}>\n <LazyPeriodTitle\n onPeriodChange={onPeriodChange}\n periodTypes={periodTypes}\n period={period}\n title={t(\"portfolio.overview.performance\")}\n filterItems={filterItems}\n onFilter={onFilter}\n />\n </React.Suspense>\n </Box>\n }\n id=\"portfolio-overview-performance\"\n >\n <Box pb={4}>\n <Grid cols={3} gap={4}>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={4}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n <Statistic\n label={\n <LabelWithHint\n label={t(\"portfolio.overview.performance.roi\", {\n period: curPeriod,\n })}\n hint={t(\"portfolio.overview.performance.roi.tooltip\")}\n />\n }\n valueProps={{ rule: \"percentages\", coloring: true, visible }}\n >\n {invisible ? \"--\" : aggregateValue.roi}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={4}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n <Statistic\n label={\n <LabelWithHint\n label={t(\"portfolio.overview.performance.pnl\", {\n period: curPeriod,\n })}\n hint={t(\"portfolio.overview.performance.pnl.tooltip\")}\n />\n }\n valueProps={{ coloring: true, showIdentifier: true, visible }}\n >\n {invisible ? \"--\" : aggregateValue.pnl}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={4}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n <Statistic\n classNames={{\n label: \"oui-w-full\",\n }}\n label={\n <Flex justify={\"between\"}>\n <span>\n <LabelWithHint\n label={t(\"portfolio.overview.performance.volume\", {\n period: curPeriod,\n })}\n hint={t(\"portfolio.overview.performance.volume.tooltip\")}\n />\n </span>\n <span>{volumeUpdateDate}</span>\n </Flex>\n }\n valueProps={{ visible }}\n >\n {invisible ? \"--\" : aggregateValue.vol}\n </Statistic>\n </Box>\n </Grid>\n <Grid cols={2} gap={4} mb={4}>\n <PerformancePnLTabs\n data={props.data ?? EMPTY_LIST}\n invisible={props.invisible}\n />\n <VolumeChart\n data={props.data ?? EMPTY_LIST}\n invisible={props.invisible}\n curPeriod={props.curPeriod}\n />\n </Grid>\n </Box>\n </Card>\n );\n};\n","// Asset conversion types\nexport interface ConvertedAssets {\n [asset: string]: number;\n}\n\nexport interface ConvertTransaction {\n transaction_id: number;\n venue: \"on_chain\" | \"internal_fund\";\n converted_asset: string;\n received_asset: string;\n converted_qty: number;\n received_qty: number;\n haircut: number;\n chain_id?: number; // Optional, only for on_chain venue\n tx_id?: string; // Optional, only for on_chain venue\n result?: string;\n}\n\nexport interface ConvertRecord {\n convert_id: number;\n converted_asset: ConvertedAssets;\n received_asset: string;\n received_qty: number;\n type: \"auto\" | \"manual\";\n status: \"completed\" | \"pending\" | \"failed\" | \"cancelled\";\n created_time: number;\n updated_time: number;\n details: ConvertTransaction[];\n}\n\n// Additional utility types\nexport type ConvertType = \"auto\" | \"manual\";\n\nexport type ConvertStatus = \"completed\" | \"pending\" | \"failed\" | \"cancelled\";\n\nexport type VenueType = \"on_chain\" | \"internal_fund\";\n\nexport const ORDERLY_ASSETS_VISIBLE_KEY = \"orderly_assets_visible\";\n","import { useMemo } from \"react\";\nimport { useAccount, useLocalStorage } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext, useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { ORDERLY_ASSETS_VISIBLE_KEY } from \"../../assets/type\";\nimport { useOverviewContext } from \"../provider/overviewContext\";\n\nexport const usePerformanceScript = () => {\n const ctx = useOverviewContext();\n const [visible, setVisible] = useLocalStorage<boolean>(\n ORDERLY_ASSETS_VISIBLE_KEY,\n true,\n );\n\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n const filteredData = useDataTap(ctx?.data, {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n fallbackData: ctx?.createFakeData?.(\n { account_value: 0, pnl: 0 },\n { account_value: 500, pnl: 500 },\n ),\n });\n\n const _data = useMemo(() => {\n if (filteredData?.length) {\n return filteredData;\n }\n return ctx?.createFakeData?.(\n { account_value: 0, pnl: 0 },\n { account_value: 500, pnl: 500 },\n );\n }, [ctx, filteredData]);\n\n const invisible =\n wrongNetwork ||\n disabledConnect ||\n (state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected);\n\n return {\n ...ctx,\n data: _data as ReadonlyArray<any>,\n invisible,\n visible: visible as boolean,\n setVisible: setVisible,\n };\n};\n\nexport type UsePerformanceScriptReturn = ReturnType<\n typeof usePerformanceScript\n>;\n","import React from \"react\";\nimport { usePerformanceScript } from \"./performance.script\";\nimport { PerformanceUI } from \"./performance.ui\";\n\nexport const PerformanceWidget: React.FC = () => {\n const state = usePerformanceScript();\n return <PerformanceUI {...state} />;\n};\n","export { PerformanceUI } from \"./performance.ui\";\nexport { PerformanceWidget } from \"./performance.widget\";\nexport { usePerformanceScript } from \"./performance.script\";\n","import React, { useId } from \"react\";\n\nexport const EffectiveFee = React.forwardRef<\n SVGSVGElement,\n React.SVGAttributes<SVGSVGElement>\n>((props, ref) => {\n const linearId = useId();\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={14}\n height={14}\n viewBox=\"0 0 14 14\"\n fill=\"currentColor\"\n ref={ref}\n focusable={false}\n {...props}\n >\n <path\n d=\"M6.16411 1.53106C6.61974 1.07566 7.35888 1.07551 7.81442 1.53106L8.48833 2.20496C8.6797 2.39624 8.93064 2.51452 9.19755 2.54106L9.3132 2.54676H10.2662C10.9104 2.54691 11.4328 3.06926 11.4329 3.71343V4.66647C11.4329 4.97589 11.5559 5.27312 11.7747 5.49191L12.4492 6.16582C12.9047 6.62142 12.9047 7.36054 12.4492 7.81613L11.7753 8.49004L11.6972 8.57549C11.5272 8.78302 11.433 9.04426 11.4329 9.31491V10.2685L11.4272 10.3876C11.3715 10.9366 10.9348 11.373 10.3859 11.4289L10.2662 11.4352H9.3132L9.19755 11.4409C8.93066 11.4674 8.67969 11.5857 8.48833 11.777L7.81442 12.4509L7.72555 12.5306C7.29789 12.8795 6.68066 12.8794 6.25297 12.5306L6.16411 12.4509L5.4902 11.777C5.29887 11.5857 5.04786 11.4675 4.78097 11.4409L4.66533 11.4352H3.71171L3.59265 11.4289C3.04358 11.3731 2.60705 10.9367 2.55131 10.3876L2.54505 10.2685V9.31491C2.54499 9.04416 2.45089 8.78306 2.28072 8.57549L2.20325 8.49004L1.52934 7.81613C1.10213 7.38905 1.07534 6.71297 1.44902 6.25469L1.52934 6.16582L2.20382 5.49191C2.42248 5.27314 2.54505 4.97579 2.54505 4.66647V3.71343C2.54513 3.10945 3.00442 2.61221 3.59265 2.55246L3.71171 2.54676H4.66533L4.78097 2.54106C5.00968 2.51826 5.22694 2.4281 5.40475 2.28244L5.4902 2.20496L6.16411 1.53106ZM6.31507 3.02983C5.87756 3.46727 5.28401 3.71336 4.66533 3.71343H3.71171V4.66647C3.71171 5.28521 3.46614 5.87922 3.02869 6.31678L2.35421 6.99069L3.02812 7.6646C3.46577 8.10214 3.71164 8.69607 3.71171 9.31491V10.2685H4.66533C5.28396 10.2686 5.87757 10.5142 6.31507 10.9515L6.98898 11.6255L7.66289 10.9515C8.10045 10.5141 8.69446 10.2685 9.3132 10.2685H10.2662V9.31491C10.2663 8.69604 10.5127 8.10214 10.9504 7.6646L11.6243 6.99069L10.9498 6.31678C10.5122 5.8792 10.2662 5.28531 10.2662 4.66647V3.71343H9.3132C8.69438 3.71343 8.10047 3.46739 7.66289 3.02983L6.98898 2.35592L6.31507 3.02983ZM8.52934 4.64255C8.7571 4.41479 9.12639 4.41489 9.35421 4.64255C9.58202 4.87035 9.58202 5.23961 9.35421 5.46742L5.4657 9.35593C5.2379 9.58372 4.86863 9.58373 4.64083 9.35593C4.41318 9.12811 4.41308 8.75881 4.64083 8.53106L8.52934 4.64255ZM8.66435 7.83265C9.1245 7.83272 9.49777 8.2059 9.49777 8.66607C9.49769 9.12616 9.12445 9.49941 8.66435 9.49948C8.20419 9.49948 7.83101 9.12621 7.83094 8.66607C7.83094 8.20586 8.20415 7.83265 8.66435 7.83265ZM5.33126 4.49956C5.79141 4.49963 6.16468 4.87282 6.16468 5.33298C6.1646 5.79307 5.79136 6.16575 5.33126 6.16582C4.87111 6.16582 4.49793 5.79311 4.49785 5.33298C4.49785 4.87277 4.87106 4.49956 5.33126 4.49956Z\"\n fill={`url(#${linearId})`}\n />\n <defs>\n <linearGradient\n id={linearId}\n x1=\"12.7908\"\n y1=\"6.99084\"\n x2=\"1.1875\"\n y2=\"6.99084\"\n gradientUnits=\"userSpaceOnUse\"\n >\n <stop stopColor=\"rgb(var(--oui-gradient-brand-end))\" />\n <stop stopColor=\"rgb(var(--oui-gradient-brand-start))\" offset={1} />\n </linearGradient>\n </defs>\n </svg>\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n EffectiveFee.displayName = \"EffectiveFee\";\n}\n","export * from \"./effectiveFee\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useMemo } from \"react\";\nimport { useFeeState } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Flex,\n modal,\n Text,\n Tooltip,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { EffectiveFee } from \"./icons\";\n\nexport type FeeTierHeaderItemProps = {\n label: string;\n value: React.ReactNode;\n interactive?: boolean;\n};\n\nexport type FeeTierHeaderProps = {\n tier?: number | null;\n vol?: number | null;\n headerDataAdapter?: (original: any[]) => any[];\n};\n\nconst isEffective = (val?: unknown) =>\n typeof val !== \"undefined\" && val !== null;\n\nexport const MobileHeaderItem: React.FC<FeeTierHeaderItemProps> = (props) => {\n const { label, value, interactive } = props;\n const { t } = useTranslation();\n return (\n <Flex justify=\"between\" itemAlign=\"center\" width=\"100%\">\n <Text\n as=\"div\"\n intensity={36}\n size=\"xs\"\n weight=\"semibold\"\n className=\"oui-leading-[18px]\"\n >\n {label}\n </Text>\n <Flex className=\"oui-gap-1.5\" itemAlign=\"center\" justify=\"between\">\n <Text size=\"xs\" intensity={80} className=\"oui-leading-[24px]\">\n {value}\n </Text>\n {interactive && (\n <Flex\n gap={1}\n justify=\"center\"\n itemAlign=\"center\"\n className=\"oui-cursor-pointer oui-rounded oui-bg-gradient-to-r oui-from-[rgb(var(--oui-gradient-brand-start)_/_0.12)] oui-to-[rgb(var(--oui-gradient-brand-end)_/_0.12)] oui-px-1\"\n onClick={() => {\n modal.dialog({\n size: \"sm\",\n title: t(\"common.tips\"),\n content: t(\"portfolio.feeTier.effectiveFee.tooltip\"),\n });\n }}\n >\n <EffectiveFee />\n <Text.gradient\n className=\"oui-select-none\"\n color={\"brand\"}\n size=\"3xs\"\n weight=\"regular\"\n >\n {t(\"common.effectiveFee\")}\n </Text.gradient>\n </Flex>\n )}\n </Flex>\n </Flex>\n );\n};\n\nexport const DesktopHeaderItem: React.FC<FeeTierHeaderItemProps> = (props) => {\n const { label, value, interactive } = props;\n const { t } = useTranslation();\n return (\n <Box\n gradient=\"neutral\"\n r=\"lg\"\n px={4}\n py={2}\n angle={184}\n width=\"100%\"\n border\n borderColor={6}\n >\n <Text\n as=\"div\"\n intensity={36}\n size=\"2xs\"\n weight=\"semibold\"\n className=\"oui-leading-[18px]\"\n >\n {label}\n </Text>\n <Flex\n className=\"oui-mt-1 oui-w-full\"\n itemAlign=\"center\"\n justify=\"between\"\n >\n <Text size=\"base\" intensity={80} className=\"oui-leading-[24px]\">\n {value}\n </Text>\n {interactive && (\n <Tooltip\n content={t(\"portfolio.feeTier.effectiveFee.tooltip\")}\n className=\"oui-p-1.5 oui-text-base-contrast-54\"\n >\n <Flex\n gap={1}\n justify=\"center\"\n itemAlign=\"center\"\n className=\"oui-cursor-pointer oui-rounded oui-bg-gradient-to-r oui-from-[rgb(var(--oui-gradient-brand-start)_/_0.12)] oui-to-[rgb(var(--oui-gradient-brand-end)_/_0.12)] oui-px-1\"\n >\n <EffectiveFee />\n <Text.gradient\n className=\"oui-select-none\"\n color={\"brand\"}\n size=\"xs\"\n weight=\"regular\"\n >\n {t(\"common.effectiveFee\")}\n </Text.gradient>\n </Flex>\n </Tooltip>\n )}\n </Flex>\n </Box>\n );\n};\n\nexport const FeeTierHeader: React.FC<FeeTierHeaderProps> = (props) => {\n const { t } = useTranslation();\n const { tier, vol, headerDataAdapter } = props;\n const { isMobile } = useScreen();\n const { refereeRebate, ...others } = useFeeState();\n const isEffectiveFee = isEffective(refereeRebate);\n const items: FeeTierHeaderItemProps[] = [\n {\n label: t(\"portfolio.feeTier.header.yourTier\"),\n interactive: false,\n value: (\n <Text.gradient\n color={\"brand\"}\n angle={270}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {tier || \"--\"}\n </Text.gradient>\n ),\n },\n {\n label: `${t(\"portfolio.feeTier.header.30dVolume\")} (USDC)`,\n interactive: false,\n value: (\n <Text.numeral\n rule=\"price\"\n dp={2}\n rm={Decimal.ROUND_DOWN}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {vol !== undefined && vol !== null ? `${vol}` : \"-\"}\n </Text.numeral>\n ),\n },\n {\n label: t(\"portfolio.feeTier.header.takerFeeRate\"),\n interactive: isEffectiveFee,\n value: (\n <Text.gradient\n color={\"brand\"}\n angle={270}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {isEffectiveFee\n ? others.effectiveTakerFee || \"--\"\n : others.takerFee || \"--\"}\n </Text.gradient>\n ),\n },\n {\n label: t(\"portfolio.feeTier.header.makerFeeRate\"),\n interactive: isEffectiveFee,\n value: (\n <Text.gradient\n color={\"brand\"}\n angle={270}\n size={isMobile ? \"xs\" : \"base\"}\n >\n {isEffectiveFee\n ? others.effectiveMakerFee || \"--\"\n : others.makerFee || \"--\"}\n </Text.gradient>\n ),\n },\n ];\n\n const mergedData = useMemo<FeeTierHeaderItemProps[]>(() => {\n if (typeof headerDataAdapter === \"function\") {\n return headerDataAdapter(items);\n }\n return items;\n }, [headerDataAdapter, items]);\n\n if (!Array.isArray(mergedData)) {\n return null;\n }\n\n if (isMobile) {\n return (\n <Flex\n className=\"oui-rounded-xl oui-bg-base-9 oui-p-3\"\n direction=\"column\"\n gap={2}\n itemAlign={\"stretch\"}\n >\n {mergedData.map((item, index) => (\n <MobileHeaderItem {...item} key={`mobile-item-${index}`} />\n ))}\n </Flex>\n );\n }\n\n return (\n <Flex className=\"\" direction=\"row\" gapX={4} my={4} itemAlign={\"stretch\"}>\n {mergedData.map((item, index) => (\n <DesktopHeaderItem {...item} key={`desktop-item-${index}`} />\n ))}\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport {\n APIKeyItem,\n ScopeType,\n useAccount,\n useApiKeyManager,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext, useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { toast, usePagination } from \"@kodiak-finance/orderly-ui\";\n\nexport type GenerateKeyInfo = {\n key: string;\n screctKey: string;\n ip?: string;\n permissions?: string;\n};\n\nexport const useApiManagerScript = (props?: {\n filterTags?: [string];\n keyStatus?: string;\n}) => {\n const { filterTags, keyStatus } = props ?? {};\n const [showCreateDialog, setShowCreateDialog] = useState(false);\n const [showCreatedDialog, setShowCreatedDialog] = useState(false);\n const [generateKey, setGenerateKey] = useState<GenerateKeyInfo | undefined>();\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state, account } = useAccount();\n const { t } = useTranslation();\n\n const canCreateApiKey =\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n const [\n keys,\n {\n generateOrderlyKey,\n setIPRestriction,\n removeOrderlyKey,\n resetOrderlyKeyIPRestriction,\n refresh,\n isLoading,\n error,\n },\n ] = useApiKeyManager({\n keyInfo: { key_status: keyStatus },\n });\n\n const [curPubKey, setCurPubKey] = useState<string | undefined>(undefined);\n\n useEffect(() => {\n account.keyStore\n .getOrderlyKey()\n ?.getPublicKey()\n .then((pubKey) => {\n setCurPubKey(pubKey);\n });\n }, [account, state]);\n\n const onCreateApiKey = () => {\n setShowCreateDialog(true);\n };\n const onReadApiGuide = () => {\n window.open(\n \"https://orderly.network/docs/build-on-omnichain/evm-api/api-authentication#api-authentication\",\n \"_blank\",\n );\n };\n\n const hideCreateDialog = () => {\n setShowCreateDialog(false);\n };\n\n const doCreate = async (\n ipRestriction?: string,\n scope?: ScopeType,\n ): Promise<number> => {\n try {\n const createdSuccess = (\n res: {\n key: string;\n secretKey: string;\n },\n ip?: string,\n ) => {\n const { key, secretKey } = res;\n hideCreateDialog();\n setGenerateKey({\n key: key,\n screctKey: secretKey,\n ip: ip,\n permissions: scope\n ?.split(\",\")\n ?.map((e) => capitalizeFirstChar(e))\n .join(\", \"),\n });\n setShowCreatedDialog(true);\n };\n\n const generateKeyRes = await generateOrderlyKey(scope);\n\n toast.success(t(\"portfolio.apiKey.created\"));\n console.log(\"xxx generateKeyRes\", generateKeyRes);\n\n if ((ipRestriction?.length || 0) > 0) {\n const key = generateKeyRes.key.startsWith(\"ed25519:\")\n ? generateKeyRes.key\n : `ed25519:${generateKeyRes.key}`;\n const res = await setIPRestriction(key, ipRestriction!);\n console.log(\"set ip res\", res);\n if (res.success) {\n createdSuccess(\n generateKeyRes,\n res.data.ip_restriction_list?.join(\",\"),\n );\n }\n } else {\n createdSuccess(generateKeyRes, undefined);\n }\n } catch (err: any) {\n if (err?.message) toast.error(err?.message);\n }\n\n return Promise.resolve(0);\n };\n\n const hideCreatedDialog = () => {\n setShowCreatedDialog(false);\n refresh();\n };\n\n const onCopyApiKeyInfo = () => {\n navigator.clipboard.writeText(JSON.stringify(generateKey));\n toast.success(t(\"portfolio.apiKey.apiInfo.copied\"));\n };\n const doConfirm = () => {\n hideCreatedDialog();\n };\n\n const doDelete = (item: APIKeyItem): Promise<any> => {\n return new Promise(async (resolve) => {\n await removeOrderlyKey(item.orderly_key)\n .then(\n async (data) => {\n if (data?.success) {\n toast.success(t(\"portfolio.apiKey.deleted\"));\n refresh();\n // delete current api key, wiil disconnect\n const curKey = await account.keyStore\n .getOrderlyKey()\n ?.getPublicKey();\n if (item.orderly_key === curKey) {\n account.destroyOrderlyKey();\n }\n }\n resolve(1);\n },\n (reject) => {},\n )\n .catch((err) => {});\n });\n };\n\n const doEdit = async (item: APIKeyItem, ip?: string): Promise<void> => {\n let future;\n if ((ip?.length || 0) === 0) {\n future = resetOrderlyKeyIPRestriction(item.orderly_key, \"ALLOW_ALL_IPS\");\n } else {\n future = setIPRestriction(item.orderly_key, ip!);\n }\n\n const data = await future;\n\n if (data.success) {\n toast.success(t(\"portfolio.apiKey.updated\"));\n refresh();\n return Promise.resolve();\n } else {\n toast.error(data.message);\n }\n return Promise.reject();\n };\n\n const onCopyAccountId = () =>\n toast.success(t(\"portfolio.apiKey.accountId.copied\"));\n const onCopyApiKey = (key?: string) => {\n if (typeof key !== \"undefined\") {\n navigator.clipboard.writeText(key.replace(\"ed25519:\", \"\"));\n }\n toast.success(t(\"portfolio.apiKey.column.apiKey.copy\"));\n };\n const onCopyApiSecretKey = () =>\n toast.success(t(\"portfolio.apiKey.secretKey.copied\"));\n const onCopyIP = () =>\n toast.success(t(\"portfolio.apiKey.column.restrictedIP.copy\"));\n\n const keyList = useMemo(() => {\n return keys?.filter((e) => {\n const filterTag = filterTags ? filterTags?.includes(e.tag) : true;\n const filterCurKey = curPubKey\n ? !e.orderly_key.includes(curPubKey)\n : true;\n return filterTag && filterCurKey;\n });\n }, [keys, filterTags, curPubKey]);\n\n const verifyIP = (ip: string) => {\n const ipRegex =\n /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(,((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9]))*$/;\n return ipRegex.test(ip)\n ? \"\"\n : \"The IP restriction format is incorrect. Please use the correct format: [xx.xx.xxx.x],[xx.xxx.xxx.xxx]\";\n };\n\n const accountStatus =\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading;\n\n const accountId = useDataTap(state.accountId, {\n accountStatus,\n });\n\n const userId = useDataTap(state.userId, {\n accountStatus,\n });\n\n const { pagination } = usePagination();\n\n return {\n accountId: accountId ?? \"--\",\n userId: userId ?? \"--\",\n onCreateApiKey,\n onReadApiGuide,\n showCreateDialog,\n hideCreateDialog,\n doCreate,\n showCreatedDialog,\n hideCreatedDialog,\n onCopyApiKeyInfo,\n doConfirm,\n doDelete,\n doEdit,\n canCreateApiKey,\n status: state.status,\n keys: keyList,\n generateKey,\n onCopyAccountId,\n wrongNetwork,\n onCopyApiKey,\n onCopyApiSecretKey,\n onCopyIP,\n verifyIP,\n isLoading,\n pagination,\n };\n};\n\nexport function capitalizeFirstChar(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport type ApiManagerScriptReturns = ReturnType<typeof useApiManagerScript>;\n","import { FC, useEffect, useState } from \"react\";\nimport { ScopeType } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, SimpleDialog, Statistic, Text } from \"@kodiak-finance/orderly-ui\";\nimport { ApiManagerScriptReturns } from \"../apiManager.script\";\n\nexport const CreateAPIKeyDialog: FC<ApiManagerScriptReturns> = (props) => {\n const [ipText, setIpText] = useState(\"\");\n const [read, setRead] = useState(true);\n const [trade, setTrade] = useState(true);\n const [hint, setHint] = useState(\"\");\n const { t } = useTranslation();\n\n useEffect(() => {\n if (!props.showCreateDialog) {\n setIpText(\"\");\n setRead(true);\n setTrade(true);\n setHint(\"\");\n }\n }, [props.showCreateDialog]);\n\n useEffect(() => {\n if (ipText.length === 0) setHint(\"\");\n }, [ipText]);\n\n return (\n <SimpleDialog\n size=\"sm\"\n open={props.showCreateDialog}\n onOpenChange={(open) => {\n props.hideCreateDialog?.();\n }}\n title={t(\"portfolio.apiKey.create.dialog.title\")}\n actions={{\n primary: {\n label: t(\"common.confirm\"),\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n \"data-testid\": \"oui-testid-apiKey-createApiKey-dialog-comfirm-btn\",\n onClick: async () => {\n if (ipText.length > 0) {\n const hint = props.verifyIP(ipText);\n setHint(hint);\n if (hint.length > 0) {\n return;\n }\n }\n\n const scopes: string[] = [];\n if (read) {\n scopes.push(\"read\");\n }\n if (trade) {\n scopes.push(\"trading\");\n }\n await props.doCreate(ipText, scopes.join(\",\") as ScopeType);\n },\n disabled: !trade && !read,\n size: \"md\",\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n }}\n >\n <Flex direction={\"column\"} gap={6}>\n <Flex direction={\"column\"} gap={1} width={\"100%\"} itemAlign={\"start\"}>\n <Text intensity={54} size=\"2xs\">\n {t(\"portfolio.apiKey.create.ipRestriction\")}\n </Text>\n <textarea\n data-testid=\"oui-testid-apiKey-createApiKey-dialog-textarea\"\n placeholder={t(\"portfolio.apiKey.create.ipRestriction.placeholder\")}\n className={cn(\n \"oui-h-[100px] oui-w-full oui-rounded-xl oui-bg-base-6 oui-p-3 oui-text-sm oui-text-base-contrast-80\",\n \"oui-border-0 oui-outline-none focus:oui-border-2 focus:oui-border-primary-darken\",\n \"oui-placeholder-base-contrast-20\",\n hint.length > 0 &&\n \"oui-outline-1 oui-outline-danger focus:oui-outline-none\",\n )}\n value={ipText}\n onChange={(e) => {\n setIpText(e.target.value);\n }}\n style={{\n resize: \"none\",\n }}\n />\n {hint.length > 0 && (\n <Flex gap={1} className=\"oui-relative\">\n <div\n className={cn(\n \"oui-absolute oui-top-[10px]\",\n \"oui-size-1 oui-rounded-full oui-bg-danger\",\n )}\n />\n <Text color=\"danger\" size=\"xs\" className=\"oui-ml-2\">\n {hint}\n </Text>\n </Flex>\n )}\n </Flex>\n <Statistic\n label={\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.apiKey.permissions\")}\n </Text>\n }\n className=\"oui-w-full\"\n >\n <Flex\n direction={\"row\"}\n gap={6}\n itemAlign={\"start\"}\n className=\"oui-mt-2\"\n >\n <Checkbox\n size={18}\n checked={read}\n onCheckedChange={(e) => setRead(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.read\")}\n testid=\"oui-testid-apiKey-createApiKey-dialog-read-checkbox\"\n />\n <Checkbox\n size={18}\n checked={trade}\n onCheckedChange={(e) => setTrade(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.trading\")}\n testid=\"oui-testid-apiKey-createApiKey-dialog-trading-checkbox\"\n />\n </Flex>\n </Statistic>\n </Flex>\n </SimpleDialog>\n );\n};\n\nexport const Checkbox: FC<{\n size?: number;\n checked: boolean;\n onCheckedChange: (checked?: boolean) => void;\n disabled?: boolean;\n label: string;\n testid?: string;\n}> = (props) => {\n return (\n <button\n disabled={props.disabled}\n onClick={(e) => {\n props.onCheckedChange(!props.checked);\n }}\n className={\n \"oui-flex oui-items-center oui-gap-2 disabled:oui-cursor-not-allowed disabled:oui-opacity-50\"\n }\n data-testid={props.testid}\n >\n {props.checked ? (\n <svg\n width={\"props.size\"}\n height={props.size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M6.99072 2.92981C4.78172 2.92981 2.99072 4.72071 2.99072 6.92981V16.9298C2.99072 19.1389 4.78172 20.9298 6.99072 20.9298H16.9907C19.1997 20.9298 20.9907 19.1389 20.9907 16.9298V6.92981C20.9907 4.72071 19.1997 2.92981 16.9907 2.92981H6.99072ZM16.9853 7.31211C17.2125 7.09537 17.5236 7 17.8218 7C18.1201 7 18.4312 7.09537 18.6584 7.31211C19.1139 7.74546 19.1139 8.47384 18.6584 8.9072L10.5077 16.675C10.0534 17.1083 9.28909 17.1083 8.83472 16.675L5.34077 13.3459C4.88641 12.9126 4.88641 12.1841 5.34077 11.7508C5.79631 11.3175 6.56057 11.3175 7.01493 11.7508L9.67122 14.2822L16.9853 7.31211Z\"\n fill=\"white\"\n fillOpacity=\"0.54\"\n />\n </svg>\n ) : (\n <svg\n width={props.size}\n height={props.size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.99072 2.92981C4.78172 2.92981 2.99072 4.72071 2.99072 6.92981V16.9298C2.99072 19.1389 4.78172 20.9298 6.99072 20.9298H16.9907C19.1997 20.9298 20.9907 19.1389 20.9907 16.9298V6.92981C20.9907 4.72071 19.1997 2.92981 16.9907 2.92981H6.99072ZM6.99072 4.92981H16.9907C18.0957 4.92981 18.9907 5.82521 18.9907 6.92981V16.9298C18.9907 18.0344 18.0957 18.9298 16.9907 18.9298H6.99072C5.88572 18.9298 4.99072 18.0344 4.99072 16.9298V6.92981C4.99072 5.82521 5.88572 4.92981 6.99072 4.92981Z\"\n fill=\"white\"\n fillOpacity=\"0.54\"\n />\n </svg>\n )}\n\n <Text\n intensity={54}\n size=\"sm\"\n className=\"oui-whitespace-nowrap oui-break-normal\"\n >\n {props.label}\n </Text>\n </button>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n CopyIcon,\n Flex,\n SimpleDialog,\n Statistic,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ApiManagerScriptReturns } from \"../apiManager.script\";\n\nexport const CreatedAPIKeyDialog: FC<ApiManagerScriptReturns> = (props) => {\n const ip = props.generateKey?.ip ?? \"--\";\n const { t } = useTranslation();\n return (\n <SimpleDialog\n size=\"sm\"\n open={props.showCreatedDialog}\n onOpenChange={(open) => {\n props.hideCreatedDialog?.();\n }}\n title={t(\"portfolio.apiKey.created\")}\n actions={{\n primary: {\n label: t(\"common.ok\"),\n \"data-testid\": \"oui-testid-apiKey-createdApiKey-dialog-ok-btn\",\n className:\n \"oui-w-[120px] lg:oui-w-[154px] oui-bg-base-2 hover:oui-bg-base-3\",\n size: \"md\",\n onClick: async () => {\n return props.doConfirm();\n },\n },\n secondary: {\n label: t(\"portfolio.apiKey.created.button.copyApiInfo\"),\n \"data-testid\": \"oui-testid-apiKey-createdApiKey-dialog-copy-btn\",\n className:\n \"oui-w-[120px] lg:oui-w-[154px] oui-bg-primary-darken hover:oui-opacity-80\",\n size: \"md\",\n onClick: async () => {\n return props.onCopyApiKeyInfo();\n },\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n body: \"oui-py-0 oui-pt-5\",\n }}\n >\n <Flex direction={\"column\"} gap={4} itemAlign={\"start\"}>\n <Statistic label={t(\"common.accountId\")}>\n <Text.formatted\n size=\"sm\"\n intensity={80}\n copyable\n copyIconSize={16}\n className=\"oui-break-all\"\n onCopy={props.onCopyAccountId}\n data-testid=\"oui-testid-apiKey-createdApiKey-dialog-key-span\"\n >\n {props.accountId}\n </Text.formatted>\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.column.apiKey\")}>\n <Text.formatted\n size=\"sm\"\n intensity={80}\n copyable\n copyIconSize={16}\n className=\"oui-break-all\"\n onCopy={() => props.onCopyApiKey(props.generateKey?.key)}\n data-testid=\"oui-testid-apiKey-createdApiKey-dialog-key-span\"\n >\n {props.generateKey?.key}\n </Text.formatted>\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.secretKey\")}>\n <Text.formatted\n size=\"sm\"\n intensity={80}\n copyable\n copyIconSize={16}\n className=\"oui-break-all\"\n onCopy={props.onCopyApiSecretKey}\n >\n {props.generateKey?.screctKey}\n </Text.formatted>{\" \"}\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.ip\")}>\n <Flex\n width={320}\n gap={1}\n itemAlign={\"center\"}\n className=\"oui-text-base-contrast-80 oui-text-sm\"\n >\n <Box className=\"oui-max-h-[100px] oui-flex-1 oui-overflow-hidden oui-text-ellipsis oui-line-clamp-5 oui-break-all\">\n {ip}\n </Box>\n {ip !== \"--\" && (\n <Box\n width={16}\n height={16}\n className=\"oui-cursor-pointer oui-flex-shrink-0\"\n >\n <CopyIcon\n color=\"white\"\n opacity={0.54}\n size={16}\n onClick={(e) => {\n if (props.generateKey?.ip)\n navigator.clipboard.writeText(props.generateKey?.ip);\n props?.onCopyIP();\n }}\n />\n </Box>\n )}\n </Flex>\n </Statistic>\n <Statistic label={t(\"portfolio.apiKey.permissions\")}>\n <Text\n size=\"sm\"\n intensity={80}\n data-testid=\"oui-testid-apiKey-createdApiKey-dialog-permissions-span\"\n >\n {props.generateKey?.permissions}\n </Text>\n </Statistic>\n <div></div>\n <Text color=\"warning\" size=\"xs\" className=\"oui-text-center\">\n {t(\"portfolio.apiKey.created.warning\")}\n </Text>\n </Flex>\n </SimpleDialog>\n );\n};\n","import { FC } from \"react\";\nimport { Flex, SimpleDialog, Text } from \"@kodiak-finance/orderly-ui\";\nimport { APIKeyItem } from \"@kodiak-finance/orderly-hooks\";\nimport { formatKey } from \"../apiManager.ui\";\nimport { useTranslation, Trans } from \"@kodiak-finance/orderly-i18n\";\n\nexport const DeleteAPIKeyDialog: FC<{\n item: APIKeyItem;\n open: boolean;\n setOpen?: any;\n onDelete?: (item: APIKeyItem) => Promise<void>;\n}> = (props) => {\n const { item, open, setOpen, onDelete } = props;\n const { t } = useTranslation();\n return (\n <SimpleDialog\n size=\"sm\"\n open={open}\n onOpenChange={setOpen}\n title={t(\"portfolio.apiKey.delete.dialog.title\")}\n actions={{\n primary: {\n label: t(\"common.confirm\"),\n \"data-testid\": \"oui-testid-apiKey-deleteApiKey-dialog-confirm-btn\",\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n size: \"md\",\n onClick: async () => {\n await props.onDelete?.(item);\n setOpen(false);\n },\n },\n secondary: {\n label: t(\"common.cancel\"),\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n size: \"md\",\n onClick: async () => {\n setOpen(false);\n },\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n }}\n >\n <Flex className=\"oui-text-xs\">\n {/* @ts-ignore */}\n <Trans\n i18nKey=\"portfolio.apiKey.delete.dialog.description\"\n values={{ apiKey: formatKey(item?.orderly_key) }}\n components={[<Text color=\"primary\" className=\"oui-px-1\" />]}\n />\n </Flex>\n </SimpleDialog>\n );\n};\n","import { FC, useEffect, useState } from \"react\";\nimport { APIKeyItem } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, SimpleDialog, Statistic, Text } from \"@kodiak-finance/orderly-ui\";\nimport { Checkbox } from \"./createApiKey\";\n\nexport const EditAPIKeyDialog: FC<{\n item: APIKeyItem;\n open: boolean;\n setOpen?: any;\n onUpdate?: (item: APIKeyItem, ip?: string) => Promise<void>;\n verifyIP: (ip: string) => string;\n}> = (props) => {\n const { item, open, setOpen, onUpdate } = props;\n const [ipText, setIpText] = useState(item.ip_restriction_list?.join(\",\"));\n const [read, setRead] = useState(true);\n const [trade, setTrade] = useState(true);\n const [hint, setHint] = useState(\"\");\n const { t } = useTranslation();\n\n useEffect(() => {\n setIpText(item.ip_restriction_list.join(\",\"));\n const scope = item.scope?.toLocaleLowerCase() || \"\";\n\n setRead(scope.includes(\"read\"));\n setTrade(scope.includes(\"trading\"));\n }, [item]);\n\n useEffect(() => {\n if (ipText.length === 0) setHint(\"\");\n }, [ipText]);\n\n return (\n <SimpleDialog\n size=\"sm\"\n open={open}\n onOpenChange={setOpen}\n title={t(\"portfolio.apiKey.edit.dialog.title\")}\n actions={{\n primary: {\n label: t(\"common.confirm\"),\n \"data-testid\": \"oui-testid-apiKey-editApiKey-dialog-confirm-btn\",\n className: \"oui-w-[120px] lg:oui-w-[154px]\",\n onClick: async () => {\n if (ipText.length > 0) {\n const hint = props.verifyIP(ipText);\n setHint(hint);\n if (hint.length > 0) {\n return;\n }\n }\n await props.onUpdate?.(item, ipText);\n setOpen(false);\n },\n disabled: item.ip_restriction_list.join(\",\") === ipText,\n size: \"md\",\n fullWidth: true,\n },\n }}\n classNames={{\n footer: \"oui-justify-center\",\n content:\n \"oui-bg-base-8 oui-w-[300px] lg:oui-w-[360px] oui-font-semibold\",\n }}\n >\n <Flex direction={\"column\"} gap={6}>\n {/* <TextField label={\"IP restriction (optional)\"} rows={5} className=\"oui-w-full oui-h-auto\" classNames={{\n input: \"oui-h-[100px]\",\n root: \"oui-h-[100px]\"\n }}/> */}\n <Flex direction={\"column\"} gap={1} width={\"100%\"} itemAlign={\"start\"}>\n <Text intensity={54} size=\"2xs\">\n {t(\"portfolio.apiKey.create.ipRestriction\")}\n </Text>\n <textarea\n data-testid=\"oui-testid-apiKey-editApiKey-dialog-textarea\"\n placeholder={t(\"portfolio.apiKey.create.ipRestriction.placeholder\")}\n className={cn(\n \"oui-h-[100px] oui-w-full oui-rounded-xl oui-bg-base-6 oui-p-3 oui-text-sm oui-text-base-contrast-80\",\n \"oui-border-0 oui-outline-none focus:oui-border-2 focus:oui-border-primary-darken\",\n \"oui-placeholder-base-contrast-20\",\n hint.length > 0 &&\n \"oui-outline-1 oui-outline-danger focus:oui-outline-none\",\n )}\n value={ipText}\n onChange={(e) => {\n setIpText(e.target.value);\n }}\n style={{\n resize: \"none\",\n }}\n />\n {hint.length > 0 && (\n <Flex gap={1} className=\"oui-relative\">\n <div\n className={cn(\n \"oui-absolute oui-top-[10px]\",\n \"oui-size-1 oui-rounded-full oui-bg-danger\",\n )}\n />\n <Text color=\"danger\" size=\"xs\" className=\"oui-ml-2\">\n {hint}\n </Text>\n </Flex>\n )}\n </Flex>\n <Statistic\n label={\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.apiKey.permissions\")}\n </Text>\n }\n className=\"oui-w-full\"\n >\n <Flex\n direction={\"row\"}\n gap={6}\n itemAlign={\"start\"}\n className=\"oui-mt-2\"\n >\n <Checkbox\n disabled\n size={18}\n checked={read}\n onCheckedChange={(e) => setRead(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.read\")}\n />\n <Checkbox\n disabled\n size={18}\n checked={trade}\n onCheckedChange={(e) => setTrade(e as boolean)}\n label={t(\"portfolio.apiKey.permissions.trading\")}\n />\n </Flex>\n </Statistic>\n </Flex>\n </SimpleDialog>\n );\n};\n","import React, { useState } from \"react\";\nimport { APIKeyItem } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Button,\n Card,\n CopyIcon,\n Flex,\n PlusIcon,\n Column,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n AuthGuardEmpty,\n AuthGuardDataTable,\n AuthGuardTooltip,\n} from \"@kodiak-finance/orderly-ui-connector\";\nimport {\n type ApiManagerScriptReturns,\n capitalizeFirstChar,\n} from \"./apiManager.script\";\n\nconst LazyCreateAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/createApiKey\").then((mod) => {\n return { default: mod.CreateAPIKeyDialog };\n }),\n);\n\nconst LazyCreatedAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/createdApiKey\").then((mod) => {\n return { default: mod.CreatedAPIKeyDialog };\n }),\n);\n\nconst LazyDeleteAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/deleteApiKey\").then((mod) => {\n return { default: mod.DeleteAPIKeyDialog };\n }),\n);\n\nconst LazyEditAPIKeyDialog = React.lazy(() =>\n import(\"./dialog/editApiKey\").then((mod) => {\n return { default: mod.EditAPIKeyDialog };\n }),\n);\n\nexport const APIManager: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n return (\n <Card\n title={t(\"portfolio.apiKeys\")}\n id=\"portfolio-apikey-manager\"\n className=\"oui-bg-base-9 oui-font-semibold\"\n >\n <Flex\n direction={\"column\"}\n gap={4}\n width={\"100%\"}\n className=\"oui-font-semibold\"\n >\n <AccountInfo {...props} />\n <Subtitle {...props} />\n </Flex>\n <div>\n <KeyList {...props} />\n <React.Suspense fallback={null}>\n <LazyCreateAPIKeyDialog {...props} />\n </React.Suspense>\n <React.Suspense fallback={null}>\n <LazyCreatedAPIKeyDialog {...props} />\n </React.Suspense>\n </div>\n </Card>\n );\n};\n\nconst AccountInfo: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n width={\"100%\"}\n gap={4}\n className=\"oui-border-t-2 oui-border-line-6 oui-pt-4\"\n >\n <Flex\n py={2}\n px={4}\n direction={\"column\"}\n itemAlign={\"start\"}\n r=\"xl\"\n gradient=\"neutral\"\n angle={27}\n border\n className=\"oui-w-1/2\"\n >\n <Text size=\"xs\" intensity={36}>\n {t(\"common.accountId\")}\n </Text>\n <Text.formatted\n size=\"base\"\n inlist={80}\n rule={\"address\"}\n copyable={props.accountId !== \"--\"}\n copyIconSize={16}\n onCopy={props.onCopyAccountId}\n copyIconTestid=\"oui-testid-apiKey-accountInfo-accountId-copy-btn\"\n >\n {props.accountId}\n </Text.formatted>\n </Flex>\n <Flex\n py={2}\n px={4}\n direction={\"column\"}\n itemAlign={\"start\"}\n r=\"xl\"\n gradient=\"neutral\"\n angle={27}\n border\n className=\"oui-w-1/2\"\n >\n <Text size=\"xs\" intensity={36}>\n {t(\"portfolio.apiKey.uid\")}\n </Text>\n <Text size=\"base\" inlist={80}>\n {props.userId}\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nconst Subtitle: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n width={\"100%\"}\n direction={\"row\"}\n className=\"oui-text-sm oui-border-b-2 oui-border-line-6 oui-pb-4\"\n >\n <Flex direction={\"column\"} itemAlign={\"start\"} width={\"100%\"} gap={1}>\n <Text intensity={54}>{t(\"portfolio.apiKey.description\")}</Text>\n <Flex\n itemAlign={\"center\"}\n className=\"oui-text-primary-light oui-fill-primary-light hover:oui-text-primary-darken oui-cursor-pointer oui-text-2xs md:oui-text-xs xl:oui-text-sm\"\n onClick={props.onReadApiGuide}\n >\n <Text>{t(\"portfolio.apiKey.readApiGuide\")}</Text>\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M4.008 7.995c0-.368.298-.666.666-.666H9.71L7.733 5.331l.937-.936 3.143 3.122c.13.13.195.304.195.479a.67.67 0 0 1-.195.478L8.67 11.596l-.937-.937 1.978-1.998H4.674a.666.666 0 0 1-.666-.666\" />\n </svg>\n </Flex>\n </Flex>\n <AuthGuardTooltip\n side=\"top\"\n tooltip={{\n connectWallet: t(\"portfolio.apiKey.create.connectWallet.tooltip\"),\n signIn: t(\"portfolio.apiKey.create.createAccount.tooltip\"),\n enableTrading: t(\"portfolio.apiKey.create.enableTrading.tooltip\"),\n wrongNetwork: t(\"portfolio.apiKey.create.wrongNetwork.tooltip\"),\n }}\n >\n <Button\n size=\"md\"\n icon={<PlusIcon />}\n variant=\"contained\"\n color=\"primary\"\n onClick={props.onCreateApiKey}\n disabled={!props.canCreateApiKey}\n // className=\"disabled:oui-cursor-default\"\n data-testid=\"oui-testid-apiKey-createApiKey-btn\"\n >\n {t(\"portfolio.apiKey.create.dialog.title\")}\n </Button>\n </AuthGuardTooltip>\n </Flex>\n );\n};\n\nconst KeyList: React.FC<ApiManagerScriptReturns> = (props) => {\n const { t } = useTranslation();\n const columns: Column<APIKeyItem>[] = [\n {\n title: t(\"portfolio.apiKey.column.apiKey\"),\n dataIndex: \"orderly_key\",\n render: (value) => {\n return (\n <Text.formatted\n rule={\"\"}\n copyable\n copyIconSize={16}\n onCopy={() => {\n props.onCopyApiKey?.(value);\n }}\n >\n {formatKey(value)}\n </Text.formatted>\n );\n },\n },\n {\n title: t(\"portfolio.apiKey.column.permissionType\"),\n dataIndex: \"scope\",\n render: (value) =>\n value\n ?.split(\",\")\n .map((e: any) => capitalizeFirstChar(`${e}`))\n .join(\", \"),\n },\n {\n title: t(\"portfolio.apiKey.column.restrictedIP\"),\n dataIndex: \"ip_restriction_list\",\n render: (value) => {\n let ip = value.join(\",\");\n if (ip.length === 0) {\n ip = \"--\";\n }\n return (\n <Tooltip content={ip} className=\"oui-max-w-[200px] oui-break-all\">\n <Flex gap={1}>\n <div className=\" oui-overflow-ellipsis oui-overflow-hidden\">\n {ip}\n </div>\n {ip !== \"--\" && (\n <Box width={16} height={16} className=\"oui-cursor-pointer\">\n <CopyIcon\n color=\"white\"\n opacity={0.54}\n size={16}\n onClick={(e) => {\n navigator.clipboard.writeText(ip);\n props?.onCopyIP();\n }}\n />\n </Box>\n )}\n </Flex>\n </Tooltip>\n );\n },\n },\n {\n title: t(\"portfolio.apiKey.column.expirationDate\"),\n dataIndex: \"expiration\",\n render: (value) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd\">\n {value}\n </Text.formatted>\n ),\n },\n {\n title: \"\",\n type: \"action\",\n dataIndex: \"action\",\n width: 120,\n render: (_, item) => {\n return (\n <Flex direction={\"row\"} gap={2}>\n <EditButton\n item={item}\n onUpdate={props.doEdit}\n verifyIP={props.verifyIP}\n />\n <DeleteButton item={item} onDelete={props.doDelete} />\n </Flex>\n );\n },\n },\n ];\n return (\n <AuthGuardDataTable\n bordered\n columns={columns}\n loading={props.isLoading}\n dataSource={props.keys}\n emptyView={<AuthGuardEmpty />}\n classNames={{}}\n pagination={props.pagination}\n manualPagination={false}\n />\n );\n};\n\nconst EditButton: React.FC<{\n item: APIKeyItem;\n onUpdate: (item: APIKeyItem, ip?: string) => Promise<void>;\n verifyIP: (ip: string) => string;\n}> = (props) => {\n const { item, onUpdate, verifyIP } = props;\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n\n return (\n <>\n <Button\n size=\"xs\"\n color=\"primary\"\n variant=\"contained\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n data-testid=\"oui-testid-apiKey-keyList-edit-btn\"\n >\n {t(\"common.edit\")}\n </Button>\n {open && (\n <React.Suspense fallback={null}>\n <LazyEditAPIKeyDialog\n item={item}\n open={open}\n setOpen={setOpen}\n onUpdate={onUpdate}\n verifyIP={verifyIP}\n />\n </React.Suspense>\n )}\n </>\n );\n};\n\nconst DeleteButton: React.FC<{\n item: APIKeyItem;\n onDelete: (item: APIKeyItem) => Promise<void>;\n}> = (props) => {\n const { item, onDelete } = props;\n const [open, setOpen] = useState(false);\n const { t } = useTranslation();\n return (\n <>\n <Button\n size=\"xs\"\n color=\"gray\"\n variant=\"contained\"\n onClick={(e) => {\n e.stopPropagation();\n setOpen(true);\n }}\n data-testid=\"oui-testid-apiKey-keyList-delete-btn\"\n >\n {t(\"common.delete\")}\n </Button>\n {open && (\n <React.Suspense fallback={null}>\n <LazyDeleteAPIKeyDialog\n item={item}\n open={open}\n setOpen={setOpen}\n onDelete={onDelete}\n />\n </React.Suspense>\n )}\n </>\n );\n};\n\nexport function formatKey(value: string): string {\n if (typeof value === \"undefined\") {\n return \"-\";\n }\n const key = `${value}`.replace(\"ed25519:\", \"\").slice(0, 6);\n return `${key}*****`;\n}\n","import { FC, PropsWithChildren } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { usePortfolioLayoutScript } from \"./layout.script\";\nimport { PortfolioLayout, PortfolioLayoutProps } from \"./layout.ui\";\nimport { PortfolioLayoutMobile } from \"./layout.ui.mobile\";\n\nexport type PortfolioLayoutWidgetProps = PortfolioLayoutProps;\n\nexport const PortfolioLayoutWidget: FC<\n PropsWithChildren<PortfolioLayoutWidgetProps>\n> = (props) => {\n const state = usePortfolioLayoutScript({\n current: props.leftSideProps?.current,\n });\n const { isMobile } = useScreen();\n\n return (\n <>\n {isMobile ? (\n // @ts-ignore\n <PortfolioLayoutMobile {...state} {...props} />\n ) : (\n <PortfolioLayout {...state} {...props} />\n )}\n </>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMediaQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n SideMenuItem,\n useScaffoldContext,\n} from \"@kodiak-finance/orderly-ui-scaffold\";\n\nexport enum PortfolioLeftSidebarPath {\n Overview = \"/portfolio\",\n Positions = \"/portfolio/positions\",\n Orders = \"/portfolio/orders\",\n Assets = \"/portfolio/assets\",\n FeeTier = \"/portfolio/feeTier\",\n ApiKey = \"/portfolio/apiKey\",\n Setting = \"/portfolio/setting\",\n History = \"/portfolio/history\",\n SymbolPerformance = \"/portfolio/symbol-performance\",\n}\n\nexport type UseLayoutBuilderOptions = {\n current?: string;\n};\n\nexport const usePortfolioLayoutScript = (props: UseLayoutBuilderOptions) => {\n const { routerAdapter } = useScaffoldContext();\n const [current, setCurrent] = useState(\n props.current ?? routerAdapter?.currentPath ?? \"/portfolio\",\n );\n const { t } = useTranslation();\n\n useEffect(() => {\n if (props.current || routerAdapter?.currentPath) {\n setCurrent(props.current || routerAdapter?.currentPath || \"/portfolio\");\n }\n }, [props.current, routerAdapter?.currentPath]);\n\n const items = useMemo(() => {\n return [\n {\n name: t(\"common.overview\"),\n href: PortfolioLeftSidebarPath.Overview,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.24316 2.19727C3.58641 2.19727 2.24316 3.54044 2.24316 5.19727V12.6973C2.24316 14.3541 3.58641 15.6973 5.24316 15.6973H12.7432C14.3999 15.6973 15.7432 14.3541 15.7432 12.6973V5.19727C15.7432 3.54044 14.3999 2.19727 12.7432 2.19727H5.24316ZM5.24316 3.69727H12.7432C13.5719 3.69727 14.2432 4.36882 14.2432 5.19727V12.6973C14.2432 13.2484 13.9319 13.734 13.4894 13.9947C13.3454 12.2235 11.4427 11.1973 8.99316 11.1973C6.54366 11.1973 4.60341 12.251 4.48566 13.9997C4.04241 13.739 3.74316 13.2484 3.74316 12.6973V5.19727C3.74316 4.36882 4.41441 3.69727 5.24316 3.69727ZM8.99316 5.19727C7.54341 5.19727 6.36816 6.37252 6.36816 7.82227C6.36816 9.27202 7.54341 10.4473 8.99316 10.4473C10.4429 10.4473 11.6182 9.27202 11.6182 7.82227C11.6182 6.37252 10.4429 5.19727 8.99316 5.19727Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"common.positions\"),\n href: PortfolioLeftSidebarPath.Positions,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M4.51 3.021a3 3 0 0 0-3 3v6a3 3 0 0 0 3 3h9a3 3 0 0 0 3-3v-6a3 3 0 0 0-3-3zm2.25 3a.76.76 0 0 1 .54.211.77.77 0 0 1 0 1.078l-.75.75a.77.77 0 0 1-.54.211h-.75a.75.75 0 0 1 0-1.5h.422l.54-.539a.76.76 0 0 1 .539-.21m3 .75h3a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5m-3 2.25a.76.76 0 0 1 .54.211.77.77 0 0 1 0 1.079l-.75.75a.77.77 0 0 1-.54.21h-.75a.75.75 0 0 1 0-1.5h.422l.54-.539a.76.76 0 0 1 .539-.21m3 .75h3a.75.75 0 0 1 0 1.5h-3a.75.75 0 0 1 0-1.5\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"common.orders\"),\n href: PortfolioLeftSidebarPath.Orders,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.693 1.5C4.229 1.5 3.02 2.61 3.02 4.006v9.984c0 1.398 1.208 2.508 2.672 2.508h6.657c1.463 0 2.671-1.11 2.671-2.508V6.726c0-2.672-2.579-5.227-5.25-5.227zm4.828 1.593c1.33.352 2.562 1.58 2.906 2.906h-1.734c-.667 0-1.172-.472-1.172-1.008zm-3.75 2.906h.75a.75.75 0 0 1 0 1.5h-.75a.75.75 0 0 1 0-1.5m0 3h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5m0 3h4.5a.75.75 0 0 1 0 1.5h-4.5a.75.75 0 0 1 0-1.5\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"common.assets\"),\n href: PortfolioLeftSidebarPath.Assets,\n icon: (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n >\n <path\n d=\"M9 1.5C4.85 1.5 1.5 4.85 1.5 9C1.5 13.15 4.85 16.5 9 16.5C13.15 16.5 16.5 13.15 16.5 9C16.5 4.85 13.15 1.5 9 1.5ZM8.17529 3.75H9.67529V4.94971L10.125 5.17529C10.35 5.32529 10.5756 5.47471 10.7256 5.69971C10.8756 5.92471 11.0256 6.14971 11.1006 6.44971C11.1756 6.74971 11.25 7.05029 11.25 7.42529H9.82471C9.82471 6.97529 9.75059 6.67471 9.60059 6.44971C9.45059 6.22471 9.3 6.14941 9 6.14941C8.85 6.14941 8.7 6.15059 8.625 6.22559L8.39941 6.44971C8.32441 6.52471 8.325 6.675 8.25 6.75C8.175 6.825 8.17529 6.975 8.17529 7.125C8.17529 7.275 8.25 7.35 8.25 7.5C8.25 7.65 8.32441 7.72529 8.39941 7.80029C8.47441 7.95029 8.54971 8.02559 8.69971 8.10059C8.77471 8.17559 8.92441 8.24971 9.14941 8.32471C9.44941 8.47471 9.75059 8.62441 9.97559 8.77441C10.2756 8.92441 10.4994 9.07529 10.6494 9.30029C10.8744 9.52529 11.0256 9.75059 11.1006 9.97559C11.1756 10.2006 11.25 10.5 11.25 10.875C11.25 11.25 11.1756 11.5494 11.1006 11.7744C11.0256 12.0744 10.8756 12.2247 10.7256 12.4497C10.5756 12.5997 10.35 12.7494 10.125 12.8994C9.975 12.9744 9.9 13.0503 9.75 13.0503V14.25H8.25V12.9756C8.1 12.9006 7.95029 12.8997 7.80029 12.8247C7.50029 12.7497 7.35 12.6 7.125 12.375C6.975 12.225 6.82529 11.925 6.67529 11.625C6.60029 11.25 6.52441 10.8753 6.52441 10.4253H8.02441C8.02441 10.6503 8.02559 10.8756 8.10059 11.1006C8.17559 11.3256 8.24971 11.4753 8.32471 11.5503C8.39971 11.6253 8.475 11.6994 8.625 11.7744C8.775 11.8494 8.85 11.8506 9 11.8506C9.15 11.8506 9.225 11.8494 9.375 11.7744C9.525 11.6994 9.60029 11.6253 9.67529 11.5503C9.75029 11.4753 9.74971 11.4 9.82471 11.25C9.89971 11.175 9.89941 11.025 9.89941 10.875C9.89941 10.725 9.82471 10.575 9.82471 10.5C9.82471 10.425 9.75029 10.2747 9.67529 10.1997C9.60029 10.0497 9.525 9.97441 9.375 9.89941L8.92529 9.67529C8.62529 9.52529 8.32559 9.37559 8.10059 9.22559C7.80059 9.07559 7.57529 8.92471 7.42529 8.69971C7.20029 8.54971 7.05059 8.32441 6.97559 8.02441C6.90059 7.79941 6.82471 7.5 6.82471 7.125C6.82471 6.825 6.82441 6.52529 6.89941 6.30029C7.04941 6.07529 7.12559 5.85 7.35059 5.625C7.50059 5.4 7.65029 5.25029 7.80029 5.17529C7.95029 5.10029 8.02529 5.02441 8.17529 5.02441V3.75Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.feeTier\"),\n href: PortfolioLeftSidebarPath.FeeTier,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5.99829 1.51062C4.34154 1.51062 2.99829 2.85387 2.99829 4.51062V13.5106C2.99829 15.1674 4.34154 16.5106 5.99829 16.5106H11.9983C13.655 16.5106 14.9983 15.1674 14.9983 13.5106V4.51062C14.9983 2.85387 13.655 1.51062 11.9983 1.51062H5.99829ZM5.99829 3.76062H11.9983C12.4123 3.76062 12.7483 4.09662 12.7483 4.51062V6.01062C12.7483 6.42462 12.4123 6.76062 11.9983 6.76062H5.99829C5.58429 6.76062 5.24829 6.42462 5.24829 6.01062V4.51062C5.24829 4.09662 5.58429 3.76062 5.99829 3.76062ZM5.99829 8.26062C6.41229 8.26062 6.74829 8.59662 6.74829 9.01062C6.74829 9.42462 6.41229 9.76062 5.99829 9.76062C5.58429 9.76062 5.24829 9.42462 5.24829 9.01062C5.24829 8.59662 5.58429 8.26062 5.99829 8.26062ZM8.99829 8.26062C9.41229 8.26062 9.74829 8.59662 9.74829 9.01062C9.74829 9.42462 9.41229 9.76062 8.99829 9.76062C8.58429 9.76062 8.24829 9.42462 8.24829 9.01062C8.24829 8.59662 8.58429 8.26062 8.99829 8.26062ZM11.9983 8.26062C12.4123 8.26062 12.7483 8.59662 12.7483 9.01062C12.7483 9.42462 12.4123 9.76062 11.9983 9.76062C11.5843 9.76062 11.2483 9.42462 11.2483 9.01062C11.2483 8.59662 11.5843 8.26062 11.9983 8.26062ZM5.99829 10.5106C6.41229 10.5106 6.74829 10.8466 6.74829 11.2606C6.74829 11.6746 6.41229 12.0106 5.99829 12.0106C5.58429 12.0106 5.24829 11.6746 5.24829 11.2606C5.24829 10.8466 5.58429 10.5106 5.99829 10.5106ZM8.99829 10.5106C9.41229 10.5106 9.74829 10.8466 9.74829 11.2606C9.74829 11.6746 9.41229 12.0106 8.99829 12.0106C8.58429 12.0106 8.24829 11.6746 8.24829 11.2606C8.24829 10.8466 8.58429 10.5106 8.99829 10.5106ZM11.9983 10.5106C12.4123 10.5106 12.7483 10.8466 12.7483 11.2606V13.5106C12.7483 13.9246 12.4123 14.2606 11.9983 14.2606C11.5843 14.2606 11.2483 13.9246 11.2483 13.5106V11.2606C11.2483 10.8466 11.5843 10.5106 11.9983 10.5106ZM5.99829 12.7606C6.41229 12.7606 6.74829 13.0966 6.74829 13.5106C6.74829 13.9246 6.41229 14.2606 5.99829 14.2606C5.58429 14.2606 5.24829 13.9246 5.24829 13.5106C5.24829 13.0966 5.58429 12.7606 5.99829 12.7606ZM8.99829 12.7606C9.41229 12.7606 9.74829 13.0966 9.74829 13.5106C9.74829 13.9246 9.41229 14.2606 8.99829 14.2606C8.58429 14.2606 8.24829 13.9246 8.24829 13.5106C8.24829 13.0966 8.58429 12.7606 8.99829 12.7606Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.apiKeys\"),\n href: PortfolioLeftSidebarPath.ApiKey,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.02124 1.49915C7.77849 1.49915 6.77124 2.5064 6.77124 3.74915C6.77124 4.70015 7.40049 5.55517 8.26974 5.86942L8.27124 8.24915H5.27124C4.85724 8.24915 4.52124 8.58515 4.52124 8.99915L4.52048 12.1304C3.65723 12.4274 3.02124 13.2981 3.02124 14.2491C3.02124 15.4919 4.02849 16.4991 5.27124 16.4991C6.51399 16.4991 7.52124 15.4919 7.52124 14.2491C7.52124 13.2981 6.92499 12.4596 6.02949 12.1206L6.02124 9.74915H9.02124H12.0212L12.0265 12.1319C11.1257 12.4446 10.5212 13.2981 10.5212 14.2491C10.5212 15.4919 11.5285 16.4991 12.7712 16.4991C14.014 16.4991 15.0212 15.4919 15.0212 14.2491C15.0212 13.2981 14.407 12.4611 13.5272 12.1281L13.5212 8.99915C13.5212 8.58515 13.1852 8.24915 12.7712 8.24915H9.77124L9.76899 5.86639C10.642 5.55814 11.2712 4.70015 11.2712 3.74915C11.2712 2.5064 10.264 1.49915 9.02124 1.49915Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.symbolPerformance\"),\n href: PortfolioLeftSidebarPath.SymbolPerformance,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M13.5 3.75C12.8096 3.75 12.375 4.18467 12.375 4.875V12.375C12.375 13.0654 12.8096 13.5 13.5 13.5H14.625C15.3154 13.5 15.75 13.0654 15.75 12.375V4.875C15.75 4.18467 15.3154 3.75 14.625 3.75H13.5ZM13.5 5.25H14.625V12.375H13.5V5.25ZM8.25 6.75C7.55964 6.75 7.125 7.18467 7.125 7.875V12.375C7.125 13.0654 7.55964 13.5 8.25 13.5H9.375C10.0654 13.5 10.5 13.0654 10.5 12.375V7.875C10.5 7.18467 10.0654 6.75 9.375 6.75H8.25ZM8.25 8.25H9.375V12.375H8.25V8.25ZM3 9.75C2.30964 9.75 1.875 10.1847 1.875 10.875V12.375C1.875 13.0654 2.30964 13.5 3 13.5H4.125C4.81536 13.5 5.25 13.0654 5.25 12.375V10.875C5.25 10.1847 4.81536 9.75 4.125 9.75H3ZM3 11.25H4.125V12.375H3V11.25Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"portfolio.setting\"),\n href: PortfolioLeftSidebarPath.Setting,\n icon: (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6.72601 1.84159C5.66251 2.17834 4.74527 2.7296 3.93677 3.48185C3.68702 3.7151 3.61052 4.09534 3.77252 4.39609C4.37327 5.50684 3.74476 6.69484 2.39026 6.76309C2.05801 6.78034 1.76477 7.02559 1.68677 7.34884C1.55252 7.90759 1.49927 8.37559 1.49927 8.98984C1.49927 9.50509 1.55476 10.0878 1.66351 10.6068C1.73101 10.9308 2.01302 11.1641 2.34302 11.1933C3.70652 11.3111 4.38152 12.3506 3.77252 13.6773C3.63752 13.9721 3.69902 14.3246 3.93677 14.5443C4.73327 15.2816 5.64826 15.8006 6.72601 16.1381C7.03351 16.2348 7.38076 16.1186 7.56976 15.8568C8.40376 14.7033 9.61352 14.6988 10.4055 15.8568C10.5923 16.1298 10.9343 16.2611 11.2493 16.1613C12.2895 15.8343 13.2585 15.2771 14.0618 14.5443C14.3093 14.3193 14.3745 13.9541 14.226 13.6541C13.602 12.3948 14.3198 11.2383 15.6083 11.2166C15.9503 11.2106 16.2548 10.9856 16.335 10.6541C16.4648 10.1163 16.4993 9.64759 16.4993 8.98984C16.4993 8.42434 16.4325 7.86709 16.3118 7.32559C16.2353 6.98359 15.936 6.74059 15.585 6.73984C14.3168 6.73759 13.6058 5.49109 14.226 4.39609C14.3985 4.09084 14.3445 3.71735 14.085 3.48185C13.2675 2.73935 12.2708 2.15959 11.226 1.84159C10.905 1.74409 10.5638 1.86409 10.3823 2.14609C9.65776 3.27109 8.30477 3.29135 7.59302 2.16935C7.41077 1.8821 7.05001 1.73809 6.72601 1.84159ZM8.99927 5.98984C10.656 5.98984 11.9993 7.33309 11.9993 8.98984C11.9993 10.6466 10.656 11.9898 8.99927 11.9898C7.34252 11.9898 5.99927 10.6466 5.99927 8.98984C5.99927 7.33309 7.34252 5.98984 8.99927 5.98984Z\"\n className=\"oui-fill-current group-data-[actived=true]:oui-fill-[url(#side-menu-gradient)]\"\n />\n </svg>\n ),\n },\n {\n name: t(\"trading.history\"),\n href: PortfolioLeftSidebarPath.History,\n hide: true,\n },\n ];\n }, [t]);\n\n const hideSideBar = useMediaQuery(\"(max-width: 768px)\");\n\n return {\n items,\n current,\n hideSideBar,\n onItemSelect: (item: SideMenuItem) => {\n if (typeof item.href === \"undefined\") {\n console.warn(\"Item href is not defined\");\n return;\n }\n setCurrent(item.href!);\n routerAdapter?.onRouteChange({\n href: item.href,\n name: item.name,\n });\n },\n };\n};\n\nexport const useCustomSidebarHook = () => {\n const { expanded, setExpand } = useScaffoldContext();\n\n return {\n open: expanded,\n onOpenChange: (open: boolean) => {\n setExpand(open);\n },\n };\n};\n\nexport type usePortfolioLayoutScriptType = ReturnType<\n typeof usePortfolioLayoutScript\n>;\n","import { FC, PropsWithChildren } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn } from \"@kodiak-finance/orderly-ui\";\nimport {\n ScaffoldProps,\n RouterAdapter,\n Scaffold,\n SideBar,\n SideBarProps,\n useScaffoldContext,\n} from \"@kodiak-finance/orderly-ui-scaffold\";\n\nexport type PortfolioLayoutProps = ScaffoldProps & {\n hideSideBar?: boolean;\n items?: SideBarProps[\"items\"];\n};\n\nexport const PortfolioLayout: FC<PropsWithChildren<PortfolioLayoutProps>> = (\n props,\n) => {\n const { children, leftSideProps, classNames, ...rest } = props;\n\n return (\n <Scaffold\n leftSidebar={\n props.hideSideBar ? null : (\n <LeftSidebar\n current={props.routerAdapter?.currentPath}\n routerAdapter={props.routerAdapter}\n items={props.items}\n {...leftSideProps}\n />\n )\n }\n routerAdapter={props.routerAdapter}\n classNames={{\n ...classNames,\n content: cn(\"oui-my-6 oui-px-3\", classNames?.content),\n topNavbar: cn(\"oui-bg-base-9\", classNames?.topNavbar),\n leftSidebar: cn(\n \"oui-rounded-xl oui-bg-base-9\",\n \"oui-m-3 oui-p-4\",\n \"oui-border oui-border-line\",\n classNames?.leftSidebar,\n ),\n }}\n {...rest}\n >\n {children}\n </Scaffold>\n );\n};\n\ntype LeftSidebarProps = SideBarProps & {\n routerAdapter?: RouterAdapter;\n};\n\nconst LeftSidebar: FC<LeftSidebarProps> = (props) => {\n const { expanded, setExpand } = useScaffoldContext();\n const { t } = useTranslation();\n return (\n <SideBar\n title={t(\"common.portfolio\")}\n {...props}\n open={expanded}\n onOpenChange={(open) => setExpand(open)}\n onItemSelect={(e) => {\n props.onItemSelect?.(e);\n props.routerAdapter?.onRouteChange?.({\n href: e.href || \"\",\n name: e.name,\n });\n }}\n />\n );\n};\n","import { FC, PropsWithChildren } from \"react\";\nimport { Flex, Box } from \"@kodiak-finance/orderly-ui\";\nimport {\n MainNavMobile,\n BottomNav,\n type ScaffoldProps,\n} from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { LayoutProvider } from \"./context\";\nimport { usePortfolioLayoutScriptType } from \"./layout.script\";\n\nexport const PortfolioLayoutMobile: FC<\n PropsWithChildren<\n ScaffoldProps & usePortfolioLayoutScriptType & { current?: string }\n >\n> = (props) => {\n return (\n <LayoutProvider {...props}>\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n height={\"100%\"}\n className=\"oui-h-full-screen oui-bg-base-10\"\n >\n <header className=\"oui-scaffold-topNavbar oui-sticky oui-top-0 oui-z-10 oui-w-full oui-bg-base-10\">\n <MainNavMobile\n {...props.mainNavProps}\n current={props?.current}\n subItems={props?.items}\n routerAdapter={props.routerAdapter}\n />\n </header>\n <Box className=\"oui-scaffold-container oui-min-h-[calc(100vh-44px-64px-env(safe-area-inset-bottom))] oui-w-full\">\n {props.children}\n </Box>\n <footer className=\"oui-scaffold-bottomNav oui-fixed oui-bottom-0 oui-z-10 oui-w-full oui-bg-base-9 oui-pb-[calc(env(safe-area-inset-bottom))]\">\n <BottomNav\n mainMenus={props.bottomNavProps?.mainMenus}\n current={props?.current}\n onRouteChange={props.routerAdapter?.onRouteChange}\n />\n </footer>\n </Flex>\n </LayoutProvider>\n );\n};\n","import React, { createContext, useContext, useState, useMemo } from \"react\";\nimport type { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\n\ntype LayoutContextValue = {\n sideOpen: boolean;\n onSideOpenChange: (open: boolean) => void;\n routerAdapter?: RouterAdapter;\n};\n\nconst LayoutContext = createContext<LayoutContextValue>({\n sideOpen: true,\n} as LayoutContextValue);\n\nexport const useLayoutContext = () => {\n return useContext(LayoutContext);\n};\n\nexport const LayoutProvider: React.FC<\n React.PropsWithChildren<{ routerAdapter?: RouterAdapter }>\n> = (props) => {\n const { routerAdapter, children } = props;\n const [sideOpen, setSideOpen] = useState(true);\n const memoizedValue = useMemo<LayoutContextValue>(\n () => ({\n sideOpen: sideOpen,\n onSideOpenChange: setSideOpen,\n routerAdapter: routerAdapter,\n }),\n [sideOpen, setSideOpen, routerAdapter],\n );\n return (\n <LayoutContext.Provider value={memoizedValue}>\n {children}\n </LayoutContext.Provider>\n );\n};\n","export { AssetWidget, AssetsUI } from \"./assets\";\nexport { HistoryDataGroupWidget } from \"./historyDataGroup\";\n\nexport * from \"./assetChart\";\nexport * from \"./assetHistory\";\n\nexport {\n PerformanceUI,\n PerformanceWidget,\n usePerformanceScript,\n} from \"./performance\";\n\nexport * from \"./performanceMobileDialog\";\n\nexport {\n FundingHistoryWidget,\n useFundingHistoryColumns,\n useFundingHistoryHook,\n} from \"./funding\";\n\nexport {\n DistributionHistoryWidget,\n DistributionHistoryMobile,\n DistributionHistoryDesktop,\n} from \"./distribution\";\n\nexport { OverviewPage } from \"./main\";\n\nexport { OverviewProvider } from \"./provider/overviewProvider\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from \"react\";\nimport {\n AssetLineChart,\n PnlAreaChart,\n PnLBarChart,\n VolBarChart,\n PnlLineChartProps,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Tabs,\n TabPanel,\n Flex,\n Text,\n DataFilter,\n Box,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { UsePerformanceScriptReturn } from \"../performance/performance.script\";\nimport {\n PeriodType,\n useAssetsHistoryDataReturn,\n} from \"../shared/useAssetHistory\";\n\nconst responsiveProps: PnlLineChartProps[\"responsiveContainerProps\"] = {\n width: \"100%\",\n minHeight: 144,\n aspect: 2.5,\n};\n\nexport const PerformanceMobileUI: React.FC<\n Pick<\n useAssetsHistoryDataReturn & UsePerformanceScriptReturn,\n | \"data\"\n | \"curPeriod\"\n | \"aggregateValue\"\n | \"onPeriodChange\"\n | \"invisible\"\n | \"visible\"\n | \"createFakeData\"\n | \"period\"\n | \"filterItems\"\n | \"onFilter\"\n >\n> = (props) => {\n const { t } = useTranslation();\n const {\n data,\n aggregateValue,\n visible,\n invisible,\n curPeriod,\n period,\n onPeriodChange,\n createFakeData,\n filterItems,\n onFilter,\n } = props;\n\n const mergedData = data.length\n ? data\n : (createFakeData?.(\n { account_value: 0, pnl: 0 },\n { account_value: 500, pnl: 500 },\n ) as any[]);\n\n return (\n <div>\n {filterItems && filterItems.length > 0 && (\n <Box mb={4}>\n <DataFilter\n items={filterItems}\n onFilter={onFilter || (() => {})}\n className=\"oui-border-none oui-py-0\"\n />\n </Box>\n )}\n <Tabs\n value={period || \"\"}\n defaultValue={PeriodType.MONTH}\n classNames={{ tabsList: \"oui-justify-between\", trigger: \"oui-w-1/4\" }}\n onValueChange={(value) => onPeriodChange(value as PeriodType)}\n >\n <TabPanel\n title={t(\"common.select.1d\")}\n value={PeriodType.DAY}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n title={t(\"common.select.7d\")}\n value={PeriodType.WEEK}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n title={t(\"common.select.30d\")}\n value={PeriodType.MONTH}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n title={t(\"common.select.90d\")}\n value={PeriodType.QUARTER}\n className=\"oui-min-h-40\"\n >\n <AssetLineChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n </Tabs>\n <Flex justify=\"between\" itemAlign=\"center\" gap={2} my={4}>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.overview.performance.roi\", { period: curPeriod })}\n </Text>\n <Text.numeral size=\"sm\" visible={visible} rule=\"percentages\" coloring>\n {invisible ? \"--\" : aggregateValue.roi}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.overview.performance.pnl\", { period: curPeriod })}\n </Text>\n <Text.numeral size=\"sm\" visible={visible} coloring showIdentifier>\n {invisible ? \"--\" : aggregateValue.pnl}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.overview.performance.volume\", { period: curPeriod })}\n </Text>\n <Text.numeral size=\"sm\" visible={visible} coloring={false}>\n {invisible ? \"--\" : aggregateValue.vol}\n </Text.numeral>\n </Flex>\n </Flex>\n <Tabs defaultValue={\"dailyPnl\"}>\n <TabPanel\n value={\"dailyPnl\"}\n title={t(\"portfolio.overview.performance.dailyPnl\")}\n className=\"oui-min-h-40\"\n >\n <PnLBarChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n value={\"cumulativePnl\"}\n title={t(\"portfolio.overview.performance.cumulativePnl\")}\n className=\"oui-min-h-40\"\n >\n <PnlAreaChart\n data={mergedData}\n invisible={invisible || (mergedData?.length ?? 0) <= 2}\n responsiveContainerProps={responsiveProps}\n />\n </TabPanel>\n <TabPanel\n value={\"volume\"}\n title={t(\"portfolio.overview.performance.volume\", { period: \"\" })}\n className=\"oui-min-h-40\"\n >\n <div\n className={cn(\n \"oui-h-[144px] oui-w-full\",\n (invisible || (mergedData?.length ?? 0) <= 2) &&\n \"chart-invisible\",\n )}\n >\n <VolBarChart\n data={(mergedData ?? []).map((item: any) => ({\n date: item.date,\n volume: item.perp_volume ?? 0,\n opacity: (item.perp_volume ?? 0) > 0 ? 1 : 0,\n }))}\n className=\"oui-size-full\"\n />\n </div>\n </TabPanel>\n </Tabs>\n </div>\n );\n};\n","import React from \"react\";\nimport { pick } from \"ramda\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport {\n registerSimpleDialog,\n registerSimpleSheet,\n} from \"@kodiak-finance/orderly-ui\";\nimport { usePerformanceScript } from \"..\";\nimport { localKey } from \"../provider/overviewProvider\";\nimport { useAssetsHistoryData } from \"../shared/useAssetHistory\";\nimport { PerformanceMobileUI } from \"./performance.ui\";\n\nexport const PerformanceMobileWidget: React.FC = () => {\n const state = useAssetsHistoryData(localKey, { isRealtime: true });\n const { visible, invisible } = usePerformanceScript();\n return (\n <PerformanceMobileUI\n {...pick(\n [\n \"data\",\n \"curPeriod\",\n \"aggregateValue\",\n \"onPeriodChange\",\n \"createFakeData\",\n \"period\",\n \"filterItems\",\n \"onFilter\",\n ],\n state,\n )}\n visible={visible}\n invisible={invisible}\n />\n );\n};\n\nexport const PerformanceMobileSheetId = \"PerformanceMobileSheetId\";\n\nexport const PerformanceMobileDialogId = \"PerformanceMobileDialogId\";\n\nregisterSimpleSheet(PerformanceMobileSheetId, PerformanceMobileWidget, {\n title: () => i18n.t(\"portfolio.overview.performance\"),\n});\n\nregisterSimpleDialog(PerformanceMobileDialogId, PerformanceMobileWidget, {\n title: () => i18n.t(\"portfolio.overview.performance\"),\n classNames: {\n content: \"oui-w-[420px]\",\n },\n});\n","import { FC, PropsWithChildren, useMemo } from \"react\";\nimport { TWType } from \"@kodiak-finance/orderly-hooks\";\nimport { useRewardsData } from \"../mobile/useRewardsData.script\";\nimport { useAssetsHistoryData } from \"../shared/useAssetHistory\";\nimport { OverviewContext, OverviewContextState } from \"./overviewContext\";\n\nexport const localKey = \"portfolio_performance_period\";\n\nexport const OverviewProvider: FC<PropsWithChildren<{ type?: TWType }>> = (\n props,\n) => {\n const { type, children } = props;\n const state = useAssetsHistoryData(localKey, { isRealtime: true });\n const rewardsData = useRewardsData({ type: type });\n\n const memoizedValue = useMemo<OverviewContextState>(() => {\n return {\n ...state,\n type: type,\n ...rewardsData,\n };\n }, [state, type, rewardsData]);\n\n return (\n <OverviewContext.Provider value={memoizedValue}>\n {children}\n </OverviewContext.Provider>\n );\n};\n","import { useMemo, useRef, useEffect } from \"react\";\nimport {\n useAllBrokers,\n useConfig,\n useCurEpochEstimate,\n useEpochInfo,\n useGetClaimed,\n useAccount,\n RefferalAPI,\n usePrivateQuery,\n noCacheConfig,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { DistributionId, TWType } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useOverviewContext } from \"../provider/overviewContext\";\n\nexport const useRewardsData = ({ type = TWType.normal }: { type?: TWType }) => {\n const totalOrderClaimedReward = useGetClaimed(\n type === TWType.mm ? DistributionId.mmOrder : DistributionId.order,\n );\n const [curEpochEstimate] = useCurEpochEstimate(type);\n const [brokers] = useAllBrokers();\n const { state } = useAccount();\n const { data, mutate } = usePrivateQuery<RefferalAPI.ReferralInfo>(\n \"/v1/referral/info\",\n { revalidateOnFocus: true, errorRetryCount: 3, ...noCacheConfig },\n );\n\n const epochList = useEpochInfo(type as TWType);\n const brokerId = useConfig(\"brokerId\");\n\n const brokerName = useMemo(() => {\n return brokers?.[brokerId];\n }, [brokerId, brokers]);\n\n const lastStete = useRef<AccountStatusEnum>(AccountStatusEnum.NotConnected);\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n if (lastStete.current !== state.status) {\n lastStete.current = state.status;\n timerRef.current = setTimeout(() => {\n mutate();\n }, 1000);\n }\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [state.status]);\n\n return {\n totalOrderClaimedReward,\n curEpochEstimate,\n epochList,\n brokerName,\n referralInfo: data,\n };\n};\n\nexport const useRewardsDataScript = () => {\n const {\n totalOrderClaimedReward,\n curEpochEstimate,\n epochList,\n brokerName,\n referralInfo,\n } = useOverviewContext();\n const { state } = useAccount();\n const { wrongNetwork } = useAppContext();\n const isSignIn =\n state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected;\n\n return {\n totalOrderClaimedReward,\n curEpochEstimate,\n epochList,\n brokerName,\n isSignIn,\n referralInfo,\n wrongNetwork,\n };\n};\n\nexport type UseRewardsDataReturn = ReturnType<typeof useRewardsData>;\n","import React from \"react\";\nimport { Grid, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { MobileOverview } from \"./mobile\";\nimport { OverviewProvider } from \"./provider/overviewProvider\";\n\nconst LazyAssetWidget = React.lazy(() =>\n import(\"./assets\").then((mod) => {\n return { default: mod.AssetWidget };\n }),\n);\n\nconst LazyAssetsChartWidget = React.lazy(() =>\n import(\"./assetChart\").then((mod) => {\n return { default: mod.AssetsChartWidget };\n }),\n);\n\nconst LazyPerformanceWidget = React.lazy(() =>\n import(\"./performance\").then((mod) => {\n return { default: mod.PerformanceWidget };\n }),\n);\n\nconst LazyHistoryDataGroupWidget = React.lazy(() =>\n import(\"./historyDataGroup\").then((mod) => {\n return { default: mod.HistoryDataGroupWidget };\n }),\n);\n\nexport const OverviewPage: React.FC = () => {\n const { isMobile } = useScreen();\n return (\n <OverviewProvider>\n {isMobile ? (\n <MobileOverview />\n ) : (\n <Grid cols={2} gap={4}>\n <React.Suspense fallback={null}>\n <LazyAssetWidget />\n </React.Suspense>\n <React.Suspense fallback={null}>\n <LazyAssetsChartWidget />\n </React.Suspense>\n <Grid.span colSpan={2}>\n <React.Suspense fallback={null}>\n <LazyPerformanceWidget />\n </React.Suspense>\n </Grid.span>\n <Grid.span colSpan={2}>\n <React.Suspense fallback={null}>\n <LazyHistoryDataGroupWidget />\n </React.Suspense>\n </Grid.span>\n </Grid>\n )}\n </OverviewProvider>\n );\n};\n","import React from \"react\";\nimport { ENVType, useGetEnv } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { Flex } from \"@kodiak-finance/orderly-ui\";\nimport { DepositStatusWidget } from \"@kodiak-finance/orderly-ui-transfer\";\nimport { useLayoutContext } from \"../../../layout/context\";\nimport { useAssetScript } from \"../assets\";\nimport { PortfolioChartsMobileWidget } from \"../portfolioChartsMobile\";\nimport { AccountStatusMobile } from \"./accountStatus.ui.mobile\";\nimport { AffiliateCardMobile } from \"./affiliateCard.ui.mobile\";\nimport { PortfolioHandleMobile } from \"./portfolioHandle.ui.mobile\";\nimport { PortfolioValueMobile } from \"./portfolioVaule.ui.mobile\";\nimport { SettingRouterMobile } from \"./settingRouter.ui.mobile\";\nimport { TraderCardMobile } from \"./traderCard.ui.mobile\";\n// import { TradingRewardsCardMobile } from \"./tradingRewardsCard.ui.mobile\";\nimport { useRewardsDataScript } from \"./useRewardsData.script\";\n\nexport const MobileOverview: React.FC = () => {\n const {\n canTrade,\n onWithdraw,\n onDeposit,\n portfolioValue,\n unrealPnL,\n unrealROI,\n visible,\n namespace,\n toggleVisible,\n onTransfer,\n isMainAccount,\n hasSubAccount,\n } = useAssetScript();\n const { t } = useTranslation();\n const rewardsData = useRewardsDataScript();\n const layoutContext = useLayoutContext();\n const { onRouteChange } = useAppContext();\n const env = useGetEnv();\n\n const goToClaim = () => {\n const url = `https://${\n env !== ENVType.prod ? `${env}-` : \"\"\n }app.orderly.network/tradingRewards`;\n window.open(url, \"_blank\");\n };\n\n const navigateToPortfolioHistory =\n typeof onRouteChange === \"function\"\n ? () => {\n onRouteChange({\n href: \"/portfolio/history\",\n name: t(\"trading.history\"),\n });\n }\n : undefined;\n\n // console.log('rewards data', rewardsData, layoutContext, props);\n\n return (\n <>\n <div className=\"oui-my-1 oui-px-3\">\n <AccountStatusMobile />\n </div>\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n height={\"100%\"}\n className=\"oui-gap-5 oui-px-3\"\n >\n <Flex direction=\"column\" width=\"100%\" gapY={2}>\n <PortfolioValueMobile\n toggleVisible={toggleVisible}\n portfolioValue={portfolioValue}\n unrealPnL={unrealPnL}\n unrealROI={unrealROI}\n visible={visible}\n canTrade={canTrade}\n namespace={namespace}\n routerAdapter={layoutContext?.routerAdapter}\n />\n <DepositStatusWidget onClick={navigateToPortfolioHistory} />\n <PortfolioChartsMobileWidget />\n </Flex>\n <PortfolioHandleMobile\n disabled={!canTrade}\n onWithdraw={onWithdraw}\n onDeposit={onDeposit}\n onTransfer={onTransfer}\n isMainAccount={isMainAccount}\n routerAdapter={layoutContext?.routerAdapter}\n hasSubAccount={hasSubAccount}\n />\n <Flex\n direction={\"row\"}\n width={\"100%\"}\n height={\"100%\"}\n className=\"oui-gap-3\"\n >\n {/* Disable trading rewards card for now. Set to row */}\n <Flex direction=\"row\" className=\"oui-flex-1 oui-gap-3\">\n <AffiliateCardMobile\n referralInfo={rewardsData.referralInfo}\n routerAdapter={layoutContext?.routerAdapter}\n />\n <TraderCardMobile\n referralInfo={rewardsData.referralInfo}\n routerAdapter={layoutContext?.routerAdapter}\n />\n </Flex>\n {/* <Flex direction=\"column\" className=\"oui-flex-1\">\n <TradingRewardsCardMobile {...rewardsData} goToClaim={goToClaim} />\n </Flex> */}\n </Flex>\n <SettingRouterMobile routerAdapter={layoutContext?.routerAdapter} />\n </Flex>\n </>\n );\n};\n","import React from \"react\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { useAssetsChartScript } from \"../assetChart\";\nimport { usePortfolioChartsState } from \"./portfolioChartsMobile.script\";\nimport { PortfolioChartsMobileUI } from \"./portfolioChartsMobile.ui\";\n\nexport const PortfolioChartsMobileWidget: React.FC = () => {\n const { data, invisible } = useAssetsChartScript();\n const state = usePortfolioChartsState();\n return (\n <PortfolioChartsMobileUI\n data={data || EMPTY_LIST}\n invisible={invisible}\n {...state}\n />\n );\n};\n","import { useCallback } from \"react\";\nimport { useLocalStorage, usePositionStream } from \"@kodiak-finance/orderly-hooks\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport { ORDERLY_ASSETS_VISIBLE_KEY } from \"../../assets/type\";\nimport { PerformanceMobileSheetId } from \"../performanceMobileDialog\";\n\nexport const usePortfolioChartsState = () => {\n const [data] = usePositionStream();\n const [visible, setVisible] = useLocalStorage<boolean>(\n ORDERLY_ASSETS_VISIBLE_KEY,\n true,\n );\n const onPerformanceClick = useCallback(() => {\n return modal.show(PerformanceMobileSheetId);\n }, []);\n return {\n unrealPnL: data?.aggregated.total_unreal_pnl,\n unrealROI: data?.totalUnrealizedROI,\n visible: visible as boolean,\n setVisible: setVisible,\n onPerformanceClick: onPerformanceClick,\n } as const;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useId } from \"react\";\nimport { Area, AreaChart } from \"@kodiak-finance/orderly-chart\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { ChevronRightIcon, cn, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { usePortfolioChartsState } from \".\";\n\nexport const PortfolioChartsMobileUI: React.FC<\n ReturnType<typeof usePortfolioChartsState> & {\n data: any[];\n invisible?: boolean;\n }\n> = (props) => {\n const { data, invisible, unrealPnL, unrealROI, visible, onPerformanceClick } =\n props;\n const { t } = useTranslation();\n const colorId = useId();\n return (\n <Flex\n p={4}\n width={\"100%\"}\n itemAlign=\"center\"\n justify=\"between\"\n className={cn(\n \"oui-relative oui-overflow-hidden oui-rounded-2xl oui-border oui-border-solid oui-border-line-12 oui-bg-base-9\",\n )}\n >\n <Flex\n width={\"100%\"}\n justify={\"center\"}\n itemAlign={\"start\"}\n direction={\"column\"}\n gap={2}\n >\n <Text size=\"xs\" intensity={54}>\n {t(\"common.unrealizedPnl\")}\n </Text>\n <Flex justify={\"start\"} itemAlign={\"center\"}>\n <Text.numeral\n coloring\n size=\"base\"\n weight=\"semibold\"\n visible={visible}\n >\n {unrealPnL}\n </Text.numeral>\n <Text.numeral\n coloring\n rule=\"percentages\"\n size=\"sm\"\n weight=\"semibold\"\n prefix={\"(\"}\n suffix={\")\"}\n visible={visible}\n >\n {unrealROI}\n </Text.numeral>\n </Flex>\n <Text\n size=\"xs\"\n intensity={54}\n className=\"oui-flex oui-items-center oui-justify-start oui-gap-1\"\n onClick={onPerformanceClick}\n >\n {t(\"portfolio.overview.performance\")}\n <ChevronRightIcon className=\"oui-text-base-contrast-54\" />\n </Text>\n </Flex>\n <Flex\n width={\"100%\"}\n justify={\"center\"}\n itemAlign={\"center\"}\n direction={\"column\"}\n >\n <AreaChart data={data || EMPTY_LIST} width={160} height={52}>\n {!invisible && (\n <>\n <defs>\n <linearGradient id={colorId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop stopColor=\"#00B49E\" offset=\"0%\" stopOpacity={0.5} />\n <stop stopColor=\"#00B49E\" offset=\"100%\" stopOpacity={0} />\n </linearGradient>\n </defs>\n <Area\n type=\"natural\"\n dataKey=\"account_value\"\n stroke={\"rgb(41, 233, 169)\"}\n strokeWidth={1.5}\n dot={false}\n isAnimationActive={false}\n fill={`url(#${colorId})`}\n />\n </>\n )}\n </AreaChart>\n </Flex>\n </Flex>\n );\n};\n","import { FC, SVGProps, useCallback, useMemo } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useChains,\n useLocalStorage,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum, ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport {\n cn,\n modal,\n toast,\n formatAddress,\n Flex,\n CopyIcon,\n ChainIcon,\n} from \"@kodiak-finance/orderly-ui\";\n\ninterface StatusInfo {\n title: string;\n description: string;\n titleColor?: any;\n titleClsName?: string;\n}\n\nconst useCurrentStatus = () => {\n const { state, account } = useAccount();\n const { wrongNetwork, disabledConnect, connectWallet } = useAppContext();\n const { t } = useTranslation();\n\n const statusText = {\n wrongNetwork: {\n description: t(\"connector.wrongNetwork.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#D25F00_0%,transparent_30%)]\",\n },\n connectWallet: {\n description: t(\"connector.trade.connectWallet.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#27FDFE_0%,transparent_30%)]\",\n },\n notSignedIn: {\n description: t(\"connector.trade.createAccount.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#335FFC_0%,transparent_30%)]\",\n },\n disabledTrading: {\n description: t(\"connector.trade.enableTrading.tooltip\"),\n rootClass: \"oui-bg-[linear-gradient(15deg,#335FFC_0%,transparent_30%)]\",\n },\n default: {\n description: \"\",\n rootClass: \"\",\n arrowIconClass: \"\",\n textClass: \"\",\n },\n };\n\n return useMemo(() => {\n if (disabledConnect) {\n return statusText.connectWallet;\n }\n\n if (wrongNetwork) {\n return statusText.wrongNetwork;\n }\n\n switch (state.status) {\n case AccountStatusEnum.NotConnected:\n return statusText.connectWallet;\n case AccountStatusEnum.NotSignedIn:\n return statusText.notSignedIn;\n case AccountStatusEnum.DisabledTrading:\n return statusText.disabledTrading;\n default:\n return statusText.default;\n }\n }, [state.status, wrongNetwork]);\n};\n\nexport function EVMChainPopover({ children }: { children: React.ReactNode }) {\n // const [chains] = useState(getChainsByNetwork(\"mainnet\"));\n const [chains] = useChains(\"mainnet\", {\n pick: \"network_infos\",\n });\n const { t } = useTranslation();\n\n const showDialog = () => {\n modal.dialog({\n title: t(\"connector.privy.supportedEvmChain\"),\n size: \"xs\",\n content: (\n <div>\n <div className=\"oui-p-1 oui-grid oui-grid-cols-2 oui-gap-x-2 oui-gap-y-3 oui-text-2xs oui-text-base-contrast-54\">\n {chains.map((item, key) => (\n <div\n key={key}\n className=\"oui-flex oui-items-center oui-justify-start oui-gap-1\"\n >\n <ChainIcon chainId={item.chain_id} size=\"2xs\" />\n <div>{item.name}</div>\n </div>\n ))}\n </div>\n </div>\n ),\n });\n };\n\n return <button onClick={showDialog}>{children}</button>;\n}\n\nexport const MoreIcon: FC<SVGProps<SVGSVGElement>> = (props) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n {...props}\n >\n <path d=\"M8.00521 6.66797C8.74161 6.66797 9.33854 7.26464 9.33854 8.0013C9.33854 8.73797 8.74161 9.33464 8.00521 9.33464C7.26881 9.33464 6.67188 8.73797 6.67188 8.0013C6.67188 7.26464 7.26881 6.66797 8.00521 6.66797Z\" />\n <path d=\"M3.33333 6.66797C4.06973 6.66797 4.66667 7.26464 4.66667 8.0013C4.66667 8.73797 4.06973 9.33464 3.33333 9.33464C2.59693 9.33464 2 8.73797 2 8.0013C2 7.26464 2.59693 6.66797 3.33333 6.66797Z\" />\n <path d=\"M12.6666 6.66797C13.403 6.66797 14 7.26464 14 8.0013C14 8.73797 13.403 9.33464 12.6666 9.33464C11.9302 9.33464 11.3333 8.73797 11.3333 8.0013C11.3333 7.26464 11.9302 6.66797 12.6666 6.66797Z\" />\n </svg>\n);\n\nconst EVMChains = () => {\n return (\n <div className=\"oui-relative oui-flex oui-items-center oui-justify-center\">\n <div className=\"oui-flex oui-h-[18px] oui-items-center oui-justify-center \">\n <img\n src=\"https://oss.orderly.network/static/sdk/portfolio/chains.png\"\n className=\"oui-relative oui-z-0 oui-h-[18px] oui-w-[49px]\"\n />\n </div>\n <div className=\"oui-relative oui-left-[-9px] oui-flex oui-items-center oui-justify-center oui-gap-1\">\n <div className=\"oui-flex oui-size-[18px] oui-items-center oui-justify-center oui-rounded-full oui-bg-[#282e3a]\">\n <EVMChainPopover>\n <MoreIcon\n className=\"oui-relative oui-z-10 oui-size-3 oui-text-base-contrast-54 hover:oui-text-base-contrast\"\n style={{ zIndex: 1 }}\n />\n </EVMChainPopover>\n </div>\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast\">\n Evm\n </div>\n </div>\n </div>\n );\n};\n\nconst ShowAccount: FC = () => {\n const { state, account } = useAccount();\n const { namespace } = useWalletConnector();\n const { t } = useTranslation();\n const onCopyAddress = () => {\n navigator.clipboard.writeText(state.address ?? \"\");\n toast.success(t(\"common.copy.copied\"));\n };\n\n const currentNamespace = useMemo(() => {\n if (namespace) {\n return namespace;\n }\n if (state.status === AccountStatusEnum.EnableTradingWithoutConnected) {\n return getLinkDeviceStorage()?.chainNamespace;\n }\n return null;\n }, [namespace, state.status]);\n\n const leftNode = useMemo(() => {\n if (!state.address) {\n return;\n }\n return (\n <Flex className=\"oui-text-base oui-text-base-contrast\" gapX={2}>\n {formatAddress(state.address ?? \"\")}\n <button\n className=\"oui-cursor-pointer\"\n onClick={() => {\n onCopyAddress();\n }}\n >\n <CopyIcon\n size={18}\n className=\"oui-text-base-contrast-80\"\n opacity={1}\n />\n </button>\n </Flex>\n );\n }, [state.address]);\n const rightNode = useMemo(() => {\n if (currentNamespace === ChainNamespace.evm) {\n return <EVMChains />;\n }\n\n return (\n <Flex gapX={1} itemAlign={\"center\"} className=\"oui-text-2xs\">\n <img\n src=\"https://oss.orderly.network/static/sdk/solana-logo.png\"\n className=\"oui-w-[15px]\"\n />\n Solana\n </Flex>\n );\n }, [currentNamespace]);\n\n const bgClass = useMemo(() => {\n let bg = \"\";\n if (currentNamespace == ChainNamespace.evm) {\n bg =\n \"oui-bg-[linear-gradient(15deg,#283BEE_-11%,transparent_30%,transparent_77%,#A53411_100%)]\";\n } else if (currentNamespace == ChainNamespace.solana) {\n bg =\n \"oui-bg-[linear-gradient(15deg,#7400D0_-11%,transparent_30%,transparent_77%,#009A7E_100%)]\";\n }\n return bg;\n }, [currentNamespace]);\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[44px] oui-w-full oui-items-center oui-justify-between oui-rounded-[10px] oui-px-3 oui-py-[10px]\",\n bgClass,\n ])}\n >\n {leftNode}\n {rightNode}\n </div>\n );\n};\n\nexport const AccountStatusMobile: FC = () => {\n const { state } = useAccount();\n const { wrongNetwork } = useAppContext();\n const { description, rootClass } = useCurrentStatus();\n\n const alreadyShowAccount = useMemo(() => {\n if (state.status === AccountStatusEnum.EnableTradingWithoutConnected) {\n return true;\n }\n if (wrongNetwork) {\n return false;\n }\n return state.status >= AccountStatusEnum.EnableTrading;\n }, [state.status, wrongNetwork]);\n\n if (alreadyShowAccount) {\n return <ShowAccount />;\n }\n\n return (\n <div\n className={cn([\n \"oui-flex oui-h-[44px] oui-w-full oui-items-center oui-justify-center oui-rounded-[10px] oui-px-3 oui-py-[10px]\",\n rootClass,\n // \"oui-bg-linear-65\",\n // \"oui-from-[-20%]\",\n // \"oui-to-[40%]\",\n // \" oui-from-[#FF7B00]\",\n // \" oui-to-[#FFEA00]\",\n ])}\n >\n <div\n className={cn(\n \"oui-flex oui-items-center oui-justify-end oui-rounded-[10px] oui-text-xs oui-font-semibold\",\n \"oui-text-base-contrast-54\",\n )}\n >\n {description}\n </div>\n </div>\n );\n};\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n","import { FC } from \"react\";\nimport { RefferalAPI as API } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n AffiliateIcon,\n ChevronRightIcon,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\n\nconst isNumber = (val: unknown): val is number => {\n return typeof val === \"number\" && !Number.isNaN(val);\n};\n\ntype AffiliateCardMobileProps = {\n referralInfo?: API.ReferralInfo;\n routerAdapter?: RouterAdapter;\n};\n\nexport const AffiliateCardMobile: FC<AffiliateCardMobileProps> = (props) => {\n const { t } = useTranslation();\n const { referralInfo, routerAdapter } = props;\n const rebate = referralInfo?.referrer_info?.[\"30d_referrer_rebate\"];\n return (\n <Flex\n className=\"\n oui-via-21.6% \n oui-via-83.23% \n oui-relative \n oui-h-[112px] \n oui-w-full \n oui-flex-col \n oui-items-start \n oui-rounded-xl \n oui-border \n oui-border-solid \n oui-border-[rgba(var(--oui-gradient-primary-start)/0.36)] \n oui-bg-gradient-to-r\n oui-from-[rgba(var(--oui-gradient-primary-end)/0.12)]\n oui-to-[rgba(var(--oui-gradient-primary-start)/0.12)]\n oui-p-3\n \"\n >\n <Flex className=\"oui-w-full oui-flex-row oui-justify-between oui-items-center\">\n <Flex className=\"oui-flex-col oui-items-start\">\n <Text className=\"oui-text-base-contrast oui-text-base oui-font-semibold\">\n {t(\"affiliate.asAffiliate.affilates\")}\n </Text>\n <Text className=\"oui-text-2xs oui-font-normal oui-text-base-contrast-54\">\n {t(\"affiliate.commission\")}\n </Text>\n </Flex>\n <AffiliateIcon />\n </Flex>\n <Flex className=\"oui-mt-auto oui-w-full oui-flex-row oui-items-center oui-gap-1\">\n <img\n src=\"https://oss.orderly.network/static/symbol_logo/USDC.png\"\n alt=\"USDC\"\n className=\"oui-size-5\"\n />\n <Text\n className={cn(\n \"oui-text-xs oui-font-semibold\",\n isNumber(rebate) && rebate !== 0\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n >\n {commifyOptional(rebate, { fix: 2, fallback: \"--\" })}\n </Text>\n <Text className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-36\">\n (30D)\n </Text>\n <ChevronRightIcon\n size={18}\n color=\"white\"\n className=\"oui-ml-auto\"\n onClick={() => {\n routerAdapter?.onRouteChange({\n href: \"/rewards/affiliate?tab=affiliate\",\n name: t(\"tradingRewards.rewards\"),\n });\n }}\n />\n </Flex>\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n ArrowDownSquareFillIcon,\n ArrowUpSquareFillIcon,\n CalendarMinusIcon,\n ArrowLeftRightIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { PortfolioLeftSidebarPath } from \"../../../layout\";\n\ntype Props = {\n disabled: boolean;\n onWithdraw?: () => void;\n onDeposit?: () => void;\n onTransfer?: () => void;\n isMainAccount?: boolean;\n routerAdapter?: RouterAdapter;\n hasSubAccount?: boolean;\n};\n\nexport const PortfolioHandleMobile: FC<Props> = (props) => {\n const { t } = useTranslation();\n\n const onGotoHistory = () => {\n props.routerAdapter?.onRouteChange({\n href: PortfolioLeftSidebarPath.History,\n name: t(\"trading.history\"),\n });\n };\n\n return (\n <Flex\n direction={\"row\"}\n width={\"100%\"}\n height={\"71px\"}\n className=\"oui-gap-3 oui-bg-transparent\"\n >\n {props.isMainAccount && (\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onDeposit}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <ArrowDownSquareFillIcon size={28} color=\"white\" opacity={1} />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"common.deposit\")}\n </Text>\n </Flex>\n )}\n {props.hasSubAccount && (\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onTransfer}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <ArrowLeftRightIcon size={28} color=\"white\" opacity={1} />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"common.transfer\")}\n </Text>\n </Flex>\n )}\n {props.isMainAccount && (\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n onClick={props?.onWithdraw}\n >\n <div className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\">\n <ArrowUpSquareFillIcon size={28} color=\"white\" opacity={1} />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"common.withdraw\")}\n </Text>\n </Flex>\n )}\n <Flex\n direction=\"column\"\n gapY={2}\n itemAlign={\"center\"}\n className=\"oui-flex-1 oui-cursor-pointer\"\n >\n <div\n className=\"oui-flex oui-size-[48px] oui-items-center oui-justify-center oui-rounded-xl oui-bg-base-9\"\n onClick={onGotoHistory}\n >\n <CalendarMinusIcon\n size={28}\n color=\"white\"\n opacity={1}\n viewBox=\"0 0 28 28\"\n className=\"oui-w-[28px] oui-h-[28px]\"\n />\n </div>\n <Text className=\"oui-text-base-80 oui-text-2xs\">\n {t(\"trading.history\")}\n </Text>\n </Flex>\n </Flex>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { parseJSON, useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { AccountStatusEnum, ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport {\n Flex,\n Text,\n cn,\n ArrowRightShortIcon,\n EyeIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { PortfolioLeftSidebarPath } from \"../../../layout\";\n\ntype Props = {\n portfolioValue: number | null;\n unrealPnL: number;\n unrealROI: number;\n visible: boolean;\n namespace: string | null;\n toggleVisible: () => void;\n canTrade: boolean;\n routerAdapter?: RouterAdapter;\n};\n\nexport const PortfolioValueMobile: FC<Props> = (props) => {\n const { t } = useTranslation();\n const { state } = useAccount();\n\n const currentNamespace = useMemo(() => {\n if (props.namespace) {\n return props.namespace;\n }\n if (state.status === AccountStatusEnum.EnableTradingWithoutConnected) {\n return getLinkDeviceStorage()?.chainNamespace;\n }\n return null;\n }, [props.namespace, state.status]);\n return (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n height={\"100%\"}\n className={cn([\n \"oui-relative oui-items-start oui-overflow-hidden oui-rounded-2xl oui-bg-base-9\",\n currentNamespace === ChainNamespace.evm && \"oui-bg-[#283BEE]\",\n currentNamespace === ChainNamespace.solana && \"oui-bg-[#630EAD]\",\n ])}\n p={4}\n >\n <Flex direction=\"row\" gapX={1} itemAlign={\"center\"}>\n <Text className=\"oui-text-sm oui-text-base-contrast-54\">\n {t(\"portfolio.overview.handle.title\")}\n </Text>\n <EyeIcon\n size={16}\n className={cn(\n props.canTrade ? \"oui-text-base-contrast-54\" : \"oui-hidden\",\n )}\n onClick={props.toggleVisible}\n />\n </Flex>\n <Flex\n direction=\"row\"\n gapX={1}\n itemAlign={\"baseline\"}\n className=\"oui-mt-1\"\n >\n <Text.numeral\n visible={props.visible}\n className=\"oui-text-3xl oui-font-bold oui-text-base-contrast\"\n >\n {props.portfolioValue ?? \"--\"}\n </Text.numeral>\n <Text className=\"oui-text-base oui-font-bold oui-text-base-contrast-80\">\n USDC\n </Text>\n </Flex>\n <Flex\n direction=\"row\"\n gapX={1}\n itemAlign={\"center\"}\n className=\"oui-text-sm oui-text-base-contrast\"\n >\n <Text.numeral visible={props.visible}>\n {props.unrealPnL ?? \"--\"}\n </Text.numeral>\n <Text.numeral\n visible={props.visible}\n rule=\"percentages\"\n prefix={\"(\"}\n suffix={\")\"}\n >\n {props.unrealROI ?? \"--\"}\n </Text.numeral>\n </Flex>\n <div\n className=\"oui-absolute oui-right-0 oui-top-0 oui-flex oui-h-full oui-items-center oui-justify-center oui-px-4\"\n onClick={() =>\n props.routerAdapter?.onRouteChange({\n href: PortfolioLeftSidebarPath.Assets,\n name: \"Assets\",\n })\n }\n >\n <ArrowRightShortIcon size={18} color=\"white\" opacity={0.54} />\n </div>\n </Flex>\n );\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n SettingFillIcon,\n ChevronRightIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { PortfolioLeftSidebarPath } from \"../../../layout\";\n\ntype Props = {\n routerAdapter?: RouterAdapter;\n};\n\nexport const SettingRouterMobile: FC<Props> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n direction={\"row\"}\n width={\"100%\"}\n className=\"oui-cursor-pointer oui-items-center oui-gap-2 oui-rounded-xl oui-bg-base-9 oui-p-4 oui-mb-3\"\n onClick={() =>\n props?.routerAdapter?.onRouteChange({\n href: PortfolioLeftSidebarPath.Setting,\n name: t(\"portfolio.setting\"),\n })\n }\n >\n <SettingFillIcon size={18} opacity={0.98} color=\"white\" />\n <Text className=\"oui-text-base oui-font-semibold oui-text-base-contrast-80\">\n {t(\"portfolio.setting\")}\n </Text>\n <ChevronRightIcon\n className=\"oui-ml-auto\"\n size={18}\n opacity={0.36}\n color=\"white\"\n />\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { RefferalAPI as API } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n TraderMobileIcon,\n ChevronRightIcon,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { RouterAdapter } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\n\nconst isNumber = (val: unknown): val is number => {\n return typeof val === \"number\" && !Number.isNaN(val);\n};\n\ntype TraderCardMobileProps = {\n referralInfo?: API.ReferralInfo;\n routerAdapter?: RouterAdapter;\n};\n\nexport const TraderCardMobile: FC<TraderCardMobileProps> = (props) => {\n const { t } = useTranslation();\n const { referralInfo, routerAdapter } = props;\n const rebate = referralInfo?.referee_info?.[\"30d_referee_rebate\"];\n return (\n <Flex\n className=\"\n oui-via-21.6% \n oui-via-83.23% \n oui-relative \n oui-h-[112px] \n oui-w-full \n oui-flex-col \n oui-items-start \n oui-rounded-xl \n oui-border\n oui-border-solid \n oui-border-[rgba(var(--oui-gradient-success-start)/0.36)]\n oui-bg-gradient-to-r\n oui-from-[rgba(var(--oui-gradient-success-end)/0.12)]\n oui-to-[rgba(var(--oui-gradient-success-start)/0.12)]\n oui-p-3\n \"\n >\n <Flex className=\"oui-w-full oui-flex-row oui-justify-between oui-items-center\">\n <Flex className=\"oui-flex-col oui-items-start\">\n <Text className=\"oui-text-base-contrast oui-text-base oui-font-semibold\">\n {t(\"affiliate.trader.rebates\")}\n </Text>\n <Text className=\"oui-text-2xs oui-font-normal oui-text-base-contrast-54\">\n {t(\"affiliate.trader.tradingRebates\")}\n </Text>\n </Flex>\n <TraderMobileIcon />\n </Flex>\n\n <Flex\n className={cn(\n \"oui-mt-auto oui-w-full oui-flex-row oui-items-center oui-gap-1\",\n )}\n >\n <img\n src=\"https://oss.orderly.network/static/symbol_logo/USDC.png\"\n alt=\"USDC\"\n className=\"oui-size-5\"\n />\n <Text\n className={cn(\n \"oui-text-xs oui-font-semibold\",\n isNumber(rebate) && rebate !== 0\n ? \"oui-text-base-contrast\"\n : \"oui-text-base-contrast-36\",\n )}\n >\n {commifyOptional(rebate, { fix: 2, fallback: \"--\" })}\n </Text>\n <Text className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-36\">\n (30D)\n </Text>\n <ChevronRightIcon\n size={18}\n color=\"white\"\n className=\"oui-ml-auto\"\n onClick={() => {\n routerAdapter?.onRouteChange({\n href: \"/rewards/affiliate?tab=trader\",\n name: t(\"tradingRewards.rewards\"),\n });\n }}\n />\n </Flex>\n </Flex>\n );\n};\n","export { FeeTierPage } from \"./page\";\nexport { useFeeTierScript } from \"./feeTier.script\";\nexport type { FeeDataType, UseFeeTierScriptOptions } from \"./feeTier.script\";\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useCallback } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Flex,\n Text,\n Card,\n Divider,\n DataTable,\n Column,\n useScreen,\n cn,\n TanstackColumn,\n} from \"@kodiak-finance/orderly-ui\";\nimport type { FeeDataType, useFeeTierScriptReturn } from \"./feeTier.script\";\n\nconst LazyFeeTierHeader = React.lazy(() =>\n import(\"./feeTierHeader\").then((mod) => {\n return { default: mod.FeeTierHeader };\n }),\n);\n\nexport type FeeTierProps = useFeeTierScriptReturn;\n\nexport type FeeTierHeaderProps = {\n tier?: number;\n vol?: number;\n};\n\ntype FeeTierTableProps = {\n columns: Column<any>[];\n dataSource?: any[];\n page?: number;\n pageSize?: number;\n dataCount?: number;\n tier?: number | null;\n vol?: number | null;\n onRow?: (\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n onCell?: (\n column: TanstackColumn<any>,\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n};\n\nexport const FeeTierTable: React.FC<FeeTierTableProps> = (props) => {\n const { isMobile } = useScreen();\n\n const { tier, columns, dataSource, onRow, onCell } = props;\n\n const internalOnRow = useCallback(\n (record: FeeDataType, index: number) => {\n const config =\n typeof onRow === \"function\"\n ? onRow(record, index)\n : { normal: undefined, active: undefined };\n const active = tier !== undefined && tier !== null && tier === index + 1;\n if (active) {\n return {\n \"data-state\": \"active\",\n className: cn(\n \"oui-pointer-events-none oui-h-[54px] oui-text-[rgba(0,0,0,0.88)] oui-gradient-brand\",\n ),\n ...config.active,\n };\n } else {\n return {\n \"data-state\": \"none\",\n className: cn(\"oui-h-[54px]\"),\n ...config.normal,\n };\n }\n },\n [tier, onRow],\n );\n\n const internalOnCell = useCallback(\n (\n column: TanstackColumn<FeeDataType>,\n record: FeeDataType,\n index: number,\n ) => {\n const config =\n typeof onCell === \"function\"\n ? onCell(column, record, index)\n : { normal: undefined, active: undefined };\n const active = tier !== undefined && tier !== null && tier === index + 1;\n const isFirstColumn = column.getIsFirstColumn();\n const isLastColumn = column.getIsLastColumn();\n if (active) {\n return {\n className: cn(\n isFirstColumn && \"oui-rounded-l-lg\",\n isLastColumn && \"oui-rounded-r-lg\",\n ),\n ...config.active,\n };\n } else {\n return {\n className: \"\",\n ...config.normal,\n };\n }\n },\n [tier, onCell],\n );\n\n return (\n <Box\n className={cn(\n \"oui-relative oui-border-b oui-border-line-4\",\n isMobile ? \"oui-mt-2 oui-rounded-xl oui-bg-base-9\" : undefined,\n )}\n >\n <DataTable\n bordered\n className=\"oui-font-semibold\"\n classNames={{ root: \"oui-bg-transparent\" }}\n onRow={internalOnRow}\n onCell={internalOnCell}\n columns={columns}\n dataSource={dataSource}\n />\n </Box>\n );\n};\n\nconst CardTitle: React.FC = () => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n if (isMobile) {\n return (\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={2}>\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.feeTier.updatedDailyBy\")}\n </Text>\n <Text size=\"xs\" intensity={80}>\n ~2:15 UTC\n </Text>\n </Flex>\n );\n }\n return (\n <Flex itemAlign={\"center\"} justify={\"between\"}>\n <Text size={\"lg\"}>{t(\"portfolio.feeTier\")}</Text>\n <Flex itemAlign={\"center\"} justify={\"center\"} gap={1}>\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.feeTier.updatedDailyBy\")}\n </Text>\n <Text size=\"xs\" intensity={80}>\n ~2:15 UTC\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nexport const FeeTier: React.FC<FeeTierProps> = (props) => {\n const { columns, dataSource, tier, vol, headerDataAdapter, onRow, onCell } =\n props;\n const { isMobile } = useScreen();\n return (\n <Card\n title={<CardTitle />}\n id=\"oui-portfolio-fee-tier\"\n className=\"w-full\"\n classNames={{\n root: isMobile ? \"oui-bg-transparent oui-p-2\" : \"oui-bg-base-9\",\n }}\n >\n {!isMobile && <Divider />}\n <React.Suspense fallback={null}>\n <LazyFeeTierHeader\n vol={vol}\n tier={tier}\n headerDataAdapter={headerDataAdapter}\n />\n </React.Suspense>\n <FeeTierTable\n dataSource={dataSource}\n columns={columns}\n vol={vol}\n tier={tier}\n onRow={onRow}\n onCell={onCell}\n />\n </Card>\n );\n};\n","import React from \"react\";\nimport { useFeeTierScript, type UseFeeTierScriptOptions } from \".\";\nimport { FeeTier } from \"./feeTier.ui\";\n\nexport type FeeTierWidgetProps = UseFeeTierScriptOptions;\n\nexport const FeeTierWidget: React.FC<FeeTierWidgetProps> = (props) => {\n const state = useFeeTierScript(props);\n return <FeeTier {...state} />;\n};\n","import React from \"react\";\nimport { FeeTierWidget, FeeTierWidgetProps } from \"./feeTier.widget\";\n\nexport type FeeTierPageProps = FeeTierWidgetProps;\n\nexport const FeeTierPage: React.FC<FeeTierPageProps> = (props) => {\n return <FeeTierWidget {...props} />;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useEffect, useMemo, useState } from \"react\";\nimport { on } from \"events\";\nimport {\n useAccount,\n useAccountInfo,\n usePrivateQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum, API } from \"@kodiak-finance/orderly-types\";\nimport type { Column, TanstackColumn } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useFeeTierColumns } from \"./column\";\nimport { dataSource as defaultDataSource } from \"./dataSource\";\n\nexport type useFeeTierScriptReturn = ReturnType<typeof useFeeTierScript>;\n\nexport type UseFeeTierScriptOptions = {\n dataAdapter?: (\n columns: Column<any>[],\n dataSource: any[],\n context?: {\n tier?: number;\n },\n ) => {\n columns: Column<any>[];\n dataSource: any[];\n };\n headerDataAdapter?: (original: any[]) => any[];\n onRow?: (\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n onCell?: (\n column: TanstackColumn<any>,\n record: any,\n index: number,\n ) => {\n normal?: any;\n active?: any;\n };\n};\n\nexport interface FeeDataType {\n tier: number | null;\n volume_min?: number | null;\n volume_max?: number | null;\n volume_node?: React.ReactNode;\n or?: string | null;\n maker_fee: string;\n taker_fee: string;\n}\n\nconst findCurrentTier = (feeList: FeeDataType[], data: API.AccountInfo) => {\n const { futures_taker_fee_rate = 0, futures_maker_fee_rate = 0 } = data;\n const takerRate = new Decimal(futures_taker_fee_rate).mul(0.01);\n const makerRate = new Decimal(futures_maker_fee_rate).mul(0.01);\n const findItem = feeList.find(\n (item) =>\n item.taker_fee === `${takerRate.toNumber()}%` &&\n item.maker_fee === `${makerRate.toNumber()}%`,\n );\n return findItem?.tier;\n};\n\nexport const useFeeTierScript = (options?: UseFeeTierScriptOptions) => {\n const { dataAdapter, headerDataAdapter, onRow, onCell } = options || {};\n const [tier, setTier] = useState<number | null>();\n const { data, isLoading } = useAccountInfo();\n const { state } = useAccount();\n\n const cols = useFeeTierColumns();\n\n const { data: volumeStatistics } = usePrivateQuery<{\n perp_volume_last_30_days: number;\n }>(\"/v1/volume/user/stats\");\n\n const { columns, dataSource } = useMemo(() => {\n return typeof dataAdapter === \"function\"\n ? dataAdapter(cols, defaultDataSource, { tier: tier! })\n : { columns: cols, dataSource: defaultDataSource };\n }, [dataAdapter, cols, tier]);\n\n useEffect(() => {\n if (!data || isLoading) {\n return;\n }\n setTier(findCurrentTier(dataSource, data));\n }, [data, isLoading, dataSource]);\n\n const authData = useDataTap(\n {\n tier: tier,\n vol: volumeStatistics?.perp_volume_last_30_days,\n },\n {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n },\n );\n\n return {\n ...authData,\n columns: columns,\n dataSource: dataSource,\n onRow: onRow,\n onCell: onCell,\n headerDataAdapter: headerDataAdapter,\n };\n};\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\nimport { numberToHumanStyle } from \"@kodiak-finance/orderly-utils\";\nimport type { FeeDataType } from \"./feeTier.script\";\n\nconst textStyle: React.CSSProperties = {\n fontVariantLigatures: \"none\",\n};\n\nexport const useFeeTierColumns = () => {\n const { t } = useTranslation();\n return useMemo<Column<FeeDataType>[]>(() => {\n return [\n {\n title: t(\"portfolio.feeTier.column.tier\"),\n dataIndex: \"tier\",\n align: \"left\",\n width: 100,\n },\n {\n title: `${t(\"portfolio.feeTier.column.30dVolume\")} (USDC)`,\n dataIndex: \"volume\",\n align: \"center\",\n width: 180,\n render: (val, record) => {\n const { volume_min, volume_max, volume_node } = record;\n if (volume_node) {\n return volume_node;\n }\n if (!volume_min && !volume_max) {\n return <div style={textStyle}>--</div>;\n }\n if (volume_min && !volume_max) {\n return t(\"portfolio.feeTier.column.30dVolume.above\", {\n volume: numberToHumanStyle(\n volume_min,\n volume_min === 2500000 ? 1 : 0,\n ),\n });\n }\n return (\n <div>\n {volume_min &&\n numberToHumanStyle(volume_min, volume_min === 2500000 ? 1 : 0)}\n {` - `}\n {volume_max &&\n numberToHumanStyle(volume_max, volume_max === 2500000 ? 1 : 0)}\n </div>\n );\n },\n },\n {\n title: t(\"portfolio.feeTier.column.maker\"),\n dataIndex: \"maker_fee\",\n align: \"right\",\n width: 100,\n },\n {\n title: t(\"portfolio.feeTier.column.taker\"),\n dataIndex: \"taker_fee\",\n align: \"right\",\n width: 100,\n },\n ];\n }, [t]);\n};\n","import type { FeeDataType } from \"./feeTier.script\";\n\nexport const dataSource: FeeDataType[] = [\n {\n tier: 1,\n volume_min: 0,\n volume_max: 500000,\n maker_fee: \"0.025%\",\n taker_fee: \"0.04%\",\n },\n {\n tier: 2,\n volume_min: 500000,\n volume_max: 1000000,\n maker_fee: \"0.02%\",\n taker_fee: \"0.035%\",\n },\n {\n tier: 3,\n volume_min: 1000000,\n volume_max: 5000000,\n maker_fee: \"0.018%\",\n taker_fee: \"0.03%\",\n },\n {\n tier: 4,\n volume_min: 5000000,\n volume_max: 20000000,\n maker_fee: \"0.012%\",\n taker_fee: \"0.025%\",\n },\n {\n tier: 5,\n volume_min: 20000000,\n volume_max: 50000000,\n or: \"/\",\n maker_fee: \"0.009%\",\n taker_fee: \"0.022%\",\n },\n {\n tier: 6,\n volume_min: 50000000,\n volume_max: 100000000,\n or: \"/\",\n maker_fee: \"0.005%\",\n taker_fee: \"0.018%\",\n },\n {\n tier: 7,\n volume_min: 100000000,\n volume_max: undefined,\n or: \"/\",\n maker_fee: \"0%\",\n taker_fee: \"0.015%\",\n },\n];\n","import { useMemo, useState, useRef } from \"react\";\nimport React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Flex,\n Text,\n Divider,\n Box,\n Tabs,\n TabPanel,\n DataFilter,\n formatAddress,\n Tooltip,\n InfoCircleIcon,\n Button,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n LiquidationWidget,\n PositionHistoryWidget,\n PositionHistoryInstance,\n PositionsProps,\n CombinePositionsWidget,\n PositionsWidget,\n PositionsInstance,\n} from \"@kodiak-finance/orderly-ui-positions\";\nimport type { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport { AccountType } from \"../assets/assetsPage/assets.ui.desktop\";\n\nenum TabsType {\n positions = \"Positions\",\n positionHistory = \"Position history\",\n liquidation = \"Liquidation\",\n}\n\nexport const PositionsPage: React.FC<PositionsProps> = (props) => {\n const [tab, setTab] = useState(TabsType.positions);\n const { t } = useTranslation();\n const { state, isMainAccount } = useAccount();\n\n const subAccounts = state.subAccounts ?? [];\n\n const [selectedAccount, setAccount] = React.useState<string>(AccountType.ALL);\n\n const positionsRef = useRef<PositionsInstance>(null);\n const positionHistoryRef = useRef<PositionHistoryInstance>(null);\n\n const onAccountFilter = React.useCallback(\n (filter: { name: string; value: string }) => {\n const { name, value } = filter;\n if (name === \"account\") {\n setAccount(value);\n }\n },\n [],\n );\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [subAccounts]);\n\n return (\n <Flex\n // p={6}\n direction={\"column\"}\n itemAlign={\"start\"}\n gap={4}\n width=\"100%\"\n height=\"100%\"\n >\n <Flex width=\"100%\" justify=\"between\">\n <Text size=\"lg\">{t(\"common.positions\")}</Text>\n <Button color=\"gray\" size=\"sm\" className=\"oui-bg-base-4\" disabled>\n Export to CSV\n </Button>\n </Flex>\n <Divider className=\"oui-w-full\" />\n {/* 26(title height) + 1(divider) + 32 (padding) */}\n <Box width=\"100%\" className=\"oui-h-[calc(100%_-_59px)]\">\n <Tabs\n value={tab}\n onValueChange={(e) => setTab(e as any)}\n classNames={{\n tabsList: \"!oui-border-none oui-pb-1\",\n tabsContent: \"oui-h-[calc(100%_-_28px)]\",\n trigger: \"oui-group\",\n }}\n className=\"oui-h-full\"\n >\n <TabPanel value={TabsType.positions} title={t(\"common.positions\")}>\n <Flex direction=\"column\" gap={3} width=\"100%\" height=\"100%\">\n {isMainAccount ? (\n <>\n <DataFilter\n onFilter={onAccountFilter}\n items={[\n {\n type: \"select\",\n name: \"account\",\n value: selectedAccount,\n options: memoizedOptions,\n },\n ]}\n />\n <CombinePositionsWidget\n ref={positionsRef}\n selectedAccount={selectedAccount}\n {...props}\n />\n </>\n ) : (\n <PositionsWidget\n ref={positionsRef}\n {...props}\n enableSortingStorage={false}\n />\n )}\n </Flex>\n </TabPanel>\n <TabPanel\n value={TabsType.positionHistory}\n title={t(\"positions.positionHistory\")}\n >\n <Flex direction=\"column\" gap={3} width=\"100%\" height=\"100%\">\n <PositionHistoryWidget\n ref={positionHistoryRef}\n {...props}\n enableSortingStorage={false}\n />\n </Flex>\n </TabPanel>\n <TabPanel value={TabsType.liquidation} title={<LiquidationTab />}>\n <LiquidationWidget />\n </TabPanel>\n </Tabs>\n </Box>\n </Flex>\n );\n};\n\nconst LiquidationTab: React.FC = () => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-space-x-1\">\n <span>{t(\"positions.liquidation\")}</span>\n <Tooltip\n className=\"oui-max-w-[275px] oui-bg-base-6\"\n content={\n <div>\n <div className=\"oui-text-pretty\">\n {t(\"positions.Liquidation.tooltip.liquidation\")}\n </div>\n <div>\n <a\n href=\"https://orderly.network/docs/introduction/trade-on-orderly/perpetual-futures/liquidations\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"oui-text-primary\"\n >\n {t(\"positions.Liquidation.tooltip.viewMore\")}\n </a>\n </div>\n </div>\n }\n arrow={{\n className: \"oui-fill-base-6\",\n }}\n >\n <button className=\"oui-hidden group-data-[state=active]:oui-block\">\n <InfoCircleIcon />\n </button>\n </Tooltip>\n </div>\n );\n};\n","import { FC, SVGProps, useRef } from \"react\";\nimport React from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Button,\n Divider,\n Flex,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n OrderListInstance,\n OrdersWidget,\n} from \"@kodiak-finance/orderly-ui-orders\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\n\nexport const OrdersPage: React.FC<{ sharePnLConfig?: SharePnLConfig }> = (\n props,\n) => {\n const { sharePnLConfig } = props;\n const { t } = useTranslation();\n\n const ordersRef = useRef<OrderListInstance>(null);\n\n return (\n <Flex\n // p={6}\n direction={\"column\"}\n itemAlign={\"start\"}\n gap={4}\n width=\"100%\"\n height=\"100%\"\n >\n <Flex width=\"100%\" justify=\"between\">\n <Text size=\"lg\">{t(\"common.orders\")}</Text>\n <Tooltip content={t(\"orders.download.tooltip\")}>\n <Button color=\"gray\" size=\"sm\" className=\"oui-bg-base-4\" disabled>\n {t(\"common.download\")}\n <TooltipIcon className=\"oui-text-base-contrast-36 oui-ml-[5px]\" />\n </Button>\n </Tooltip>\n </Flex>\n <Divider className=\"oui-w-full\" />\n {/* 26(title height) + 1(divider) + 32 (padding) */}\n <Box width=\"100%\" className=\"oui-h-[calc(100%_-_59px)]\">\n <OrdersWidget ref={ordersRef} sharePnLConfig={sharePnLConfig} />\n </Box>\n </Flex>\n );\n};\n\nconst TooltipIcon = React.forwardRef<SVGSVGElement, SVGProps<SVGSVGElement>>(\n (props, ref) => {\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n ref={ref}\n {...props}\n >\n <path d=\"M5.999 1.007a5 5 0 1 0 0 10 5 5 0 0 0 0-10m0 2.5a.5.5 0 1 1 0 1 .5.5 0 0 1 0-1m0 1.5a.5.5 0 0 1 .5.5v2.5a.5.5 0 0 1-1 0v-2.5a.5.5 0 0 1 .5-.5\" />\n </svg>\n );\n },\n);\n","export { APIManagerWidget } from \"./apiManager.widget\";\nexport { APIManagerPage } from \"./apiManager.page\";\n","import { APIManager } from \"./apiManager.ui\";\nimport { useApiManagerScript } from \"./apiManager.script\";\n\n\nexport const APIManagerWidget = (props?: {\n filterTags?: [string];\n keyStatus?: string;\n}) => {\n const state = useApiManagerScript(props);\n return <APIManager {...state} />;\n};\n","import { APIManagerWidget } from \"./apiManager.widget\";\n\n/**\n * API key manager page\n * @param filterTags filterTags\n * @param keyStatus filterTags default is \"ACTIVE\"\n * @returns\n */\nexport const APIManagerPage = (props: {\n filterTags?: [string];\n keyStatus?: string;\n}) => {\n const { filterTags, keyStatus = \"ACTIVE\" } = props;\n return <APIManagerWidget filterTags={filterTags} keyStatus={keyStatus}/>;\n};\n","export { SettingWidget } from \"./setting.widget\";\nexport { SettingPage } from \"./setting.page\";\n","import { useEffect, useState } from \"react\";\nimport {\n useAccount,\n useAccountInfo,\n useDebouncedCallback,\n useMutation,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\n\nexport type SettingScriptReturns = {\n maintenance_cancel_orders?: boolean;\n setMaintainConfig: (maintenance_cancel_order_flag: boolean) => void;\n isSetting: boolean;\n canTouch: boolean;\n};\n\nexport const useSettingScript = (): SettingScriptReturns => {\n const { data, mutate: refresh } = useAccountInfo();\n const { wrongNetwork, disabledConnect } = useAppContext();\n const [update, { isMutating }] = useMutation(\"/v1/client/maintenance_config\");\n const [checked, setChecked] = useState(false);\n\n useEffect(() => {\n setChecked(data?.maintenance_cancel_orders || false);\n }, [data]);\n\n const updateCheckState = useDebouncedCallback((value: boolean) => {\n // if (value === data?.maintenance_cancel_orders) return;\n update({\n maintenance_cancel_order_flag: value,\n }).then((data) => {\n if (data.success) {\n toast.success(value ? \"Opened\" : \"Closed\");\n } else {\n setChecked(!value);\n }\n });\n }, 300);\n\n const setMaintainConfig = (maintenance_cancel_order_flag: boolean) => {\n setChecked(maintenance_cancel_order_flag);\n updateCheckState(maintenance_cancel_order_flag);\n };\n const { state } = useAccount();\n\n const canTouch =\n !wrongNetwork &&\n !disabledConnect &&\n (state.status === AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n return {\n maintenance_cancel_orders: checked, //data?.maintenance_cancel_orders,\n setMaintainConfig,\n isSetting: false,\n canTouch,\n };\n};\n","import { FC } from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { SettingScriptReturns } from \"./setting.script\";\nimport { SettingDesktop } from \"./setting.ui.desktop\";\nimport { SettingMobile } from \"./setting.ui.mobile\";\n\nexport const Setting: FC<SettingScriptReturns> = (props) => {\n const { isMobile } = useScreen();\n if (isMobile) {\n return (\n <div className=\"oui-px-3\">\n <SettingMobile {...props} />\n </div>\n );\n }\n return <SettingDesktop {...props} />;\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Card, Flex, Switch, Text } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardTooltip } from \"@kodiak-finance/orderly-ui-connector\";\nimport type { SettingScriptReturns } from \"./setting.script\";\n\nexport const SettingDesktop: FC<SettingScriptReturns> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Card\n title={t(\"portfolio.setting.systemUpgrade\")}\n id=\"portfolio-apikey-manager\"\n className=\"oui-bg-base-9 oui-font-semibold\"\n >\n <Flex\n direction={\"row\"}\n gap={4}\n width={\"100%\"}\n itemAlign={\"center\"}\n pt={4}\n className=\"oui-border-t-2 oui-border-line-6 oui-font-semibold\"\n >\n <Flex direction={\"column\"} itemAlign={\"start\"} className=\"oui-flex-1\">\n <Text intensity={80} size=\"base\">\n {t(\"portfolio.setting.cancelOpenOrders\")}\n </Text>\n <Text intensity={54} size=\"sm\">\n {t(\"portfolio.setting.cancelOpenOrders.description\")}\n </Text>\n </Flex>\n\n <AuthGuardTooltip align=\"end\">\n <Switch\n checked={props.maintenance_cancel_orders}\n onCheckedChange={(e) => {\n props.setMaintainConfig(e);\n }}\n disabled={props.isSetting || !props.canTouch}\n data-testid=\"oui-testid-setting-switch-btn\"\n />\n </AuthGuardTooltip>\n </Flex>\n </Card>\n );\n};\n","import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Card,\n Flex,\n Switch,\n Text,\n ChevronRightIcon,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardTooltip } from \"@kodiak-finance/orderly-ui-connector\";\nimport { LanguageSwitcherWidget } from \"@kodiak-finance/orderly-ui-scaffold\";\nimport type { SettingScriptReturns } from \"./setting.script\";\n\nexport const SettingMobile: FC<SettingScriptReturns> = (props) => {\n const { t } = useTranslation();\n const [open, setOpen] = useState<boolean>(false);\n const onLanguageChange = () => {\n setOpen(true);\n };\n\n return (\n <>\n <Flex mt={1} mb={2} p={4} intensity={900} r=\"xl\" itemAlign=\"center\">\n <LanguageSwitcherWidget open={open} onOpenChange={setOpen} />\n <Flex\n className=\"oui-cursor-pointer\"\n itemAlign=\"center\"\n width=\"100%\"\n onClick={onLanguageChange}\n >\n <Text\n size=\"base\"\n weight=\"semibold\"\n intensity={80}\n className=\"oui-ml-2\"\n >\n {t(\"languageSwitcher.language\")}\n </Text>\n <ChevronRightIcon\n size={18}\n className=\"oui-ml-auto oui-text-base-contrast-36\"\n />\n </Flex>\n </Flex>\n\n <Card\n // @ts-ignore\n title={\n <div className=\"oui-text-sm\">\n {t(\"portfolio.setting.systemUpgrade\")}\n </div>\n }\n id=\"portfolio-apikey-manager\"\n className=\"oui-bg-base-9 oui-font-semibold\"\n classNames={{ root: \"oui-p-4\", content: \"!oui-pt-3\" }}\n >\n <Flex\n direction={\"row\"}\n gap={4}\n width={\"100%\"}\n itemAlign={\"center\"}\n pt={3}\n className=\"oui-font-semibold oui-border-t-2 oui-border-line-6\"\n >\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-flex-1 oui-gap-2\"\n >\n <Text intensity={80} size=\"xs\">\n {t(\"portfolio.setting.cancelOpenOrders\")}\n </Text>\n <Text intensity={36} size=\"2xs\" className=\"oui-font-normal\">\n {t(\"portfolio.setting.cancelOpenOrders.description\")}\n </Text>\n <AuthGuardTooltip>\n <Switch\n className=\"oui-mt-1\"\n checked={props.maintenance_cancel_orders}\n onCheckedChange={(e) => {\n props.setMaintainConfig(e);\n }}\n disabled={props.isSetting || !props.canTouch}\n data-testid=\"oui-testid-setting-switch-btn\"\n />\n </AuthGuardTooltip>\n </Flex>\n </Flex>\n </Card>\n </>\n );\n};\n","import React from \"react\";\nimport { useSettingScript } from \"./setting.script\";\nimport { Setting } from \"./setting.ui\";\n\nexport const SettingWidget: React.FC = () => {\n const state = useSettingScript();\n return <Setting {...state} />;\n};\n","import React from \"react\";\nimport { SettingWidget } from \"./setting.widget\";\n\nexport const SettingPage: React.FC = () => {\n return <SettingWidget />;\n};\n","export { AssetsPage } from \"./page\";\nexport {\n AssetsWidget,\n AssetsDataTableWidget,\n} from \"./assetsPage/assets.widget\";\nexport type { AssetsWidgetProps } from \"./assetsPage/assets.widget\";\nexport { AssetsTable, AssetsDataTable } from \"./assetsPage/assets.ui.desktop\";\nexport { AssetsTableMobile } from \"./assetsPage/assets.ui.mobile\";\n","import React from \"react\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useAssetsScript } from \"./assets.script\";\nimport type { useAssetsScriptReturn } from \"./assets.script\";\nimport { AssetsDataTable, AssetsTable } from \"./assets.ui.desktop\";\nimport { AssetsTableMobile } from \"./assets.ui.mobile\";\n\nexport type AssetsWidgetProps = useAssetsScriptReturn;\n\nexport const AssetsDataTableWidget: React.FC = () => {\n const assetsState = useAssetsScript();\n const accountState = useAccount();\n return <AssetsDataTable {...assetsState} {...accountState} />;\n};\n\nexport const AssetsWidget: React.FC = () => {\n const assetsState = useAssetsScript();\n const accountState = useAccount();\n const { isMobile } = useScreen();\n if (isMobile) {\n return <AssetsTableMobile {...assetsState} {...accountState} />;\n }\n return <AssetsTable {...assetsState} {...accountState} />;\n};\n","import { useCallback, useEffect, useMemo } from \"react\";\nimport {\n useAccount,\n useCollateral,\n useLocalStorage,\n useIndexPricesStream,\n useTokensInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { account } from \"@kodiak-finance/orderly-perp\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport {\n DepositAndWithdrawWithDialogId,\n TransferDialogId,\n} from \"@kodiak-finance/orderly-ui-transfer\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\nimport { useAccountsData, useAssetsMultiFilter } from \"../../../hooks\";\nimport { useAssetTotalValue } from \"../../../hooks/useAssetTotalValue\";\nimport { ORDERLY_ASSETS_VISIBLE_KEY } from \"../type\";\nimport { useAssetsColumns } from \"./assets.column\";\n\nexport const useAssetsScript = () => {\n const [visible, setVisible] = useLocalStorage<boolean>(\n ORDERLY_ASSETS_VISIBLE_KEY,\n true,\n );\n\n const { state, subAccount, isMainAccount } = useAccount();\n const { holding = [] } = useCollateral();\n const { getIndexPrice } = useIndexPricesStream();\n\n const tokensInfo = useTokensInfo();\n\n const subAccounts = state.subAccounts ?? [];\n\n useEffect(() => {\n if (holding.length > 0) {\n subAccount.refresh();\n }\n }, [holding]);\n\n // Use the extracted total value hook\n const totalValue = useAssetTotalValue();\n\n const toggleVisible = () => {\n // @ts-ignore\n setVisible((visible: boolean) => !visible);\n };\n\n const assetsOptions = useMemo(() => {\n return tokensInfo?.map((item) => ({\n label: item.token,\n value: item.token,\n }));\n }, [tokensInfo]);\n\n // Use the extracted accounts data hook\n const allAccounts = useAccountsData();\n\n // Use the extracted account and asset filter hook\n const {\n selectedAccount,\n selectedAsset,\n filteredData: filtered,\n onFilter,\n } = useAssetsMultiFilter(allAccounts);\n\n // Enhanced filtered data with additional calculations for children\n const enhancedFiltered = useMemo(() => {\n return filtered.map((accountData) => {\n // Enhance each child (holding) with calculated fields\n const enhancedChildren =\n accountData.children?.map((holding) => {\n const tokenInfo = tokensInfo?.find(\n (item) => item.token === holding.token,\n );\n\n // Use extracted function for index price calculation\n const indexPrice = getIndexPrice(holding.token);\n\n // Use extracted function for asset value calculation\n const assetValue = new Decimal(holding.holding)\n .mul(indexPrice)\n .toNumber();\n\n // Calculate collateral ratio for this token\n const collateralRatio = tokenInfo\n ? account.collateralRatio({\n baseWeight: tokenInfo.base_weight ?? 0,\n discountFactor: tokenInfo.discount_factor ?? 0,\n collateralQty: holding.holding,\n collateralCap: tokenInfo?.user_max_qty ?? holding.holding,\n indexPrice: indexPrice,\n })\n : zero;\n\n // Calculate collateral contribution for this token\n const collateralContribution = account.collateralContribution({\n collateralQty: holding.holding,\n collateralCap: tokenInfo?.user_max_qty ?? holding.holding,\n collateralRatio: collateralRatio.toNumber(),\n indexPrice: indexPrice,\n });\n\n return {\n ...holding,\n indexPrice,\n assetValue,\n collateralRatio,\n collateralContribution,\n };\n }) || [];\n\n return {\n ...accountData,\n children: enhancedChildren,\n };\n });\n }, [filtered, getIndexPrice, tokensInfo]);\n\n const handleTransfer = useCallback((accountId: string, token: string) => {\n if (!accountId) {\n return;\n }\n modal.show(TransferDialogId, {\n toAccountId: accountId,\n token,\n });\n }, []);\n\n const handleConvert = (accountId: string, token: string) => {\n modal.show(\"ConvertDialogId\", {\n accountId,\n token,\n });\n };\n\n const showTransfer = isMainAccount ? subAccounts.length > 0 : true;\n\n const assetsColumns = useAssetsColumns({\n onTransfer: showTransfer ? handleTransfer : undefined,\n onConvert: handleConvert,\n });\n\n const openDepositAndWithdraw = useCallback(\n (viewName: \"deposit\" | \"withdraw\") => {\n modal.show(DepositAndWithdrawWithDialogId, {\n activeTab: viewName,\n });\n },\n [],\n );\n\n const onDeposit = useCallback(() => {\n openDepositAndWithdraw(\"deposit\");\n }, []);\n\n const onWithdraw = useCallback(() => {\n openDepositAndWithdraw(\"withdraw\");\n }, []);\n\n return {\n columns: assetsColumns,\n dataSource: enhancedFiltered, // Use enhanced filtered data with calculated children\n visible: visible as boolean,\n onToggleVisibility: toggleVisible,\n selectedAccount,\n selectedAsset,\n onFilter,\n totalValue,\n hasSubAccount: subAccounts.length > 0,\n onDeposit,\n onWithdraw,\n holding,\n assetsOptions: assetsOptions ?? EMPTY_LIST,\n };\n};\n\nexport type useAssetsScriptReturn = ReturnType<typeof useAssetsScript> &\n ReturnType<typeof useAccount>;\n","import React from \"react\";\nimport { useTokensInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useWalletConnector } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport { Button, Flex, Text, TokenIcon } from \"@kodiak-finance/orderly-ui\";\nimport type { Column } from \"@kodiak-finance/orderly-ui\";\n\nexport interface ColumnsOptions {\n onTransfer?: (accountId: string, token: string) => void;\n onConvert?: (accountId: string, token: string) => void;\n}\n\n// Define the enhanced holding interface with calculated fields\ninterface EnhancedHolding {\n token: string;\n holding: number;\n indexPrice: number;\n assetValue: number;\n collateralRatio: number;\n collateralContribution: number;\n account_id: string;\n}\n\nexport const useAssetsColumns = (options: ColumnsOptions) => {\n const { t } = useTranslation();\n const tokensInfo = useTokensInfo();\n const { namespace } = useWalletConnector();\n const { onTransfer, onConvert } = options;\n const columns = React.useMemo<Column[]>(() => {\n return [\n {\n title: t(\"portfolio.overview.column.token\"),\n dataIndex: \"token\",\n align: \"left\",\n width: 150,\n render(val: string) {\n return (\n <Flex itemAlign=\"center\" gap={2}>\n <TokenIcon name={val} />\n {val}\n </Flex>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.qty\"),\n dataIndex: \"holding\",\n align: \"left\",\n width: 140,\n render(val: number, record) {\n const findToken = tokensInfo?.find(\n ({ token }) => token === record.token,\n );\n return (\n <Text.numeral dp={findToken?.decimals ?? 6} padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.indexPrice\"),\n dataIndex: \"indexPrice\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral rule=\"price\" dp={6} currency=\"$\" padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.assetValue\"),\n dataIndex: \"assetValue\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral rule=\"price\" dp={6} currency=\"$\" padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"portfolio.overview.column.collateralRatio\"),\n dataIndex: \"collateralRatio\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral dp={2} suffix=\"%\">\n {val * 100}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"transfer.deposit.collateralContribution\"),\n dataIndex: \"collateralContribution\",\n align: \"left\",\n width: 140,\n render(val: number) {\n return (\n <Text.numeral rule=\"price\" dp={6} currency=\"$\" padding={false}>\n {val}\n </Text.numeral>\n );\n },\n },\n {\n title: null,\n dataIndex: \"account_id\",\n align: \"center\",\n width: 180,\n render(id: string, record: EnhancedHolding) {\n const { token } = record;\n return (\n <Flex itemAlign=\"center\" justify=\"end\" gap={3}>\n {token !== \"USDC\" &&\n namespace !== ChainNamespace.solana &&\n typeof onConvert === \"function\" && (\n <Button\n size={\"sm\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={() => onConvert?.(id, token)}\n >\n {t(\"transfer.convert\")}\n </Button>\n )}\n {typeof onTransfer === \"function\" && (\n <Button\n size={\"sm\"}\n variant={\"outlined\"}\n color={\"secondary\"}\n onClick={() => onTransfer?.(id, token)}\n >\n {t(\"common.transfer\")}\n </Button>\n )}\n </Flex>\n );\n },\n },\n ];\n }, [t, tokensInfo, onTransfer, onConvert, namespace]);\n return columns;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { useMemo } from \"react\";\nimport { useWalletConnector } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n cn,\n TokenIcon,\n Text,\n formatAddress,\n DataFilter,\n modal,\n Flex,\n} from \"@kodiak-finance/orderly-ui\";\nimport { SelectOption } from \"@kodiak-finance/orderly-ui/src/select/withOptions\";\nimport type { useAssetsScriptReturn } from \"./assets.script\";\nimport { AccountType } from \"./assets.ui.desktop\";\n\nconst AccountTag: React.FC<{ name: string }> = ({ name }) => {\n return (\n <div className=\"oui-mt-2 oui-flex oui-h-[18px] oui-w-fit oui-items-center oui-rounded oui-bg-white/[0.06] oui-px-2 oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {name}\n </div>\n );\n};\n\ntype AssetMobileItemProps = {\n item: any;\n};\n\nconst AssetMobileItem: React.FC<AssetMobileItemProps> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n const { namespace } = useWalletConnector();\n return (\n <div className=\"oui-flex oui-flex-col oui-gap-2 oui-rounded-xl oui-bg-base-9 oui-p-2\">\n <Flex\n width={\"100%\"}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-gap-x-0.5\"\n >\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"common.token\")}\n </div>\n <Flex\n gap={1}\n justify={\"start\"}\n itemAlign={\"center\"}\n className=\"oui-text-xs oui-font-semibold oui-text-base-contrast-80\"\n >\n <TokenIcon name={item.token} size=\"2xs\" />\n {item.token}\n </Flex>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"common.qty\")}\n </div>\n <Text.numeral\n className=\"oui-truncate\"\n size=\"xs\"\n dp={6}\n padding={false}\n >\n {item.holding}\n </Text.numeral>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-w-full oui-text-end oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"common.indexPrice\")}\n </div>\n <Flex\n gap={1}\n width={\"100%\"}\n justify={\"end\"}\n itemAlign={\"center\"}\n className=\"oui-text-end oui-font-semibold oui-text-base-contrast-80\"\n >\n <Text.numeral\n size=\"xs\"\n rule=\"price\"\n dp={6}\n currency=\"$\"\n padding={false}\n >\n {item.indexPrice}\n </Text.numeral>\n <div className=\"oui-text-end oui-text-2xs oui-text-base-contrast-36\">\n USDC\n </div>\n </Flex>\n </Flex>\n </Flex>\n <Flex\n width={\"100%\"}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-gap-x-0.5\"\n >\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"portfolio.overview.column.assetValue\")}\n </div>\n <Text.numeral\n size=\"xs\"\n intensity={80}\n className=\"oui-truncate oui-font-semibold\"\n rule=\"price\"\n dp={6}\n currency=\"$\"\n padding={false}\n >\n {item.assetValue}\n </Text.numeral>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"portfolio.overview.column.collateralRatio\")}\n </div>\n <Text.numeral size=\"xs\" dp={2} suffix=\"%\">\n {item.collateralRatio * 100}\n </Text.numeral>\n </Flex>\n <Flex\n className=\"oui-w-1/3 oui-truncate\"\n itemAlign={\"start\"}\n direction={\"column\"}\n >\n <div className=\"oui-w-full oui-text-end oui-text-2xs oui-font-semibold oui-text-base-contrast-36\">\n {t(\"transfer.deposit.collateralContribution\")}\n </div>\n <Flex\n gap={1}\n width={\"100%\"}\n justify={\"end\"}\n itemAlign={\"center\"}\n className=\"oui-text-end oui-font-semibold oui-text-base-contrast-80\"\n >\n <Text.numeral\n size=\"xs\"\n rule=\"price\"\n dp={6}\n currency=\"$\"\n padding={false}\n >\n {item.collateralContribution}\n </Text.numeral>\n <div className=\"oui-text-end oui-text-2xs oui-text-base-contrast-36\">\n USDC\n </div>\n </Flex>\n </Flex>\n </Flex>\n <Flex justify={\"between\"} itemAlign={\"center\"} gap={2}>\n {item.token !== \"USDC\" && namespace !== ChainNamespace.solana && (\n <Button\n fullWidth\n variant=\"outlined\"\n size=\"sm\"\n color=\"gray\"\n onClick={() => {\n modal.show(\"ConvertSheetId\", {\n accountId: item.account_id,\n token: item.token,\n });\n }}\n className={cn(\n \"oui-flex-1 oui-border-white/[0.36] oui-text-base-contrast-54\",\n )}\n >\n {t(\"transfer.convert\")}\n </Button>\n )}\n <Button\n fullWidth\n variant=\"outlined\"\n size=\"sm\"\n color=\"gray\"\n onClick={() => {\n modal.show(\"TransferSheetId\", {\n accountId: item.account_id,\n token: item.token,\n });\n }}\n className={cn(\n \"oui-flex-1 oui-border-white/[0.36] oui-text-base-contrast-54\",\n )}\n >\n {t(\"common.transfer\")}\n </Button>\n </Flex>\n </div>\n );\n};\n\nexport const AssetsTableMobile: React.FC<useAssetsScriptReturn> = (props) => {\n const { t } = useTranslation();\n\n const {\n assetsOptions,\n state,\n isMainAccount,\n dataSource,\n selectedAccount,\n selectedAsset,\n onFilter,\n } = props;\n\n const subAccounts = state.subAccounts ?? [];\n\n const ALL_ACCOUNTS: SelectOption = {\n label: t(\"common.allAccount\"),\n value: AccountType.ALL,\n };\n\n const MAIN_ACCOUNT: SelectOption = {\n label: t(\"common.mainAccount\"),\n value: AccountType.MAIN,\n };\n\n const ALL_ASSETS: SelectOption = {\n label: \"All assets\",\n value: \"all\",\n };\n\n const memoizedOptions = useMemo(() => {\n if (Array.isArray(subAccounts) && subAccounts.length) {\n return [\n ALL_ACCOUNTS,\n MAIN_ACCOUNT,\n ...subAccounts.map<SelectOption>((value) => ({\n value: value.id,\n label: value?.description || formatAddress(value?.id),\n })),\n ];\n }\n return [ALL_ACCOUNTS, MAIN_ACCOUNT];\n }, [subAccounts]);\n\n // Create asset options from holding data - optimized and consistent with desktop\n const memoizedAssets = useMemo(() => {\n return [ALL_ASSETS, ...assetsOptions];\n }, [assetsOptions]);\n\n return (\n <div className={cn(\"oui-flex oui-flex-col oui-gap-1 oui-px-1 oui-pb-4\")}>\n {isMainAccount && (\n <DataFilter\n onFilter={onFilter}\n className=\"oui-border-none oui-py-2\"\n items={[\n {\n size: \"sm\",\n type: \"picker\",\n name: \"account\",\n value: selectedAccount,\n options: memoizedOptions,\n },\n {\n size: \"sm\",\n type: \"picker\",\n name: \"asset\",\n value: selectedAsset,\n options: memoizedAssets,\n },\n ]}\n />\n )}\n <div className=\"oui-flex oui-flex-col oui-gap-1\">\n {dataSource.map((assets, index) => {\n return (\n <React.Fragment key={`item-${index}`}>\n <AccountTag name={assets.description ?? \"sub account\"} />\n {Array.isArray(assets.children) &&\n assets.children.map((child) => (\n <AssetMobileItem\n item={child}\n key={`${child.token}-${child.account_id}`}\n />\n ))}\n </React.Fragment>\n );\n })}\n </div>\n </div>\n );\n};\n","import React from \"react\";\nimport { AssetsWidget } from \"./assetsPage/assets.widget\";\nimport type { AssetsWidgetProps } from \"./assetsPage/assets.widget\";\n\nexport type AssetsPageProps = AssetsWidgetProps;\n\nexport const AssetsPage: React.FC = () => {\n return <AssetsWidget />;\n};\n","export { HistoryPage } from \"./history.page\";\nexport { HistoryWidget } from \"./history.page\";\n","import React from \"react\";\nimport { HistoryDataGroupWidget } from \"../overview/historyDataGroup\";\n\nexport const HistoryWidget: React.FC = () => {\n return <HistoryDataGroupWidget />;\n};\n\nexport const HistoryPage: React.FC = () => {\n return <HistoryDataGroupWidget />;\n};\n","export { SymbolPerformancePage } from \"./page\";\nexport { SymbolPerformanceWidget } from \"./symbolPerformance.widget\";\nexport { SymbolPerformanceUI } from \"./symbolPerformance.ui\";\nexport { useSymbolPerformanceScript } from \"./symbolPerformance.script\";\nexport type {\n UseSymbolPerformanceScriptReturn,\n Timeframe,\n} from \"./symbolPerformance.script\";\n","import React from \"react\";\nimport { Box } from \"@kodiak-finance/orderly-ui\";\nimport { SymbolPerformanceWidget } from \"./symbolPerformance.widget\";\n\nexport const SymbolPerformancePage: React.FC = () => {\n return (\n <Box\n p={6}\n pb={0}\n intensity={900}\n r=\"xl\"\n width=\"100%\"\n style={{\n minHeight: 379,\n maxHeight: 2560,\n overflow: \"auto\",\n }}\n >\n <SymbolPerformanceWidget />\n </Box>\n );\n};\n","import React from \"react\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { useSymbolPerformanceScript } from \"./symbolPerformance.script\";\nimport { SymbolPerformanceUI } from \"./symbolPerformance.ui\";\nimport { SymbolPerformanceUIMobile } from \"./symbolPerformance.ui.mobile\";\n\nexport const SymbolPerformanceWidget: React.FC<{ symbol?: string }> = ({\n symbol,\n}) => {\n const { isMobile } = useScreen();\n const state = useSymbolPerformanceScript(symbol);\n\n if (isMobile) {\n return <SymbolPerformanceUIMobile {...state} />;\n }\n\n return <SymbolPerformanceUI {...state} />;\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays, subDays, addDays, format, endOfDay } from \"date-fns\";\nimport { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { useAppContext } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useSymbolPerformanceData } from \"./useSymbolPerformanceData\";\nimport { useTrades } from \"./useTrades\";\n\nexport enum PeriodType {\n DAY = \"1D\",\n WEEK = \"7D\",\n MONTH = \"30D\",\n QUARTER = \"90D\",\n}\n\nexport enum AggregationWindow {\n FIFTEEN_MIN = \"15m\",\n HOURLY = \"1h\",\n DAILY = \"1d\",\n}\n\nexport type Timeframe = \"1D\" | \"7D\" | \"30D\" | \"90D\" | \"ALL\";\n\n/**\n * Number of days in each preset period.\n * DAY = 2 means \"today and yesterday\" (inclusive range)\n */\nconst PRESET_DAYS = {\n [PeriodType.DAY]: 2,\n [PeriodType.WEEK]: 7,\n [PeriodType.MONTH]: 30,\n [PeriodType.QUARTER]: 90,\n} as const;\n\nconst getDateRange = (period: PeriodType | number, today: Date) => {\n const offsetDay = typeof period === \"number\" ? period : PRESET_DAYS[period];\n return {\n from: subDays(today, offsetDay - 1),\n to: today,\n };\n};\n\nconst formatDateOnly = (date: Date): string => {\n return date.toISOString().split(\"T\")[0];\n};\n\nconst formatDateRange = (date?: Date) => {\n if (typeof date === \"undefined\") return undefined;\n return format(date, \"yyyy-MM-dd\");\n};\n\n/**\n * Normalize a date to UTC midnight to prevent timezone-related date shifting.\n * Extracts the date components and reconstructs as UTC to ensure consistency\n * across different timezones.\n *\n * @example\n * // Input: Nov 19 2025 00:00:00 GMT+0100 (which is Nov 18 23:00:00 UTC)\n * // Output: Nov 19 2025 00:00:00 UTC\n *\n * @param date - Date to normalize\n * @returns Date at midnight UTC with same calendar date\n */\nconst normalizeDateToUTC = (date: Date): Date => {\n const dateStr = format(date, \"yyyy-MM-dd\");\n const [year, month, day] = dateStr.split(\"-\").map(Number);\n return new Date(Date.UTC(year, month - 1, day));\n};\n\nexport const useSymbolPerformanceScript = (symbol?: string) => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n const [selectedSymbol, setSelectedSymbol] = useState<string>(\n symbol || \"ALL_SYMBOLS\",\n );\n const [aggregationWindow, setAggregationWindow] = useState<AggregationWindow>(\n AggregationWindow.DAILY,\n );\n const [isNetPnL, setIsNetPnL] = useState(false); // Toggle: Net P&L (fees deducted) vs Gross P&L (default)\n const [today] = useState(() => new Date());\n const [period, setPeriod] = useState<PeriodType | null>(PeriodType.WEEK);\n\n const [dateRange, setDateRange] = useState<{ from: Date; to: Date }>(() => {\n const range = getDateRange(PeriodType.WEEK, today);\n return {\n from: normalizeDateToUTC(range.from),\n to: normalizeDateToUTC(range.to),\n };\n });\n\n const onPeriodChange = (value: PeriodType) => {\n const newRange = getDateRange(value, today);\n setPeriod(value);\n setDateRange({\n from: normalizeDateToUTC(newRange.from),\n to: normalizeDateToUTC(newRange.to),\n });\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = filter.value;\n\n // Normalize dates to UTC to avoid timezone issues\n const normalizedRange = {\n from: normalizeDateToUTC(newDateRange.from),\n to: normalizeDateToUTC(newDateRange.to),\n };\n\n setDateRange(normalizedRange);\n\n if (normalizedRange.from && normalizedRange.to) {\n const offsetDay =\n Math.abs(differenceInDays(normalizedRange.from, normalizedRange.to)) +\n 1;\n\n const range = getDateRange(offsetDay, today);\n const normalizedRangeForComparison = {\n from: normalizeDateToUTC(range.from),\n to: normalizeDateToUTC(range.to),\n };\n\n if (\n formatDateRange(normalizedRangeForComparison.from) ===\n formatDateRange(normalizedRange.from) &&\n formatDateRange(normalizedRangeForComparison.to) ===\n formatDateRange(normalizedRange.to)\n ) {\n setPeriod(\n (Object.keys(PRESET_DAYS) as PeriodType[]).find(\n (key) => PRESET_DAYS[key] === offsetDay,\n ) || null,\n );\n } else {\n setPeriod(null);\n }\n }\n }\n };\n\n const startDate = dateRange.from;\n const endDate = dateRange.to;\n\n // Set end date to end of day for API query\n // This ensures we capture all trades up to 23:59:59 UTC of the selected end date\n const endDateForAPI = useMemo(() => {\n if (!endDate) return endDate;\n return endOfDay(endDate);\n }, [endDate]);\n\n const filterItems = useMemo(() => {\n return [\n {\n type: \"range\" as const,\n name: \"dateRange\",\n value: dateRange,\n max: 90,\n },\n ];\n }, [dateRange]);\n\n const { trades, isLoading, error } = useTrades({\n symbol: selectedSymbol === \"ALL_SYMBOLS\" ? undefined : selectedSymbol,\n start_t: startDate ? startDate.getTime() : undefined,\n end_t: endDateForAPI ? endDateForAPI.getTime() : undefined,\n });\n\n // Always calculate actual performance with fees (for stats)\n // The includeFees toggle only affects chart visualization, not stats\n // Use endDateForAPI to ensure all fetched trades are included in aggregation\n const performanceData = useSymbolPerformanceData(\n trades,\n startDate,\n endDateForAPI,\n true,\n );\n\n const invisible =\n wrongNetwork ||\n disabledConnect ||\n (state.status < AccountStatusEnum.EnableTrading &&\n state.status !== AccountStatusEnum.EnableTradingWithoutConnected);\n\n const periodTypes = Object.values(PeriodType);\n const aggregationWindowTypes = Object.values(AggregationWindow);\n\n const getAggregatedData = () => {\n if (!performanceData) return null;\n\n let result;\n switch (aggregationWindow) {\n case AggregationWindow.FIFTEEN_MIN:\n result = {\n periodData: performanceData.fifteenMinuteData,\n cumulativePnL: performanceData.cumulativeFifteenMinutePnL,\n cumulativeFees: performanceData.cumulativeFifteenMinuteFees,\n cumulativeVolume: performanceData.cumulativeFifteenMinuteVolume,\n };\n break;\n case AggregationWindow.HOURLY:\n result = {\n periodData: performanceData.hourlyData,\n cumulativePnL: performanceData.cumulativeHourlyPnL,\n cumulativeFees: performanceData.cumulativeHourlyFees,\n cumulativeVolume: performanceData.cumulativeHourlyVolume,\n };\n break;\n case AggregationWindow.DAILY:\n default:\n result = {\n periodData: performanceData.dailyData,\n cumulativePnL: performanceData.cumulativeDailyPnL,\n cumulativeFees: performanceData.cumulativeDailyFees,\n cumulativeVolume: performanceData.cumulativeDailyVolume,\n };\n }\n\n return result;\n };\n\n return {\n selectedSymbol,\n setSelectedSymbol,\n period,\n onPeriodChange,\n periodTypes,\n aggregationWindow,\n setAggregationWindow,\n aggregationWindowTypes,\n isNetPnL,\n setIsNetPnL,\n dateRange,\n filterItems,\n onFilter,\n trades,\n isLoading,\n error,\n performanceData,\n aggregatedData: getAggregatedData(),\n invisible,\n };\n};\n\nexport type UseSymbolPerformanceScriptReturn = ReturnType<\n typeof useSymbolPerformanceScript\n>;\n","import { useMemo } from \"react\";\nimport { addDays } from \"date-fns\";\nimport type { TradeData } from \"./useTrades\";\n\nexport interface SymbolPerformanceMetrics {\n totalPnL: number;\n grossPnL: number;\n totalVolume: number;\n totalFees: number;\n totalTrades: number;\n makerShare: number;\n // daily data\n dailyData: Array<{ date: string; pnl: number; volume: number; fees: number }>;\n cumulativeDailyPnL: Array<{ date: string; cumulativePnl: number }>;\n cumulativeDailyFees: Array<{ date: string; cumulativeFees: number }>;\n cumulativeDailyVolume: Array<{ date: string; cumulativeVolume: number }>;\n // hourly data\n hourlyData: Array<{\n date: string;\n pnl: number;\n fees: number;\n volume: number;\n }>;\n cumulativeHourlyPnL: Array<{ date: string; cumulativePnl: number }>;\n cumulativeHourlyFees: Array<{ date: string; cumulativeFees: number }>;\n cumulativeHourlyVolume: Array<{ date: string; cumulativeVolume: number }>;\n // 15-minute data\n fifteenMinuteData: Array<{\n date: string;\n pnl: number;\n fees: number;\n volume: number;\n }>;\n cumulativeFifteenMinutePnL: Array<{ date: string; cumulativePnl: number }>;\n cumulativeFifteenMinuteFees: Array<{ date: string; cumulativeFees: number }>;\n cumulativeFifteenMinuteVolume: Array<{\n date: string;\n cumulativeVolume: number;\n }>;\n}\n\n/**\n * Generic function to fill gaps in aggregated time-series data.\n * Ensures complete coverage of the date range with zero values for missing periods.\n *\n * @param dataMap - Map of aggregated data keyed by ISO datetime string\n * @param startDate - Start of the period\n * @param endDate - End of the period\n * @param incrementFn - Function to increment the current date\n * @param getKeyFn - Function to extract the key from current date\n * @returns Array of filled data points\n */\nconst fillTimeSeriesGaps = (\n dataMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n incrementFn: (date: Date) => void,\n getKeyFn: (date: Date) => string,\n) => {\n const filledData: Array<{\n date: string;\n pnl: number;\n volume: number;\n fees: number;\n }> = [];\n\n const current = new Date(startDate);\n current.setUTCHours(0, 0, 0, 0);\n\n while (current <= endDate) {\n const key = getKeyFn(current);\n const data = dataMap.get(key) || {\n pnl: 0,\n volume: 0,\n fees: 0,\n };\n filledData.push({ date: key, ...data });\n incrementFn(current);\n }\n\n return filledData;\n};\n\n// Helper function to fill daily gaps\nconst fillDailyGaps = (\n dailyMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n) => {\n return fillTimeSeriesGaps(\n dailyMap,\n startDate,\n endDate,\n (date) => date.setUTCDate(date.getUTCDate() + 1),\n (date) => date.toISOString().split(\"T\")[0],\n );\n};\n\n// Helper function to fill hourly gaps\nconst fillHourlyGaps = (\n hourlyMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n) => {\n return fillTimeSeriesGaps(\n hourlyMap,\n startDate,\n endDate,\n (date) => date.setUTCHours(date.getUTCHours() + 1),\n (date) => date.toISOString(),\n );\n};\n\n// Helper function to fill 15-minute gaps\nconst fillFifteenMinuteGaps = (\n fifteenMinMap: Map<string, { pnl: number; volume: number; fees: number }>,\n startDate: Date,\n endDate: Date,\n) => {\n return fillTimeSeriesGaps(\n fifteenMinMap,\n startDate,\n endDate,\n (date) => date.setUTCMinutes(date.getUTCMinutes() + 15),\n (date) => date.toISOString(),\n );\n};\n\nexport const useSymbolPerformanceData = (\n tradesData: TradeData[] | null,\n periodStartDate?: Date,\n periodEndDate?: Date,\n includeFees: boolean = true,\n): SymbolPerformanceMetrics | null => {\n return useMemo(() => {\n if (!tradesData || tradesData.length === 0) {\n return null;\n }\n\n // Process trades - each trade already has realized_pnl (which is net, after fees)\n const tradesWithPnL = tradesData.map((trade) => {\n const volume = Math.abs(trade.executed_quantity * trade.executed_price);\n const fees = trade.fee || 0;\n // If includeFees is true: show net PnL (realized_pnl, which already has fees deducted)\n // If includeFees is false: show gross PnL (add fees back to realized_pnl)\n const pnl = includeFees\n ? trade.realized_pnl || 0\n : (trade.realized_pnl || 0) + fees;\n\n return {\n ...trade,\n pnl,\n volume,\n fees,\n date: new Date(trade.executed_timestamp),\n };\n });\n\n // Calculate metrics\n const totalPnL = tradesWithPnL.reduce((sum, trade) => sum + trade.pnl, 0);\n const totalVolume = tradesWithPnL.reduce(\n (sum, trade) => sum + trade.volume,\n 0,\n );\n const totalFees = tradesWithPnL.reduce((sum, trade) => sum + trade.fees, 0);\n const totalTrades = tradesWithPnL.length;\n const grossPnL = totalPnL + totalFees;\n\n // Use provided period dates or fall back to trade dates\n const sortedByDate = [...tradesWithPnL].sort(\n (a, b) => a.date.getTime() - b.date.getTime(),\n );\n const startDate = periodStartDate || sortedByDate[0].date;\n const endDate = periodEndDate || sortedByDate[sortedByDate.length - 1].date;\n\n // Calculate maker volume share\n const makerVolume = tradesData\n .filter((trade) => trade.is_maker === 1)\n .reduce(\n (sum, trade) =>\n sum + Math.abs(trade.executed_quantity * trade.executed_price),\n 0,\n );\n const makerShare = totalVolume > 0 ? (makerVolume / totalVolume) * 100 : 0;\n\n // Group by day for daily PnL, Volume, and Fees\n const dailyPnLMap = new Map<\n string,\n { pnl: number; volume: number; fees: number }\n >();\n tradesWithPnL.forEach((trade) => {\n const dateKey = trade.date.toISOString().split(\"T\")[0];\n const existing = dailyPnLMap.get(dateKey) || {\n pnl: 0,\n volume: 0,\n fees: 0,\n };\n dailyPnLMap.set(dateKey, {\n pnl: existing.pnl + trade.pnl,\n volume: existing.volume + trade.volume,\n fees: existing.fees + trade.fees,\n });\n });\n\n // Fill gaps in daily data\n const dailyData = fillDailyGaps(dailyPnLMap, startDate, endDate);\n\n // Group by hour for hourly PnL and Fees\n const hourlyDataMap = new Map<\n string,\n { pnl: number; fees: number; volume: number }\n >();\n tradesWithPnL.forEach((trade) => {\n // Format: YYYY-MM-DDTHH:00:00.000Z\n // setMinutes(0, 0, 0) normalizes minutes, seconds, and milliseconds to 0\n // This ensures all trades within the same hour share the same key regardless of seconds/milliseconds\n const date = new Date(trade.date);\n date.setUTCMinutes(0, 0, 0);\n const hourKey = date.toISOString();\n const existing = hourlyDataMap.get(hourKey) || {\n pnl: 0,\n fees: 0,\n volume: 0,\n };\n hourlyDataMap.set(hourKey, {\n pnl: existing.pnl + trade.pnl,\n fees: existing.fees + trade.fees,\n volume: existing.volume + trade.volume,\n });\n });\n\n // Check if this is a single-day selection\n const isSingleDay = startDate.getTime() === endDate.getTime();\n\n // Calculate the next calendar day start time (00:00 UTC of the next day)\n const nextDayDate = addDays(startDate, 1);\n const nextDayStartTime = new Date(\n nextDayDate.getUTCFullYear(),\n nextDayDate.getUTCMonth(),\n nextDayDate.getUTCDate(),\n 0,\n 0,\n 0,\n 0,\n ).getTime();\n\n // For single-day: create buckets that span the full calendar day\n // For multi-day: use the provided date range as-is\n const bucketEndDate = isSingleDay ? addDays(startDate, 1) : endDate;\n\n // Fill gaps in hourly data\n let hourlyData = fillHourlyGaps(hourlyDataMap, startDate, bucketEndDate);\n // For single-day selections only, remove any entries from the next day\n if (isSingleDay) {\n hourlyData = hourlyData.filter(\n (item) => new Date(item.date).getTime() < nextDayStartTime,\n );\n }\n\n // Group by 15 minutes for 15-minute PnL, Fees, and Volume\n const fifteenMinuteDataMap = new Map<\n string,\n { pnl: number; fees: number; volume: number }\n >();\n tradesWithPnL.forEach((trade) => {\n const date = new Date(trade.date);\n // Round down to the nearest 15-minute interval (0, 15, 30, 45)\n const minutes = date.getUTCMinutes();\n const roundedMinutes = Math.floor(minutes / 15) * 15;\n // setMinutes(roundedMinutes, 0, 0) normalizes seconds and milliseconds to 0\n // This ensures all trades within the same 15-minute window share the same key regardless of seconds/milliseconds\n date.setUTCMinutes(roundedMinutes, 0, 0);\n const fifteenMinKey = date.toISOString();\n const existing = fifteenMinuteDataMap.get(fifteenMinKey) || {\n pnl: 0,\n fees: 0,\n volume: 0,\n };\n fifteenMinuteDataMap.set(fifteenMinKey, {\n pnl: existing.pnl + trade.pnl,\n fees: existing.fees + trade.fees,\n volume: existing.volume + trade.volume,\n });\n });\n\n // Fill gaps in 15-minute data\n let fifteenMinuteData = fillFifteenMinuteGaps(\n fifteenMinuteDataMap,\n startDate,\n bucketEndDate,\n );\n // For single-day selections only, remove any entries from the next day\n if (isSingleDay) {\n fifteenMinuteData = fifteenMinuteData.filter(\n (item) => new Date(item.date).getTime() < nextDayStartTime,\n );\n }\n\n // Calculate cumulative PnL\n let _pnl = 0;\n const cumulativeDailyPnL = dailyData.map((day) => {\n _pnl += day.pnl;\n return {\n date: day.date,\n cumulativePnl: _pnl,\n };\n });\n\n let _fees = 0;\n const cumulativeDailyFees = dailyData.map((day) => {\n _fees += day.fees;\n return {\n date: day.date,\n cumulativeFees: _fees,\n };\n });\n let _volume = 0;\n const cumulativeDailyVolume = dailyData.map((day) => {\n _volume += day.volume;\n return {\n date: day.date,\n cumulativeVolume: _volume,\n };\n });\n _pnl = 0;\n const cumulativeHourlyPnL = hourlyData.map((hour) => {\n _pnl += hour.pnl;\n return {\n date: hour.date,\n cumulativePnl: _pnl,\n };\n });\n _fees = 0;\n const cumulativeHourlyFees = hourlyData.map((hour) => {\n _fees += hour.fees;\n return {\n date: hour.date,\n cumulativeFees: _fees,\n };\n });\n _volume = 0;\n const cumulativeHourlyVolume = hourlyData.map((hour) => {\n _volume += hour.volume;\n return {\n date: hour.date,\n cumulativeVolume: _volume,\n };\n });\n\n // Calculate cumulative 15-minute data\n _pnl = 0;\n const cumulativeFifteenMinutePnL = fifteenMinuteData.map((fifteenMin) => {\n _pnl += fifteenMin.pnl;\n return {\n date: fifteenMin.date,\n cumulativePnl: _pnl,\n };\n });\n\n _fees = 0;\n const cumulativeFifteenMinuteFees = fifteenMinuteData.map((fifteenMin) => {\n _fees += fifteenMin.fees;\n return {\n date: fifteenMin.date,\n cumulativeFees: _fees,\n };\n });\n\n _volume = 0;\n const cumulativeFifteenMinuteVolume = fifteenMinuteData.map(\n (fifteenMin) => {\n _volume += fifteenMin.volume;\n return {\n date: fifteenMin.date,\n cumulativeVolume: _volume,\n };\n },\n );\n\n return {\n totalPnL,\n grossPnL,\n totalVolume,\n totalFees,\n totalTrades,\n makerShare,\n\n // daily data\n dailyData,\n cumulativeDailyPnL,\n cumulativeDailyFees,\n cumulativeDailyVolume,\n\n // hourly data\n hourlyData,\n cumulativeHourlyPnL,\n cumulativeHourlyFees,\n cumulativeHourlyVolume,\n\n // 15-minute data\n fifteenMinuteData,\n cumulativeFifteenMinutePnL,\n cumulativeFifteenMinuteFees,\n cumulativeFifteenMinuteVolume,\n };\n }, [tradesData, periodStartDate, periodEndDate, includeFees]);\n};\n","import { useMemo, useEffect, useRef } from \"react\";\nimport { usePrivateInfiniteQuery } from \"@kodiak-finance/orderly-hooks\";\n\nexport interface TradeData {\n id: number;\n symbol: string;\n fee: number;\n fee_asset: string;\n side: \"BUY\" | \"SELL\";\n order_id: number;\n executed_price: number;\n executed_quantity: number;\n executed_timestamp: number;\n is_maker: number;\n realized_pnl: number;\n match_id: string;\n}\n\nexport interface TradesResponse {\n rows: TradeData[];\n meta: {\n total: number;\n records_per_page: number;\n current_page: number;\n };\n}\n\nexport const useTrades = (params: {\n symbol?: string;\n start_t?: number;\n end_t?: number;\n size?: number;\n}) => {\n const { symbol, start_t, end_t, size = 500 } = params;\n\n const getKey = useMemo(() => {\n return (pageIndex: number, previousPageData: any): string | null => {\n if (previousPageData) {\n // Use meta.total from API to determine if there's more data to fetch\n const total = previousPageData.meta?.total ?? 0;\n const alreadyFetched = pageIndex * size;\n\n // Stop if we've already fetched all available trades according to the API\n if (alreadyFetched >= total) {\n return null;\n }\n\n // Fallback: stop if current page has fewer items than requested\n if (previousPageData.rows.length < size) {\n return null;\n }\n }\n\n const search = new URLSearchParams();\n search.set(\"size\", size.toString());\n search.set(\"page\", `${pageIndex + 1}`);\n if (symbol) {\n search.set(\"symbol\", symbol);\n }\n if (start_t) {\n search.set(\"start_t\", start_t.toString());\n }\n if (end_t) {\n search.set(\"end_t\", end_t.toString());\n }\n const url = `/v1/trades?${search.toString()}`;\n return url;\n };\n }, [symbol, start_t, end_t, size]);\n\n const result = usePrivateInfiniteQuery<TradesResponse>(getKey, {\n formatter: (data) => data,\n revalidateOnFocus: true,\n keepPreviousData: true,\n });\n\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n // Auto-fetch all pages with rate limiting (10 requests per 1 second = 100ms minimum between requests)\n useEffect(() => {\n if (!result.data) return;\n\n const lastPage = result.data[result.data.length - 1];\n\n // Check if there's more data to fetch (when last page has full size)\n if (lastPage && lastPage.rows.length === size) {\n // Capture next page size before scheduling to avoid stale closure\n const nextPageSize = result.data.length + 1;\n\n // Schedule next fetch with 100ms delay to respect rate limit\n timeoutRef.current = setTimeout(() => {\n result.setSize(nextPageSize);\n }, 100);\n }\n\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [result.data, size]);\n\n // Clear pending pagination fetch when filters change to prevent mixed data states\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n };\n }, [symbol, start_t, end_t]);\n\n // Flatten all trades from paginated response\n const trades = useMemo(() => {\n if (!result.data) return [];\n return result.data\n .map((page) => page.rows)\n .flat()\n .filter((trade): trade is TradeData => trade !== undefined);\n }, [result.data]);\n\n return {\n trades,\n isLoading: result.isLoading,\n error: result.error,\n mutate: result.mutate,\n };\n};\n","import React, { useMemo, useState } from \"react\";\nimport { endOfDay } from \"date-fns\";\nimport {\n CombinedPnLChart,\n CombinedVolumeChart,\n CombinedFeesChart,\n CombinedPriceChart,\n AssetAreaChart,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Card,\n Grid,\n Box,\n Statistic,\n Text,\n Divider,\n Flex,\n Select,\n Switch,\n cn,\n DataTable,\n type Column,\n} from \"@kodiak-finance/orderly-ui\";\nimport { formatDateForChart, getAggregationLabel } from \"./dateUtils\";\nimport { PnLRankingChart } from \"./pnlRankingChart\";\nimport type { UseSymbolPerformanceScriptReturn } from \"./symbolPerformance.script\";\nimport { AggregationWindow } from \"./symbolPerformance.script\";\nimport { SymbolSelector } from \"./symbolSelector\";\nimport { useKlineData } from \"./useKlineData\";\nimport type { TradeData } from \"./useTrades\";\n\nconst LazyPeriodTitle = React.lazy(() =>\n import(\"../overview/shared/periodHeader\").then((mod) => {\n return { default: mod.PeriodTitle };\n }),\n);\n\nexport type SymbolPerformanceUIProps = UseSymbolPerformanceScriptReturn;\n\nconst MakerTakerShare: React.FC<{ makerShare: number }> = ({ makerShare }) => {\n const takerShare = 100 - makerShare;\n return (\n <div className=\"oui-flex oui-items-center oui-justify-center oui-gap-4\">\n <Text weight=\"semibold\">{makerShare.toFixed(1)}%</Text>\n <span className=\"oui-text-base-contrast-54\">/</span>\n <Text weight=\"semibold\">{takerShare.toFixed(1)}%</Text>\n </div>\n );\n};\n\nenum ViewType {\n chart = \"chart\",\n table = \"table\",\n}\n\ntype PerformanceTableRow = {\n date: string;\n pnl: number;\n volume: number;\n fees: number;\n};\n\nexport const SymbolPerformanceUI: React.FC<SymbolPerformanceUIProps> = (\n props,\n) => {\n const {\n selectedSymbol,\n setSelectedSymbol,\n period,\n onPeriodChange,\n periodTypes,\n performanceData,\n filterItems,\n onFilter,\n aggregationWindow,\n setAggregationWindow,\n aggregationWindowTypes,\n aggregatedData,\n trades,\n dateRange,\n isNetPnL,\n setIsNetPnL,\n } = props;\n const { t } = useTranslation();\n const symbolsInfo = useSymbolsInfo();\n const [viewType, setViewType] = useState<ViewType>(ViewType.chart);\n const [showCumulativePnL, setShowCumulativePnL] = useState(true);\n const [showCumulativeVolume, setShowCumulativeVolume] = useState(false);\n const [showCumulativeFees, setShowCumulativeFees] = useState(false);\n\n // Trim all data based on first and last non-zero volume to keep all charts aligned\n // This removes leading empty buckets and trailing empty buckets\n const getTrimmedDataRange = (data: any[]) => {\n if (!data || data.length === 0) return { start: 0, end: 0 };\n\n // Find first non-zero volume\n const startIndex = data.findIndex(\n (item) => item.volume && item.volume !== 0,\n );\n\n // Find last non-zero volume\n const endIndex = data.reduce(\n (lastIdx, item, idx) =>\n item.volume && item.volume !== 0 ? idx : lastIdx,\n -1,\n );\n\n return {\n start: startIndex === -1 ? 0 : startIndex,\n end: endIndex === -1 ? data.length : endIndex + 1,\n };\n };\n\n // Get available symbols\n const availableSymbols = useMemo(() => {\n const symbols = Object.keys(symbolsInfo);\n return [\n { value: \"ALL_SYMBOLS\", label: \"All Symbols\" },\n ...symbols.map((symbol) => ({\n value: symbol,\n label: symbol.replace(\"PERP_\", \"\").replace(\"_USDC\", \"\"),\n })),\n ];\n }, [symbolsInfo]);\n\n // Transform period PnL data for CombinedPnLChart (combines bars + cumulative line)\n // aggregatedData.periodData contains NET PnL (after fees)\n // Toggle allows viewing GROSS PnL (before fees) by adding fees back\n const combinedPnLData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n // Net PnL = actual result (with fees deducted)\n // Gross PnL = add fees back to show hypothetical without fees\n pnl: isNetPnL ? item.pnl : item.pnl + item.fees,\n }));\n }, [aggregatedData, aggregationWindow, isNetPnL]);\n\n // Transform period volume data for CombinedVolumeChart (combines bars + cumulative line)\n const combinedVolumeData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n volume: item.volume ?? 0,\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Transform period fees data for CombinedFeesChart (combines bars + cumulative line)\n // Fees are shown as negative since they're a cost\n const combinedFeesData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n fees: -(item.fees ?? 0),\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Map aggregation window to K-line resolution\n const klineResolution = useMemo(() => {\n switch (aggregationWindow) {\n case \"15m\":\n return \"15m\" as const;\n case \"1h\":\n return \"1h\" as const;\n case \"1d\":\n return \"1d\" as const;\n default:\n return \"1d\" as const;\n }\n }, [aggregationWindow]);\n\n // Fetch K-line data (only if a specific symbol is selected, not \"ALL_SYMBOLS\")\n const isAllSymbols = selectedSymbol === \"ALL_SYMBOLS\";\n const klineEndDate = useMemo(() => {\n if (!dateRange?.to) return undefined;\n // Use endOfDay to capture klines through the full day, not just to midnight\n return endOfDay(dateRange.to);\n }, [dateRange?.to]);\n\n const { klines } = useKlineData({\n symbol: !isAllSymbols && selectedSymbol ? selectedSymbol : undefined,\n resolution: klineResolution,\n from: dateRange ? Math.floor(dateRange.from.getTime() / 1000) : undefined,\n to: klineEndDate ? Math.floor(klineEndDate.getTime() / 1000) : undefined,\n });\n\n // Combine price data - align with trading data range, fill gaps with null\n // This ensures price chart covers the full date range of PnL/Volume/Fees charts\n // Missing price data (due to 1k kline API limit) shows as null, maintaining tooltip sync\n const combinedPriceData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) {\n return [];\n }\n\n // Apply same trim range as volume/fees/pnl to align x-axis\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedTradingData = aggregatedData.periodData.slice(start, end);\n\n if (trimmedTradingData.length === 0 || klines.length === 0) {\n return [];\n }\n\n // Create a map of kline data by formatted date for O(1) lookup\n const klineMap = new Map<string, (typeof klines)[0]>();\n klines.forEach((k) => {\n const date = new Date(k.timestamp * 1000);\n const formattedDate = formatDateForChart(\n date.toISOString(),\n aggregationWindow,\n );\n klineMap.set(formattedDate, k);\n });\n\n // Create price data for all trading data buckets, using null where kline data is missing\n const result = trimmedTradingData.map((tradingItem) => {\n const formattedDate = formatDateForChart(\n tradingItem.date,\n aggregationWindow,\n );\n const kline = klineMap.get(formattedDate);\n\n return {\n date: formattedDate,\n open: kline?.open ?? null,\n high: kline?.high ?? null,\n low: kline?.low ?? null,\n close: kline?.close ?? null,\n };\n });\n\n return result;\n }, [klines, aggregatedData, aggregationWindow]);\n\n // Transform data for table view\n const tableData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const { start, end } = getTrimmedDataRange(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(start, end);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n pnl: item.pnl,\n volume: item.volume ?? 0,\n fees: item.fees ?? 0,\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Define table columns\n const tableColumns: Column<PerformanceTableRow>[] = useMemo(\n () => [\n {\n title: t(\"common.date\"),\n dataIndex: \"date\",\n width: 120,\n align: \"left\",\n },\n {\n title: t(\"portfolio.symbolPerformance.realizedPnL\"),\n dataIndex: \"pnl\",\n align: \"right\",\n width: 150,\n render: (value: number) => {\n const isPositive = value >= 0;\n return (\n <Text\n as=\"span\"\n weight=\"semibold\"\n className={\n isPositive ? \"oui-text-profit-500\" : \"oui-text-loss-500\"\n }\n >\n {value.toFixed(2)} USDC\n </Text>\n );\n },\n },\n {\n title: t(\"portfolio.symbolPerformance.volume\"),\n dataIndex: \"volume\",\n align: \"right\",\n width: 150,\n render: (value: number) => {\n return <Text as=\"span\">{formatVolumeValue(value)}</Text>;\n },\n },\n {\n title: t(\"portfolio.symbolPerformance.fees\"),\n dataIndex: \"fees\",\n align: \"right\",\n width: 150,\n render: (value: number) => {\n return <Text as=\"span\">{formatVolumeValue(value)}</Text>;\n },\n },\n ],\n [t],\n );\n\n // Helper function to format volume/fees with K/M/B\n const formatVolumeValue = (value: number): string => {\n const abbreviations = [\"\", \"K\", \"M\", \"B\", \"T\"];\n let index = 0;\n let num = value;\n while (num >= 1000 && index < abbreviations.length - 1) {\n num /= 1000;\n index++;\n }\n const decimalPlaces = num <= 10 ? 2 : num <= 100 ? 1 : 0;\n const rounded = parseFloat(num.toFixed(decimalPlaces));\n return `${rounded}${abbreviations[index]}`;\n };\n\n // Aggregate trades by symbol\n const symbolSummaryData = useMemo(() => {\n if (!trades || trades.length === 0) return [];\n\n const symbolMap = new Map<\n string,\n { pnl: number; volume: number; fees: number; trades: number }\n >();\n\n trades.forEach((trade: TradeData) => {\n const symbol = trade.symbol;\n if (!symbolMap.has(symbol)) {\n symbolMap.set(symbol, { pnl: 0, volume: 0, fees: 0, trades: 0 });\n }\n\n const current = symbolMap.get(symbol)!;\n const tradeVolume = trade.executed_quantity * trade.executed_price;\n\n current.pnl += trade.realized_pnl || 0;\n current.volume += tradeVolume;\n current.fees += trade.fee || 0;\n current.trades += 1;\n });\n\n // Convert map to array and sort by PnL (highest first)\n return Array.from(symbolMap.entries())\n .map(([symbol, data]) => ({\n symbol,\n ...data,\n }))\n .sort((a, b) => b.pnl - a.pnl)\n .slice(0, 10); // Top 10 symbols\n }, [trades]);\n\n return (\n <Card\n title={\n <Box>\n <React.Suspense fallback={null}>\n <LazyPeriodTitle\n onPeriodChange={onPeriodChange}\n periodTypes={periodTypes}\n period={period}\n title={t(\"portfolio.symbolPerformance\")}\n filterItems={filterItems}\n onFilter={onFilter}\n />\n </React.Suspense>\n </Box>\n }\n >\n <Grid cols={1} gap={4}>\n <Flex gap={4} itemAlign=\"end\">\n {/* Symbol Selector - With Logo and Search */}\n <Box className=\"oui-max-w-xs oui-flex-1\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"common.symbol\")}\n </Text>\n <SymbolSelector\n value={selectedSymbol || \"\"}\n onValueChange={(value: string) => setSelectedSymbol(value)}\n options={availableSymbols}\n placeholder={t(\"common.symbol\")}\n />\n </Box>\n\n {/* Aggregation Window Selector */}\n <Box className=\"oui-max-w-xs\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"portfolio.symbolPerformance.aggregation\")}\n </Text>\n <Select.options\n value={aggregationWindow}\n onValueChange={(value) =>\n setAggregationWindow(value as AggregationWindow)\n }\n options={aggregationWindowTypes.map((type) => ({\n label:\n type === \"15m\"\n ? \"15 min\"\n : type === \"1h\"\n ? \"Hourly\"\n : \"Daily\",\n value: type,\n }))}\n classNames={{ trigger: cn(\"oui-h-[2.4rem]\") }}\n />\n </Box>\n </Flex>\n\n <Divider className=\"oui-my-6 oui-border-t-2\" intensity={8} />\n\n <Box pb={4}>\n {/* Key Metrics */}\n <Grid cols={5} gap={4} mb={4}>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total PnL (Gross) */}\n <Statistic\n label=\"Total PnL (Gross)\"\n valueProps={{ coloring: true, showIdentifier: true }}\n >\n {performanceData ? performanceData.grossPnL.toFixed(2) : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total Fees */}\n <Statistic\n label={t(\"portfolio.symbolPerformance.totalFees\")}\n valueProps={{ showIdentifier: false }}\n >\n {performanceData ? performanceData.totalFees.toFixed(2) : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total PnL (Net) */}\n <Statistic\n label=\"Total PnL (Net)\"\n valueProps={{ coloring: true, showIdentifier: true }}\n >\n {performanceData ? performanceData.totalPnL.toFixed(2) : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Total Volume */}\n <Statistic label={t(\"portfolio.symbolPerformance.totalVolume\")}>\n {performanceData\n ? performanceData.totalVolume.toFixed(2)\n : \"--\"}\n </Statistic>\n </Box>\n <Box\n gradient=\"neutral\"\n r=\"md\"\n px={3}\n py={2}\n angle={184}\n border\n borderColor={6}\n >\n {/* Maker / Taker */}\n <Statistic label=\"Maker / Taker\">\n {performanceData ? (\n <MakerTakerShare makerShare={performanceData.makerShare} />\n ) : (\n <div className=\"oui-text-center\">--</div>\n )}\n </Statistic>\n </Box>\n </Grid>\n\n {/* Chart/Table View Toggle */}\n <Flex gap={2} mb={4}>\n <button\n onClick={() => setViewType(ViewType.chart)}\n className={cn(\n \"oui-px-4 oui-py-2 oui-rounded oui-text-sm oui-font-semibold oui-transition-all\",\n viewType === ViewType.chart\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Chart\n </button>\n <button\n onClick={() => setViewType(ViewType.table)}\n className={cn(\n \"oui-px-4 oui-py-2 oui-rounded oui-text-sm oui-font-semibold oui-transition-all\",\n viewType === ViewType.table\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Table\n </button>\n </Flex>\n\n {/* Charts - Conditional Rendering */}\n {viewType === ViewType.chart && (\n <Grid cols={1} gap={6}>\n {/* Combined PnL Chart (bars + cumulative line) */}\n <Box>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.realizedPnL\")}\n </Text>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-3\">\n <Flex gap={2}>\n <button\n onClick={() => setIsNetPnL(false)}\n className={cn(\n \"oui-px-3 oui-py-1 oui-rounded oui-text-xs oui-font-semibold oui-transition-all\",\n !isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Gross P&L\n </button>\n <button\n onClick={() => setIsNetPnL(true)}\n className={cn(\n \"oui-px-3 oui-py-1 oui-rounded oui-text-xs oui-font-semibold oui-transition-all\",\n isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54 hover:oui-bg-base-4\",\n )}\n >\n Net P&L\n </button>\n </Flex>\n <Flex itemAlign=\"center\" gap={2}>\n <label className=\"oui-text-xs oui-text-base-contrast-54\">\n Cumulative\n </label>\n <Switch\n checked={showCumulativePnL}\n onCheckedChange={setShowCumulativePnL}\n />\n </Flex>\n </Flex>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedPnLChart\n key={`combined-pnl-${aggregationWindow}`}\n data={combinedPnLData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n invisible={\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0\n }\n showCumulative={showCumulativePnL}\n />\n </Box>\n </Box>\n\n {/* Combined Volume Chart (bars + cumulative line) */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-3\">\n <Text as=\"div\" size=\"sm\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.volume\")}\n </Text>\n <Flex itemAlign=\"center\" gap={2}>\n <label className=\"oui-text-xs oui-text-base-contrast-54\">\n Cumulative\n </label>\n <Switch\n checked={showCumulativeVolume}\n onCheckedChange={setShowCumulativeVolume}\n />\n </Flex>\n </Flex>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedVolumeChart\n key={`combined-vol-${aggregationWindow}`}\n data={combinedVolumeData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n invisible={\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0\n }\n showCumulative={showCumulativeVolume}\n />\n </Box>\n </Box>\n\n {/* Combined Price Chart - Only show when specific symbol is selected */}\n {!isAllSymbols && (\n <Box>\n <Text as=\"div\" size=\"sm\" className=\"oui-mb-3\">\n {getAggregationLabel(aggregationWindow)} Price\n </Text>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedPriceChart\n key={`combined-price-${aggregationWindow}-${selectedSymbol}`}\n data={combinedPriceData}\n aggregationWindow={\n aggregationWindow as \"15m\" | \"1h\" | \"1d\"\n }\n invisible={combinedPriceData.length === 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Combined Fees Chart (bars + cumulative line) */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-3\">\n <Text as=\"div\" size=\"sm\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.fees\")}\n </Text>\n <Flex itemAlign=\"center\" gap={2}>\n <label className=\"oui-text-xs oui-text-base-contrast-54\">\n Cumulative\n </label>\n <Switch\n checked={showCumulativeFees}\n onCheckedChange={setShowCumulativeFees}\n />\n </Flex>\n </Flex>\n <Box\n r=\"md\"\n className=\"oui-h-[300px] oui-border oui-border-line-4\"\n >\n <CombinedFeesChart\n key={`combined-fees-${aggregationWindow}`}\n data={combinedFeesData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n invisible={\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0\n }\n showCumulative={showCumulativeFees}\n />\n </Box>\n </Box>\n </Grid>\n )}\n\n {/* Table View - Conditional Rendering */}\n {viewType === ViewType.table && (\n <Box className=\"oui-h-[600px]\">\n <DataTable<PerformanceTableRow>\n bordered\n columns={tableColumns}\n dataSource={tableData}\n emptyView={\n <Box className=\"oui-text-center oui-py-8\">\n <Text>{t(\"portfolio.symbolPerformance.noData\")}</Text>\n </Box>\n }\n />\n </Box>\n )}\n\n {/* Symbol Summary - Top Symbols by PnL */}\n {symbolSummaryData.length > 0 && (\n <Box mt={8}>\n <Divider className=\"oui-my-6 oui-border-t-2\" intensity={8} />\n <Text as=\"div\" size=\"lg\" weight=\"semibold\" className=\"oui-mb-4\">\n {t(\"portfolio.symbolPerformance.pnlRanking\")}\n </Text>\n <Box className=\"oui-border oui-border-line-4 oui-rounded-md oui-p-4\">\n <PnLRankingChart\n data={symbolSummaryData}\n onSymbolSelect={setSelectedSymbol}\n />\n </Box>\n </Box>\n )}\n </Box>\n </Grid>\n </Card>\n );\n};\n","import { format, parseISO } from \"date-fns\";\nimport { AggregationWindow } from \"./symbolPerformance.script\";\n\n/**\n * Get human-readable label for aggregation window type.\n *\n * @param window - Aggregation window (daily, hourly, 15-min)\n * @returns Display label (e.g., \"Daily\", \"Hourly\", \"15 min\")\n */\nexport const getAggregationLabel = (window: AggregationWindow): string => {\n switch (window) {\n case AggregationWindow.FIFTEEN_MIN:\n return \"15 min\";\n case AggregationWindow.HOURLY:\n return \"Hourly\";\n case AggregationWindow.DAILY:\n return \"Daily\";\n default:\n return \"Daily\";\n }\n};\n\n/**\n * Format a date string for display on charts based on aggregation window.\n * Handles different precision levels for different time intervals.\n *\n * @param dateString - ISO datetime string\n * @param window - Aggregation window (daily, hourly, 15-min)\n * @returns Human-readable formatted date string\n */\nexport const formatDateForChart = (\n dateString: string,\n window: AggregationWindow,\n): string => {\n try {\n const date = parseISO(dateString);\n\n switch (window) {\n case AggregationWindow.FIFTEEN_MIN:\n case AggregationWindow.HOURLY:\n // Show time for hourly/15-min: \"Nov 21, 3:00 AM\"\n return format(date, \"MMM d, h:mm a\");\n case AggregationWindow.DAILY:\n default:\n // Show date only for daily: \"Nov 21\"\n return format(date, \"MMM d\");\n }\n } catch {\n // Fallback if parsing fails\n return dateString;\n }\n};\n\n/**\n * Format a date string to \"yyyy-MM-dd\" format.\n * Used for API calls and date range display.\n *\n * @param dateString - ISO datetime string\n * @returns Date in \"yyyy-MM-dd\" format\n */\nexport const formatDateOnly = (dateString: string): string => {\n try {\n const date = parseISO(dateString);\n return format(date, \"yyyy-MM-dd\");\n } catch {\n return dateString;\n }\n};\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Text, cn } from \"@kodiak-finance/orderly-ui\";\n\nexport type PnLRankingDataItem = {\n symbol: string;\n pnl: number;\n volume: number;\n fees: number;\n};\n\ntype PnLRankingChartProps = {\n data: PnLRankingDataItem[];\n onSymbolSelect?: (symbol: string) => void;\n};\n\nconst formatCurrency = (value: number): string => {\n if (value >= 1e9) return `$${(value / 1e9).toFixed(2)}B`;\n if (value >= 1e6) return `$${(value / 1e6).toFixed(2)}M`;\n if (value >= 1e3) return `$${(value / 1e3).toFixed(2)}K`;\n return `$${value.toFixed(2)}`;\n};\n\nexport const PnLRankingChart: React.FC<PnLRankingChartProps> = ({\n data,\n onSymbolSelect,\n}) => {\n const { t } = useTranslation();\n\n const maxAbsValue = useMemo(\n () => Math.max(...data.map((item) => Math.abs(item.pnl)), 1),\n [data],\n );\n\n return (\n <div className=\"oui-w-full\">\n {/* Header Row */}\n <div className=\"oui-grid oui-gap-4 oui-border-b oui-border-line-4 oui-mb-2 oui-px-4 oui-py-3\">\n <div className=\"oui-grid oui-grid-cols-12 oui-gap-4 oui-items-center\">\n <div className=\"oui-col-span-2\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.symbols\")}\n </Text>\n </div>\n <div className=\"oui-col-span-6\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.pnl\")}\n </Text>\n </div>\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.volume\")}\n </Text>\n </div>\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.fees\")}\n </Text>\n </div>\n </div>\n </div>\n\n {/* Data Rows */}\n <div className=\"oui-space-y-3\">\n {data.map((item) => {\n const isPositive = item.pnl >= 0;\n const barWidth = (Math.abs(item.pnl) / maxAbsValue) * 100;\n\n return (\n <div\n key={item.symbol}\n onClick={() => onSymbolSelect?.(item.symbol)}\n className=\"oui-border oui-border-line-4 hover:oui-border-line-5 oui-rounded-md oui-transition-colors oui-px-4 oui-py-3 oui-cursor-pointer\"\n >\n <div className=\"oui-grid oui-grid-cols-12 oui-gap-4 oui-items-center\">\n {/* Symbol Column */}\n <div className=\"oui-col-span-2\">\n <Text size=\"sm\" weight=\"semibold\" className=\"oui-truncate\">\n {item.symbol}\n </Text>\n </div>\n\n {/* P&L Column with Inline Bar Chart */}\n <div className=\"oui-col-span-6\">\n <div className=\"oui-relative oui-w-full oui-h-8 oui-rounded oui-bg-base-8 oui-overflow-hidden oui-flex oui-items-center\">\n <div\n className=\"oui-absolute oui-h-full oui-rounded oui-transition-all\"\n style={{\n width: `${barWidth}%`,\n backgroundColor: isPositive ? \"#00B49E\" : \"#FF5959\",\n }}\n />\n <Text\n size=\"sm\"\n weight=\"semibold\"\n className={cn(\n \"oui-relative oui-z-10 oui-ml-2\",\n isPositive\n ? \"oui-text-profit-500\"\n : \"oui-text-loss-500\",\n )}\n >\n {isPositive ? \"+\" : \"\"}\n {item.pnl.toFixed(2)}\n </Text>\n </div>\n </div>\n\n {/* Volume Column */}\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" weight=\"semibold\">\n {formatCurrency(item.volume)}\n </Text>\n </div>\n\n {/* Fees Column */}\n <div className=\"oui-col-span-2 oui-text-right\">\n <Text size=\"sm\" weight=\"semibold\" intensity={80}>\n {formatCurrency(item.fees)}\n </Text>\n </div>\n </div>\n </div>\n );\n })}\n </div>\n\n {/* Empty State */}\n {data.length === 0 && (\n <div className=\"oui-flex oui-items-center oui-justify-center oui-py-8\">\n <Text intensity={54}>{t(\"portfolio.symbolPerformance.noData\")}</Text>\n </div>\n )}\n </div>\n );\n};\n","import React, { useMemo, useState } from \"react\";\nimport {\n DropdownMenuRoot,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuPortal,\n Flex,\n Text,\n TokenIcon,\n Input,\n cn,\n CaretDownIcon,\n CaretUpIcon,\n} from \"@kodiak-finance/orderly-ui\";\n\nexport interface SymbolOption {\n value: string;\n label: string;\n}\n\nexport interface SymbolSelectorProps {\n value: string;\n onValueChange: (value: string) => void;\n options: SymbolOption[];\n placeholder?: string;\n}\n\nexport const SymbolSelector: React.FC<SymbolSelectorProps> = ({\n value,\n onValueChange,\n options,\n placeholder = \"Select symbol\",\n}) => {\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n\n const filteredOptions = useMemo(() => {\n if (!search) return options;\n return options.filter(\n (opt) =>\n opt.label.toLowerCase().includes(search.toLowerCase()) ||\n opt.value.toLowerCase().includes(search.toLowerCase()),\n );\n }, [search, options]);\n\n const selectedOption = options.find((opt) => opt.value === value);\n const displayLabel =\n value === \"ALL_SYMBOLS\"\n ? \"All Symbols\"\n : selectedOption?.label || placeholder;\n const isAllSymbols = value === \"ALL_SYMBOLS\";\n\n return (\n <DropdownMenuRoot open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button className=\"oui-w-full oui-px-3 oui-py-2 oui-rounded oui-border oui-border-line-6 oui-bg-line-4 oui-text-left oui-flex oui-items-center oui-justify-between hover:oui-bg-line-5\">\n <Flex gap={1} itemAlign=\"center\">\n {!isAllSymbols && displayLabel !== placeholder && (\n <TokenIcon name={displayLabel} size=\"2xs\" />\n )}\n <Text size=\"xs\" className=\"oui-text-base-contrast-80\">\n {displayLabel}\n </Text>\n </Flex>\n\n <CaretDownIcon\n size={12}\n className={cn(\n \"oui-text-base-contrast-54 oui-transition-transform\",\n open && \"oui-rotate-180\",\n )}\n />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={4}\n className=\"oui-w-[var(--radix-dropdown-menu-trigger-width)] oui-bg-base-8 oui-border oui-border-line-6 oui-rounded oui-p-2 oui-z-50\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n {/* Search Input */}\n <div className=\"oui-px-2 oui-py-2 oui-border-b oui-border-base-4 oui-mb-2\">\n <Input\n autoFocus\n placeholder=\"Search symbols...\"\n value={search}\n onValueChange={setSearch}\n size=\"sm\"\n />\n </div>\n\n {/* Options List */}\n <div className=\"oui-max-h-[300px] oui-overflow-y-auto\">\n {filteredOptions.length === 0 ? (\n <div className=\"oui-px-3 oui-py-2 oui-text-center oui-text-base-contrast-54 oui-text-xs\">\n No symbols found\n </div>\n ) : (\n filteredOptions.map((option) => {\n const isSelected = value === option.value;\n const cleanLabel =\n option.value === \"ALL_SYMBOLS\" ? \"All Symbols\" : option.label;\n\n return (\n <button\n key={option.value}\n onClick={() => {\n onValueChange(option.value);\n setOpen(false);\n setSearch(\"\");\n }}\n className={cn(\n \"oui-w-full oui-px-3 oui-py-2 oui-rounded oui-flex oui-items-center oui-gap-2 oui-text-left oui-transition-colors\",\n isSelected ? \"oui-bg-base-7\" : \"hover:oui-bg-base-7\",\n )}\n >\n {option.value !== \"ALL_SYMBOLS\" && (\n <TokenIcon name={cleanLabel} size=\"2xs\" />\n )}\n <Text size=\"xs\" className=\"oui-text-base-contrast-80\">\n {cleanLabel}\n </Text>\n </button>\n );\n })\n )}\n </div>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenuRoot>\n );\n};\n","import { useMemo } from \"react\";\nimport { useSWR } from \"@kodiak-finance/orderly-hooks\";\n\nexport interface KlineData {\n symbol: string;\n resolution: string;\n timestamp: number;\n open: number;\n high: number;\n low: number;\n close: number;\n volume: number;\n}\n\ninterface KlineResponse {\n s: string; // status: \"ok\"\n o: number[]; // open\n h: number[]; // high\n l: number[]; // low\n c: number[]; // close\n v: number[]; // volume\n a: number[]; // notional\n t: number[]; // timestamps\n}\n\nconst fetcher = (url: string) =>\n fetch(`https://api.orderly.org${url}`).then((res) => res.json());\n\nexport const useKlineData = (params: {\n symbol?: string;\n resolution?: \"15m\" | \"1h\" | \"1d\";\n from?: number;\n to?: number;\n limit?: number;\n}) => {\n const { symbol, resolution, from, to, limit = 1000 } = params;\n\n const getKey = useMemo(() => {\n if (!symbol || !resolution) return null;\n\n // Calculate default from/to timestamps\n const now = Math.floor(Date.now() / 1000);\n\n // Use provided from/to timestamps, or calculate defaults\n let fromTimestamp = from;\n const toTimestamp = to || now;\n\n if (!fromTimestamp) {\n // If no from is provided, calculate based on resolution and limit\n const secondsPerCandle = {\n \"15m\": 900,\n \"1h\": 3600,\n \"1d\": 86400,\n }[resolution];\n\n fromTimestamp = now - limit * secondsPerCandle;\n }\n\n const search = new URLSearchParams();\n search.set(\"symbol\", symbol);\n search.set(\"resolution\", resolution);\n search.set(\"from\", fromTimestamp.toString());\n search.set(\"to\", toTimestamp.toString());\n\n return `/v1/tv/kline_history?${search.toString()}`;\n }, [symbol, resolution, from, to, limit]);\n\n const { data, isLoading, error } = useSWR<KlineResponse>(getKey, fetcher, {\n revalidateOnFocus: false,\n dedupingInterval: 60000, // Cache for 1 minute\n });\n\n // Transform API response to usable format\n const klines = useMemo(() => {\n if (!data?.t || !Array.isArray(data.t)) return [];\n\n const { o, h, l, c, v, t } = data as KlineResponse;\n\n return t.map((timestamp, index) => ({\n symbol: symbol || \"\",\n resolution: resolution || \"\",\n timestamp,\n open: o[index],\n high: h[index],\n low: l[index],\n close: c[index],\n volume: v[index],\n }));\n }, [data, symbol, resolution]);\n\n return {\n klines,\n isLoading,\n error,\n };\n};\n","import React, { useMemo, useState } from \"react\";\nimport {\n CombinedPnLChart,\n CombinedVolumeChart,\n CombinedFeesChart,\n CombinedPriceChart,\n} from \"@kodiak-finance/orderly-chart\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Box,\n Card,\n Text,\n Flex,\n Tabs,\n TabPanel,\n DataFilter,\n Select,\n Grid,\n Divider,\n Switch,\n Statistic,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { formatDateForChart, getAggregationLabel } from \"./dateUtils\";\nimport { PnLRankingChartMobile } from \"./pnlRankingChartMobile\";\nimport type { UseSymbolPerformanceScriptReturn } from \"./symbolPerformance.script\";\nimport { PeriodType, AggregationWindow } from \"./symbolPerformance.script\";\nimport { SymbolSelector } from \"./symbolSelector\";\nimport { useKlineData } from \"./useKlineData\";\nimport type { TradeData } from \"./useTrades\";\n\nexport type SymbolPerformanceUIMobileProps = UseSymbolPerformanceScriptReturn;\n\nconst MakerTakerShare: React.FC<{ makerShare: number }> = ({ makerShare }) => {\n const takerShare = 100 - makerShare;\n return (\n <Flex direction=\"row\" justify=\"center\" gap={1}>\n <Text weight=\"semibold\" size=\"2xs\">\n {makerShare.toFixed(1)}%\n </Text>\n <span className=\"oui-text-base-contrast-54\">/</span>\n <Text weight=\"semibold\" size=\"2xs\">\n {takerShare.toFixed(1)}%\n </Text>\n </Flex>\n );\n};\n\nexport const SymbolPerformanceUIMobile: React.FC<\n SymbolPerformanceUIMobileProps\n> = (props) => {\n const {\n selectedSymbol,\n setSelectedSymbol,\n period,\n onPeriodChange,\n performanceData,\n filterItems,\n onFilter,\n aggregationWindow,\n setAggregationWindow,\n aggregationWindowTypes,\n aggregatedData,\n trades,\n dateRange,\n isNetPnL,\n setIsNetPnL,\n } = props;\n const { t } = useTranslation();\n const symbolsInfo = useSymbolsInfo();\n const [showCumulativePnL, setShowCumulativePnL] = useState(true);\n const [showCumulativeVolume, setShowCumulativeVolume] = useState(false);\n const [showCumulativeFees, setShowCumulativeFees] = useState(false);\n\n // Trim all data based on first non-zero volume to keep all charts aligned\n const getFirstNonZeroVolumeIndex = (data: any[]) => {\n if (!data || data.length === 0) return 0;\n const index = data.findIndex((item) => item.volume && item.volume !== 0);\n return index === -1 ? 0 : index;\n };\n\n // Get available symbols\n const availableSymbols = useMemo(() => {\n const symbols = Object.keys(symbolsInfo);\n return [\n { value: \"ALL_SYMBOLS\", label: \"All Symbols\" },\n ...symbols.map((symbol) => ({\n value: symbol,\n label: symbol.replace(\"PERP_\", \"\").replace(\"_USDC\", \"\"),\n })),\n ];\n }, [symbolsInfo]);\n\n // Combined PnL chart data with trim\n // aggregatedData.periodData contains NET PnL (after fees)\n // Toggle allows viewing GROSS PnL (before fees) by adding fees back\n const combinedPnLData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(trimIndex);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n // Net PnL = actual result (with fees deducted)\n // Gross PnL = add fees back to show hypothetical without fees\n pnl: isNetPnL ? item.pnl : item.pnl + item.fees,\n }));\n }, [aggregatedData, aggregationWindow, isNetPnL]);\n\n // Combined Volume chart data with trim\n const combinedVolumeData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(trimIndex);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n volume: item.volume ?? 0,\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Combined Fees chart data with trim\n // Fees are shown as negative since they're a cost\n const combinedFeesData = useMemo(() => {\n if (!aggregatedData || !aggregatedData.periodData) return [];\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const trimmedData = aggregatedData.periodData.slice(trimIndex);\n return trimmedData.map((item) => ({\n date: formatDateForChart(item.date, aggregationWindow),\n fees: -(item.fees ?? 0),\n }));\n }, [aggregatedData, aggregationWindow]);\n\n // Map aggregation window to K-line resolution\n const klineResolution = useMemo(() => {\n switch (aggregationWindow) {\n case \"15m\":\n return \"15m\" as const;\n case \"1h\":\n return \"1h\" as const;\n case \"1d\":\n return \"1d\" as const;\n default:\n return \"1d\" as const;\n }\n }, [aggregationWindow]);\n\n // Fetch K-line data (only if a specific symbol is selected, not \"ALL_SYMBOLS\")\n const isAllSymbols = selectedSymbol === \"ALL_SYMBOLS\";\n const { klines } = useKlineData({\n symbol: !isAllSymbols && selectedSymbol ? selectedSymbol : undefined,\n resolution: klineResolution,\n from: dateRange ? Math.floor(dateRange.from.getTime() / 1000) : undefined,\n to: dateRange ? Math.floor(dateRange.to.getTime() / 1000) : undefined,\n });\n\n // Combine price data - trim to match the trading data range for cross-chart alignment\n // This ensures price chart X-axis aligns with PnL/Volume/Fees charts for easy tracing\n const combinedPriceData = useMemo(() => {\n if (klines.length === 0 || !aggregatedData || !aggregatedData.periodData) {\n return [];\n }\n\n // Get the same trim index as trading data\n const trimIndex = getFirstNonZeroVolumeIndex(aggregatedData.periodData);\n const firstTrimmedEntry = aggregatedData.periodData[trimIndex];\n\n if (!firstTrimmedEntry) {\n return [];\n }\n\n // Filter klines to only include those on or after the first trimmed trading date\n const firstTrimmedDate = new Date(firstTrimmedEntry.date);\n\n return klines\n .filter((k) => {\n const klineDate = new Date(k.timestamp * 1000);\n return klineDate >= firstTrimmedDate;\n })\n .map((k) => {\n const date = new Date(k.timestamp * 1000);\n const formattedDate = formatDateForChart(\n date.toISOString(),\n aggregationWindow,\n );\n\n return {\n date: formattedDate,\n open: k.open,\n high: k.high,\n low: k.low,\n close: k.close,\n };\n });\n }, [klines, aggregatedData, aggregationWindow]);\n\n const isEmptyData =\n !aggregatedData ||\n !aggregatedData.periodData ||\n aggregatedData.periodData.length === 0;\n\n // Build DataFilter items with only date range (symbol selector is separate)\n const dataFilterItems = useMemo(() => {\n const items: Array<{ type: \"range\"; name: string; value: any }> = [];\n\n // Add date range filter if available\n if (filterItems && filterItems.length > 0) {\n const dateRangeFilter = filterItems.find(\n (item) => item.name === \"dateRange\",\n );\n if (dateRangeFilter) {\n items.push({\n type: \"range\" as const,\n name: \"dateRange\",\n value: dateRangeFilter.value,\n });\n }\n }\n\n return items;\n }, [filterItems]);\n\n const handleFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\" && onFilter) {\n onFilter(filter);\n }\n };\n\n // Aggregate trades by symbol\n const symbolSummaryData = useMemo(() => {\n if (!trades || trades.length === 0) return [];\n\n const symbolMap = new Map<\n string,\n { pnl: number; volume: number; fees: number; trades: number }\n >();\n\n trades.forEach((trade: TradeData) => {\n const symbol = trade.symbol;\n if (!symbolMap.has(symbol)) {\n symbolMap.set(symbol, { pnl: 0, volume: 0, fees: 0, trades: 0 });\n }\n\n const current = symbolMap.get(symbol)!;\n const tradeVolume = trade.executed_quantity * trade.executed_price;\n\n current.pnl += trade.realized_pnl || 0;\n current.volume += tradeVolume;\n current.fees += trade.fee || 0;\n current.trades += 1;\n });\n\n // Convert map to array and sort by PnL (highest first)\n return Array.from(symbolMap.entries())\n .map(([symbol, data]) => ({\n symbol,\n ...data,\n }))\n .sort((a, b) => b.pnl - a.pnl)\n .slice(0, 10); // Top 10 symbols\n }, [trades]);\n\n return (\n <div>\n {/* Symbol Selector & Aggregation Window */}\n <Flex gap={2} itemAlign=\"end\" mb={2}>\n <Box className=\"oui-flex-1\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"common.symbol\")}\n </Text>\n <SymbolSelector\n value={selectedSymbol || \"\"}\n onValueChange={(value: string) => setSelectedSymbol(value)}\n options={availableSymbols}\n placeholder={t(\"common.symbol\")}\n />\n </Box>\n\n <Box className=\"oui-flex-1\">\n <Text size=\"xs\" intensity={54} className=\"oui-mb-2\">\n {t(\"portfolio.symbolPerformance.aggregation\")}\n </Text>\n <Select.combine\n value={aggregationWindow}\n onValueChange={(value) =>\n setAggregationWindow(value as AggregationWindow)\n }\n options={aggregationWindowTypes.map((type) => ({\n label:\n type === \"15m\" ? \"15 min\" : type === \"1h\" ? \"Hourly\" : \"Daily\",\n value: type,\n }))}\n />\n </Box>\n </Flex>\n\n {/* Date Range Filter */}\n {dataFilterItems && dataFilterItems.length > 0 && (\n <Box mb={4}>\n <DataFilter\n items={dataFilterItems}\n onFilter={handleFilter}\n className=\"oui-border-none oui-py-0\"\n />\n </Box>\n )}\n\n {/* Period Buttons - Below Filters */}\n <Box mb={4}>\n <Tabs\n value={period || \"\"}\n defaultValue={PeriodType.WEEK}\n classNames={{ tabsList: \"oui-justify-between\", trigger: \"oui-w-1/4\" }}\n onValueChange={(value) => onPeriodChange(value as PeriodType)}\n >\n <TabPanel\n title={t(\"common.select.1d\")}\n value={PeriodType.DAY}\n className=\"oui-min-h-0 oui-p-0\"\n />\n <TabPanel\n title={t(\"common.select.7d\")}\n value={PeriodType.WEEK}\n className=\"oui-min-h-0 oui-p-0\"\n />\n <TabPanel\n title={t(\"common.select.30d\")}\n value={PeriodType.MONTH}\n className=\"oui-min-h-0 oui-p-0\"\n />\n <TabPanel\n title={t(\"common.select.90d\")}\n value={PeriodType.QUARTER}\n className=\"oui-min-h-0 oui-p-0\"\n />\n </Tabs>\n </Box>\n\n {/* Key Metrics - Above Charts */}\n <Flex justify=\"between\" itemAlign=\"center\" gap={2} mb={4}>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.symbolPerformance.totalPnL\")}\n </Text>\n <Text.numeral size=\"sm\" weight=\"semibold\" coloring>\n {performanceData ? performanceData.totalPnL.toFixed(2) : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n {t(\"portfolio.symbolPerformance.totalVolume\")}\n </Text>\n <Text.numeral size=\"sm\" coloring={false}>\n {performanceData ? performanceData.totalVolume.toFixed(2) : \"--\"}\n </Text.numeral>\n </Flex>\n <Flex\n gap={1}\n direction=\"column\"\n itemAlign=\"start\"\n className=\"oui-w-1/3 oui-rounded-lg oui-bg-base-7 oui-px-2 oui-py-1.5\"\n >\n <Text className=\"oui-truncate\" intensity={36} size=\"2xs\">\n Maker / Taker\n </Text>\n <div className=\"oui-text-sm\">\n {performanceData ? (\n <MakerTakerShare makerShare={performanceData.makerShare} />\n ) : (\n <Text size=\"sm\">--</Text>\n )}\n </div>\n </Flex>\n </Flex>\n\n {/* Charts - Combined visualization (bars + cumulative line) */}\n <Grid cols={1} gap={4} mb={4}>\n {/* PnL - Combined Bars + Cumulative Line */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-2\">\n <Text as=\"div\" size=\"xs\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.realizedPnL\")}\n </Text>\n <Flex gap={1}>\n <button\n onClick={() => setIsNetPnL(false)}\n className={cn(\n \"oui-px-2 oui-py-0.5 oui-rounded oui-text-2xs oui-font-semibold oui-transition-all\",\n !isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54\",\n )}\n >\n Gross\n </button>\n <button\n onClick={() => setIsNetPnL(true)}\n className={cn(\n \"oui-px-2 oui-py-0.5 oui-rounded oui-text-2xs oui-font-semibold oui-transition-all\",\n isNetPnL\n ? \"oui-bg-primary-darken oui-text-white\"\n : \"oui-bg-base-5 oui-text-base-contrast-54\",\n )}\n >\n Net\n </button>\n <Divider direction=\"vertical\" />\n <Flex itemAlign=\"center\" gap={1}>\n <label className=\"oui-text-2xs oui-text-base-contrast-54\">\n Cum.\n </label>\n <Switch\n checked={showCumulativePnL}\n onCheckedChange={setShowCumulativePnL}\n />\n </Flex>\n </Flex>\n </Flex>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedPnLChart\n key={`mobile-pnl-${aggregationWindow}`}\n data={combinedPnLData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={isEmptyData}\n showCumulative={showCumulativePnL}\n />\n </Box>\n </Box>\n\n {/* Volume - Combined Bars + Cumulative Line */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-2\">\n <Text as=\"div\" size=\"xs\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.volume\")}\n </Text>\n <Flex itemAlign=\"center\" gap={1}>\n <label className=\"oui-text-2xs oui-text-base-contrast-54\">\n Cum.\n </label>\n <Switch\n checked={showCumulativeVolume}\n onCheckedChange={setShowCumulativeVolume}\n />\n </Flex>\n </Flex>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedVolumeChart\n key={`mobile-volume-${aggregationWindow}`}\n data={combinedVolumeData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={isEmptyData}\n showCumulative={showCumulativeVolume}\n />\n </Box>\n </Box>\n\n {/* Price Chart - Only show when specific symbol is selected */}\n {!isAllSymbols && (\n <Box>\n <Text as=\"div\" size=\"xs\" className=\"oui-mb-2\">\n {getAggregationLabel(aggregationWindow)} Price\n </Text>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedPriceChart\n key={`mobile-price-${aggregationWindow}-${selectedSymbol}`}\n data={combinedPriceData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={combinedPriceData.length === 0}\n />\n </Box>\n </Box>\n )}\n\n {/* Fees - Combined Bars + Cumulative Line */}\n <Box>\n <Flex justify=\"between\" itemAlign=\"center\" className=\"oui-mb-2\">\n <Text as=\"div\" size=\"xs\">\n {getAggregationLabel(aggregationWindow)}{\" \"}\n {t(\"portfolio.symbolPerformance.fees\")}\n </Text>\n <Flex itemAlign=\"center\" gap={1}>\n <label className=\"oui-text-2xs oui-text-base-contrast-54\">\n Cum.\n </label>\n <Switch\n checked={showCumulativeFees}\n onCheckedChange={setShowCumulativeFees}\n />\n </Flex>\n </Flex>\n <Box r=\"md\" className=\"oui-h-[144px] oui-border oui-border-line-4\">\n <CombinedFeesChart\n key={`mobile-fees-${aggregationWindow}`}\n data={combinedFeesData}\n aggregationWindow={aggregationWindow as \"15m\" | \"1h\" | \"1d\"}\n isMobile={true}\n invisible={isEmptyData}\n showCumulative={showCumulativeFees}\n />\n </Box>\n </Box>\n </Grid>\n\n {/* Symbol Summary - Top Symbols by PnL */}\n {symbolSummaryData.length > 0 && (\n <Box mt={6} mb={4}>\n <Divider className=\"oui-my-6 oui-border-t-2\" intensity={8} />\n <Text as=\"div\" size=\"sm\" weight=\"semibold\" className=\"oui-mb-4\">\n {t(\"portfolio.symbolPerformance.pnlRanking\")}\n </Text>\n <Box className=\"oui-border oui-border-line-4 oui-rounded-md oui-p-3\">\n <PnLRankingChartMobile\n data={symbolSummaryData}\n onSymbolSelect={setSelectedSymbol}\n />\n </Box>\n </Box>\n )}\n </div>\n );\n};\n","import React, { useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Text, cn } from \"@kodiak-finance/orderly-ui\";\n\nexport type PnLRankingDataItem = {\n symbol: string;\n pnl: number;\n volume: number;\n fees: number;\n};\n\ntype PnLRankingChartMobileProps = {\n data: PnLRankingDataItem[];\n onSymbolSelect?: (symbol: string) => void;\n};\n\nconst formatCurrency = (value: number): string => {\n if (value >= 1e9) return `$${(value / 1e9).toFixed(2)}B`;\n if (value >= 1e6) return `$${(value / 1e6).toFixed(2)}M`;\n if (value >= 1e3) return `$${(value / 1e3).toFixed(2)}K`;\n return `$${value.toFixed(2)}`;\n};\n\nexport const PnLRankingChartMobile: React.FC<PnLRankingChartMobileProps> = ({\n data,\n onSymbolSelect,\n}) => {\n const { t } = useTranslation();\n\n const maxAbsValue = useMemo(\n () => Math.max(...data.map((item) => Math.abs(item.pnl)), 1),\n [data],\n );\n\n return (\n <div className=\"oui-w-full oui-space-y-3\">\n {/* Header Row */}\n <div className=\"oui-border-b oui-border-line-4 oui-mb-2 oui-px-3 oui-py-2\">\n <div className=\"oui-flex oui-items-center oui-justify-between\">\n <Text size=\"xs\" intensity={54} weight=\"semibold\">\n {t(\"portfolio.symbolPerformance.pnlRanking.symbols\")}\n </Text>\n <Text\n size=\"xs\"\n intensity={54}\n weight=\"semibold\"\n className=\"oui-text-right\"\n >\n {t(\"portfolio.symbolPerformance.pnlRanking.pnl\")}\n </Text>\n </div>\n </div>\n\n {/* Data Rows */}\n {data.map((item) => {\n const isPositive = item.pnl >= 0;\n const barWidth = (Math.abs(item.pnl) / maxAbsValue) * 100;\n\n return (\n <div\n key={item.symbol}\n onClick={() => onSymbolSelect?.(item.symbol)}\n className=\"oui-border oui-border-line-4 hover:oui-border-line-5 oui-rounded oui-transition-colors oui-px-3 oui-py-3 oui-cursor-pointer\"\n >\n {/* Symbol - Full Width, No Truncation */}\n <Text size=\"xs\" weight=\"semibold\" className=\"oui-mb-2\">\n {item.symbol}\n </Text>\n\n {/* Bar with P&L Value - Full Width */}\n <div className=\"oui-relative oui-w-full oui-h-7 oui-rounded oui-bg-base-8 oui-overflow-hidden oui-flex oui-items-center oui-mb-3\">\n <div\n className=\"oui-absolute oui-h-full oui-rounded oui-transition-all\"\n style={{\n width: `${barWidth}%`,\n backgroundColor: isPositive ? \"#00B49E\" : \"#FF5959\",\n }}\n />\n <Text\n size=\"xs\"\n weight=\"semibold\"\n className={cn(\n \"oui-relative oui-z-10 oui-ml-2\",\n isPositive ? \"oui-text-profit-500\" : \"oui-text-loss-500\",\n )}\n >\n {isPositive ? \"+\" : \"\"}\n {item.pnl.toFixed(2)}\n </Text>\n </div>\n\n {/* Volume and Fees - Compact Secondary Info */}\n <div className=\"oui-flex oui-justify-between oui-gap-2 oui-border-t oui-border-line-4 oui-pt-2\">\n <div>\n <Text size=\"2xs\" intensity={54} className=\"oui-mb-0.5\">\n {t(\"portfolio.symbolPerformance.pnlRanking.volume\")}\n </Text>\n <Text size=\"xs\" weight=\"semibold\">\n {formatCurrency(item.volume)}\n </Text>\n </div>\n <div className=\"oui-text-right\">\n <Text size=\"2xs\" intensity={54} className=\"oui-mb-0.5\">\n {t(\"portfolio.symbolPerformance.pnlRanking.fees\")}\n </Text>\n <Text size=\"xs\" weight=\"semibold\" intensity={80}>\n {formatCurrency(item.fees)}\n </Text>\n </div>\n </div>\n </div>\n );\n })}\n\n {/* Empty State */}\n {data.length === 0 && (\n <div className=\"oui-flex oui-items-center oui-justify-center oui-py-8\">\n <Text size=\"xs\" intensity={54}>\n {t(\"portfolio.symbolPerformance.noData\")}\n </Text>\n </div>\n )}\n </div>\n );\n};\n"]}