efae3480bf
- Remove test connection button and related code from strategy creation page - Fix text colors in profile page dark theme (credits log, notification settings, exchange config, referral list) - Update frontend build files
1 line
274 KiB
JavaScript
1 line
274 KiB
JavaScript
(function(){var e={505:function(e,t,a){"use strict";a.d(t,{iD:function(){return o},ri:function(){return l},ug:function(){return r}});var i=a(75769),s={Login:"/api/auth/login",Logout:"/api/auth/logout",UserInfo:"/api/auth/info",UserMenu:"/user/nav"};function o(e){return(0,i.Ay)({url:s.Login,method:"post",data:e})}function n(){return(0,i.Ay)({url:s.UserInfo,method:"get",headers:{"Content-Type":"application/json;charset=UTF-8"}})}function r(){return n()}function l(){return(0,i.Ay)({url:s.Logout,method:"post",headers:{"Content-Type":"application/json;charset=UTF-8"}})}},2304:function(e,t,a){"use strict";e.exports=a.p+"img/slogo.6a59b21e.png"},5839:function(e,t,a){var i={"./ar-SA":[217,618],"./ar-SA.js":[217,618],"./de-DE":[73065,879],"./de-DE.js":[73065,879],"./en-US":[45958],"./en-US.js":[45958],"./fr-FR":[92556,969],"./fr-FR.js":[92556,969],"./ja-JP":[7392,638],"./ja-JP.js":[7392,638],"./ko-KR":[20729,840],"./ko-KR.js":[20729,840],"./th-TH":[11422,301],"./th-TH.js":[11422,301],"./vi-VN":[69654,424],"./vi-VN.js":[69654,424],"./zh-CN":[4070,644],"./zh-CN.js":[4070,644],"./zh-TW":[84540,892],"./zh-TW.js":[84540,892]};function s(e){if(!a.o(i,e))return Promise.resolve().then(function(){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=i[e],s=t[0];return Promise.all(t.slice(1).map(a.e)).then(function(){return a(s)})}s.keys=function(){return Object.keys(i)},s.id=5839,e.exports=s},33153:function(e,t,a){"use strict";e.exports=a.p+"img/logo.e0f510a8.png"},35358:function(e,t,a){var i={"./af":25177,"./af.js":25177,"./ar":61509,"./ar-dz":41488,"./ar-dz.js":41488,"./ar-kw":58676,"./ar-kw.js":58676,"./ar-ly":42353,"./ar-ly.js":42353,"./ar-ma":24496,"./ar-ma.js":24496,"./ar-ps":6947,"./ar-ps.js":6947,"./ar-sa":82682,"./ar-sa.js":82682,"./ar-tn":89756,"./ar-tn.js":89756,"./ar.js":61509,"./az":95533,"./az.js":95533,"./be":28959,"./be.js":28959,"./bg":47777,"./bg.js":47777,"./bm":54903,"./bm.js":54903,"./bn":61290,"./bn-bd":17357,"./bn-bd.js":17357,"./bn.js":61290,"./bo":31545,"./bo.js":31545,"./br":11470,"./br.js":11470,"./bs":44429,"./bs.js":44429,"./ca":7306,"./ca.js":7306,"./cs":56464,"./cs.js":56464,"./cv":73635,"./cv.js":73635,"./cy":64226,"./cy.js":64226,"./da":93601,"./da.js":93601,"./de":77853,"./de-at":26111,"./de-at.js":26111,"./de-ch":54697,"./de-ch.js":54697,"./de.js":77853,"./dv":60708,"./dv.js":60708,"./el":54691,"./el.js":54691,"./en-au":53872,"./en-au.js":53872,"./en-ca":28298,"./en-ca.js":28298,"./en-gb":56195,"./en-gb.js":56195,"./en-ie":66584,"./en-ie.js":66584,"./en-il":65543,"./en-il.js":65543,"./en-in":9033,"./en-in.js":9033,"./en-nz":79402,"./en-nz.js":79402,"./en-sg":43004,"./en-sg.js":43004,"./eo":32934,"./eo.js":32934,"./es":97650,"./es-do":20838,"./es-do.js":20838,"./es-mx":17730,"./es-mx.js":17730,"./es-us":56575,"./es-us.js":56575,"./es.js":97650,"./et":3035,"./et.js":3035,"./eu":3508,"./eu.js":3508,"./fa":119,"./fa.js":119,"./fi":90527,"./fi.js":90527,"./fil":95995,"./fil.js":95995,"./fo":52477,"./fo.js":52477,"./fr":85498,"./fr-ca":26435,"./fr-ca.js":26435,"./fr-ch":37892,"./fr-ch.js":37892,"./fr.js":85498,"./fy":37071,"./fy.js":37071,"./ga":41734,"./ga.js":41734,"./gd":70217,"./gd.js":70217,"./gl":77329,"./gl.js":77329,"./gom-deva":32124,"./gom-deva.js":32124,"./gom-latn":93383,"./gom-latn.js":93383,"./gu":95050,"./gu.js":95050,"./he":11713,"./he.js":11713,"./hi":43861,"./hi.js":43861,"./hr":26308,"./hr.js":26308,"./hu":90609,"./hu.js":90609,"./hy-am":17160,"./hy-am.js":17160,"./id":74063,"./id.js":74063,"./is":89374,"./is.js":89374,"./it":88383,"./it-ch":21827,"./it-ch.js":21827,"./it.js":88383,"./ja":23827,"./ja.js":23827,"./jv":89722,"./jv.js":89722,"./ka":41794,"./ka.js":41794,"./kk":27088,"./kk.js":27088,"./km":96870,"./km.js":96870,"./kn":84451,"./kn.js":84451,"./ko":63164,"./ko.js":63164,"./ku":98174,"./ku-kmr":6181,"./ku-kmr.js":6181,"./ku.js":98174,"./ky":78474,"./ky.js":78474,"./lb":79680,"./lb.js":79680,"./lo":15867,"./lo.js":15867,"./lt":45766,"./lt.js":45766,"./lv":69532,"./lv.js":69532,"./me":58076,"./me.js":58076,"./mi":41848,"./mi.js":41848,"./mk":30306,"./mk.js":30306,"./ml":73739,"./ml.js":73739,"./mn":99053,"./mn.js":99053,"./mr":86169,"./mr.js":86169,"./ms":73386,"./ms-my":92297,"./ms-my.js":92297,"./ms.js":73386,"./mt":77075,"./mt.js":77075,"./my":72264,"./my.js":72264,"./nb":22274,"./nb.js":22274,"./ne":8235,"./ne.js":8235,"./nl":92572,"./nl-be":43784,"./nl-be.js":43784,"./nl.js":92572,"./nn":54566,"./nn.js":54566,"./oc-lnc":69330,"./oc-lnc.js":69330,"./pa-in":29849,"./pa-in.js":29849,"./pl":94418,"./pl.js":94418,"./pt":79834,"./pt-br":48303,"./pt-br.js":48303,"./pt.js":79834,"./ro":24457,"./ro.js":24457,"./ru":82271,"./ru.js":82271,"./sd":1221,"./sd.js":1221,"./se":33478,"./se.js":33478,"./si":17538,"./si.js":17538,"./sk":5784,"./sk.js":5784,"./sl":46637,"./sl.js":46637,"./sq":86794,"./sq.js":86794,"./sr":45719,"./sr-cyrl":3322,"./sr-cyrl.js":3322,"./sr.js":45719,"./ss":56e3,"./ss.js":56e3,"./sv":41011,"./sv.js":41011,"./sw":40748,"./sw.js":40748,"./ta":11025,"./ta.js":11025,"./te":11885,"./te.js":11885,"./tet":28861,"./tet.js":28861,"./tg":86571,"./tg.js":86571,"./th":55802,"./th.js":55802,"./tk":59527,"./tk.js":59527,"./tl-ph":29231,"./tl-ph.js":29231,"./tlh":31052,"./tlh.js":31052,"./tr":85096,"./tr.js":85096,"./tzl":79846,"./tzl.js":79846,"./tzm":81765,"./tzm-latn":97711,"./tzm-latn.js":97711,"./tzm.js":81765,"./ug-cn":48414,"./ug-cn.js":48414,"./uk":16618,"./uk.js":16618,"./ur":57777,"./ur.js":57777,"./uz":57609,"./uz-latn":72475,"./uz-latn.js":72475,"./uz.js":57609,"./vi":21135,"./vi.js":21135,"./x-pseudo":64051,"./x-pseudo.js":64051,"./yo":82218,"./yo.js":82218,"./zh-cn":52648,"./zh-cn.js":52648,"./zh-hk":1632,"./zh-hk.js":1632,"./zh-mo":31541,"./zh-mo.js":31541,"./zh-tw":50304,"./zh-tw.js":50304};function s(e){var t=o(e);return a(t)}function o(e){if(!a.o(i,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return i[e]}s.keys=function(){return Object.keys(i)},s.resolve=o,e.exports=s,s.id=35358},36911:function(e,t,a){"use strict";a.d(t,{EM:function(){return o},GF:function(){return g},KP:function(){return v},Ke:function(){return d},Ox:function(){return r},P7:function(){return l},UH:function(){return m},WM:function(){return n},Yx:function(){return b},kv:function(){return h},mV:function(){return c},oK:function(){return y},tq:function(){return f},v_:function(){return u},xQ:function(){return p}});var i=a(75769),s={strategies:"/api/strategies",strategyDetail:"/api/strategies/detail",createStrategy:"/api/strategies/create",batchCreateStrategies:"/api/strategies/batch-create",updateStrategy:"/api/strategies/update",stopStrategy:"/api/strategies/stop",startStrategy:"/api/strategies/start",deleteStrategy:"/api/strategies/delete",batchStartStrategies:"/api/strategies/batch-start",batchStopStrategies:"/api/strategies/batch-stop",batchDeleteStrategies:"/api/strategies/batch-delete",testConnection:"/api/strategies/test-connection",trades:"/api/strategies/trades",positions:"/api/strategies/positions",equityCurve:"/api/strategies/equityCurve",notifications:"/api/strategies/notifications"};function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,i.Ay)({url:s.strategies,method:"get",params:e})}function n(e){return(0,i.Ay)({url:s.createStrategy,method:"post",data:e})}function r(e){return(0,i.Ay)({url:s.batchCreateStrategies,method:"post",data:e})}function l(e,t){return(0,i.Ay)({url:s.updateStrategy,method:"put",params:{id:e},data:t})}function d(e){return(0,i.Ay)({url:s.stopStrategy,method:"post",params:{id:e}})}function c(e){return(0,i.Ay)({url:s.startStrategy,method:"post",params:{id:e}})}function u(e){return(0,i.Ay)({url:s.deleteStrategy,method:"delete",params:{id:e}})}function m(e){return(0,i.Ay)({url:s.batchStartStrategies,method:"post",data:e})}function g(e){return(0,i.Ay)({url:s.batchStopStrategies,method:"post",data:e})}function p(e){return(0,i.Ay)({url:s.batchDeleteStrategies,method:"delete",data:e})}function h(e){return(0,i.Ay)({url:s.testConnection,method:"post",data:{exchange_config:e}})}function f(e){return(0,i.Ay)({url:s.trades,method:"get",params:{id:e}})}function y(e){return(0,i.Ay)({url:s.positions,method:"get",params:{id:e}})}function b(e){return(0,i.Ay)({url:s.equityCurve,method:"get",params:{id:e}})}function v(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return(0,i.Ay)({url:s.notifications,method:"get",params:e})}},45958:function(e,t,a){"use strict";a.r(t);var i=a(76338),s=a(1512),o=a(3508),n=a.n(o),r={antLocale:s.A,momentName:"eu",momentLocale:n()},l={"common.confirm":"Confirm","common.cancel":"Cancel","common.save":"Save","common.delete":"Delete","common.edit":"Edit","common.add":"Add","common.close":"Close","common.done":"Done","common.ok":"OK","common.loading":"Loading...","common.noData":"No data",submit:"Submit",save:"Save","submit.ok":"Submit successfully","save.ok":"Saved successfully","menu.welcome":"Welcome","menu.home":"Home","menu.dashboard":"Dashboard","menu.dashboard.analysis":"AI Analysis","menu.dashboard.aiAssetAnalysis":"AI Asset Analysis","menu.dashboard.aiQuant":"AI Quant","menu.dashboard.indicator":"Indicator Analysis","menu.dashboard.community":"Indicator Market","menu.dashboard.tradingAssistant":"Trading Assistant","menu.dashboard.portfolio":"Portfolio","menu.dashboard.globalMarket":"Global Market","menu.dashboard.polymarket":"Prediction Markets","menu.settings":"Settings","menu.dashboard.aiTradingAssistant":"AI Trading Assistant","menu.dashboard.signalRobot":"Signal Robot","menu.dashboard.monitor":"Monitor","menu.dashboard.workplace":"Workplace","aiAssetAnalysis.title":"AI Asset Analysis","aiAssetAnalysis.subtitle":"Unify portfolio monitoring, instant analysis, and scheduled tasks into one smooth workflow.","aiAssetAnalysis.actions.quickAnalysis":"Start Analysis Now","aiAssetAnalysis.actions.monitorTasks":"Manage Monitor Tasks","aiAssetAnalysis.actions.openStandalone":"Open Standalone Page","aiAssetAnalysis.quickBar.title":"Quick Analyze","aiAssetAnalysis.quickBar.placeholder":"Select a symbol from asset pool","aiAssetAnalysis.quickBar.useInQuick":"Use in Instant Analysis","aiAssetAnalysis.quickBar.runNow":"Analyze Now","aiAssetAnalysis.history.title":"Recent Analysis","aiAssetAnalysis.history.empty":"No analysis history yet","aiAssetAnalysis.actions.enterQuick":"Go to Instant Analysis","aiAssetAnalysis.actions.enterMonitor":"Go to Asset Pool & Tasks","aiAssetAnalysis.flow.poolTitle":"Build Asset Pool","aiAssetAnalysis.flow.poolDesc":"Add positions and watch targets first to build one unified analysis pool.","aiAssetAnalysis.flow.poolAction":"Manage Asset Pool","aiAssetAnalysis.flow.quickTitle":"Instant Analysis","aiAssetAnalysis.flow.quickDesc":"Run AI analysis for any symbol in one click and get suggestions quickly.","aiAssetAnalysis.flow.quickAction":"Run Analysis","aiAssetAnalysis.flow.autoTitle":"Scheduled Monitoring","aiAssetAnalysis.flow.autoDesc":"Set recurring AI analysis tasks and deliver reports through notification channels.","aiAssetAnalysis.flow.autoAction":"Configure Tasks","aiAssetAnalysis.tabs.quick":"Instant Analysis","aiAssetAnalysis.tabs.monitor":"Asset Pool & Scheduled Tasks","aiAssetAnalysis.tabLead.quick":"Best for ad-hoc decisions: select a symbol and analyze immediately.","aiAssetAnalysis.tabLead.monitor":"Best for continuous tracking: maintain positions and set monitor ranges/frequency.","aiAssetAnalysis.stats.totalAnalyses":"Total Analyses","aiAssetAnalysis.stats.accuracy":"Accuracy","aiAssetAnalysis.stats.avgReturn":"Avg Return","aiAssetAnalysis.stats.satisfaction":"Satisfaction","aiAssetAnalysis.stats.decisions":"Decision Dist.","aiAssetAnalysis.opportunities.title":"AI Opportunity Radar","aiAssetAnalysis.opportunities.empty":"No opportunities found","aiAssetAnalysis.opportunities.analyze":"Analyze","aiAssetAnalysis.opportunities.updateHint":"Updates hourly","aiAssetAnalysis.opportunities.signal.overbought":"Overbought","aiAssetAnalysis.opportunities.signal.oversold":"Oversold","aiAssetAnalysis.opportunities.signal.bullish_momentum":"Bullish","aiAssetAnalysis.opportunities.signal.bearish_momentum":"Bearish","aiAssetAnalysis.opportunities.market.Crypto":"🪙 Crypto","aiAssetAnalysis.opportunities.market.USStock":"📈 US Stock","aiAssetAnalysis.opportunities.market.Forex":"💱 Forex","aiAssetAnalysis.opportunities.market.PredictionMarket":"🎯 Prediction Market","aiAssetAnalysis.opportunities.reason.crypto.overbought":"24h +{change}%, 7d +{change7d}%, overbought risk","aiAssetAnalysis.opportunities.reason.crypto.bullish_momentum":"24h +{change}%, strong bullish momentum","aiAssetAnalysis.opportunities.reason.crypto.oversold":"24h -{change}%, possible oversold bounce","aiAssetAnalysis.opportunities.reason.crypto.bearish_momentum":"24h -{change}%, clear bearish trend","aiAssetAnalysis.opportunities.reason.usstock.overbought":"Day +{change}%, large gain, watch for pullback","aiAssetAnalysis.opportunities.reason.usstock.bullish_momentum":"Day +{change}%, strong bullish momentum","aiAssetAnalysis.opportunities.reason.usstock.oversold":"Day -{change}%, possible oversold bounce","aiAssetAnalysis.opportunities.reason.usstock.bearish_momentum":"Day -{change}%, clear bearish trend","aiAssetAnalysis.opportunities.reason.forex.overbought":"Day +{change}%, volatile, watch for reversal","aiAssetAnalysis.opportunities.reason.forex.bullish_momentum":"Day +{change}%, bullish momentum","aiAssetAnalysis.opportunities.reason.forex.oversold":"Day -{change}%, volatile, possible bounce","aiAssetAnalysis.opportunities.reason.forex.bearish_momentum":"Day -{change}%, clear bearish trend","aiAssetAnalysis.checkup.title":"Portfolio Checkup","aiAssetAnalysis.checkup.btn":"Checkup","aiAssetAnalysis.checkup.desc":"Run AI analysis on all positions in your portfolio to quickly understand the current status and get recommendations for each asset.","aiAssetAnalysis.checkup.start":"Start Checkup","aiAssetAnalysis.checkup.progress":"Analyzing {current}/{total}...","aiAssetAnalysis.checkup.noPositions":"No positions in your portfolio. Please add assets first.","aiAssetAnalysis.checkup.complete":"Checkup Complete","aiAssetAnalysis.checkup.failed":"Failed","aiAssetAnalysis.checkup.rerun":"Run Again","aiAssetAnalysis.search.hint":"Search","aiAssetAnalysis.search.placeholder":"Search any symbol... (Ctrl+K)","aiAssetAnalysis.search.noResults":"No results found. Try a different keyword.","menu.form":"Form","menu.form.basic-form":"Basic Form","menu.form.step-form":"Step Form","menu.form.step-form.info":"Step Form(write transfer information)","menu.form.step-form.confirm":"Step Form(confirm transfer information)","menu.form.step-form.result":"Step Form(finished)","menu.form.advanced-form":"Advanced Form","menu.list":"List","menu.list.table-list":"Search Table","menu.list.basic-list":"Basic List","menu.list.card-list":"Card List","menu.list.search-list":"Search List","menu.list.search-list.articles":"Search List(articles)","menu.list.search-list.projects":"Search List(projects)","menu.list.search-list.applications":"Search List(applications)","menu.profile":"Profile","menu.profile.basic":"Basic Profile","menu.profile.advanced":"Advanced Profile","menu.result":"Result","menu.result.success":"Success","menu.result.fail":"Fail","menu.exception":"Exception","menu.exception.not-permission":"403","menu.exception.not-find":"404","menu.exception.server-error":"500","menu.exception.trigger":"Trigger","menu.account":"Account","menu.account.center":"Account Center","menu.account.settings":"Account Settings","menu.account.trigger":"Trigger Error","menu.account.logout":"Logout","menu.wallet":"My Wallet","menu.docs":"Documentation","menu.docs.detail":"Doc Detail","menu.header.refreshPage":"Refresh Page","menu.invite.friends":"Invite Friends","app.setting.pagestyle":"Page Style Setting","app.setting.pagestyle.light":"Light Menu Style","app.setting.pagestyle.dark":"Dark Menu Style","app.setting.pagestyle.realdark":"RealDark style","app.setting.themecolor":"Theme Color","app.setting.navigationmode":"Navigation Mode","app.setting.sidemenu.nav":"Sidebar Navigation","app.setting.topmenu.nav":"Top Navigation","app.setting.content-width":"Content Width","app.setting.content-width.tooltip":"This setting is only effective for [Top Navigation]","app.setting.content-width.fixed":"Fixed","app.setting.content-width.fluid":"Fluid","app.setting.fixedheader":"Fixed Header","app.setting.fixedheader.tooltip":"Configurable when Header is fixed","app.setting.autoHideHeader":"Hide Header on Scroll","app.setting.fixedsidebar":"Fixed Sidebar Menu","app.setting.sidemenu":"Side Menu Layout","app.setting.topmenu":"Top Menu Layout","app.setting.othersettings":"Other Settings","app.setting.weakmode":"Weak Mode","app.setting.multitab":"Multi-Tab Mode","app.setting.copy":"Copy Setting","app.setting.loading":"Loading theme","app.setting.copyinfo":"copy success,please replace defaultSettings in src/config/defaultSettings.js","app.setting.copy.success":"Copy Success","app.setting.copy.fail":"Copy Failed","app.setting.theme.switching":"Switching theme...","app.setting.production.hint":"Setting panel shows in development environment only, please manually modify","app.setting.themecolor.daybreak":"Daybreak Blue (Default)","app.setting.themecolor.dust":"Dust Red","app.setting.themecolor.volcano":"Volcano","app.setting.themecolor.sunset":"Sunset Orange","app.setting.themecolor.cyan":"Cyan","app.setting.themecolor.green":"Polar Green","app.setting.themecolor.geekblue":"Geek Blue","app.setting.themecolor.purple":"Golden Purple","app.setting.tooltip":"Page Settings","notice.title":"Notifications","notice.empty":"No notifications","notice.markAllRead":"Mark all as read","notice.clear":"Clear all","notice.close":"Close","notice.justNow":"Just now","notice.minutesAgo":"minutes ago","notice.hoursAgo":"hours ago","notice.daysAgo":"days ago","notice.detailInfo":"Details","notice.aiDecision":"AI Decision","notice.confidence":"Confidence","notice.reasoning":"Reasoning","notice.symbol":"Symbol","notice.currentPrice":"Current Price","notice.triggerPrice":"Trigger Price","notice.action":"Action","notice.quantity":"Quantity","notice.viewPortfolio":"View Portfolio","notice.type.aiMonitor":"AI Monitor","notice.type.priceAlert":"Price Alert","notice.type.signal":"Trade Signal","notice.type.buy":"Buy Signal","notice.type.sell":"Sell Signal","notice.type.hold":"Hold Suggestion","notice.type.trade":"Trade Execution","notice.type.notification":"Notification","user.login.userName":"userName","user.login.password":"password","user.login.username.placeholder":"Account: admin","user.login.password.placeholder":"password: admin or ant.design","user.login.message-invalid-credentials":"Login failed, please check your email and verification code","user.login.message-invalid-verification-code":"Invalid verification code","user.login.tab-login-credentials":"Credentials","user.login.tab-login-email":"Email","user.login.tab-login-mobile":"Mobile number","user.login.captcha.placeholder":"Please enter captcha","user.login.mobile.placeholder":"Mobile number","user.login.mobile.verification-code.placeholder":"Verification code","user.login.email.placeholder":"Please enter your email address","user.login.email.verification-code.placeholder":"Please enter verification code","user.login.email.sending":"Sending verification code...","user.login.email.send-success-title":"Notice","user.login.email.send-success":"Verification code sent successfully, please check your email","user.login.sms.send-success":"Verification code sent successfully, please check your SMS","user.login.remember-me":"Remember me","user.login.forgot-password":"Forgot your password?","user.login.sign-in-with":"Sign in with","user.login.signup":"Sign up","user.login.login":"Login","user.register.register":"Register","user.register.email.placeholder":"Email","user.register.password.placeholder":"Password ","user.register.password.popover-message":"Please enter at least 6 characters. Please do not use passwords that are easy to guess. ","user.register.confirm-password.placeholder":"Confirm password","user.register.get-verification-code":"Get code","user.register.sign-in":"Already have an account?","user.register-result.msg":"Account:registered at {email}","user.register-result.activation-email":"The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.","user.register-result.back-home":"Back to home","user.register-result.view-mailbox":"View mailbox","user.email.required":"Please enter your email!","user.email.wrong-format":"The email address is in the wrong format!","user.userName.required":"Please enter account name or email address","user.password.required":"Please enter your password!","user.password.twice.msg":"The passwords entered twice do not match!","user.password.strength.msg":"The password is not strong enough","user.password.strength.strong":"Strength: strong","user.password.strength.medium":"Strength: medium","user.password.strength.low":"Strength: low","user.password.strength.short":"Strength: too short","user.confirm-password.required":"Please confirm your password!","user.phone-number.required":"Please enter your phone number!","user.phone-number.wrong-format":"Please enter a valid phone number","user.verification-code.required":"Please enter the verification code!","user.captcha.required":"Please enter captcha!","user.login.infos":"QuantDinger is an AI multi-agent stock analysis tool that does not have securities investment consulting qualifications. All analysis results, scores, and reference opinions on the platform are automatically generated by AI based on historical data, and are only for learning, research, and technical exchanges, and do not constitute any investment advice or decision-making basis. Stock investment involves market risk, liquidity risk, policy risk and other risks, which may lead to losses of principal. Users should make independent decisions based on their risk tolerance capacity, and bear the consequences of any investment behavior and its results using this tool. Market risk, investment needs to be cautious.","user.login.tab-login-web3":"Web3 Login","user.login.web3.tip":"Sign in with your wallet via signature","user.login.web3.connect":"Connect wallet and login","user.login.web3.no-wallet":"No wallet detected","user.login.web3.no-address":"Wallet address not found","user.login.web3.nonce-failed":"Failed to get nonce","user.login.web3.verify-failed":"Signature verification failed","user.login.web3.success":"Login success","user.login.web3.failed":"Wallet login failed","nav.no_wallet":"No wallet detected","nav.copy":"Copy","nav.copy_success":"Copied","user.login.oauth.google":"Sign in with Google","user.login.oauth.github":"Sign in with GitHub","user.login.oauth.loading":"Redirecting to authorization page...","user.login.oauth.failed":"OAuth login failed","user.login.oauth.get-url-failed":"Failed to get authorization URL","user.login.subtitle":"driven quantitative insights for global markets","user.login.legal.title":"Legal Disclaimer","user.login.legal.view":"View Legal Disclaimer","user.login.legal.collapse":"Hide Legal Disclaimer","user.login.legal.agree":"I have read and agree to the Legal Disclaimer","user.login.legal.required":"Please read and check the Legal Disclaimer first","user.login.legal.content":"QuantDinger is an AI multi-agent stock analysis tool and does not provide investment advice. All analysis results, scores, and references are generated by AI based on historical data and are for learning, research, and technical exchange only. They do not constitute investment advice or a basis for decision-making. Stock investments involve market, liquidity, and policy risks, which may lead to loss of principal. Users should make independent decisions based on their risk tolerance and bear the consequences of any investment behavior and results using this tool.","user.login.privacy.title":"Privacy Policy","user.login.privacy.view":"View Privacy Policy","user.login.privacy.collapse":"Hide Privacy Policy","user.login.privacy.content":"We value your privacy and data protection. (1) Scope of collection: We only collect information necessary to provide the service (e.g., email, mobile number, country code, Web3 wallet address) and limited logs/device data. (2) Purpose of use: Account login and security verification, feature provisioning, troubleshooting, and compliance requirements. (3) Storage & security: Data is encrypted and access-controlled to prevent unauthorized access, disclosure, or loss. (4) Sharing & third parties: We do not share personal data with third parties except as required by law or to deliver the service; where third-party services are involved (e.g., wallets, SMS providers), processing is limited to the minimum scope required. (5) Cookies/local storage: Used for session and login state (e.g., tokens, PHPSESSID). You may clear or restrict them in your browser. (6) Your rights: You may exercise rights of access, correction, deletion, and consent withdrawal as permitted by law. (7) Changes & notices: We will provide prominent notice for updates. Continued use indicates that you have read and agreed to the updated terms. If you do not agree, please stop using the service and contact us.","user.login.username":"Username","user.login.usernameRequired":"Please enter username","user.login.passwordRequired":"Please enter password","user.login.tab":"Login","user.login.submit":"Login","user.login.register":"Create Account","user.login.forgotPassword":"Forgot Password?","user.login.orLoginWith":"Or login with","user.login.methodPassword":"Password","user.login.methodCode":"Email Code","user.login.email":"Email","user.login.emailRequired":"Please enter email","user.login.emailInvalid":"Invalid email format","user.login.verificationCode":"Verification Code","user.login.codeRequired":"Please enter verification code","user.login.sendCode":"Send","user.login.codeSent":"Verification code sent","user.login.codeLoginHint":"New users will be auto-registered","user.login.welcomeNew":"Welcome!","user.login.accountCreated":"Your account has been created","user.oauth.processing":"Processing login...","user.oauth.error.missing_params":"Missing required parameters","user.oauth.error.invalid_state":"Invalid state parameter","user.oauth.error.user_creation_failed":"Failed to create user","user.oauth.error.server_error":"Server error","user.register.tab":"Register","user.register.title":"Create Account","user.register.email":"Email","user.register.emailRequired":"Please enter email","user.register.emailInvalid":"Invalid email format","user.register.verificationCode":"Verification Code","user.register.codeRequired":"Please enter verification code","user.register.sendCode":"Send Code","user.register.codeSent":"Verification code sent","user.register.username":"Username","user.register.usernameRequired":"Please enter username","user.register.usernameLength":"Username must be 3-30 characters","user.register.usernamePattern":"Start with letter, letters/numbers/underscore only","user.register.password":"Password","user.register.passwordRequired":"Please enter password","user.register.confirmPassword":"Confirm Password","user.register.confirmPasswordRequired":"Please confirm password","user.register.passwordMismatch":"Passwords do not match","user.register.submit":"Create Account","user.register.haveAccount":"Already have an account?","user.register.login":"Login","user.register.success":"Registration successful","user.register.pleaseLogin":"Please login with your new account","user.register.pwdMinLength":"At least 8 characters","user.register.pwdUppercase":"At least one uppercase letter","user.register.pwdLowercase":"At least one lowercase letter","user.register.pwdNumber":"At least one number","user.resetPassword.title":"Reset Password","user.resetPassword.email":"Email","user.resetPassword.emailRequired":"Please enter email","user.resetPassword.emailInvalid":"Invalid email format","user.resetPassword.verificationCode":"Verification Code","user.resetPassword.codeRequired":"Please enter verification code","user.resetPassword.sendCode":"Send Code","user.resetPassword.codeSent":"Verification code sent","user.resetPassword.next":"Next","user.resetPassword.backToLogin":"Back to Login","user.resetPassword.resettingFor":"Resetting password for","user.resetPassword.newPassword":"New Password","user.resetPassword.passwordRequired":"Please enter new password","user.resetPassword.confirmPassword":"Confirm New Password","user.resetPassword.confirmPasswordRequired":"Please confirm password","user.resetPassword.submit":"Reset Password","user.resetPassword.back":"Back","user.resetPassword.successTitle":"Password Reset Successful","user.resetPassword.successSubtitle":"You can now login with your new password","user.resetPassword.goToLogin":"Go to Login","user.security.retry":"Retry","profile.passwordHintNew":"For security, email verification is required to change password. Password must be at least 8 characters with uppercase, lowercase, and number.","profile.verificationCode":"Verification Code","profile.codeRequired":"Please enter verification code","profile.codePlaceholder":"Enter verification code","profile.sendCode":"Send Code","profile.codeSent":"Verification code sent","profile.codeWillSendTo":"Code will be sent to","profile.noEmailWarning":"Please set your email first in Basic Info tab","account.basicInfo":"Basic Information","account.id":"User ID","account.username":"Username","account.nickname":"Nickname","account.email":"Email","account.mobile":"Mobile","account.web3address":"Wallet Address","account.pid":"Referrer ID","account.level":"Level","account.money":"Balance","account.qdtBalance":"QDT Balance","account.score":"Score","account.createtime":"Registration Time","account.inviteLink":"Invite Link","account.recharge":"Recharge","account.rechargeTip":"Please scan the QR code below with WeChat or Alipay to recharge","account.qrCodePlaceholder":"QR Code Placeholder (Mock)","account.rechargeAmount":"Recharge Amount","account.enterAmount":"Please enter recharge amount","account.rechargeHint":"Minimum recharge amount: 1 QDT","account.confirmRecharge":"Confirm Recharge","account.enterValidAmount":"Please enter a valid recharge amount","account.rechargeSuccess":"Recharge successful! Recharged {amount} QDT","account.settings.menuMap.basic":"Basic Settings","account.settings.menuMap.security":"Security Settings","account.settings.menuMap.notification":"New Message Notification","account.settings.menuMap.moneyLog":"Transaction History","account.moneyLog.empty":"No transaction history","account.moneyLog.total":"Total {total} records","account.moneyLog.type.purchase":"Purchase Indicator","account.moneyLog.type.recharge":"Recharge","account.moneyLog.type.refund":"Refund","account.moneyLog.type.reward":"Reward","account.moneyLog.type.income":"Indicator Income","account.moneyLog.type.commission":"Platform Fee","wallet.balance":"QDT Balance","wallet.recharge":"Recharge","wallet.withdraw":"Withdraw","wallet.filter":"Filter","wallet.reset":"Reset","wallet.totalRecharge":"Total Recharge","wallet.totalWithdraw":"Total Withdraw","wallet.totalIncome":"Total Income","wallet.records":"Trading Records & Transaction History","wallet.tradingRecords":"Trading Records","wallet.moneyLog":"Transaction History","wallet.rechargeTip":"Please scan the QR code below with WeChat or Alipay to recharge","wallet.qrCodePlaceholder":"QR Code Placeholder (Simulated)","wallet.rechargeAmount":"Recharge Amount","wallet.enterAmount":"Please enter recharge amount","wallet.rechargeHint":"Minimum recharge amount: 1 QDT","wallet.confirmRecharge":"Confirm Recharge","wallet.enterValidAmount":"Please enter a valid recharge amount","wallet.rechargeSuccess":"Recharge successful! Recharged {amount} QDT","wallet.rechargeFailed":"Recharge failed","wallet.withdrawTip":"Please enter withdrawal amount and address","wallet.withdrawAmount":"Withdrawal Amount","wallet.enterWithdrawAmount":"Please enter withdrawal amount","wallet.withdrawHint":"Minimum withdrawal amount: 1 QDT","wallet.withdrawAddress":"Withdrawal Address (Optional)","wallet.enterWithdrawAddress":"Please enter withdrawal address","wallet.confirmWithdraw":"Confirm Withdrawal","wallet.enterValidWithdrawAmount":"Please enter a valid withdrawal amount","wallet.insufficientBalance":"Insufficient balance","wallet.withdrawSuccess":"Withdrawal successful! Withdrew {amount} QDT","wallet.withdrawFailed":"Withdrawal failed","wallet.noTradingRecords":"No trading records","wallet.noMoneyLog":"No transaction history","wallet.loadTradingRecordsFailed":"Failed to load trading records","wallet.loadMoneyLogFailed":"Failed to load transaction history","wallet.moneyLogTotal":"Total {total} records","wallet.moneyLogTypeTitle":"Type","wallet.moneyLogType.all":"All types","wallet.table.time":"Time","wallet.table.type":"Type","wallet.table.price":"Price","wallet.table.amount":"Amount","wallet.table.money":"Amount","wallet.table.balance":"Balance","wallet.table.memo":"Memo","wallet.table.value":"Value","wallet.table.profit":"P/L","wallet.table.commission":"Commission","wallet.table.total":"Total {total} records","wallet.tradeType.buy":"Buy","wallet.tradeType.sell":"Sell","wallet.tradeType.liquidation":"Liquidation","wallet.tradeType.openLong":"Open Long","wallet.tradeType.addLong":"Add Long","wallet.tradeType.closeLong":"Close Long","wallet.tradeType.closeLongStop":"Stop Loss Close Long","wallet.tradeType.closeLongProfit":"Take Profit Close Long","wallet.tradeType.openShort":"Open Short","wallet.tradeType.addShort":"Add Short","wallet.tradeType.closeShort":"Close Short","wallet.tradeType.closeShortStop":"Stop Loss Close Short","wallet.tradeType.closeShortProfit":"Take Profit Close Short","wallet.moneyLogType.purchase":"Purchase Indicator","wallet.moneyLogType.recharge":"Recharge","wallet.moneyLogType.withdraw":"Withdraw","wallet.moneyLogType.refund":"Refund","wallet.moneyLogType.reward":"Reward","wallet.moneyLogType.income":"Income","wallet.moneyLogType.commission":"Commission","wallet.web3Address.required":"Please fill in Web3 wallet address first","wallet.web3Address.requiredDescription":"You need to bind your Web3 wallet address before recharging to receive deposits","wallet.web3Address.placeholder":"Please enter your Web3 wallet address (starts with 0x)","wallet.web3Address.save":"Save Wallet Address","wallet.web3Address.saveSuccess":"Wallet address saved successfully","wallet.web3Address.saveFailed":"Failed to save wallet address","wallet.web3Address.invalidFormat":"Please enter a valid Web3 wallet address (Ethereum format: 42 characters starting with 0x, or TRC20 format: 34 characters starting with T)","wallet.selectCoin":"Select Coin","wallet.selectChain":"Select Chain","wallet.chain.eth":"ETH(ERC20)","wallet.chain.trc20":"TRC20","wallet.chain.bsc":"BSC","wallet.targetQdtAmount":"Target QDT Amount (Optional)","wallet.targetQdtAmount.placeholder":"Enter the QDT amount you want to exchange, current QDT price: {price} USDT","wallet.targetQdtAmount.requiredUsdt":"Required USDT: {amount}","wallet.rechargeAddress":"Recharge Address","wallet.copyAddress":"Copy","wallet.copySuccess":"Copied successfully!","wallet.copyFailed":"Copy failed, please copy manually","wallet.rechargeAddressHint":"Please ensure you use {chain} chain to recharge {coin} to this address","wallet.qdtPrice.loading":"Loading...","wallet.rechargeTip.new":"Please select coin and chain, then scan the QR code below to recharge","wallet.exchangeRate":"1 QDT ≈ {rate} USDT","wallet.withdrawableAmount":"Withdrawable Amount","wallet.totalBalance":"Total Balance","wallet.insufficientWithdrawable":"Insufficient withdrawable amount, current withdrawable: {amount} QDT","wallet.withdrawAddressRequired":"Please enter withdrawal address","wallet.withdrawAddressHint":"Please ensure the address is correct, withdrawal cannot be revoked","wallet.withdrawSubmitSuccess":"Withdrawal application submitted successfully, please wait for review","menu.footer.contactUs":"Contact Us","menu.footer.getSupport":"Get Support","menu.footer.socialAccounts":"Social Accounts","menu.footer.userAgreement":"User Agreement","menu.footer.privacyPolicy":"Privacy Policy","menu.footer.support":"Support","menu.footer.featureRequest":"Feature request","menu.footer.email":"Email","menu.footer.liveChat":"24/7 live chat","dashboard.analysis.title":"Multi-Dimensional Analysis","dashboard.analysis.subtitle":"AI-Powered Comprehensive Financial Analysis Platform","dashboard.analysis.selectSymbol":"Select or enter symbol code","dashboard.analysis.selectModel":"Select Model","dashboard.analysis.startAnalysis":"Start Analysis","dashboard.analysis.history":"History","dashboard.analysis.tab.overview":"Overview","dashboard.analysis.tab.fundamental":"Fundamental","dashboard.analysis.tab.technical":"Technical","dashboard.analysis.tab.news":"News","dashboard.analysis.tab.sentiment":"Sentiment","dashboard.analysis.tab.risk":"Risk","dashboard.analysis.tab.debate":"Debate","dashboard.analysis.tab.decision":"Final Decision","dashboard.analysis.empty.selectSymbol":"Select Symbol to Start Analysis","dashboard.analysis.empty.selectSymbolDesc":"Select from watchlist or enter symbol code to get multi-dimensional AI analysis report","dashboard.analysis.empty.startAnalysis":'Click "Start Analysis" button to perform multi-dimensional analysis',"dashboard.analysis.empty.startAnalysisDesc":"We will provide comprehensive analysis from multiple dimensions including fundamental, technical, news, sentiment and risk","dashboard.analysis.empty.noData":"No {type} analysis data available, please perform comprehensive analysis first","dashboard.analysis.empty.noWatchlist":"No watchlist items","dashboard.analysis.empty.noHistory":"No history records","dashboard.analysis.empty.watchlistHint":"No watchlist, please","dashboard.analysis.empty.noDebateData":"No debate data available","dashboard.analysis.empty.noDecisionData":"No decision data available","dashboard.analysis.empty.selectAgent":"Please select an Agent to view analysis results","dashboard.analysis.loading.analyzing":"Analyzing, please wait...","dashboard.analysis.loading.fundamental":"Analyzing fundamental data...","dashboard.analysis.loading.technical":"Analyzing technical indicators...","dashboard.analysis.loading.news":"Analyzing news data...","dashboard.analysis.loading.sentiment":"Analyzing market sentiment...","dashboard.analysis.loading.risk":"Assessing risks...","dashboard.analysis.loading.debate":"Debating...","dashboard.analysis.loading.decision":"Generating final decision...","dashboard.analysis.score.overall":"Overall Score","dashboard.analysis.score.recommendation":"Recommendation","dashboard.analysis.score.confidence":"Confidence","dashboard.analysis.dimension.fundamental":"Fundamental","dashboard.analysis.dimension.technical":"Technical","dashboard.analysis.dimension.news":"News","dashboard.analysis.dimension.sentiment":"Sentiment","dashboard.analysis.dimension.risk":"Risk","dashboard.analysis.card.dimensionScores":"Dimension Scores","dashboard.analysis.card.overviewReport":"Overview Report","dashboard.analysis.card.financialMetrics":"Financial Metrics","dashboard.analysis.card.fundamentalReport":"Fundamental Analysis Report","dashboard.analysis.card.technicalIndicators":"Technical Indicators","dashboard.analysis.card.technicalReport":"Technical Analysis Report","dashboard.analysis.card.newsList":"Related News","dashboard.analysis.card.newsReport":"News Analysis Report","dashboard.analysis.card.sentimentIndicators":"Sentiment Indicators","dashboard.analysis.card.sentimentReport":"Sentiment Analysis Report","dashboard.analysis.card.riskMetrics":"Risk Metrics","dashboard.analysis.card.riskReport":"Risk Assessment Report","dashboard.analysis.card.bullView":"Bullish View (Bull)","dashboard.analysis.card.bearView":"Bearish View (Bear)","dashboard.analysis.card.researchConclusion":"Researcher Conclusion","dashboard.analysis.card.traderPlan":"Trader Plan","dashboard.analysis.card.riskDebate":"Risk Committee Debate","dashboard.analysis.card.finalDecision":"Final Decision","dashboard.analysis.card.tradePlanDetail":"Trading Plan Details","dashboard.analysis.tradingPlan.entry_price":"Entry Price","dashboard.analysis.tradingPlan.position_size":"Position Size","dashboard.analysis.tradingPlan.stop_loss":"Stop Loss","dashboard.analysis.tradingPlan.take_profit":"Take Profit","dashboard.analysis.label.confidence":"Confidence","dashboard.analysis.label.keyPoints":"Key Points","dashboard.analysis.label.riskWarning":"Risk Warning","dashboard.analysis.risk.risky":"Aggressive View (Risky)","dashboard.analysis.risk.neutral":"Neutral View (Neutral)","dashboard.analysis.risk.safe":"Conservative View (Safe)","dashboard.analysis.risk.conclusion":"Conclusion","dashboard.analysis.feature.fundamental":"Fundamental Analysis","dashboard.analysis.feature.technical":"Technical Analysis","dashboard.analysis.feature.news":"News Analysis","dashboard.analysis.feature.sentiment":"Sentiment Analysis","dashboard.analysis.feature.risk":"Risk Assessment","dashboard.analysis.watchlist.title":"My Watchlist","dashboard.analysis.watchlist.add":"Add","dashboard.analysis.watchlist.addStock":"Add Stock","dashboard.analysis.modal.addStock.title":"Add to Watchlist","dashboard.analysis.modal.addStock.confirm":"Confirm","dashboard.analysis.modal.addStock.cancel":"Cancel","dashboard.analysis.modal.addStock.market":"Market Type","dashboard.analysis.modal.addStock.marketPlaceholder":"Please select market","dashboard.analysis.modal.addStock.marketRequired":"Please select market type","dashboard.analysis.modal.addStock.symbol":"Symbol","dashboard.analysis.modal.addStock.symbolPlaceholder":"e.g.: AAPL, TSLA, GOOGL, 000001, BTC","dashboard.analysis.modal.addStock.symbolRequired":"Please enter symbol code","dashboard.analysis.modal.addStock.searchPlaceholder":"Search symbol code or name","dashboard.analysis.modal.addStock.searchOrInputPlaceholder":"Search or enter symbol code (e.g.: AAPL, BTC/USDT, EUR/USD)","dashboard.analysis.modal.addStock.searchOrInputHint":"Search in database or enter code directly (name will be fetched automatically)","dashboard.analysis.modal.addStock.search":"Search","dashboard.analysis.modal.addStock.searchResults":"Search Results","dashboard.analysis.modal.addStock.hotSymbols":"Hot Symbols","dashboard.analysis.modal.addStock.noHotSymbols":"No hot symbols available","dashboard.analysis.modal.addStock.selectedSymbol":"Selected Symbol","dashboard.analysis.modal.addStock.pleaseSelectSymbol":"Please select a symbol first","dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol":"Please select a symbol or enter symbol code","dashboard.analysis.modal.addStock.pleaseEnterSymbol":"Please enter symbol code","dashboard.analysis.modal.addStock.pleaseSelectMarket":"Please select market type first","dashboard.analysis.modal.addStock.searchFailed":"Search failed, please try again later","dashboard.analysis.modal.addStock.noSearchResults":"No matching symbols found","dashboard.analysis.modal.addStock.willAutoFetchName":"Name will be fetched automatically","dashboard.analysis.modal.addStock.addDirectly":"Add Directly","dashboard.analysis.modal.addStock.nameWillBeFetched":"Name will be fetched automatically when adding","dashboard.analysis.market.USStock":"US Stock","dashboard.analysis.market.Crypto":"Cryptocurrency","dashboard.analysis.market.Forex":"Forex","dashboard.analysis.market.Futures":"Futures","dashboard.analysis.modal.history.title":"Analysis History","dashboard.analysis.modal.history.viewResult":"View Result","dashboard.analysis.modal.history.completeTime":"Complete Time","dashboard.analysis.modal.history.error":"Error","dashboard.analysis.status.pending":"Pending","dashboard.analysis.status.processing":"Processing","dashboard.analysis.status.completed":"Completed","dashboard.analysis.status.failed":"Failed","dashboard.analysis.message.selectSymbol":"Please select a symbol first","dashboard.analysis.message.taskCreated":"Analysis task created, executing in background...","dashboard.analysis.message.analysisComplete":"Analysis Complete","dashboard.analysis.message.analysisCompleteCache":"Analysis Complete (Using Cache)","dashboard.analysis.message.analysisFailed":"Analysis failed, please try again later","dashboard.analysis.message.addStockSuccess":"Added successfully","dashboard.analysis.message.addStockFailed":"Failed to add","dashboard.analysis.message.removeStockSuccess":"Removed successfully","dashboard.analysis.message.removeStockFailed":"Failed to remove","dashboard.analysis.message.resumingAnalysis":"Resuming analysis task...","dashboard.analysis.message.deleteSuccess":"Deleted successfully","dashboard.analysis.message.deleteFailed":"Failed to delete","dashboard.analysis.modal.history.delete":"Delete","dashboard.analysis.modal.history.deleteConfirm":"Are you sure you want to delete this analysis record?","dashboard.analysis.test":"Gongzhuan No.{no} shop","dashboard.analysis.introduce":"Introduce","dashboard.analysis.total-sales":"Total Sales","dashboard.analysis.day-sales":"Daily Sales","dashboard.analysis.visits":"Visits","dashboard.analysis.visits-trend":"Visits Trend","dashboard.analysis.visits-ranking":"Visits Ranking","dashboard.analysis.day-visits":"Daily Visits","dashboard.analysis.week":"WoW Change","dashboard.analysis.day":"DoD Change","dashboard.analysis.payments":"Payments","dashboard.analysis.conversion-rate":"Conversion Rate","dashboard.analysis.operational-effect":"Operational Effect","dashboard.analysis.sales-trend":"Stores Sales Trend","dashboard.analysis.sales-ranking":"Sales Ranking","dashboard.analysis.all-year":"All Year","dashboard.analysis.all-month":"All Month","dashboard.analysis.all-week":"All Week","dashboard.analysis.all-day":"All day","dashboard.analysis.search-users":"Search Users","dashboard.analysis.per-capita-search":"Per Capita Search","dashboard.analysis.online-top-search":"Online Top Search","dashboard.analysis.the-proportion-of-sales":"The Proportion Of Sales","dashboard.analysis.dropdown-option-one":"Operation one","dashboard.analysis.dropdown-option-two":"Operation two","dashboard.analysis.channel.all":"ALL","dashboard.analysis.channel.online":"Online","dashboard.analysis.channel.stores":"Stores","dashboard.analysis.sales":"Sales","dashboard.analysis.traffic":"Traffic","dashboard.analysis.table.rank":"Rank","dashboard.analysis.table.search-keyword":"Keyword","dashboard.analysis.table.users":"Users","dashboard.analysis.table.weekly-range":"Weekly Range","dashboard.indicator.selectSymbol":"Select or enter symbol code","dashboard.indicator.emptyWatchlistHint":"No watchlist, please add first","dashboard.indicator.hint.selectSymbol":"Please select a symbol to start analysis","dashboard.indicator.hint.selectSymbolDesc":"Select or enter stock code in the search box above to view K-line chart and technical indicators","dashboard.indicator.retry":"Retry","dashboard.indicator.panel.title":"Technical Indicators","dashboard.indicator.panel.realtimeOn":"Turn off real-time update","dashboard.indicator.panel.realtimeOff":"Turn on real-time update","dashboard.indicator.panel.themeLight":"Switch to dark theme","dashboard.indicator.panel.themeDark":"Switch to light theme","dashboard.indicator.section.enabled":"Enabled","dashboard.indicator.section.added":"My Added Indicators","dashboard.indicator.section.custom":"My Created Indicators","dashboard.indicator.section.bought":"Purchased Indicators","dashboard.indicator.section.myCreated":"My Created Indicators","dashboard.indicator.section.purchased":"Purchased Indicators","dashboard.indicator.empty":"No indicators, please add or create indicators first","dashboard.indicator.emptyPurchased":"No purchased indicators, check out the market","dashboard.indicator.buy":"Buy Indicators","dashboard.indicator.action.start":"Start","dashboard.indicator.action.stop":"Stop","dashboard.indicator.action.edit":"Edit","dashboard.indicator.action.delete":"Delete","dashboard.indicator.action.backtest":"Backtest","dashboard.indicator.action.publish":"Publish to Community","dashboard.indicator.action.unpublish":"Published (Click to Manage)","dashboard.indicator.status.normal":"Active","dashboard.indicator.status.normalPermanent":"Active (Permanent)","dashboard.indicator.status.expired":"Expired","dashboard.indicator.expiry.permanent":"Permanent","dashboard.indicator.expiry.noExpiry":"No expiration","dashboard.indicator.expiry.expired":"Expired: {date}","dashboard.indicator.expiry.expiresOn":"Expires: {date}","dashboard.indicator.delete.confirmTitle":"Confirm Deletion","dashboard.indicator.delete.confirmContent":'Are you sure you want to delete indicator "{name}"? This action cannot be undone.',"dashboard.indicator.delete.confirmOk":"Delete","dashboard.indicator.delete.confirmCancel":"Cancel","dashboard.indicator.delete.success":"Deleted successfully","dashboard.indicator.delete.failed":"Failed to delete","dashboard.indicator.save.success":"Saved successfully","dashboard.indicator.save.failed":"Failed to save","dashboard.indicator.publish.title":"Publish to Community","dashboard.indicator.publish.editTitle":"Manage Publication","dashboard.indicator.publish.hint":'After publishing, other users can view and purchase your indicator in the "Indicator Community"',"dashboard.indicator.publish.pricingType":"Pricing Type","dashboard.indicator.publish.free":"Free","dashboard.indicator.publish.paid":"Paid","dashboard.indicator.publish.price":"Price","dashboard.indicator.publish.description":"Description","dashboard.indicator.publish.descriptionPlaceholder":"Enter a detailed description to help others understand your indicator...","dashboard.indicator.publish.confirm":"Publish","dashboard.indicator.publish.update":"Update","dashboard.indicator.publish.unpublish":"Unpublish","dashboard.indicator.publish.success":"Published successfully","dashboard.indicator.publish.failed":"Failed to publish","dashboard.indicator.publish.unpublishSuccess":"Unpublished successfully","dashboard.indicator.publish.unpublishFailed":"Failed to unpublish","dashboard.indicator.error.loadWatchlistFailed":"Failed to load watchlist","dashboard.indicator.error.chartNotReady":"Chart component not initialized, please select a symbol and wait for the chart to load","dashboard.indicator.error.chartMethodNotReady":"Chart component method not ready, please try again later","dashboard.indicator.error.chartExecuteNotReady":"Chart component execute method not ready, please try again later","dashboard.indicator.error.parseFailed":"Failed to parse Python code","dashboard.indicator.error.parseFailedCheck":"Failed to parse Python code, please check the code format","dashboard.indicator.error.addIndicatorFailed":"Failed to add indicator","dashboard.indicator.error.runIndicatorFailed":"Failed to run indicator","dashboard.indicator.error.pleaseLogin":"Please login first","dashboard.indicator.error.loadDataFailed":"Failed to load data","dashboard.indicator.error.loadDataFailedDesc":"Please check network connection","dashboard.indicator.error.tiingoSubscription":"Forex 1-minute data requires Tiingo paid subscription. Please use other timeframes or upgrade your subscription.","dashboard.indicator.error.pythonEngineFailed":"Python engine failed to load, indicator functionality may be unavailable","dashboard.indicator.error.chartInitFailed":"Chart initialization failed","dashboard.indicator.warning.enterCode":"Please enter indicator code first","dashboard.indicator.warning.chartNotInitialized":"Chart not initialized, cannot use drawing tools","dashboard.indicator.warning.pyodideLoadFailed":"Python Engine Load Failed","dashboard.indicator.warning.pyodideLoadFailedDesc":"Your current region or network environment cannot use this feature","dashboard.indicator.success.runIndicator":"Indicator ran successfully","dashboard.indicator.success.clearDrawings":"All drawings cleared","dashboard.indicator.sma":"SMA (Moving Average Group)","dashboard.indicator.ema":"EMA (Exponential Moving Average Group)","dashboard.indicator.rsi":"RSI (Relative Strength Index)","dashboard.indicator.macd":"MACD","dashboard.indicator.bb":"Bollinger Bands","dashboard.indicator.atr":"ATR (Average True Range)","dashboard.indicator.cci":"CCI (Commodity Channel Index)","dashboard.indicator.williams":"Williams %R","dashboard.indicator.mfi":"MFI (Money Flow Index)","dashboard.indicator.adx":"ADX (Average Directional Index)","dashboard.indicator.obv":"OBV (On Balance Volume)","dashboard.indicator.adosc":"ADOSC (Accumulation/Distribution Oscillator)","dashboard.indicator.ad":"AD (Accumulation/Distribution Line)","dashboard.indicator.kdj":"KDJ (Stochastic Indicator)","dashboard.indicator.signal.buy":"BUY","dashboard.indicator.signal.sell":"SELL","dashboard.indicator.signal.supertrendBuy":"SuperTrend Buy","dashboard.indicator.signal.supertrendSell":"SuperTrend Sell","dashboard.indicator.chart.kline":"K-Line","dashboard.indicator.chart.volume":"Volume","dashboard.indicator.chart.uptrend":"Up Trend","dashboard.indicator.chart.downtrend":"Down Trend","dashboard.indicator.tooltip.time":"Time","dashboard.indicator.tooltip.open":"O","dashboard.indicator.tooltip.close":"C","dashboard.indicator.tooltip.high":"H","dashboard.indicator.tooltip.low":"L","dashboard.indicator.tooltip.volume":"Volume","dashboard.indicator.drawing.line":"Line","dashboard.indicator.drawing.horizontalLine":"Horizontal Line","dashboard.indicator.drawing.verticalLine":"Vertical Line","dashboard.indicator.drawing.ray":"Ray","dashboard.indicator.drawing.straightLine":"Straight Line","dashboard.indicator.drawing.parallelLine":"Parallel Line","dashboard.indicator.drawing.priceLine":"Price Line","dashboard.indicator.drawing.priceChannel":"Price Channel","dashboard.indicator.drawing.fibonacciLine":"Fibonacci Line","dashboard.indicator.drawing.measure":"Measure","dashboard.indicator.drawing.clearAll":"Clear All Drawings","dashboard.indicator.market.USStock":"US Stock","dashboard.indicator.market.Crypto":"Cryptocurrency","dashboard.indicator.market.Forex":"Forex","dashboard.indicator.market.Futures":"Futures","dashboard.indicator.create":"Create Indicator","dashboard.indicator.editor.title":"Create/Edit Indicator","dashboard.indicator.editor.name":"Indicator Name","dashboard.indicator.editor.nameRequired":"Please enter indicator name","dashboard.indicator.editor.namePlaceholder":"Enter indicator name","dashboard.indicator.editor.description":"Description","dashboard.indicator.editor.descriptionPlaceholder":"Enter description (optional)","dashboard.indicator.editor.code":"Python Code","dashboard.indicator.editor.codeRequired":"Please enter indicator code","dashboard.indicator.editor.codePlaceholder":"Enter Python code","dashboard.indicator.editor.run":"Run","dashboard.indicator.editor.runHint":"Click Run button to preview indicator on K-line chart","dashboard.indicator.editor.guide":"Development Guide","dashboard.indicator.editor.guideTitle":"Python Indicator Development Guide","dashboard.indicator.editor.save":"Save","dashboard.indicator.editor.cancel":"Cancel","dashboard.indicator.editor.unnamed":"Unnamed Indicator","dashboard.indicator.editor.publishToCommunity":"Publish to Community","dashboard.indicator.editor.publishToCommunityHint":"After publishing, other users can view and use your indicator in the community","dashboard.indicator.editor.indicatorType":"Indicator Type","dashboard.indicator.editor.indicatorTypeRequired":"Please select indicator type","dashboard.indicator.editor.indicatorTypePlaceholder":"Please select indicator type","dashboard.indicator.editor.previewImage":"Preview Image","dashboard.indicator.editor.uploadImage":"Upload Image","dashboard.indicator.editor.previewImageHint":"Recommended size: 800x400, max 2MB","dashboard.indicator.editor.pricing":"Pricing (QDT)","dashboard.indicator.editor.pricingType.free":"Free","dashboard.indicator.editor.pricingType.permanent":"Permanent","dashboard.indicator.editor.pricingType.monthly":"Monthly","dashboard.indicator.editor.price":"Price","dashboard.indicator.editor.priceRequired":"Please enter price","dashboard.indicator.editor.pricePlaceholder":"Please enter price","dashboard.indicator.editor.pricingHint":"Free indicators (price 0) will still receive platform rewards based on usage and ratings (QDT)","dashboard.indicator.editor.aiGenerate":"AI Generate","dashboard.indicator.editor.aiPromptPlaceholder":"Describe your signal logic (buy/sell only) and plots. Position sizing, risk, scaling, fees/slippage are configured in backtest.","dashboard.indicator.boundary.message":"Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.","dashboard.indicator.boundary.indicatorRule":"Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.","dashboard.indicator.boundary.backtestRule":"Rule: If a bar has a main signal (buy/sell → open/close/reverse), scaling in/out is skipped on the same bar.","dashboard.indicator.editor.aiGenerateBtn":"AI Generate Code","dashboard.indicator.editor.aiPromptRequired":"Please enter your idea","dashboard.indicator.editor.aiGenerateSuccess":"Code generated successfully","dashboard.indicator.editor.aiGenerateError":"Code generation failed, please try again later","dashboard.indicator.editor.verifyCode":"Verify Code","dashboard.indicator.editor.verifyCodeSuccess":"Verification Passed","dashboard.indicator.editor.verifyCodeFailed":"Verification Failed","dashboard.indicator.editor.verifyCodeEmpty":"Code cannot be empty","dashboard.indicator.guide.title":"Python Indicator & Strategy Development Guide","dashboard.indicator.guide.intro":"This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.","dashboard.indicator.guide.section1.title":"1. Runtime Environment & Predefined Variables","dashboard.indicator.guide.section1.env":"Your code runs in a browser-based Python environment (Pyodide).","dashboard.indicator.guide.section1.libs":"Pre-installed Libraries","dashboard.indicator.guide.section1.libsDesc":"The following libraries are imported by default, no need to import again:","dashboard.indicator.guide.section1.libsList":"<code>pandas</code> (pd), <code>numpy</code> (np), <code>math</code>, <code>json</code>","dashboard.indicator.guide.section1.data":"Input Data: df","dashboard.indicator.guide.section1.dataDesc":"The system automatically converts current K-line data into a Pandas DataFrame object, variable name is <code>df</code>.","dashboard.indicator.guide.section1.dataColumns":"<code>df</code> contains the following columns (all float type):","dashboard.indicator.guide.section1.dataColumnsList":"<code>time</code> (timestamp, seconds), <code>open</code>, <code>high</code>, <code>low</code>, <code>close</code>, <code>volume</code>","dashboard.indicator.guide.section1.dataNote":"Data index is arranged from old to new (0 is the earliest data, last row is the latest data).","dashboard.indicator.guide.section1.dataIndex":"Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using <code>.values</code> which loses the index.","dashboard.indicator.guide.section2.title":"2. Parameter Definition","dashboard.indicator.guide.section2.desc":"You can define variables as parameters at the beginning of your code. The system will try to parse statements like <code>variable = value</code> as adjustable parameters.","dashboard.indicator.guide.section2.example":"Parameter Example","dashboard.indicator.guide.section2.exampleCode":"<code>span = 20</code> or <code>multiplier = 2.0</code>","dashboard.indicator.guide.section3.title":"3. Backtest Signal Setup (Important!)","dashboard.indicator.guide.section3.desc":"If you want your indicator to support backtesting, you <strong>must</strong> set the following two columns in your code:","dashboard.indicator.guide.section3.backtestRequired":"<strong>Required for Backtesting:</strong>","dashboard.indicator.guide.section3.backtestBuySignal":"<code>df['buy_signal']</code> - Boolean Series, True indicates buy signal","dashboard.indicator.guide.section3.backtestSellSignal":"<code>df['sell_signal']</code> - Boolean Series, True indicates sell signal","dashboard.indicator.guide.section3.backtestExample":"Example:","dashboard.indicator.guide.section3.backtestExampleCode":"<code>df['buy_signal'] = condition_buy</code><br/><code>df['sell_signal'] = condition_sell</code>","dashboard.indicator.guide.section3.backtestNote":"Note: Even if you only set <code>output.signals</code> for chart display, you must set these two columns to enable backtesting.","dashboard.indicator.guide.section4.title":"4. Output Requirements: output","dashboard.indicator.guide.section4.desc":"At the end of code execution, you must define a dictionary named <code>output</code> to tell the chart how to display results.","dashboard.indicator.guide.section4.fields":"The <code>output</code> dictionary contains the following fields:","dashboard.indicator.guide.section4.plots":"<code>plots</code> - For drawing lines (e.g., moving averages, RSI)","dashboard.indicator.guide.section4.signals":"<code>signals</code> - For marking buy/sell signals (e.g., arrows, labels)","dashboard.indicator.guide.section4.name":"<code>name</code> - Indicator name (optional)","dashboard.indicator.guide.section4.calculatedVars":"<code>calculatedVars</code> - Calculated variables (optional, for displaying additional information)","dashboard.indicator.guide.section5.title":"5. Plot Configuration (Plots)","dashboard.indicator.guide.section5.desc":"Each object in the <code>plots</code> list represents a line.","dashboard.indicator.guide.section5.table.field":"Field","dashboard.indicator.guide.section5.table.type":"Type","dashboard.indicator.guide.section5.table.required":"Required","dashboard.indicator.guide.section5.table.requiredYes":"Yes","dashboard.indicator.guide.section5.table.requiredNo":"No","dashboard.indicator.guide.section5.table.desc":"Description","dashboard.indicator.guide.section5.table.name":"The name of the indicator line, displayed in the legend","dashboard.indicator.guide.section5.table.data":"Data list, length must match the number of rows in df. Recommended to use <code>series.tolist()</code>","dashboard.indicator.guide.section5.table.color":"Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign","dashboard.indicator.guide.section5.table.typeDesc":"Chart type, default is 'line'","dashboard.indicator.guide.section5.table.overlay":"<strong>Important.</strong> True means display on main chart (with K-line), False means display on sub-chart (independent area)","dashboard.indicator.guide.section5.example":"Example: Draw Simple Moving Average (SMA)","dashboard.indicator.guide.section5.exampleCalc":"Calculate SMA","dashboard.indicator.guide.section5.exampleOutput":"Construct Output","dashboard.indicator.guide.section5.exampleOverlay":"Display on main chart","dashboard.indicator.guide.section6.title":"6. Signal Markers (Signals)","dashboard.indicator.guide.section6.desc":"<code>signals</code> are used to mark buy/sell points on specific K-lines through icons or text. <strong>Note:</strong> This is only for chart display. The backtest system uses <code>df['buy_signal']</code> and <code>df['sell_signal']</code>.","dashboard.indicator.guide.section6.table.type":"Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)","dashboard.indicator.guide.section6.table.data":"Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions","dashboard.indicator.guide.section6.table.text":'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")',"dashboard.indicator.guide.section6.table.color":"Marker color","dashboard.indicator.guide.section6.hint":"The system automatically handles positioning.","dashboard.indicator.guide.section6.buy":"Markers will be automatically positioned below the Low of the current K-line","dashboard.indicator.guide.section6.sell":"Markers will be automatically positioned above the High of the current K-line","dashboard.indicator.guide.section6.example":"Example: Draw Buy/Sell Signals","dashboard.indicator.guide.section6.exampleInit":"Initialize signal list, fill all with None","dashboard.indicator.guide.section6.exampleLogic":"Simple logic: mark buy when close price is greater than open price","dashboard.indicator.guide.section6.exampleNote":"In actual logic, please use loops or vectorized operations","dashboard.indicator.guide.section6.examplePrice":"Record price","dashboard.indicator.guide.section6.exampleText":"Buy","dashboard.indicator.guide.section7.title":"7. Complete Code Examples","dashboard.indicator.guide.section7.exampleA":"Example A: Dual EMA Strategy (Supports Backtesting)","dashboard.indicator.guide.section7.exampleACode":'# 1. Calculate indicators<br/>df[\'ema_fast\'] = df[\'close\'].ewm(span=5, adjust=False).mean()<br/>df[\'ema_slow\'] = df[\'close\'].ewm(span=13, adjust=False).mean()<br/><br/># 2. Calculate crossover signals<br/>cross_up = (df[\'ema_fast\'] > df[\'ema_slow\']) & (df[\'ema_fast\'].shift(1) <= df[\'ema_slow\'].shift(1))<br/>cross_down = (df[\'ema_fast\'] < df[\'ema_slow\']) & (df[\'ema_fast\'].shift(1) >= df[\'ema_slow\'].shift(1))<br/><br/># 3. 【Important】Set NEW backtest signal columns (bool)<br/>df[\'open_long\'] = cross_up<br/>df[\'close_long\'] = cross_down<br/>df[\'open_short\'] = cross_down<br/>df[\'close_short\'] = cross_up<br/><br/># 4. Generate signal data for chart display<br/>buy_signals = [df[\'low\'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]<br/>sell_signals = [df[\'high\'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]<br/><br/># 5. Build output<br/>output = {<br/> "name": "Dual EMA Strategy",<br/> "plots": [<br/> {"name": "EMA 5", "data": df[\'ema_fast\'].tolist(), "color": "#FF6B6B", "overlay": True},<br/> {"name": "EMA 13", "data": df[\'ema_slow\'].tolist(), "color": "#4ECDC4", "overlay": True}<br/> ],<br/> "signals": [<br/> {"type": "buy", "text": "BUY", "data": buy_signals, "color": "#00E676"},<br/> {"type": "sell", "text": "SELL", "data": sell_signals, "color": "#FF5252"}<br/> ]<br/>}',"dashboard.indicator.guide.section7.exampleB":"Example B: Bollinger Bands - Chart Display Only","dashboard.indicator.guide.section7.exampleBCode":'# Calculate Bollinger Bands (chart display only, no backtesting)<br/>length = 20<br/>mult = 2.0<br/>df[\'sma\'] = df[\'close\'].rolling(length).mean()<br/>df[\'std\'] = df[\'close\'].rolling(length).std()<br/>df[\'upper\'] = df[\'sma\'] + mult * df[\'std\']<br/>df[\'lower\'] = df[\'sma\'] - mult * df[\'std\']<br/><br/>output = {<br/> "name": "Bollinger Bands",<br/> "plots": [<br/> {"name": "Upper", "data": df[\'upper\'].tolist(), "color": "#FF5252", "overlay": True},<br/> {"name": "Middle", "data": df[\'sma\'].tolist(), "color": "#2196F3", "overlay": True},<br/> {"name": "Lower", "data": df[\'lower\'].tolist(), "color": "#00E676", "overlay": True}<br/> ]<br/>}',"dashboard.indicator.guide.section7.exampleC":"Example C: RSI Strategy (Supports Backtesting)","dashboard.indicator.guide.section7.exampleCCode":'# Calculate RSI<br/>delta = df[\'close\'].diff()<br/>up = delta.clip(lower=0)<br/>down = -1 * delta.clip(upper=0)<br/>ema_up = up.ewm(com=13, adjust=False).mean()<br/>ema_down = down.ewm(com=13, adjust=False).mean()<br/>rs = ema_up / ema_down<br/>df[\'rsi\'] = 100 - (100 / (1 + rs))<br/><br/># Generate trading signals<br/>buy_condition = df[\'rsi\'] < 30 # Oversold buy<br/>sell_condition = df[\'rsi\'] > 70 # Overbought sell<br/><br/># 【Important】Set NEW backtest signal columns (bool)<br/>df[\'open_long\'] = buy_condition<br/>df[\'close_long\'] = sell_condition<br/>df[\'open_short\'] = sell_condition<br/>df[\'close_short\'] = buy_condition<br/><br/># Generate chart signals<br/>buy_signals = [df[\'low\'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]<br/>sell_signals = [df[\'high\'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]<br/><br/>output = {<br/> "name": "RSI Strategy",<br/> "plots": [<br/> {"name": "RSI", "data": df[\'rsi\'].tolist(), "color": "#9C27B0", "overlay": False},<br/> {"name": "Overbought", "data": [70] * len(df), "color": "#FF5252", "style": "dashed", "overlay": False},<br/> {"name": "Oversold", "data": [30] * len(df), "color": "#00E676", "style": "dashed", "overlay": False}<br/> ],<br/> "signals": [<br/> {"type": "buy", "text": "BUY", "data": buy_signals, "color": "#00E676"},<br/> {"type": "sell", "text": "SELL", "data": sell_signals, "color": "#FF5252"}<br/> ]<br/>}',"dashboard.indicator.guide.section6.param":"Parameters","dashboard.indicator.guide.section6.calc":"Calculate","dashboard.indicator.guide.section6.output":"Output","dashboard.indicator.guide.section6.generate":"Generate signal data (initialize with None)","dashboard.indicator.guide.section6.subchart":"Display on sub-chart","dashboard.indicator.guide.section8.title":"8. Frequently Asked Questions (FAQ)","dashboard.indicator.guide.section8.q1":"Q: Why can't my indicator be backtested?","dashboard.indicator.guide.section8.a1":"A: The backtest system requires NEW signal columns: <code>df['open_long']</code>, <code>df['close_long']</code>, <code>df['open_short']</code>, <code>df['close_short']</code> (boolean). Even if you set <code>output.signals</code> for chart display, you must set these columns to enable backtesting.","dashboard.indicator.guide.section8.q2":"Q: Data length mismatch?","dashboard.indicator.guide.section8.a2":"A: The <code>data</code> list in <code>plots</code> and <code>signals</code> must have exactly the same length as the K-line data. If you use <code>df['xxx'].tolist()</code>, there is usually no problem.","dashboard.indicator.guide.section8.q3":"Q: How to handle NaN (empty values)?","dashboard.indicator.guide.section8.a3":"A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use <code>df.fillna(0)</code> or other methods.","dashboard.indicator.guide.section8.q4":"Q: Index mismatch causing all signals to be NaN?","dashboard.indicator.guide.section8.a4":"A: Please ensure you preserve the original df index (timestamp). Avoid using <code>.values</code> to create new Series. Use columns directly like <code>df['close']</code> for operations.","dashboard.indicator.guide.section8.q5":"Q: Can I use third-party network libraries?","dashboard.indicator.guide.section8.a5":"A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.","dashboard.indicator.guide.section8.q6":"Q: How to debug code?","dashboard.indicator.guide.section8.a6":"A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.","dashboard.indicator.guide.section8.q7":"Q: Backtest shows 0 signals?","dashboard.indicator.guide.section8.a7":"A: Please check the data type of <code>df['open_long']</code>/<code>df['close_long']</code>/<code>df['open_short']</code>/<code>df['close_short']</code>. They should be boolean (True/False), not numeric. Use <code>condition.fillna(False).astype(bool)</code> to ensure correct type.","dashboard.indicator.paramsConfig.title":"Indicator Parameters","dashboard.indicator.paramsConfig.noParams":"No configurable parameters for this indicator","dashboard.indicator.paramsConfig.hint":"Configure parameters and click OK to run the indicator","dashboard.indicator.backtest.title":"Indicator Backtest","dashboard.indicator.backtest.config":"Backtest Parameters","dashboard.indicator.backtest.startDate":"Start Date","dashboard.indicator.backtest.endDate":"End Date","dashboard.indicator.backtest.selectStartDate":"Select start date","dashboard.indicator.backtest.selectEndDate":"Select end date","dashboard.indicator.backtest.startDateRequired":"Please select start date","dashboard.indicator.backtest.endDateRequired":"Please select end date","dashboard.indicator.backtest.initialCapital":"Initial Capital","dashboard.indicator.backtest.initialCapitalRequired":"Please enter initial capital","dashboard.indicator.backtest.commission":"Commission Rate (%)","dashboard.indicator.backtest.commissionHint":"Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.","dashboard.indicator.backtest.leverage":"Leverage","dashboard.indicator.backtest.timeframe":"Timeframe","dashboard.indicator.backtest.tradeDirection":"Trade Direction","dashboard.indicator.backtest.longOnly":"Long Only","dashboard.indicator.backtest.shortOnly":"Short Only","dashboard.indicator.backtest.both":"Both","dashboard.indicator.backtest.run":"Run Backtest","dashboard.indicator.backtest.rerun":"Run Again","dashboard.indicator.backtest.close":"Close","dashboard.indicator.backtest.running":"Running indicator backtest...","dashboard.indicator.backtest.loadingTip1":"Fetching historical K-line data...","dashboard.indicator.backtest.loadingTip2":"Executing strategy signal calculation...","dashboard.indicator.backtest.loadingTip3":"Simulating trade execution...","dashboard.indicator.backtest.loadingTip4":"Calculating backtest metrics...","dashboard.indicator.backtest.loadingTip5":"Almost done, please wait...","dashboard.indicator.backtest.results":"Backtest Results","dashboard.indicator.backtest.totalReturn":"Total Return","dashboard.indicator.backtest.annualReturn":"Annual Return","dashboard.indicator.backtest.maxDrawdown":"Max Drawdown","dashboard.indicator.backtest.sharpeRatio":"Sharpe Ratio","dashboard.indicator.backtest.winRate":"Win Rate","dashboard.indicator.backtest.profitFactor":"Profit Factor","dashboard.indicator.backtest.totalTrades":"Total Trades","dashboard.indicator.totalReturn":"Total Return","dashboard.indicator.annualReturn":"Annual Return","dashboard.indicator.maxDrawdown":"Max Drawdown","dashboard.indicator.sharpeRatio":"Sharpe Ratio","dashboard.indicator.winRate":"Win Rate","dashboard.indicator.profitFactor":"Profit Factor","dashboard.indicator.totalTrades":"Total Trades","dashboard.indicator.backtest.totalCommission":"Total Commission","dashboard.indicator.backtest.equityCurve":"Equity Curve","dashboard.indicator.backtest.strategy":"Indicator","dashboard.indicator.backtest.benchmark":"Benchmark","dashboard.indicator.backtest.tradeHistory":"Trade History","dashboard.indicator.backtest.tradeTime":"Time","dashboard.indicator.backtest.tradeType":"Type","dashboard.indicator.backtest.buy":"Buy","dashboard.indicator.backtest.sell":"Sell","dashboard.indicator.backtest.liquidation":"Liquidation","dashboard.indicator.backtest.openLong":"Open Long","dashboard.indicator.backtest.closeLong":"Close Long","dashboard.indicator.backtest.closeLongStop":"Close Long (Stop Loss)","dashboard.indicator.backtest.closeLongProfit":"Close Long (Take Profit)","dashboard.indicator.backtest.addLong":"Add Long","dashboard.indicator.backtest.openShort":"Open Short","dashboard.indicator.backtest.closeShort":"Close Short","dashboard.indicator.backtest.closeShortStop":"Close Short (Stop Loss)","dashboard.indicator.backtest.closeShortProfit":"Close Short (Take Profit)","dashboard.indicator.backtest.addShort":"Add Short","dashboard.indicator.backtest.closeLongTrailing":"Close Long (Trailing)","dashboard.indicator.backtest.reduceLong":"Reduce Long","dashboard.indicator.backtest.closeShortTrailing":"Close Short (Trailing)","dashboard.indicator.backtest.reduceShort":"Reduce Short","dashboard.indicator.backtest.price":"Price","dashboard.indicator.backtest.amount":"Amount","dashboard.indicator.backtest.balance":"Balance","dashboard.indicator.backtest.profit":"P&L","dashboard.indicator.backtest.success":"Backtest completed","dashboard.indicator.backtest.failed":"Backtest failed, please try again later","dashboard.indicator.backtest.quickSelect":"Quick Select","dashboard.indicator.backtest.precisionMode":"Backtest Precision Mode","dashboard.indicator.backtest.estimatedCandles":"Est. {count} candles to process","dashboard.indicator.backtest.highPrecisionDesc":"Using 1-minute candles for high-precision backtest, stop-loss/take-profit triggers are more accurate","dashboard.indicator.backtest.mediumPrecisionDesc":"Range exceeds 30 days, using 5-minute candles to balance precision and performance","dashboard.indicator.backtest.standardModeWarning":"Using Standard Backtest Mode","dashboard.indicator.backtest.standardModeDesc":"Current config does not support high-precision backtest, using strategy timeframe","dashboard.indicator.backtest.onlyCryptoSupported":"High-precision backtest only supports cryptocurrency market","dashboard.indicator.backtest.noIndicatorCode":"This indicator has no backtestable code","dashboard.indicator.backtest.noSymbol":"Please select a trading symbol first","dashboard.indicator.backtest.dateRangeExceeded":"Backtest date range exceeded: {timeframe} timeframe allows max {maxRange}","dashboard.indicator.backtest.dateRangeExceededDays":"Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)","dashboard.indicator.backtest.metaLine":"Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}","dashboard.indicator.backtest.savedRunId":"Backtest saved. Run ID: {id}","dashboard.indicator.backtest.historyTitle":"Backtest History","dashboard.indicator.backtest.historyRefresh":"Refresh","dashboard.indicator.backtest.historyView":"View","dashboard.indicator.backtest.historyNoData":"No backtest history","dashboard.indicator.backtest.historyUseCurrent":"Only current symbol/timeframe","dashboard.indicator.backtest.historyFilterSymbol":"Symbol","dashboard.indicator.backtest.historyFilterTimeframe":"Timeframe","dashboard.indicator.backtest.historyApply":"Apply filters","dashboard.indicator.backtest.historyAIAnalyze":"AI Analyze","dashboard.indicator.backtest.historyAIAnalyzeTitle":"AI Suggestions","dashboard.indicator.backtest.historyNoAIResult":"No AI analysis result","dashboard.indicator.backtest.historyRunId":"Run ID","dashboard.indicator.backtest.historyCreatedAt":"Time","dashboard.indicator.backtest.historyRange":"Range","dashboard.indicator.backtest.historyStatus":"Status","dashboard.indicator.backtest.historyStatusSuccess":"Success","dashboard.indicator.backtest.historyStatusFailed":"Failed","dashboard.indicator.backtest.historyActions":"Actions","dashboard.indicator.backtest.prev":"Previous","dashboard.indicator.backtest.next":"Next","dashboard.indicator.backtest.steps.strategy.title":"Execution Config","dashboard.indicator.backtest.steps.strategy.desc":"Position, risk, scaling","dashboard.indicator.backtest.steps.trading.title":"Backtest Setup","dashboard.indicator.backtest.steps.trading.desc":"Time, capital, fees, leverage, slippage","dashboard.indicator.backtest.steps.results.title":"Results","dashboard.indicator.backtest.steps.results.desc":"Summary & trades","dashboard.indicator.backtest.panel.risk":"Execution: Risk (SL / trailing)","dashboard.indicator.backtest.panel.scale":"Execution: Scale-in (Trend / DCA)","dashboard.indicator.backtest.panel.reduce":"Execution: Scale-out (Trend / Adverse)","dashboard.indicator.backtest.panel.position":"Execution: Entry sizing","dashboard.indicator.backtest.field.stopLossPct":"Stop Loss (%)","dashboard.indicator.backtest.field.takeProfitPct":"Take Profit (%)","dashboard.indicator.backtest.field.trailingEnabled":"Trailing stop / take profit","dashboard.indicator.backtest.field.trailingStopPct":"Trailing drawdown (%)","dashboard.indicator.backtest.field.trailingActivationPct":"Trailing activation (%)","dashboard.indicator.backtest.field.slippage":"Slippage (%)","dashboard.indicator.backtest.field.trendAddEnabled":"Trend-following scale-in","dashboard.indicator.backtest.field.dcaAddEnabled":"Mean-reversion DCA","dashboard.indicator.backtest.field.trendAddStepPct":"Scale-in trigger (%)","dashboard.indicator.backtest.field.dcaAddStepPct":"DCA trigger (%)","dashboard.indicator.backtest.field.trendAddSizePct":"Scale-in size (% of capital)","dashboard.indicator.backtest.field.dcaAddSizePct":"DCA size (% of capital)","dashboard.indicator.backtest.field.trendAddMaxTimes":"Max scale-in times","dashboard.indicator.backtest.field.dcaAddMaxTimes":"Max DCA times","dashboard.indicator.backtest.field.trendReduceEnabled":"Trend reduce","dashboard.indicator.backtest.field.adverseReduceEnabled":"Adverse reduce","dashboard.indicator.backtest.field.trendReduceStepPct":"Trend trigger (%)","dashboard.indicator.backtest.field.adverseReduceStepPct":"Adverse trigger (%)","dashboard.indicator.backtest.field.trendReduceSizePct":"Reduce size (% of position)","dashboard.indicator.backtest.field.adverseReduceSizePct":"Adverse reduce size (% of position)","dashboard.indicator.backtest.field.trendReduceMaxTimes":"Max trend reduce times","dashboard.indicator.backtest.field.adverseReduceMaxTimes":"Max adverse reduce times","dashboard.indicator.backtest.field.entryPct":"Entry size (% of capital)","dashboard.indicator.backtest.field.minOrderPct":"Min order size (% of capital) (optional)","dashboard.indicator.backtest.hint.entryPctMax":"Max entry: {maxPct}% (reserve budget for future scale-ins)","dashboard.docs.title":"Documentation","dashboard.docs.search.placeholder":"Search documents...","dashboard.docs.category.all":"All","dashboard.docs.category.guide":"Guides","dashboard.docs.category.api":"API Reference","dashboard.docs.category.tutorial":"Tutorials","dashboard.docs.category.faq":"FAQ","dashboard.docs.featured.title":"Featured Documents","dashboard.docs.featured.tag":"Featured","dashboard.docs.list.views":"views","dashboard.docs.list.author":"Author","dashboard.docs.list.empty":"No documents","dashboard.docs.list.backToAll":"Back to All Documents","dashboard.docs.list.total":"Total {count} documents","dashboard.docs.detail.back":"Back to List","dashboard.docs.detail.updatedAt":"Updated at","dashboard.docs.detail.related":"Related Documents","dashboard.docs.detail.notFound":"Document Not Found","dashboard.docs.detail.error":"Document does not exist or has been deleted","dashboard.docs.search.result":"Search Results","dashboard.docs.search.keyword":"Keyword","dashboard.totalEquity":"Total Equity","dashboard.totalPnL":"Total P&L","dashboard.aiStrategies":"AI Strategies","dashboard.indicatorStrategies":"Indicator Strategies","dashboard.running":"Running","dashboard.enabled":"Enabled","dashboard.pnlHistory":"P&L History","dashboard.strategyPerformance":"Strategy Performance","dashboard.strategyRanking":"Strategy Ranking","dashboard.winRate":"Win Rate","dashboard.profitFactor":"Profit Factor","dashboard.maxDrawdown":"Max Drawdown","dashboard.totalTrades":"Total Trades","dashboard.runningStrategies":"Running Strategies","dashboard.equityCurve":"Equity Curve","dashboard.strategyAllocation":"Strategy Allocation","dashboard.drawdownCurve":"Drawdown Curve","dashboard.drawdown":"Drawdown","dashboard.hourlyDistribution":"Hourly Distribution","dashboard.dailyPnl":"Daily P&L","dashboard.cumulativePnl":"Cumulative P&L","dashboard.tradeCount":"Trade Count","dashboard.profit":"Profit","dashboard.noData":"No Data","dashboard.noStrategyData":"No strategy data","dashboard.ranking.totalProfit":"Total Profit","dashboard.ranking.roi":"ROI","dashboard.ranking.trades":"Trades","dashboard.unit.trades":"","dashboard.unit.strategies":"","dashboard.label.avgDaily":"Avg Daily","dashboard.label.avgProfit":"Avg Profit","dashboard.label.win":"W","dashboard.label.lose":"L","dashboard.label.trade":"Trades","dashboard.label.indicator":"Indicator","dashboard.label.totalPnl":"Total P&L","dashboard.label.maxDrawdownPoint":"Max DD","dashboard.profitCalendar":"Profit Calendar","dashboard.recentTrades":"Recent Trades","dashboard.currentPositions":"Current Positions","dashboard.table.time":"Time","dashboard.table.strategy":"Strategy","dashboard.table.symbol":"Symbol","dashboard.table.type":"Type","dashboard.table.side":"Side","dashboard.table.size":"Size","dashboard.table.entryPrice":"Entry Price","dashboard.table.price":"Price","dashboard.table.amount":"Amount","dashboard.table.profit":"Profit","dashboard.pendingOrders":"Order Execution Records","dashboard.totalOrders":"Total {total} orders","dashboard.viewError":"View Error","dashboard.filled":"Filled","dashboard.orderTable.time":"Created Time","dashboard.orderTable.strategy":"Strategy","dashboard.orderTable.symbol":"Symbol","dashboard.orderTable.signalType":"Signal Type","dashboard.orderTable.amount":"Amount","dashboard.orderTable.price":"Filled Price","dashboard.orderTable.status":"Status","dashboard.orderTable.timeInfo":"Time","dashboard.orderTable.executedAt":"Executed Time","dashboard.orderTable.exchange":"Exchange","dashboard.orderTable.notify":"Notify","dashboard.orderTable.actions":"Actions","dashboard.orderTable.delete":"Delete","dashboard.orderTable.deleteConfirm":"Delete this record?","dashboard.orderTable.deleteSuccess":"Deleted","dashboard.orderTable.deleteFailed":"Delete failed","dashboard.newOrderNotify":"New Order Alert","dashboard.newOrderDesc":"New order execution record","dashboard.soundEnabled":"Sound notification enabled","dashboard.soundDisabled":"Sound notification disabled","dashboard.clickToMute":"Click to mute","dashboard.clickToUnmute":"Click to unmute","dashboard.signalType.openLong":"Open Long","dashboard.signalType.openShort":"Open Short","dashboard.signalType.closeLong":"Close Long","dashboard.signalType.closeShort":"Close Short","dashboard.signalType.addLong":"Add Long","dashboard.signalType.addShort":"Add Short","dashboard.status.pending":"Pending","dashboard.status.processing":"Processing","dashboard.status.completed":"Completed","dashboard.status.failed":"Failed","dashboard.status.cancelled":"Cancelled","dashboard.table.pnl":"Unrealized P&L","form.basic-form.basic.title":"Basic form","form.basic-form.basic.description":"Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.","form.basic-form.title.label":"Title","form.basic-form.title.placeholder":"Give the target a name","form.basic-form.title.required":"Please enter a title","form.basic-form.date.label":"Start and end date","form.basic-form.placeholder.start":"Start date","form.basic-form.placeholder.end":"End date","form.basic-form.date.required":"Please select the start and end date","form.basic-form.goal.label":"Goal description","form.basic-form.goal.placeholder":"Please enter your work goals","form.basic-form.goal.required":"Please enter a description of the goal","form.basic-form.standard.label":"Metrics","form.basic-form.standard.placeholder":"Please enter a metric","form.basic-form.standard.required":"Please enter a metric","form.basic-form.client.label":"Client","form.basic-form.label.tooltip":"Target service object","form.basic-form.client.placeholder":"Please describe your customer service, internal customers directly @ Name / job number","form.basic-form.client.required":"Please describe the customers you serve","form.basic-form.invites.label":"Inviting critics","form.basic-form.invites.placeholder":"Please direct @ Name / job number, you can invite up to 5 people","form.basic-form.weight.label":"Weight","form.basic-form.weight.placeholder":"Please enter weight","form.basic-form.public.label":"Target disclosure","form.basic-form.label.help":"Customers and invitees are shared by default","form.basic-form.radio.public":"Public","form.basic-form.radio.partially-public":"Partially public","form.basic-form.radio.private":"Private","form.basic-form.publicUsers.placeholder":"Open to","form.basic-form.option.A":"Colleague A","form.basic-form.option.B":"Colleague B","form.basic-form.option.C":"Colleague C","form.basic-form.email.required":"Please enter your email!","form.basic-form.email.wrong-format":"The email address is in the wrong format!","form.basic-form.userName.required":"Please enter your userName!","form.basic-form.password.required":"Please enter your password!","form.basic-form.password.twice":"The passwords entered twice do not match!","form.basic-form.strength.msg":"Please enter at least 6 characters and don't use passwords that are easy to guess.","form.basic-form.strength.strong":"Strength: strong","form.basic-form.strength.medium":"Strength: medium","form.basic-form.strength.short":"Strength: too short","form.basic-form.confirm-password.required":"Please confirm your password!","form.basic-form.phone-number.required":"Please enter your phone number!","form.basic-form.phone-number.wrong-format":"Malformed phone number!","form.basic-form.verification-code.required":"Please enter the verification code!","form.basic-form.form.get-captcha":"Get Captcha","form.basic-form.captcha.second":"sec","form.basic-form.form.optional":" (optional) ","form.basic-form.form.submit":"Submit","form.basic-form.form.save":"Save","form.basic-form.email.placeholder":"Email","form.basic-form.password.placeholder":"Password","form.basic-form.confirm-password.placeholder":"Confirm password","form.basic-form.phone-number.placeholder":"Phone number","form.basic-form.verification-code.placeholder":"Verification code","result.success.title":"Submission Success","result.success.description":"The submission results page is used to feed back the results of a series of operational tasks. If it is a simple operation, use the Message global prompt feedback. This text area can show a simple supplementary explanation. If there is a similar requirement for displaying “documents”, the following gray area can present more complicated content.","result.success.operate-title":"Project Name","result.success.operate-id":"Project ID","result.success.principal":"Principal","result.success.operate-time":"Effective time","result.success.step1-title":"Create project","result.success.step1-operator":"Qu Lili","result.success.step2-title":"Departmental preliminary review","result.success.step2-operator":"Zhou Maomao","result.success.step2-extra":"Urge","result.success.step3-title":"Financial review","result.success.step4-title":"Finish","result.success.btn-return":"Back List","result.success.btn-project":"View Project","result.success.btn-print":"Print","result.fail.error.title":"Submission Failed","result.fail.error.description":"Please check and modify the following information before resubmitting.","result.fail.error.hint-title":"The content you submitted has the following error:","result.fail.error.hint-text1":"Your account has been frozen","result.fail.error.hint-btn1":"Thaw immediately","result.fail.error.hint-text2":"Your account is not yet eligible to apply","result.fail.error.hint-btn2":"Upgrade immediately","result.fail.error.btn-text":"Return to modify","account.settings.menuMap.custom":"Custom Settings","account.settings.menuMap.binding":"Account Binding","account.settings.basic.avatar":"Avatar","account.settings.basic.change-avatar":"Change avatar","account.settings.basic.email":"Email","account.settings.basic.email-message":"Please input your email!","account.settings.basic.nickname":"Nickname","account.settings.basic.nickname-message":"Please input your Nickname!","account.settings.basic.profile":"Personal profile","account.settings.basic.profile-message":"Please input your personal profile!","account.settings.basic.profile-placeholder":"Brief introduction to yourself","account.settings.basic.country":"Country/Region","account.settings.basic.country-message":"Please input your country!","account.settings.basic.geographic":"Province or city","account.settings.basic.geographic-message":"Please input your geographic info!","account.settings.basic.address":"Street Address","account.settings.basic.address-message":"Please input your address!","account.settings.basic.phone":"Phone Number","account.settings.basic.phone-message":"Please input your phone!","account.settings.basic.update":"Update Information","account.settings.basic.update.success":"Update basic information successfully","account.settings.security.strong":"Strong","account.settings.security.medium":"Medium","account.settings.security.weak":"Weak","account.settings.security.password":"Account Password","account.settings.security.password-description":"Current password strength:","account.settings.security.phone":"Security Phone","account.settings.security.phone-description":"Bound phone:","account.settings.security.question":"Security Question","account.settings.security.question-description":"The security question is not set, and the security policy can effectively protect the account security","account.settings.security.email":"Bound Email","account.settings.security.email-description":"Bound Email:","account.settings.security.mfa":"MFA Device","account.settings.security.mfa-description":"Unbound MFA device, after binding, can be confirmed twice","account.settings.security.modify":"Modify","account.settings.security.set":"Set","account.settings.security.bind":"Bind","account.settings.binding.taobao":"Binding Taobao","account.settings.binding.taobao-description":"Currently unbound Taobao account","account.settings.binding.alipay":"Binding Alipay","account.settings.binding.alipay-description":"Currently unbound Alipay account","account.settings.binding.dingding":"Binding DingTalk","account.settings.binding.dingding-description":"Currently unbound DingTalk account","account.settings.binding.bind":"Bind","account.settings.notification.password":"Account Password","account.settings.notification.password-description":"Messages from other users will be notified in the form of a station letter","account.settings.notification.messages":"System Messages","account.settings.notification.messages-description":"System messages will be notified in the form of a station letter","account.settings.notification.todo":"To-do Notification","account.settings.notification.todo-description":"The to-do list will be notified in the form of a letter from the station","account.settings.settings.open":"Open","account.settings.settings.close":"Close","trading-assistant.title":"Trading Assistant","trading-assistant.strategyList":"Strategy List","trading-assistant.createStrategy":"Create Strategy","trading-assistant.noStrategy":"No strategies","trading-assistant.selectStrategy":"Please select a strategy from the left to view details","trading-assistant.startStrategy":"Start Strategy","trading-assistant.stopStrategy":"Stop Strategy","trading-assistant.editStrategy":"Edit Strategy","trading-assistant.deleteStrategy":"Delete Strategy","trading-assistant.startAll":"Start All","trading-assistant.stopAll":"Stop All","trading-assistant.deleteAll":"Delete All","trading-assistant.symbolCount":"symbols","trading-assistant.strategyCount":"strategies","trading-assistant.groupBy":"Group By","trading-assistant.groupByStrategy":"Strategy","trading-assistant.groupBySymbol":"Symbol","trading-assistant.timeframe":"Timeframe","trading-assistant.indicator":"Indicator","trading-assistant.status.running":"Running","trading-assistant.status.stopped":"Stopped","trading-assistant.status.error":"Error","trading-assistant.strategyType.IndicatorStrategy":"Indicator Strategy","trading-assistant.strategyType.PromptBasedStrategy":"Prompt Strategy","trading-assistant.strategyType.GridStrategy":"Grid Strategy","trading-assistant.tabs.tradingRecords":"Trading Records","trading-assistant.tabs.positions":"Positions","trading-assistant.tabs.equityCurve":"Equity Curve","trading-assistant.form.step1":"Select Indicator","trading-assistant.form.step2":"Exchange Configuration","trading-assistant.form.step3":"Strategy Parameters","trading-assistant.form.step2Params":"Parameters","trading-assistant.form.step3Signal":"Signal Delivery","trading-assistant.form.simpleMode":"Simple","trading-assistant.form.advancedMode":"Advanced","trading-assistant.form.simpleModeHint":"Quick setup with recommended defaults","trading-assistant.form.advancedModeHint":"Customize all parameters for pros","trading-assistant.form.simpleStep1":"Select Indicator & Pair","trading-assistant.form.simpleStep2":"Launch Mode","trading-assistant.form.simpleDefaultsHint":"Defaults (expand to customize)","trading-assistant.form.showAdvancedSettings":"Show Advanced Settings","trading-assistant.form.hideAdvancedSettings":"Hide Advanced Settings","trading-assistant.form.marketCategory":"Market Category","trading-assistant.form.marketCategoryHint":"Select a market first. Only Crypto can enable live trading; other markets are signal-only.","trading-assistant.market.USStock":"US Stock","trading-assistant.market.Crypto":"Crypto","trading-assistant.market.Forex":"Forex","trading-assistant.form.indicator":"Select Indicator","trading-assistant.form.indicatorHint":"You can only select indicators you have purchased or created","trading-assistant.form.qdtCostHints":"Using strategies will consume QDT, please ensure your account has sufficient QDT balance","trading-assistant.form.indicatorDescription":"Indicator Description","trading-assistant.form.noDescription":"No description","trading-assistant.form.indicatorParams":"Indicator Parameters","trading-assistant.form.indicatorParamsHint":"These parameters will be passed to the indicator code. Different strategies can use different parameter values.","trading-assistant.form.exchange":"Select Exchange","trading-assistant.form.apiKey":"API Key","trading-assistant.form.secretKey":"Secret Key","trading-assistant.form.passphrase":"Passphrase","trading-assistant.form.testConnection":"Test Connection","trading-assistant.form.strategyName":"Strategy Name","trading-assistant.form.symbol":"Trading Pair","trading-assistant.form.symbols":"Trading Pairs (Multi-select)","trading-assistant.form.symbolHint":"Symbol format depends on the selected market","trading-assistant.form.symbolsHint":"Select multiple pairs to create strategies for each","trading-assistant.form.strategyType":"Strategy Type","trading-assistant.form.strategyTypeSingle":"Single Symbol Strategy","trading-assistant.form.strategyTypeCrossSectional":"Cross-Sectional Strategy","trading-assistant.form.strategyTypeHint":"Single Symbol: Trade a single symbol; Cross-Sectional: Manage a portfolio of multiple symbols","trading-assistant.form.symbolList":"Symbol List","trading-assistant.form.symbolListHint":"Select multiple symbols, strategy will rank and rebalance based on indicator scores","trading-assistant.form.portfolioSize":"Portfolio Size","trading-assistant.form.portfolioSizeHint":"Number of symbols to hold simultaneously","trading-assistant.form.longRatio":"Long Ratio","trading-assistant.form.longRatioHint":"Proportion of long positions (0-1), e.g. 0.5 means 50% long, 50% short","trading-assistant.form.rebalanceFrequency":"Rebalance Frequency","trading-assistant.form.rebalanceDaily":"Daily","trading-assistant.form.rebalanceWeekly":"Weekly","trading-assistant.form.rebalanceMonthly":"Monthly","trading-assistant.form.rebalanceFrequencyHint":"Frequency of portfolio rebalancing","trading-assistant.form.addSymbol":"Add Symbol","trading-assistant.form.addSymbolTitle":"Add Symbol to Watchlist","trading-assistant.form.searchSymbolPlaceholder":"Search by code, e.g. BTC, AAPL","trading-assistant.form.noSymbolFound":"No matching symbol found","trading-assistant.form.canDirectAdd":"You can directly add the code","trading-assistant.form.searchSymbolHint":"Enter code to search symbols","trading-assistant.form.confirmAdd":"Confirm Add","trading-assistant.form.addSymbolSuccess":"Symbol added successfully","trading-assistant.form.addSymbolFailed":"Failed to add, please try again","trading-assistant.form.pleaseSelectSymbol":"Please select or enter a symbol","trading-assistant.form.symbolHintCrypto":"Crypto: use trading pairs like BTC/USDT","trading-assistant.form.symbolHintGeneral":"Enter the symbol for the selected market (e.g. 600519, AAPL, EURUSD).","trading-assistant.form.initialCapital":"Initial Capital","trading-assistant.form.marketType":"Market Type","trading-assistant.form.marketTypeFutures":"Futures","trading-assistant.form.marketTypeSpot":"Spot","trading-assistant.form.marketTypeHint":"Futures support bidirectional trading and leverage, spot only supports long positions with fixed 1x leverage","trading-assistant.form.leverage":"Leverage","trading-assistant.form.leverageHint":"Futures: 1-125x, Spot: Fixed 1x","trading-assistant.form.spotLeverageFixed":"Spot trading leverage is fixed at 1x","trading-assistant.form.spotOnlyLongHint":"Spot trading only supports long positions","trading-assistant.form.tradeDirection":"Trade Direction","trading-assistant.form.tradeDirectionLong":"Long Only","trading-assistant.form.tradeDirectionShort":"Short Only","trading-assistant.form.tradeDirectionBoth":"Both","trading-assistant.form.timeframe":"Timeframe","trading-assistant.form.klinePeriod":"K-Line Period","trading-assistant.form.timeframe1m":"1 Minute","trading-assistant.form.timeframe5m":"5 Minutes","trading-assistant.form.timeframe15m":"15 Minutes","trading-assistant.form.timeframe30m":"30 Minutes","trading-assistant.form.timeframe1H":"1 Hour","trading-assistant.form.timeframe4H":"4 Hours","trading-assistant.form.timeframe1D":"1 Day","trading-assistant.form.selectStrategyType":"Select Strategy Type","trading-assistant.form.indicatorStrategy":"Indicator Strategy","trading-assistant.form.indicatorStrategyDesc":"Automated trading strategy based on technical indicators","trading-assistant.form.aiStrategy":"AI Strategy","trading-assistant.form.aiStrategyDesc":"Automated trading strategy based on AI intelligent decision-making","trading-assistant.form.enableAiFilter":"Enable AI Intelligent Decision Filter","trading-assistant.form.enableAiFilterHint":"When enabled, indicator signals will be filtered by AI to improve trading quality","trading-assistant.form.aiFilterPrompt":"Custom Prompt","trading-assistant.form.aiFilterPromptHint":"Provide custom instructions for AI filtering, leave blank to use system default","trading-assistant.validation.strategyTypeRequired":"Please select a strategy type","trading-assistant.validation.marketCategoryRequired":"Please select a market category","trading-assistant.form.advancedSettings":"Advanced Settings","trading-assistant.form.orderMode":"Order Mode","trading-assistant.form.orderModeMaker":"Maker (Limit)","trading-assistant.form.orderModeTaker":"Taker (Market)","trading-assistant.form.orderModeHint":"Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees","trading-assistant.form.makerWaitSec":"Maker Wait Time (seconds)","trading-assistant.form.makerWaitSecHint":"Time to wait for order fill before canceling and retrying","trading-assistant.form.makerRetries":"Maker Retries","trading-assistant.form.makerRetriesHint":"Maximum number of retries when maker order is not filled","trading-assistant.form.fallbackToMarket":"Fallback to Market on failure","trading-assistant.form.fallbackToMarketHint":"If limit order (open/close) is not filled, downgrade to market order to ensure execution","trading-assistant.form.marginMode":"Margin Mode","trading-assistant.form.marginModeCross":"Cross Margin","trading-assistant.form.marginModeIsolated":"Isolated Margin","trading-assistant.form.stopLossPct":"Stop Loss (%)","trading-assistant.form.stopLossPctHint":"Set stop loss percentage, 0 means disabled","trading-assistant.form.takeProfitPct":"Take Profit (%)","trading-assistant.form.takeProfitPctHint":"Set take profit percentage, 0 means disabled","trading-assistant.form.commission":"Commission (%)","trading-assistant.form.commissionHint":"Trading fee percentage (optional)","trading-assistant.form.slippage":"Slippage (%)","trading-assistant.form.slippageHint":"Estimated slippage percentage (optional)","trading-assistant.form.executionMode":"Execution","trading-assistant.form.executionModeSignal":"Signal only (push notifications)","trading-assistant.form.executionModeLive":"Live trading","trading-assistant.form.liveTradingCryptoOnlyHint":"Live trading is available for Crypto only. Other markets can only push signals.","trading-assistant.form.liveTradingNotSupportedHint":"Live trading is not available for this market","trading-assistant.form.broker":"Broker","trading-assistant.form.localDeploymentRequired":"⚠️ Local Deployment Required","trading-assistant.form.localDeploymentHint":"IBKR and MT5 are external trading interfaces that require local deployment of QuantDinger. Cloud SaaS mode is not supported. Please ensure you have installed and configured the trading software (TWS/IB Gateway or MT5 terminal) on your local machine.","trading-assistant.form.ibkrConnectionTitle":"Interactive Brokers Connection","trading-assistant.form.ibkrConnectionHint":"Make sure TWS or IB Gateway is running with API enabled","trading-assistant.validation.brokerRequired":"Please select a broker","trading-assistant.placeholders.selectBroker":"Select broker","trading-assistant.brokerNames":{ibkr:"Interactive Brokers (IBKR)",mt5:"MetaTrader 5 (MT5)",mt4:"MetaTrader 4 (MT4)",futu:"Futu Securities",tiger:"Tiger Brokers",td:"TD Ameritrade",schwab:"Charles Schwab"},"trading-assistant.form.ibkrHost":"Host","trading-assistant.form.ibkrPort":"Port","trading-assistant.form.ibkrPortHint":"TWS Live:7497, TWS Paper:7496, Gateway Live:4001, Gateway Paper:4002","trading-assistant.form.ibkrClientId":"Client ID","trading-assistant.form.ibkrAccount":"Account","trading-assistant.form.ibkrAccountHint":"Leave empty to auto-select first account. Specify for multi-account users.","trading-assistant.placeholders.ibkrAccount":"Optional, e.g. U1234567","trading-assistant.exchange.ibkrConnectionSuccess":"IBKR connected successfully","trading-assistant.exchange.ibkrConnectionFailed":"IBKR connection failed. Please check if TWS/Gateway is running.","trading-assistant.exchange.checkLocalDeployment":"Please ensure you are running locally. Cloud SaaS does not support external trading interfaces.","trading-assistant.form.forexBroker":"Forex Broker","trading-assistant.form.mt5ConnectionTitle":"MetaTrader 5 Connection","trading-assistant.form.mt5ConnectionHint":"Make sure MT5 terminal is running and logged in (Windows only)","trading-assistant.form.mt5Server":"Server","trading-assistant.form.mt5ServerHint":"Broker server name (e.g., ICMarkets-Demo)","trading-assistant.form.mt5Login":"Account Number","trading-assistant.form.mt5Password":"Password","trading-assistant.form.mt5TerminalPath":"MT5 Terminal Path (Optional)","trading-assistant.form.mt5TerminalPathHint":"If MT5 terminal is not installed in the default location, specify the full path to terminal64.exe (e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe)","trading-assistant.placeholders.mt5Server":"e.g., ICMarkets-Demo","trading-assistant.placeholders.mt5Login":"e.g., 12345678","trading-assistant.placeholders.mt5Password":"Your MT5 password","trading-assistant.placeholders.mt5TerminalPath":"e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe","trading-assistant.validation.mt5ServerRequired":"Please enter MT5 server","trading-assistant.validation.mt5LoginRequired":"Please enter MT5 account number","trading-assistant.validation.mt5PasswordRequired":"Please enter MT5 password","trading-assistant.validation.portfolioSizeRequired":"Please enter portfolio size","trading-assistant.validation.longRatioRequired":"Please enter long ratio","trading-assistant.exchange.mt5ConnectionSuccess":"MT5 connected successfully","trading-assistant.exchange.mt5ConnectionFailed":"MT5 connection failed. Please check if terminal is running.","trading-assistant.form.notifyChannels":"Notification Channels","trading-assistant.form.notifyChannelsHint":"Choose how you want to receive buy/sell and risk-management signals.","trading-assistant.notify.browser":"Browser","trading-assistant.notify.email":"Email","trading-assistant.notify.phone":"Phone","trading-assistant.notify.telegram":"Telegram","trading-assistant.notify.discord":"Discord","trading-assistant.notify.webhook":"Webhook","trading-assistant.form.notifyEmail":"Email","trading-assistant.form.notifyPhone":"Phone number","trading-assistant.form.notifyTelegram":"Telegram (chat id / username)","trading-assistant.form.notifyDiscord":"Discord (webhook url)","trading-assistant.form.notifyWebhook":"Webhook URL","trading-assistant.form.liveTradingConfigTitle":"Exchange Credentials","trading-assistant.form.liveTradingConfigHint":"Provide your exchange API credentials. You can test the connection before saving.","trading-assistant.form.savedCredential":"Saved credential","trading-assistant.form.savedCredentialHint":"Select a saved credential to auto-fill API keys (optional).","trading-assistant.form.saveCredential":"Save this credential for future use","trading-assistant.form.credentialName":"Credential name (optional)","trading-assistant.form.signalMode":"Signal Mode","trading-assistant.form.signalModeConfirmed":"Confirmed","trading-assistant.form.signalModeAggressive":"Aggressive","trading-assistant.form.signalModeHint":"Confirmed: only check completed candles; Aggressive: also check forming candles","trading-assistant.form.cancel":"Cancel","trading-assistant.form.prev":"Previous","trading-assistant.form.next":"Next","trading-assistant.form.confirmCreate":"Confirm Create","trading-assistant.form.confirmEdit":"Confirm Edit","trading-assistant.messages.createSuccess":"Strategy created successfully","trading-assistant.messages.createFailed":"Failed to create strategy","trading-assistant.messages.updateSuccess":"Strategy updated successfully","trading-assistant.messages.updateFailed":"Failed to update strategy","trading-assistant.messages.deleteSuccess":"Strategy deleted successfully","trading-assistant.messages.deleteFailed":"Failed to delete strategy","trading-assistant.messages.startSuccess":"Strategy started successfully","trading-assistant.messages.startFailed":"Failed to start strategy","trading-assistant.messages.stopSuccess":"Strategy stopped successfully","trading-assistant.messages.stopFailed":"Failed to stop strategy","trading-assistant.messages.loadFailed":"Failed to load strategy list","trading-assistant.messages.runningWarning":"Strategy is running, please stop it before editing","trading-assistant.messages.deleteConfirmWithName":'Are you sure you want to delete strategy "{name}"? This action cannot be undone.',"trading-assistant.messages.deleteConfirm":"Are you sure you want to delete this strategy? This action cannot be undone.","trading-assistant.messages.loadTradesFailed":"Failed to load trading records","trading-assistant.messages.loadPositionsFailed":"Failed to load position records","trading-assistant.messages.loadEquityFailed":"Failed to load equity curve","trading-assistant.messages.loadIndicatorsFailed":"Failed to load indicator list, please try again later","trading-assistant.messages.spotLimitations":"Spot trading has been automatically set to long only with 1x leverage","trading-assistant.messages.autoFillApiConfig":"Auto-filled API configuration for this exchange from history","trading-assistant.messages.batchCreateSuccess":"Successfully created {count} strategies","trading-assistant.messages.batchStartSuccess":"Successfully started {count} strategies","trading-assistant.messages.batchStartFailed":"Failed to start strategies","trading-assistant.messages.batchStopSuccess":"Successfully stopped {count} strategies","trading-assistant.messages.batchStopFailed":"Failed to stop strategies","trading-assistant.messages.batchDeleteSuccess":"Successfully deleted {count} strategies","trading-assistant.messages.batchDeleteFailed":"Failed to delete strategies","trading-assistant.messages.batchDeleteConfirm":'Are you sure you want to delete {count} strategies in group "{name}"? This action cannot be undone.',"trading-assistant.placeholders.selectIndicator":"Please select an indicator","trading-assistant.placeholders.selectExchange":"Please select an exchange","trading-assistant.placeholders.selectMarketCategory":"Please select market category","trading-assistant.placeholders.inputApiKey":"Please enter API Key","trading-assistant.placeholders.inputSecretKey":"Please enter Secret Key","trading-assistant.placeholders.inputPassphrase":"Please enter Passphrase","trading-assistant.placeholders.inputStrategyName":"Please enter strategy name","trading-assistant.placeholders.selectSymbol":"Please select trading pair","trading-assistant.placeholders.selectSymbols":"Please select trading pairs (multi-select)","trading-assistant.placeholders.inputSymbol":"Please enter symbol","trading-assistant.placeholders.selectTimeframe":"Please select timeframe","trading-assistant.placeholders.selectKlinePeriod":"Please select K-line period","trading-assistant.placeholders.inputAiFilterPrompt":"Please enter custom prompt (optional)","trading-assistant.placeholders.inputEmail":"Please enter email","trading-assistant.placeholders.inputPhone":"Please enter phone number","trading-assistant.placeholders.inputTelegram":"Please enter Telegram chat id / username","trading-assistant.placeholders.inputDiscord":"Please enter Discord webhook url","trading-assistant.placeholders.inputWebhook":"Please enter webhook url","trading-assistant.placeholders.selectSavedCredential":"Select saved credential","trading-assistant.placeholders.inputCredentialName":"For example: Binance main key","trading-assistant.validation.indicatorRequired":"Please select an indicator","trading-assistant.validation.exchangeRequired":"Please select an exchange","trading-assistant.validation.apiKeyRequired":"Please enter API Key","trading-assistant.validation.secretKeyRequired":"Please enter Secret Key","trading-assistant.validation.passphraseRequired":"Please enter Passphrase","trading-assistant.validation.exchangeConfigIncomplete":"Please fill in complete exchange configuration information","trading-assistant.validation.testConnectionRequired":'Please click "Test Connection" button and ensure the connection is successful',"trading-assistant.validation.testConnectionFailed":"Connection test failed, please check the configuration and test again","trading-assistant.validation.credentialRequired":"Please add and test exchange credentials in Personal Center first","trading-assistant.validation.strategyNameRequired":"Please enter strategy name","trading-assistant.validation.symbolRequired":"Please select trading pair","trading-assistant.validation.symbolsRequired":"Please select at least one trading pair","trading-assistant.validation.initialCapitalRequired":"Please enter initial capital","trading-assistant.validation.leverageRequired":"Please enter leverage","trading-assistant.validation.emailInvalid":"Invalid email address","trading-assistant.validation.notifyChannelRequired":"Please select at least one notification channel","trading-assistant.table.time":"Time","trading-assistant.table.type":"Type","trading-assistant.table.price":"Price","trading-assistant.table.amount":"Amount","trading-assistant.table.value":"Value","trading-assistant.table.commission":"Commission","trading-assistant.table.symbol":"Trading Pair","trading-assistant.table.side":"Side","trading-assistant.table.size":"Position Size","trading-assistant.table.entryPrice":"Entry Price","trading-assistant.table.currentPrice":"Current Price","trading-assistant.table.unrealizedPnl":"Unrealized P&L","trading-assistant.table.pnlPercent":"P&L %","trading-assistant.table.buy":"Buy","trading-assistant.table.sell":"Sell","trading-assistant.table.long":"Long","trading-assistant.table.short":"Short","trading-assistant.table.noPositions":"No positions","trading-assistant.detail.title":"Strategy Details","trading-assistant.detail.strategyName":"Strategy Name","trading-assistant.detail.strategyType":"Strategy Type","trading-assistant.detail.status":"Status","trading-assistant.detail.tradingMode":"Trading Mode","trading-assistant.detail.exchange":"Exchange","trading-assistant.detail.initialCapital":"Initial Capital","trading-assistant.detail.totalInvestment":"Total Investment","trading-assistant.detail.currentEquity":"Current Equity","trading-assistant.detail.totalPnl":"Total P&L","trading-assistant.detail.indicatorName":"Indicator Name","trading-assistant.detail.maxLeverage":"Max Leverage","trading-assistant.detail.decideInterval":"Decision Interval","trading-assistant.detail.symbols":"Trading Symbols","trading-assistant.detail.createdAt":"Created At","trading-assistant.detail.updatedAt":"Updated At","trading-assistant.detail.llmConfig":"AI Model Configuration","trading-assistant.detail.exchangeConfig":"Exchange Configuration","trading-assistant.detail.provider":"Provider","trading-assistant.detail.modelId":"Model ID","trading-assistant.detail.close":"Close","trading-assistant.detail.loadFailed":"Failed to load strategy details","trading-assistant.equity.noData":"No equity data","trading-assistant.equity.equity":"Equity","trading-assistant.exchange.tradingMode":"Trading Mode","trading-assistant.exchange.virtual":"Virtual Trading","trading-assistant.exchange.live":"Live Trading","trading-assistant.exchange.selectExchange":"Select Exchange","trading-assistant.exchange.walletAddress":"Wallet Address","trading-assistant.exchange.walletAddressPlaceholder":"Please enter wallet address (starts with 0x)","trading-assistant.exchange.privateKey":"Private Key","trading-assistant.exchange.privateKeyPlaceholder":"Please enter private key (64 characters)","trading-assistant.exchange.testConnection":"Test Connection","trading-assistant.exchange.connectionSuccess":"Connection successful","trading-assistant.exchange.connectionFailed":"Connection failed","trading-assistant.exchange.testFailed":"Connection test failed","trading-assistant.exchange.fillComplete":"Please fill in complete exchange configuration information","trading-assistant.exchange.ipWhitelistTip":"Please add the following IPs to the whitelist in your exchange API settings:","trading-assistant.strategyTypeOptions.ai":"AI-Driven Strategy","trading-assistant.strategyTypeOptions.indicator":"Indicator Strategy","trading-assistant.strategyTypeOptions.aiDeveloping":"AI-Driven Strategy feature is under development, stay tuned","trading-assistant.strategyTypeOptions.aiDevelopingWarning":"AI-Driven Strategy feature is under development","trading-assistant.indicatorType.trend":"Trend","trading-assistant.indicatorType.momentum":"Momentum","trading-assistant.indicatorType.volatility":"Volatility","trading-assistant.indicatorType.volume":"Volume","trading-assistant.indicatorType.custom":"Custom","trading-assistant.exchangeNames":{okx:"OKX",binance:"Binance",hyperliquid:"Hyperliquid",blockchaincom:"Blockchain.com",coinbaseexchange:"Coinbase",gate:"Gate.io",mexc:"MEXC",kraken:"Kraken",bitfinex:"Bitfinex",bybit:"Bybit",kucoin:"KuCoin",huobi:"Huobi",bitget:"Bitget",bitmex:"BitMEX",deribit:"Deribit",phemex:"Phemex",bitmart:"BitMart",bitstamp:"Bitstamp",bittrex:"Bittrex",poloniex:"Poloniex",gemini:"Gemini",cryptocom:"Crypto.com",bitflyer:"bitFlyer",upbit:"Upbit",bithumb:"Bithumb",coinone:"Coinone",zb:"ZB",lbank:"LBank",bibox:"Bibox",bigone:"BigONE",bitrue:"Bitrue",coinex:"CoinEx",digifinex:"DigiFinex",ftx:"FTX",ftxus:"FTX US",binanceus:"Binance US",binancecoinm:"Binance COIN-M",binanceusdm:"Binance USDⓈ-M",ibkr:"Interactive Brokers (IBKR)",deepcoin:"Deepcoin"},"ai-trading-assistant.title":"AI Trading Assistant","ai-trading-assistant.strategyList":"Strategy List","ai-trading-assistant.createStrategy":"Create Strategy","ai-trading-assistant.noStrategy":"No strategies","ai-trading-assistant.selectStrategy":"Please select a strategy from the left to view details","ai-trading-assistant.startStrategy":"Start Strategy","ai-trading-assistant.stopStrategy":"Stop Strategy","ai-trading-assistant.editStrategy":"Edit Strategy","ai-trading-assistant.deleteStrategy":"Delete Strategy","ai-trading-assistant.status.running":"Running","ai-trading-assistant.status.stopped":"Stopped","ai-trading-assistant.status.error":"Error","ai-trading-assistant.tabs.tradingRecords":"Trading Records","ai-trading-assistant.tabs.positions":"Positions","ai-trading-assistant.tabs.aiDecisions":"AI Decisions","ai-trading-assistant.tabs.equityCurve":"Equity Curve","ai-trading-assistant.form.createTitle":"Create AI Trading Strategy","ai-trading-assistant.form.editTitle":"Edit AI Trading Strategy","ai-trading-assistant.form.strategyName":"Strategy Name","ai-trading-assistant.form.modelId":"AI Model","ai-trading-assistant.form.modelIdHint":"Using system OpenRouter service, no API Key configuration needed","ai-trading-assistant.form.decideInterval":"Decision Interval","ai-trading-assistant.form.decideInterval5m":"5 Minutes","ai-trading-assistant.form.decideInterval10m":"10 Minutes","ai-trading-assistant.form.decideInterval30m":"30 Minutes","ai-trading-assistant.form.decideInterval1h":"1 Hour","ai-trading-assistant.form.decideInterval4h":"4 Hours","ai-trading-assistant.form.decideInterval1d":"1 Day","ai-trading-assistant.form.decideInterval1w":"1 Week","ai-trading-assistant.form.decideIntervalHint":"Time interval for AI decision making","ai-trading-assistant.form.runPeriod":"Run Period","ai-trading-assistant.form.runPeriodHint":"Start and end time for strategy execution","ai-trading-assistant.form.startDate":"Start Date","ai-trading-assistant.form.endDate":"End Date","ai-trading-assistant.form.qdtCostTitle":"QDT Cost Notice","ai-trading-assistant.form.qdtCostHint":"Each AI decision will cost {cost} QDT. Please ensure your account has sufficient QDT balance. During strategy execution, each decision will be charged in real-time.","ai-trading-assistant.form.apiKey":"API Key","ai-trading-assistant.form.exchange":"Select Exchange","ai-trading-assistant.form.secretKey":"Secret Key","ai-trading-assistant.form.passphrase":"Passphrase","ai-trading-assistant.form.testConnection":"Test Connection","ai-trading-assistant.form.symbol":"Trading Pair","ai-trading-assistant.form.symbolHint":"Select the trading pair to trade","ai-trading-assistant.form.initialCapital":"Initial Capital (Margin)","ai-trading-assistant.form.leverage":"Leverage","ai-trading-assistant.form.timeframe":"Timeframe","ai-trading-assistant.form.timeframe1m":"1 Minute","ai-trading-assistant.form.timeframe5m":"5 Minutes","ai-trading-assistant.form.timeframe15m":"15 Minutes","ai-trading-assistant.form.timeframe30m":"30 Minutes","ai-trading-assistant.form.timeframe1H":"1 Hour","ai-trading-assistant.form.timeframe4H":"4 Hours","ai-trading-assistant.form.timeframe1D":"1 Day","ai-trading-assistant.form.marketType":"Market Type","ai-trading-assistant.form.marketTypeFutures":"Futures","ai-trading-assistant.form.marketTypeSpot":"Spot","ai-trading-assistant.form.totalPnl":"Total PnL","ai-trading-assistant.form.customPrompt":"Custom Prompt","ai-trading-assistant.form.customPromptHint":"Optional, used to customize AI trading strategy and decision logic","ai-trading-assistant.form.cancel":"Cancel","ai-trading-assistant.form.prev":"Previous","ai-trading-assistant.form.next":"Next","ai-trading-assistant.form.confirmCreate":"Confirm Create","ai-trading-assistant.form.confirmEdit":"Confirm Edit","ai-trading-assistant.messages.createSuccess":"Strategy created successfully","ai-trading-assistant.messages.createFailed":"Failed to create strategy","ai-trading-assistant.messages.updateSuccess":"Strategy updated successfully","ai-trading-assistant.messages.updateFailed":"Failed to update strategy","ai-trading-assistant.messages.deleteSuccess":"Strategy deleted successfully","ai-trading-assistant.messages.deleteFailed":"Failed to delete strategy","ai-trading-assistant.messages.startSuccess":"Strategy started successfully","ai-trading-assistant.messages.startFailed":"Failed to start strategy","ai-trading-assistant.messages.stopSuccess":"Strategy stopped successfully","ai-trading-assistant.messages.stopFailed":"Failed to stop strategy","ai-trading-assistant.messages.loadFailed":"Failed to load strategy list","ai-trading-assistant.messages.loadDecisionsFailed":"Failed to load AI decision records","ai-trading-assistant.messages.deleteConfirm":"Are you sure you want to delete this strategy? This action cannot be undone.","ai-trading-assistant.placeholders.inputStrategyName":"Please enter strategy name","ai-trading-assistant.placeholders.selectModelId":"Please select AI model","ai-trading-assistant.placeholders.selectDecideInterval":"Please select decision interval","ai-trading-assistant.placeholders.startTime":"Start Time","ai-trading-assistant.placeholders.endTime":"End Time","ai-trading-assistant.placeholders.inputApiKey":"Please enter API Key","ai-trading-assistant.placeholders.selectExchange":"Please select an exchange","ai-trading-assistant.placeholders.inputSecretKey":"Please enter Secret Key","ai-trading-assistant.placeholders.inputPassphrase":"Please enter Passphrase","ai-trading-assistant.placeholders.selectSymbol":"Please select trading pair, e.g.: BTC/USDT","ai-trading-assistant.placeholders.selectTimeframe":"Please select timeframe","ai-trading-assistant.placeholders.inputCustomPrompt":"Please enter custom prompt (optional)","ai-trading-assistant.validation.strategyNameRequired":"Please enter strategy name","ai-trading-assistant.validation.modelIdRequired":"Please select AI model","ai-trading-assistant.validation.runPeriodRequired":"Please select run period","ai-trading-assistant.validation.apiKeyRequired":"Please enter API Key","ai-trading-assistant.validation.exchangeRequired":"Please select an exchange","ai-trading-assistant.validation.secretKeyRequired":"Please enter Secret Key","ai-trading-assistant.validation.symbolRequired":"Please select trading pair","ai-trading-assistant.validation.initialCapitalRequired":"Please enter initial capital","ai-trading-assistant.table.time":"Time","ai-trading-assistant.table.type":"Type","ai-trading-assistant.table.price":"Price","ai-trading-assistant.table.amount":"Amount","ai-trading-assistant.table.value":"Value","ai-trading-assistant.table.symbol":"Trading Pair","ai-trading-assistant.table.side":"Side","ai-trading-assistant.table.size":"Position Size","ai-trading-assistant.table.entryPrice":"Entry Price","ai-trading-assistant.table.currentPrice":"Current Price","ai-trading-assistant.table.unrealizedPnl":"Unrealized P&L","ai-trading-assistant.table.profit":"Profit","ai-trading-assistant.table.openLong":"Open Long","ai-trading-assistant.table.closeLong":"Close Long","ai-trading-assistant.table.openShort":"Open Short","ai-trading-assistant.table.closeShort":"Close Short","ai-trading-assistant.table.addLong":"Add Long","ai-trading-assistant.table.addShort":"Add Short","ai-trading-assistant.table.closeShortProfit":"Close Short (TP)","ai-trading-assistant.table.closeShortStop":"Close Short (SL)","ai-trading-assistant.table.closeLongProfit":"Close Long (TP)","ai-trading-assistant.table.closeLongStop":"Close Long (SL)","ai-trading-assistant.table.buy":"Buy","ai-trading-assistant.table.sell":"Sell","ai-trading-assistant.table.long":"Long","ai-trading-assistant.table.short":"Short","ai-trading-assistant.table.hold":"Hold","ai-trading-assistant.table.reasoning":"Analysis Reasoning","ai-trading-assistant.table.decisions":"Decisions","ai-trading-assistant.table.riskAssessment":"Risk","ai-trading-assistant.table.confidence":"Confidence","ai-trading-assistant.table.totalRecords":"Total {total} records","ai-trading-assistant.table.noPositions":"No positions","ai-trading-assistant.detail.title":"Strategy Details","ai-trading-assistant.equity.noData":"No equity data","ai-trading-assistant.equity.equity":"Equity","ai-trading-assistant.exchange.testFailed":"Connection test failed","ai-trading-assistant.exchange.connectionSuccess":"Connection successful","ai-trading-assistant.exchange.connectionFailed":"Connection failed","ai-trading-assistant.form.advancedSettings":"Advanced Settings","ai-trading-assistant.form.orderMode":"Order Mode","ai-trading-assistant.form.orderModeMaker":"Maker (Limit)","ai-trading-assistant.form.orderModeTaker":"Taker (Market)","ai-trading-assistant.form.orderModeHint":"Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees","ai-trading-assistant.form.makerWaitSec":"Maker Wait Time (seconds)","ai-trading-assistant.form.makerWaitSecHint":"Time to wait for order fill before canceling and retrying","ai-trading-assistant.form.makerRetries":"Maker Retries","ai-trading-assistant.form.makerRetriesHint":"Maximum number of retries when maker order is not filled","ai-trading-assistant.form.fallbackToMarket":"Fallback to Market on failure","ai-trading-assistant.form.fallbackToMarketHint":"If limit order (open/close) is not filled, downgrade to market order to ensure execution","ai-trading-assistant.form.marginMode":"Margin Mode","ai-trading-assistant.form.marginModeCross":"Cross Margin","ai-trading-assistant.form.marginModeIsolated":"Isolated Margin","ai-analysis.title":"Quantum Trading Engine","ai-analysis.system.online":"ONLINE","ai-analysis.system.agents":"AGENTS","ai-analysis.system.active":"ACTIVE","ai-analysis.system.stage":"STAGE","ai-analysis.panel.roster":"AGENTS ROSTER","ai-analysis.panel.thinking":"Thinking...","ai-analysis.panel.done":"Done","ai-analysis.panel.standby":"Standby","ai-analysis.input.title":"QUANTUM TRADING ENGINE","ai-analysis.input.placeholder":"SELECT TARGET ASSET (e.g. BTC/USDT)","ai-analysis.input.watchlist":"Watchlist","ai-analysis.input.start":"START ANALYSIS","ai-analysis.input.recent":"RECENT MISSIONS:","ai-analysis.vis.stage":"STAGE","ai-analysis.vis.processing":"PROCESSING","ai-analysis.result.complete":"ANALYSIS COMPLETE","ai-analysis.result.signal":"FINAL SIGNAL","ai-analysis.result.confidence":"CONFIDENCE:","ai-analysis.result.new":"NEW ANALYSIS","ai-analysis.result.full":"VIEW FULL DOSSIER","ai-analysis.logs.title":"SYSTEM LOGS","ai-analysis.modal.title":"CLASSIFIED REPORT","ai-analysis.modal.fundamental":"FUNDAMENTAL ANALYSIS","ai-analysis.modal.technical":"TECHNICAL ANALYSIS","ai-analysis.modal.sentiment":"SENTIMENT ANALYSIS","ai-analysis.modal.risk":"RISK ASSESSMENT","ai-analysis.stage.idle":"IDLE","ai-analysis.stage.1":"PHASE 1: MULTI-DIMENSIONAL ANALYSIS","ai-analysis.stage.2":"PHASE 2: BULL/BEAR DEBATE","ai-analysis.stage.3":"PHASE 3: STRATEGIC PLANNING","ai-analysis.stage.4":"PHASE 4: RISK COMMITTEE REVIEW","ai-analysis.stage.complete":"COMPLETE","ai-analysis.agent.investment_director":"Investment Director","ai-analysis.agent.role.investment_director":"Comprehensive Analysis & Final Conclusion","ai-analysis.agent.market":"Market Analyst","ai-analysis.agent.role.market":"Technical & Market Data","ai-analysis.agent.fundamental":"Fundamental Analyst","ai-analysis.agent.role.fundamental":"Financials & Valuation","ai-analysis.agent.technical":"Technical Analyst","ai-analysis.agent.role.technical":"Technical Indicators & Charts","ai-analysis.agent.news":"News Analyst","ai-analysis.agent.role.news":"Global News Filter","ai-analysis.agent.sentiment":"Sentiment Analyst","ai-analysis.agent.role.sentiment":"Social & Emotional","ai-analysis.agent.risk":"Risk Analyst","ai-analysis.agent.role.risk":"Basic Risk Check","ai-analysis.agent.bull":"Bull Researcher","ai-analysis.agent.role.bull":"Growth Catalyst Hunter","ai-analysis.agent.bear":"Bear Researcher","ai-analysis.agent.role.bear":"Risk & Flaw Hunter","ai-analysis.agent.manager":"Research Manager","ai-analysis.agent.role.manager":"Debate Moderator","ai-analysis.agent.trader":"Trader Agent","ai-analysis.agent.role.trader":"Execution Strategist","ai-analysis.agent.risky":"Risky Analyst","ai-analysis.agent.role.risky":"Aggressive Strategy","ai-analysis.agent.neutral":"Neutral Analyst","ai-analysis.agent.role.neutral":"Balanced Strategy","ai-analysis.agent.safe":"Safe Analyst","ai-analysis.agent.role.safe":"Conservative Strategy","ai-analysis.agent.cro":"Risk Manager (CRO)","ai-analysis.agent.role.cro":"Final Decision Authority","ai-analysis.script.market":"Fetching OHLCV data from major exchanges...","ai-analysis.script.fundamental":"Retrieving quarterly financial reports...","ai-analysis.script.technical":"Analyzing technical indicators and chart patterns...","ai-analysis.script.news":"Scanning global financial news feeds...","ai-analysis.script.sentiment":"Analyzing social media trends...","ai-analysis.script.risk":"Calculating historical volatility...","invite.inviteLink":"Invite Link","invite.copy":"Copy Link","invite.copySuccess":"Copied successfully!","invite.copyFailed":"Copy failed, please copy manually","invite.noInviteLink":"Invite link not generated","invite.totalInvites":"Total Invites","invite.totalReward":"Total Reward","invite.rules":"Invite Rules","invite.rule1":"You will receive a reward for each friend you successfully invite to register","invite.rule2":"When your invited friend completes their first transaction, you will receive an additional reward","invite.rule3":"Invite rewards will be directly credited to your account","invite.inviteList":"Invite List","invite.tasks":"Task Center","invite.inviteeName":"Invitee","invite.inviteTime":"Invite Time","invite.status":"Status","invite.reward":"Reward","invite.active":"Active","invite.inactive":"Inactive","invite.completed":"Completed","invite.claimed":"Claimed","invite.pending":"Pending","invite.goToTask":"Go to Task","invite.claimReward":"Claim Reward","invite.verify":"Verify","invite.verifySuccess":"Verification successful! Task completed","invite.verifyNotCompleted":"Task not completed yet, please complete the task first","invite.verifyFailed":"Verification failed, please try again later","invite.claimSuccess":"Successfully claimed {reward} QDT!","invite.claimFailed":"Claim failed, please try again later","invite.totalRecords":"Total {total} records","invite.task.twitter.title":"Share Tweet on X (Twitter)","invite.task.twitter.desc":"Share our official tweet to your X (Twitter) account","invite.task.youtube.title":"Follow our YouTube Channel","invite.task.youtube.desc":"Subscribe and follow our official YouTube channel","invite.task.telegram.title":"Join Telegram Group","invite.task.telegram.desc":"Join our official Telegram community group","invite.task.discord.title":"Join Discord Server","invite.task.discord.desc":"Join our Discord community server",message:"-","layouts.usermenu.dialog.title":"Message","layouts.usermenu.dialog.content":"Are you sure you would like to logout?","layouts.userLayout.title":"Clarity from Uncertainty","signal-robot.title":"Signal Robot Console","signal-robot.createBot":"Create New Bot","signal-robot.search.nameOrSymbol":"Name/Symbol","signal-robot.search.placeholder":"Search bot name or symbol","signal-robot.search.status":"Status","signal-robot.search.statusAll":"All","signal-robot.search.statusRunning":"Running","signal-robot.search.statusPaused":"Paused","signal-robot.search.query":"Query","signal-robot.search.reset":"Reset","signal-robot.table.botName":"Bot Name","signal-robot.table.symbolTimeframe":"Symbol/Timeframe","signal-robot.table.triggerStrategy":"Trigger Strategy","signal-robot.table.notificationChannels":"Notification Channels","signal-robot.table.status":"Status","signal-robot.table.action":"Action","signal-robot.table.triggerConditions":"{count} trigger conditions","signal-robot.table.monitoring":"Monitoring","signal-robot.table.paused":"Paused","signal-robot.table.edit":"Edit","signal-robot.table.pause":"Pause","signal-robot.table.start":"Start","signal-robot.table.delete":"Delete","signal-robot.table.deleteConfirm":"Are you sure you want to delete this bot?","signal-robot.table.deleteSuccess":"Deleted successfully","signal-robot.table.startSuccess":"Bot started","signal-robot.table.pauseSuccess":"Bot paused","signal-robot.channel.telegram":"Telegram","signal-robot.channel.discord":"Discord","signal-robot.channel.email":"Email","signal-robot.channel.webhook":"Webhook","signal-robot.channel.browser":"Browser Push","signal-robot.modal.createTitle":"Create New Signal Robot","signal-robot.modal.editTitle":"Edit Signal Robot","signal-robot.modal.step.basic":"Basic Settings","signal-robot.modal.step.entry":"Entry Strategy","signal-robot.modal.step.position":"Position Management","signal-robot.modal.step.risk":"Risk Control","signal-robot.modal.step.notify":"Notification Config","signal-robot.modal.prev":"Previous","signal-robot.modal.next":"Next","signal-robot.modal.preview":"Preview Backtest","signal-robot.modal.complete":"Complete & Run","signal-robot.modal.saveSuccess":"Saved successfully","signal-robot.modal.previewDeveloping":"Preview feature is under development...","signal-robot.modal.basicInfoRequired":"Please complete basic information","signal-robot.basic.alert":"Set basic information for the bot","signal-robot.basic.title":"Basic Information","signal-robot.basic.botName":"Bot Name","signal-robot.basic.botNamePlaceholder":"e.g.: BTC SuperTrend Strategy","signal-robot.basic.symbol":"Trading Pair","signal-robot.basic.symbolPlaceholder":"Select from watchlist","signal-robot.basic.noWatchlist":"No watchlist items, please add in market page first","signal-robot.basic.timeframe":"K-Line Period","signal-robot.basic.timeframe15m":"15 Minutes","signal-robot.basic.timeframe30m":"30 Minutes","signal-robot.basic.timeframe1h":"1 Hour","signal-robot.basic.timeframe4h":"4 Hours","signal-robot.basic.timeframe1d":"1 Day","signal-robot.basic.autoNameSuggestion":"{symbol} Signal Robot","signal-robot.entry.alert":"Trigger entry signal when all conditions below are met","signal-robot.entry.condition":"Condition {index}","signal-robot.entry.indicator":"Indicator","signal-robot.entry.indicatorSupertrend":"SuperTrend","signal-robot.entry.indicatorEma":"EMA (Exponential Moving Average)","signal-robot.entry.indicatorRsi":"RSI (Relative Strength Index)","signal-robot.entry.indicatorMacd":"MACD","signal-robot.entry.indicatorBollinger":"Bollinger Bands","signal-robot.entry.atrPeriod":"ATR Period","signal-robot.entry.multiplier":"Multiplier","signal-robot.entry.triggerSignal":"Trigger Signal","signal-robot.entry.signalTrendBullish":"Trend Bullish","signal-robot.entry.signalTrendBearish":"Trend Bearish","signal-robot.entry.signalIsUptrend":"Is Uptrend","signal-robot.entry.signalIsDowntrend":"Is Downtrend","signal-robot.entry.period":"Period","signal-robot.entry.compareCondition":"Compare Condition","signal-robot.entry.priceAbove":"Price > EMA (Price Above)","signal-robot.entry.priceBelow":"Price < EMA (Price Below)","signal-robot.entry.crossUp":"Price Crosses Above EMA (Golden Cross)","signal-robot.entry.crossDown":"Price Crosses Below EMA (Death Cross)","signal-robot.entry.compare":"Compare","signal-robot.entry.greaterThan":"Greater Than","signal-robot.entry.lessThan":"Less Than","signal-robot.entry.crossUpShort":"Cross Up","signal-robot.entry.crossDownShort":"Cross Down","signal-robot.entry.threshold":"Threshold","signal-robot.entry.selectIndicator":"Please select an indicator to configure parameters","signal-robot.entry.addCondition":"Add Condition","signal-robot.position.alert":"Configure initial position size, leverage and pyramiding rules","signal-robot.position.basicTitle":"Basic Position Management","signal-robot.position.initialSize":"Initial Size (Capital %)","signal-robot.position.initialSizeHint":"Recommended 5% - 20%","signal-robot.position.leverage":"Leverage","signal-robot.position.leverageHint":"Please ensure your exchange account supports this leverage","signal-robot.position.maxPyramiding":"Max Pyramiding Times","signal-robot.position.maxPyramidingHint":"0 means no pyramiding","signal-robot.position.pyramidingTitle":"Pyramiding Rules","signal-robot.position.pyramidingEnabled":"Enabled","signal-robot.position.pyramidingDisabled":"Disabled","signal-robot.position.pyramidingCondition":"Pyramiding Trigger Condition","signal-robot.position.priceRisePct":"Price Rises (Long) / Falls (Short)","signal-robot.position.profitPct":"Profit Reaches","signal-robot.position.triggerThreshold":"Trigger Threshold (%)","signal-robot.position.triggerThresholdHint":"e.g. 3%: add position once every 3% rise","signal-robot.position.addSize":"Single Add Size (Capital %)","signal-robot.position.pyramidingDisabledHint":"Pyramiding disabled, only initial position will be executed","signal-robot.risk.alert":"Configure take profit, stop loss and exit rules","signal-robot.risk.stopLossTitle":"Stop Loss","signal-robot.risk.stopLossEnabled":"Enabled","signal-robot.risk.stopLossDisabled":"Disabled","signal-robot.risk.stopLossType":"Stop Loss Type","signal-robot.risk.stopLossFixedPct":"Fixed Percentage","signal-robot.risk.stopLossAtrMultiplier":"ATR Multiplier","signal-robot.risk.stopLossValue":"Value","signal-robot.risk.stopLossFixedHint":"e.g. 2%: stop loss when loss reaches 2%","signal-robot.risk.stopLossAtrHint":"e.g. 2.0: stop loss when price touches ATR*2.0","signal-robot.risk.stopLossDisabledHint":"Stop loss disabled (high risk)","signal-robot.risk.trailingStopTitle":"Trailing Stop","signal-robot.risk.activationProfit":"Activation Profit (%)","signal-robot.risk.activationProfitHint":"Start trailing when profit reaches this level","signal-robot.risk.callbackPct":"Callback (%)","signal-robot.risk.callbackPctHint":"Trigger take profit when price falls from peak by this percentage","signal-robot.risk.trailingStopDisabledHint":"Trailing stop disabled","signal-robot.risk.otherExitTitle":"Other Exit Rules","signal-robot.risk.signalExit":"Allow Signal Exit","signal-robot.risk.signalExitHint":"Close position immediately when reverse signal appears (e.g. close long when short signal appears)","signal-robot.notify.alert":"Configure notification methods when signal is triggered","signal-robot.notify.channelTitle":"Notification Channels","signal-robot.notify.discordWebhook":"Discord Webhook","signal-robot.notify.genericWebhook":"Generic Webhook","signal-robot.notify.webhookUrl":"Webhook URL","signal-robot.notify.webhookUrlPlaceholder":"https://example.com/webhook","signal-robot.notify.discordUrl":"Discord URL","signal-robot.notify.discordUrlPlaceholder":"https://discord.com/api/webhooks/...","signal-robot.operator.greaterThan":"Greater Than","signal-robot.operator.lessThan":"Less Than","signal-robot.operator.equal":"Equal","signal-robot.operator.goldenCross":"Golden Cross","signal-robot.operator.deathCross":"Death Cross","signal-robot.operator.increaseBy":"Increase By","signal-robot.operator.decreaseBy":"Decrease By","signal-robot.indicator.price":"Price","signal-robot.indicator.rsi":"RSI","signal-robot.indicator.kdjK":"KDJ(K)","signal-robot.indicator.kdjJ":"KDJ(J)","signal-robot.indicator.macd":"MACD","signal-robot.indicator.macdHist":"MACD Histogram","signal-robot.indicator.bollingerUp":"Bollinger Upper","signal-robot.indicator.bollingerLow":"Bollinger Lower","signal-robot.indicator.volume":"Volume","signal-robot.indicator.changePct1h":"1H Change %","signal-robot.indicator.changePct24h":"24H Change %","signal-robot.indicator.signalLine":"Signal Line","settings.title":"System Settings","settings.description":"Configure application settings, API keys, and system preferences","settings.save":"Save Settings","settings.reset":"Reset","settings.saveSuccess":"Settings saved successfully","settings.saveFailed":"Failed to save settings","settings.loadFailed":"Failed to load settings","settings.openrouterBalance":"OpenRouter Account Balance","settings.queryBalance":"Query Balance","settings.balanceUsage":"Used","settings.balanceRemaining":"Remaining","settings.balanceLimit":"Total Limit","settings.balanceQuerySuccess":"Balance query successful","settings.balanceQueryFailed":"Failed to query balance","settings.balanceNotQueried":'Click "Query Balance" to get account info',"settings.default":"Default","settings.pleaseSelect":"Please select","settings.inputApiKey":"Enter key","settings.getApi":"Get API","settings.link.getApi":"Get API","settings.link.getApiKey":"Get API Key","settings.link.getToken":"Get Token","settings.link.createBot":"Create Bot","settings.link.viewModels":"View Models","settings.link.freeRegister":"Free Register","settings.link.supportedExchanges":"Supported Exchanges","settings.link.applyApi":"Apply API","settings.link.createSearchEngine":"Create Search Engine","settings.link.getTurnstileKey":"Get Turnstile Key","settings.link.getGoogleCredentials":"Get Google Credentials","settings.link.getGithubCredentials":"Get GitHub Credentials","settings.restartRequired":"Settings saved. Some changes require Python service restart to take effect.","settings.copyRestartCmd":"Copy restart command","settings.copySuccess":"Copied","settings.copyFailed":"Copy failed","settings.group.server":"Server Configuration","settings.group.auth":"Security & Authentication","settings.group.ai":"AI / LLM Configuration","settings.group.trading":"Live Trading","settings.group.strategy":"Strategy Execution","settings.group.data_source":"Data Sources","settings.group.notification":"Notifications","settings.group.email":"Email (SMTP)","settings.group.sms":"SMS (Twilio)","settings.group.agent":"AI Agent","settings.group.network":"Network & Proxy","settings.group.search":"Web Search","settings.group.security":"Registration & Security","settings.group.app":"Application","settings.field.SECRET_KEY":"Secret Key","settings.field.ADMIN_USER":"Admin Username","settings.field.ADMIN_PASSWORD":"Admin Password","settings.field.ADMIN_EMAIL":"Admin Email","settings.field.ENABLE_REGISTRATION":"Enable Registration","settings.field.TURNSTILE_SITE_KEY":"Turnstile Site Key","settings.field.TURNSTILE_SECRET_KEY":"Turnstile Secret Key","settings.field.FRONTEND_URL":"Frontend URL","settings.field.GOOGLE_CLIENT_ID":"Google Client ID","settings.field.GOOGLE_CLIENT_SECRET":"Google Client Secret","settings.field.GOOGLE_REDIRECT_URI":"Google Redirect URI","settings.field.GITHUB_CLIENT_ID":"GitHub Client ID","settings.field.GITHUB_CLIENT_SECRET":"GitHub Client Secret","settings.field.GITHUB_REDIRECT_URI":"GitHub Redirect URI","settings.field.SECURITY_IP_MAX_ATTEMPTS":"IP Max Failed Attempts","settings.field.SECURITY_IP_WINDOW_MINUTES":"IP Window (minutes)","settings.field.SECURITY_IP_BLOCK_MINUTES":"IP Block Duration (minutes)","settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS":"Account Max Failed Attempts","settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES":"Account Window (minutes)","settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES":"Account Block Duration (minutes)","settings.field.VERIFICATION_CODE_EXPIRE_MINUTES":"Verification Code Expiry (minutes)","settings.field.VERIFICATION_CODE_RATE_LIMIT":"Code Rate Limit (seconds)","settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT":"Code Hourly Limit per IP","settings.field.VERIFICATION_CODE_MAX_ATTEMPTS":"Code Max Attempts","settings.field.VERIFICATION_CODE_LOCK_MINUTES":"Code Lock Minutes","settings.field.PYTHON_API_HOST":"Listen Address","settings.field.PYTHON_API_PORT":"Port","settings.field.PYTHON_API_DEBUG":"Debug Mode","settings.field.ENABLE_PENDING_ORDER_WORKER":"Enable Order Worker","settings.field.PENDING_ORDER_STALE_SEC":"Order Stale Timeout (sec)","settings.field.ORDER_MODE":"Order Mode","settings.field.MAKER_WAIT_SEC":"Limit Order Wait Time (sec)","settings.field.MAKER_OFFSET_BPS":"Limit Order Price Offset (bps)","settings.field.SIGNAL_WEBHOOK_URL":"Webhook URL","settings.field.SIGNAL_WEBHOOK_TOKEN":"Webhook Token","settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC":"Notify Timeout (sec)","settings.field.TELEGRAM_BOT_TOKEN":"Telegram Bot Token","settings.field.SMTP_HOST":"SMTP Host","settings.field.SMTP_PORT":"SMTP Port","settings.field.SMTP_USER":"SMTP Username","settings.field.SMTP_PASSWORD":"SMTP Password","settings.field.SMTP_FROM":"From Address","settings.field.SMTP_USE_TLS":"Use TLS","settings.field.SMTP_USE_SSL":"Use SSL","settings.field.TWILIO_ACCOUNT_SID":"Account SID","settings.field.TWILIO_AUTH_TOKEN":"Auth Token","settings.field.TWILIO_FROM_NUMBER":"From Number","settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES":"Disable Auto Restore","settings.field.STRATEGY_TICK_INTERVAL_SEC":"Tick Interval (sec)","settings.field.PRICE_CACHE_TTL_SEC":"Price Cache TTL (sec)","settings.field.PROXY_PORT":"Proxy Port","settings.field.PROXY_HOST":"Proxy Host","settings.field.PROXY_SCHEME":"Proxy Scheme","settings.field.PROXY_URL":"Full Proxy URL","settings.field.CORS_ORIGINS":"CORS Origins","settings.field.RATE_LIMIT":"Rate Limit (per min)","settings.field.ENABLE_CACHE":"Enable Cache","settings.field.ENABLE_REQUEST_LOG":"Enable Request Log","settings.field.ENABLE_AI_ANALYSIS":"Enable AI Analysis","settings.field.ENABLE_AGENT_MEMORY":"Enable Agent Memory","settings.field.AGENT_MEMORY_ENABLE_VECTOR":"Enable Vector Retrieval (Local)","settings.field.AGENT_MEMORY_EMBEDDING_DIM":"Embedding Dimension","settings.field.AGENT_MEMORY_TOP_K":"Top-K Retrieval Count","settings.field.AGENT_MEMORY_CANDIDATE_LIMIT":"Candidate Window Size","settings.field.AGENT_MEMORY_HALF_LIFE_DAYS":"Time Decay Half-life (days)","settings.field.AGENT_MEMORY_W_SIM":"Similarity Weight","settings.field.AGENT_MEMORY_W_RECENCY":"Recency Weight","settings.field.AGENT_MEMORY_W_RETURNS":"Returns Weight","settings.field.ENABLE_REFLECTION_WORKER":"Enable Auto Verification","settings.field.REFLECTION_WORKER_INTERVAL_SEC":"Verification Interval (sec)","settings.field.OPENROUTER_API_KEY":"OpenRouter API Key","settings.field.OPENROUTER_API_URL":"OpenRouter API URL","settings.field.OPENROUTER_MODEL":"Default Model","settings.field.OPENROUTER_TEMPERATURE":"Temperature","settings.field.OPENROUTER_MAX_TOKENS":"Max Tokens","settings.field.OPENROUTER_TIMEOUT":"Timeout (sec)","settings.field.OPENROUTER_CONNECT_TIMEOUT":"Connect Timeout (sec)","settings.field.AI_MODELS_JSON":"Models JSON","settings.field.MARKET_TYPES_JSON":"Market Types JSON","settings.field.TRADING_SUPPORTED_SYMBOLS_JSON":"Supported Symbols JSON","settings.field.DATA_SOURCE_TIMEOUT":"Timeout (sec)","settings.field.DATA_SOURCE_RETRY":"Retry Count","settings.field.DATA_SOURCE_RETRY_BACKOFF":"Retry Backoff (sec)","settings.field.FINNHUB_API_KEY":"Finnhub API Key","settings.field.FINNHUB_TIMEOUT":"Finnhub Timeout (sec)","settings.field.FINNHUB_RATE_LIMIT":"Finnhub Rate Limit","settings.field.CCXT_DEFAULT_EXCHANGE":"CCXT Default Exchange","settings.field.CCXT_TIMEOUT":"CCXT Timeout (ms)","settings.field.CCXT_PROXY":"CCXT Proxy","settings.field.YFINANCE_TIMEOUT":"YFinance Timeout (sec)","settings.field.TIINGO_API_KEY":"Tiingo API Key","settings.field.TIINGO_TIMEOUT":"Tiingo Timeout (sec)","settings.field.SEARCH_PROVIDER":"Search Provider","settings.field.SEARCH_MAX_RESULTS":"Max Results","settings.field.TAVILY_API_KEYS":"Tavily API Keys","settings.field.BOCHA_API_KEYS":"Bocha API Keys","settings.field.SERPAPI_KEYS":"SerpAPI Keys","settings.field.SEARCH_GOOGLE_API_KEY":"Google API Key","settings.field.SEARCH_GOOGLE_CX":"Google CX","settings.field.SEARCH_BING_API_KEY":"Bing API Key","settings.field.INTERNAL_API_KEY":"Internal API Key","settings.desc.SEARCH_PROVIDER":"Web search provider for AI research","settings.desc.TAVILY_API_KEYS":"Tavily Search API keys, comma-separated for rotation. Free 1000 requests/month","settings.desc.BOCHA_API_KEYS":"Bocha Search API keys, comma-separated for rotation","settings.desc.SERPAPI_KEYS":"SerpAPI keys for Google/Bing search, comma-separated for rotation","settings.desc.ORDER_MODE":"maker: Limit order first (lower fees), market: Market order (instant fill)","settings.desc.MAKER_WAIT_SEC":"Wait time for limit order fill before switching to market order","settings.desc.MAKER_OFFSET_BPS":"Price offset in basis points. Buy: price*(1-offset), Sell: price*(1+offset)","settings.desc.TIINGO_API_KEY":"Tiingo API key for Forex/Metals data (free tier does not support 1-minute data)","settings.desc.TIINGO_TIMEOUT":"Tiingo API request timeout","portfolio.summary.totalValue":"Total Value","portfolio.summary.totalCost":"Total Cost","portfolio.summary.totalPnl":"Total P&L","portfolio.summary.positionCount":"Positions","portfolio.summary.profitLossRatio":"Profit/Loss","portfolio.summary.today":"Today","portfolio.summary.todayPnl":"Today P&L","portfolio.summary.bestPerformer":"Best Performer","portfolio.summary.worstPerformer":"Worst Performer","portfolio.summary.priceSync":"Price Sync","portfolio.summary.syncInterval":"Refresh","portfolio.summary.justNow":"Just now","portfolio.summary.ago":" ago","portfolio.positions.title":"My Positions","portfolio.positions.add":"Add Position","portfolio.positions.addFirst":"Add Your First Position","portfolio.positions.empty":"No positions yet","portfolio.positions.deleteConfirm":"Are you sure to delete this position?","portfolio.positions.currentPrice":"Current","portfolio.positions.entryPrice":"Entry","portfolio.positions.quantity":"Quantity","portfolio.positions.side":"Side","portfolio.positions.long":"Long","portfolio.positions.short":"Short","portfolio.positions.marketValue":"Value","portfolio.positions.pnl":"P&L","portfolio.positions.items":"positions","portfolio.monitors.title":"AI Monitors","portfolio.monitors.add":"Add Monitor","portfolio.monitors.addFirst":"Add AI Monitor","portfolio.monitors.empty":"No monitors yet","portfolio.monitors.deleteConfirm":"Are you sure to delete this monitor?","portfolio.monitors.interval":"Interval","portfolio.monitors.lastRun":"Last Run","portfolio.monitors.nextRun":"Next Run","portfolio.monitors.channels":"Channels","portfolio.monitors.runNow":"Run Now","portfolio.monitors.analysisResult":"AI Analysis Result","portfolio.monitors.runningTitle":"AI Analysis Started","portfolio.monitors.runningDesc":"Analysis is running in background. Results will be pushed via notification. Analyzing multiple positions may take a few minutes.","portfolio.monitors.timeoutTitle":"Request Timeout","portfolio.monitors.timeoutDesc":"Analysis may still be running in background. Please check notifications for results later. If no notification is received, please try again.","portfolio.modal.addPosition":"Add Position","portfolio.modal.editPosition":"Edit Position","portfolio.modal.addMonitor":"Add Monitor","portfolio.modal.editMonitor":"Edit Monitor","portfolio.form.market":"Market","portfolio.form.marketRequired":"Please select a market","portfolio.form.selectMarket":"Select Market","portfolio.form.symbol":"Symbol","portfolio.form.symbolRequired":"Please enter symbol","portfolio.form.searchSymbol":"Search or enter symbol","portfolio.form.useAsSymbol":"Use","portfolio.form.asSymbolCode":"as symbol code","portfolio.form.symbolHint":"Search symbols or enter any code directly","portfolio.form.side":"Side","portfolio.form.quantity":"Quantity","portfolio.form.quantityRequired":"Please enter quantity","portfolio.form.enterQuantity":"Enter quantity","portfolio.form.entryPrice":"Entry Price","portfolio.form.entryPriceRequired":"Please enter entry price","portfolio.form.enterEntryPrice":"Enter entry price","portfolio.form.notes":"Notes","portfolio.form.enterNotes":"Optional: Add notes","portfolio.form.monitorName":"Monitor Name","portfolio.form.monitorNameRequired":"Please enter monitor name","portfolio.form.enterMonitorName":"e.g. Daily Portfolio Analysis","portfolio.form.interval":"Interval","portfolio.form.minutes":"minutes","portfolio.form.hour":"hour","portfolio.form.hours":"hours","portfolio.form.notifyChannels":"Notify Channels","portfolio.form.browser":"Browser","portfolio.form.email":"Email","portfolio.form.telegramChatId":"Telegram Chat ID","portfolio.form.enterTelegramChatId":"Enter Telegram Chat ID","portfolio.form.telegramRequired":"Please enter Telegram Chat ID","portfolio.form.emailAddress":"Email Address","portfolio.form.enterEmail":"Enter email address","portfolio.form.emailRequired":"Please enter email address","portfolio.form.emailInvalid":"Please enter a valid email address","portfolio.form.customPrompt":"Custom Prompt","portfolio.form.customPromptPlaceholder":'Optional: Add focus areas, e.g. "Focus on tech stock risks"',"portfolio.form.monitorScope":"Monitor Scope","portfolio.form.allPositions":"All Positions","portfolio.form.selectedPositions":"Selected Positions","portfolio.form.selectPositions":"Select Positions","portfolio.form.selectAll":"Select All","portfolio.form.deselectAll":"Deselect All","portfolio.form.selectedCount":"{count} of {total} selected","portfolio.form.pleaseSelectPositions":"Please select at least one position to monitor","portfolio.form.notificationFromProfile":"Notifications will be sent to addresses configured in your profile","portfolio.form.goToProfile":"Go to settings","portfolio.message.loadFailed":"Failed to load data","portfolio.message.saveSuccess":"Saved successfully","portfolio.message.saveFailed":"Failed to save","portfolio.message.deleteSuccess":"Deleted successfully","portfolio.message.deleteFailed":"Failed to delete","portfolio.message.updateFailed":"Failed to update","portfolio.message.monitorEnabled":"Monitor enabled","portfolio.message.monitorDisabled":"Monitor paused","portfolio.message.monitorRunSuccess":"Analysis completed","portfolio.message.monitorRunFailed":"Analysis failed","portfolio.message.monitorRunning":"AI analysis started, please wait for notification","portfolio.groups.all":"All Positions","portfolio.groups.ungrouped":"Ungrouped","portfolio.form.group":"Group","portfolio.form.enterGroup":"Enter or select group","portfolio.alerts.title":"Price/PnL Alerts","portfolio.alerts.addAlert":"Add Alert","portfolio.alerts.editAlert":"Edit Alert","portfolio.alerts.alertType":"Alert Type","portfolio.alerts.priceAbove":"Price Above","portfolio.alerts.priceBelow":"Price Below","portfolio.alerts.pnlAbove":"Profit Above (%)","portfolio.alerts.pnlBelow":"Loss Below (%)","portfolio.alerts.threshold":"Threshold","portfolio.alerts.thresholdRequired":"Please enter threshold","portfolio.alerts.enterPrice":"Enter price","portfolio.alerts.enterPercent":"Enter percentage","portfolio.alerts.currentPrice":"Current Price","portfolio.alerts.currentPriceHint":"Current price","portfolio.alerts.repeatInterval":"Repeat Alert","portfolio.alerts.noRepeat":"No repeat (trigger once)","portfolio.alerts.every5min":"Every 5 minutes","portfolio.alerts.every15min":"Every 15 minutes","portfolio.alerts.every30min":"Every 30 minutes","portfolio.alerts.every1hour":"Every 1 hour","portfolio.alerts.every4hours":"Every 4 hours","portfolio.alerts.onceDaily":"Once daily","portfolio.alerts.enabled":"Enable Alert","portfolio.alerts.enabledDesc":"Auto-monitor and trigger notifications","portfolio.alerts.delete":"Delete","portfolio.alerts.deleteConfirm":"Are you sure you want to delete this alert?","portfolio.modal.addAlert":"Add Alert","portfolio.modal.editAlert":"Edit Alert","menu.userManage":"User Management","menu.myProfile":"My Profile","common.actions":"Actions","common.refresh":"Refresh","userManage.title":"User Management","userManage.searchPlaceholder":"Search by username/email/nickname","userManage.description":"Manage system users, roles and permissions","userManage.createUser":"Create User","userManage.editUser":"Edit User","userManage.username":"Username","userManage.password":"Password","userManage.nickname":"Nickname","userManage.email":"Email","userManage.role":"Role","userManage.status":"Status","userManage.lastLogin":"Last Login","userManage.active":"Active","userManage.disabled":"Disabled","userManage.neverLogin":"Never","userManage.usernameRequired":"Please enter username","userManage.usernamePlaceholder":"Enter username","userManage.passwordRequired":"Please enter password","userManage.passwordPlaceholder":"Enter password (min 6 chars)","userManage.passwordMin":"Password must be at least 6 characters","userManage.nicknamePlaceholder":"Enter nickname","userManage.emailPlaceholder":"Enter email","userManage.emailInvalid":"Invalid email format","userManage.rolePlaceholder":"Select role","userManage.statusPlaceholder":"Select status","userManage.resetPassword":"Reset Password","userManage.resetPasswordWarning":"This will reset the user's password","userManage.newPassword":"New Password","userManage.newPasswordPlaceholder":"Enter new password","userManage.confirmDelete":"Are you sure to delete this user?","userManage.roleAdmin":"Admin","userManage.roleManager":"Manager","userManage.roleUser":"User","userManage.roleViewer":"Viewer","profile.title":"My Profile","profile.description":"Manage your account settings and preferences","profile.basicInfo":"Basic Info","profile.changePassword":"Change Password","profile.username":"Username","profile.nickname":"Nickname","profile.email":"Email","profile.lastLogin":"Last Login","profile.nicknamePlaceholder":"Enter your nickname","profile.emailPlaceholder":"Enter your email","profile.emailInvalid":"Invalid email format","profile.emailCannotChange":"Email cannot be changed after registration","profile.passwordHint":"Password must be at least 6 characters","profile.oldPassword":"Current Password","profile.newPassword":"New Password","profile.confirmPassword":"Confirm Password","profile.oldPasswordRequired":"Please enter current password","profile.oldPasswordPlaceholder":"Enter current password","profile.newPasswordRequired":"Please enter new password","profile.newPasswordPlaceholder":"Enter new password","profile.confirmPasswordRequired":"Please confirm password","profile.confirmPasswordPlaceholder":"Confirm new password","profile.passwordMin":"Password must be at least 6 characters","profile.passwordMismatch":"Passwords do not match","profile.credits.title":"My Credits","profile.credits.unit":"Credits","profile.credits.recharge":"Top Up","profile.credits.vipExpires":"VIP expires on","profile.credits.vipExpired":"VIP expired","profile.credits.noVip":"Not a VIP","profile.credits.hint":"AI analysis/backtest/monitoring will consume credits; VIP only makes VIP-free indicators free to use.","profile.creditsLog":"Credits History","profile.creditsLog.time":"Time","profile.creditsLog.action":"Type","profile.creditsLog.amount":"Change","profile.creditsLog.balance":"Balance","profile.creditsLog.remark":"Remark","profile.creditsLog.actionConsume":"Consume","profile.creditsLog.actionRecharge":"Recharge","profile.creditsLog.actionAdjust":"Adjust","profile.creditsLog.actionRefund":"Refund","profile.creditsLog.actionVipGrant":"VIP Grant","profile.creditsLog.actionVipRevoke":"VIP Revoke","profile.creditsLog.actionRegisterBonus":"Register Bonus","profile.creditsLog.actionReferralBonus":"Referral Bonus","profile.creditsLog.actionIndicatorPurchase":"Indicator Purchase","profile.creditsLog.actionIndicatorSale":"Indicator Sale","profile.referral.title":"Invite Friends","profile.referral.listTab":"Referrals","profile.referral.totalInvited":"Invited","profile.referral.bonusPerInvite":"Per Invite","profile.referral.yourLink":"Your Referral Link","profile.referral.copyLink":"Copy Link","profile.referral.linkCopied":"Referral link copied","profile.referral.newUserBonus":"New users get","profile.referral.user":"User","profile.referral.registerTime":"Registered","profile.referral.noReferrals":"No referrals yet","profile.referral.shareNow":"Share Now","profile.notifications.title":"Notification Settings","profile.notifications.hint":"Configure your default notification methods, which will be used automatically when creating asset monitors and alerts","profile.notifications.defaultChannels":"Default Notification Channels","profile.notifications.browser":"In-App Notification","profile.notifications.email":"Email","profile.notifications.phone":"SMS","profile.notifications.telegramBotToken":"Telegram Bot Token","profile.notifications.telegramBotTokenPlaceholder":"Enter your Telegram Bot Token","profile.notifications.telegramBotTokenHint":"Get Token by creating a bot via @BotFather","profile.notifications.telegramChatId":"Telegram Chat ID","profile.notifications.telegramPlaceholder":"Enter your Telegram Chat ID (e.g. 123456789)","profile.notifications.telegramHint":"Send /start to @userinfobot to get your Chat ID","profile.notifications.notifyEmail":"Notification Email","profile.notifications.emailPlaceholder":"Email address to receive notifications","profile.notifications.emailHint":"Uses your account email by default, or set a different one","profile.notifications.phonePlaceholder":"Enter phone number (e.g. +1234567890)","profile.notifications.phoneHint":"Requires admin to configure Twilio service","profile.notifications.discordWebhook":"Discord Webhook","profile.notifications.discordPlaceholder":"https://discord.com/api/webhooks/...","profile.notifications.discordHint":"Create Webhook in Discord server settings","profile.notifications.webhookUrl":"Webhook URL","profile.notifications.webhookPlaceholder":"https://your-server.com/webhook","profile.notifications.webhookHint":"Custom Webhook URL, notifications sent via POST JSON","profile.notifications.webhookToken":"Webhook Token (Optional)","profile.notifications.webhookTokenPlaceholder":"Bearer Token for request authentication","profile.notifications.webhookTokenHint":"Sent as Authorization: Bearer Token to Webhook","profile.notifications.testBtn":"Send Test Notification","profile.notifications.saveSuccess":"Notification settings saved successfully","profile.notifications.selectChannel":"Please select at least one notification channel","profile.notifications.fillTelegramToken":"Please fill in Telegram Bot Token","profile.notifications.fillTelegram":"Please fill in Telegram Chat ID","profile.notifications.fillEmail":"Please fill in notification email","profile.notifications.testSent":"Test notification sent, please check your notification channels","userManage.credits":"Credits","userManage.adjustCredits":"Adjust Credits","userManage.setVip":"Set VIP","userManage.currentCredits":"Current Credits","userManage.newCredits":"New Credits","userManage.enterCredits":"Enter new credits amount","userManage.creditsNonNegative":"Credits cannot be negative","userManage.currentVip":"Current VIP Status","userManage.vipActive":"Active","userManage.vipExpired":"Expired","userManage.vipDays":"VIP Days","userManage.vipExpiresAt":"VIP Expires At","userManage.cancelVip":"Cancel VIP","userManage.days":"days","userManage.customDate":"Custom Date","userManage.selectDate":"Please select a date","userManage.remark":"Remark","userManage.remarkPlaceholder":"Optional remark","userManage.tabUsers":"User Management","systemOverview.tabTitle":"System Overview","systemOverview.totalStrategies":"Total Strategies","systemOverview.runningStrategies":"Running","systemOverview.totalCapital":"Total Capital","systemOverview.totalPnl":"Total PnL","systemOverview.filterAll":"All Status","systemOverview.filterRunning":"Running","systemOverview.filterStopped":"Stopped","systemOverview.searchPlaceholder":"Search strategy/symbol/user","systemOverview.running":"Running","systemOverview.stopped":"Stopped","systemOverview.colUser":"User","systemOverview.colStrategy":"Strategy","systemOverview.colStatus":"Status","systemOverview.colSymbol":"Symbol","systemOverview.colCapital":"Capital","systemOverview.colPnl":"PnL / ROI","systemOverview.colPositions":"Pos","systemOverview.colTrades":"Trades","systemOverview.colIndicator":"Indicator","systemOverview.colExchange":"Exchange","systemOverview.colTimeframe":"TF","systemOverview.colLeverage":"Lev","systemOverview.colCreatedAt":"Created","systemOverview.realized":"Real","systemOverview.unrealized":"Unreal","systemOverview.symbols":"symbols","systemOverview.live":"Live","systemOverview.signal":"Signal Only","settings.group.billing":"Billing & Credits","settings.field.BILLING_ENABLED":"Enable Billing","settings.field.BILLING_VIP_BYPASS":"VIP Bypass (Legacy)","settings.field.BILLING_COST_AI_ANALYSIS":"AI Analysis Cost","settings.field.BILLING_COST_STRATEGY_RUN":"Strategy Run Cost","settings.field.BILLING_COST_BACKTEST":"Backtest Cost","settings.field.BILLING_COST_PORTFOLIO_MONITOR":"Portfolio Monitor Cost","settings.field.CREDITS_REGISTER_BONUS":"Register Bonus","settings.field.CREDITS_REFERRAL_BONUS":"Referral Bonus","settings.field.RECHARGE_TELEGRAM_URL":"Recharge Telegram URL","settings.field.MEMBERSHIP_MONTHLY_PRICE_USD":"Monthly Membership Price (USD)","settings.field.MEMBERSHIP_MONTHLY_CREDITS":"Monthly Membership Bonus Credits","settings.field.MEMBERSHIP_YEARLY_PRICE_USD":"Yearly Membership Price (USD)","settings.field.MEMBERSHIP_YEARLY_CREDITS":"Yearly Membership Bonus Credits","settings.field.MEMBERSHIP_LIFETIME_PRICE_USD":"Lifetime Membership Price (USD)","settings.field.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS":"Lifetime Monthly Credits","settings.field.USDT_PAY_ENABLED":"Enable USDT Pay","settings.field.USDT_PAY_CHAIN":"USDT Chain","settings.field.USDT_TRC20_XPUB":"TRC20 XPUB (Watch-only)","settings.field.USDT_TRC20_CONTRACT":"USDT TRC20 Contract","settings.field.TRONGRID_BASE_URL":"TronGrid Base URL","settings.field.TRONGRID_API_KEY":"TronGrid API Key","settings.field.USDT_PAY_CONFIRM_SECONDS":"Confirm Delay (sec)","settings.field.USDT_PAY_EXPIRE_MINUTES":"Order Expire (min)","settings.desc.BILLING_ENABLED":"Enable billing system. Users need credits to use certain features when enabled","settings.desc.BILLING_VIP_BYPASS":"Legacy switch. If enabled, VIP users bypass ALL feature credit costs. Recommended OFF: VIP should only unlock VIP-free indicators.","settings.desc.BILLING_COST_AI_ANALYSIS":"Credits consumed per AI analysis request","settings.desc.BILLING_COST_STRATEGY_RUN":"Credits consumed when starting a strategy","settings.desc.BILLING_COST_BACKTEST":"Credits consumed per backtest run","settings.desc.BILLING_COST_PORTFOLIO_MONITOR":"Credits consumed per portfolio AI monitoring run","settings.desc.CREDITS_REGISTER_BONUS":"Credits awarded to new users on registration","settings.desc.CREDITS_REFERRAL_BONUS":"Credits awarded to referrer when someone signs up with their referral code","settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS":"Maximum attempts to verify a code before lockout","settings.desc.VERIFICATION_CODE_LOCK_MINUTES":"Lockout duration after exceeding max attempts","settings.desc.RECHARGE_TELEGRAM_URL":"Telegram customer service URL for recharge inquiries","settings.desc.MEMBERSHIP_MONTHLY_PRICE_USD":"Monthly membership price in USD (mock payment in current version).","settings.desc.MEMBERSHIP_MONTHLY_CREDITS":"Credits granted immediately after purchasing monthly membership.","settings.desc.MEMBERSHIP_YEARLY_PRICE_USD":"Yearly membership price in USD (mock payment in current version).","settings.desc.MEMBERSHIP_YEARLY_CREDITS":"Credits granted immediately after purchasing yearly membership.","settings.desc.MEMBERSHIP_LIFETIME_PRICE_USD":"Lifetime membership price in USD (mock payment in current version).","settings.desc.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS":"Credits granted every 30 days for lifetime members (first grant happens immediately on purchase).","settings.desc.USDT_PAY_ENABLED":"Enable USDT scan-to-pay flow (per-order unique address + auto reconciliation).","settings.desc.USDT_PAY_CHAIN":"Currently only TRC20 is supported.","settings.desc.USDT_TRC20_XPUB":"Watch-only xpub used to derive per-order deposit addresses. Do NOT paste private key/seed.","settings.desc.USDT_TRC20_CONTRACT":"USDT contract address on TRON (default prefilled).","settings.desc.TRONGRID_BASE_URL":"TronGrid API base URL (default is fine).","settings.desc.TRONGRID_API_KEY":"Optional. For higher TronGrid rate limits and stability.","settings.desc.USDT_PAY_CONFIRM_SECONDS":"After a payment is detected, wait N seconds before marking it confirmed.","settings.desc.USDT_PAY_EXPIRE_MINUTES":"Order expiration time; users need to regenerate an order after it expires.","globalMarket.title":"Global Market Dashboard","globalMarket.fearGreedShort":"F&G","globalMarket.calendar":"Calendar","globalMarket.lastUpdate":"Last Update","globalMarket.refresh":"Refresh","globalMarket.name":"Name","globalMarket.price":"Price","globalMarket.change":"Change","globalMarket.trend":"Trend","globalMarket.pair":"Pair","globalMarket.unit":"Unit","globalMarket.refreshSuccess":"Data refreshed successfully","globalMarket.refreshError":"Failed to refresh data","globalMarket.fetchError":"Failed to fetch data","globalMarket.loading":"Loading...","globalMarket.fearGreedIndex":"Fear & Greed Index","globalMarket.fearGreedTip":"Fear & Greed Index measures market sentiment, 0 = Extreme Fear, 100 = Extreme Greed","globalMarket.volatilityIndex":"Volatility Index","globalMarket.dollarIndex":"Dollar Index","globalMarket.majorIndices":"Major Indices","globalMarket.vixTitle":"VIX Volatility Index","globalMarket.vixTip":"VIX measures expected market volatility, higher values indicate more market fear","globalMarket.extremeFear":"Extreme Fear","globalMarket.fear":"Fear","globalMarket.neutral":"Neutral","globalMarket.greed":"Greed","globalMarket.extremeGreed":"Extreme Greed","globalMarket.marketOverview":"Market Overview","globalMarket.indices":"Indices","globalMarket.forex":"Forex","globalMarket.crypto":"Crypto","globalMarket.commodities":"Commodities","globalMarket.heatmap":"Market Heatmap","globalMarket.cryptoHeatmap":"Crypto","globalMarket.commoditiesHeatmap":"Commodities","globalMarket.sectorHeatmap":"Sectors","globalMarket.forexHeatmap":"Forex","globalMarket.opportunities":"Trading Opportunities","globalMarket.noOpportunities":"No significant opportunities detected","globalMarket.financialNews":"Financial News","globalMarket.noNews":"No news available","globalMarket.economicCalendar":"Economic Calendar","globalMarket.noEvents":"No events scheduled","globalMarket.actual":"Actual","globalMarket.forecast":"Forecast","globalMarket.previous":"Previous","globalMarket.signal.bullish":"Bullish Momentum","globalMarket.signal.bearish":"Bearish Momentum","globalMarket.signal.overbought":"Overbought Warning","globalMarket.signal.oversold":"Oversold Opportunity","globalMarket.worldMap":"Global Markets Map","globalMarket.rising":"Rising","globalMarket.falling":"Falling","globalMarket.bullish":"Bullish","globalMarket.bearish":"Bearish","globalMarket.expectedImpact":"Expected Impact","globalMarket.aboveForecast":"Above Forecast","globalMarket.belowForecast":"Below Forecast","globalMarket.upcomingEvents":"Upcoming Events","globalMarket.releasedEvents":"Released Data","trading-assistant.form.notificationFromProfile":"Notifications will be sent to the address configured in your profile.","trading-assistant.form.notificationConfigMissing":"You have not configured parameters for selected channels ({channels}). Please go to your profile to configure them.","trading-assistant.form.goToProfile":"Go to Profile","community.title":"Indicator Market","community.searchPlaceholder":"Search indicators...","community.all":"All","community.freeOnly":"Free","community.paidOnly":"Paid","community.sortNewest":"Newest","community.sortHot":"Popular","community.sortRating":"Top Rated","community.sortPriceLow":"Price: Low to High","community.sortPriceHigh":"Price: High to Low","community.myPurchases":"My Purchases","community.noIndicators":"No indicators yet","community.createFirst":"Create Your First Indicator","community.total":"Total","community.items":"items","community.free":"Free","community.credits":"Credits","community.myIndicator":"My Indicator","community.purchased":"Purchased","community.noDescription":"No description","community.loadFailed":"Failed to load","community.publishedAt":"Published","community.downloads":"Downloads","community.rating":"Rating","community.views":"Views","community.description":"Description","community.performance":"Live Performance","community.strategyCount":"Strategies","community.tradeCount":"Trades","community.winRate":"Win Rate","community.totalProfit":"Total Profit","community.reviews":"Reviews","community.useNow":"Use Now","community.getFree":"Get Free","community.buyNow":"Buy Now","community.purchaseSuccess":"Purchase successful! Indicator added to your list","community.purchaseFailed":"Purchase failed","community.indicator_not_found":"Indicator not found or unavailable","community.cannot_buy_own":"Cannot buy your own indicator","community.already_purchased":"You have already purchased this indicator","community.insufficient_credits":"Insufficient credits","community.commentSuccess":"Comment submitted","community.commentFailed":"Failed to submit comment","community.commentUpdateSuccess":"Comment updated successfully","community.commentUpdateFailed":"Failed to update comment","community.editComment":"Edit Comment","community.cancelEdit":"Cancel","community.updateComment":"Update Comment","community.alreadyCommented":"You have already reviewed this indicator","community.editMyComment":"Edit Review","community.me":"Me","community.edited":"edited","community.not_purchased":"Please purchase/get the indicator first to leave a review","community.cannot_comment_own":"Cannot review your own indicator","community.already_commented":"You have already reviewed this indicator","community.noComments":"No reviews yet","community.yourRating":"Your Rating","community.commentPlaceholder":"Share your experience...","community.submitComment":"Submit Review","community.pleaseRate":"Please select a rating","community.loadMore":"Load More","community.justNow":"Just now","community.minutesAgo":"minutes ago","community.hoursAgo":"hours ago","community.daysAgo":"days ago","community.noPurchases":"No purchases yet","community.purchasedFrom":"Seller","community.purchaseTime":"Purchase Time","community.admin.reviewTab":"Review","community.admin.pending":"Pending","community.admin.approved":"Approved","community.admin.rejected":"Rejected","community.admin.noItems":"No items","community.admin.noDescription":"No description","community.admin.viewCode":"View Code","community.admin.note":"Note","community.admin.approve":"Approve","community.admin.reject":"Reject","community.admin.unpublish":"Unpublish","community.admin.delete":"Delete","community.admin.deleteConfirm":"Are you sure to delete this indicator? This cannot be undone.","community.admin.unpublishConfirm":"Are you sure to unpublish this indicator?","community.admin.unpublishHint":"This indicator will be hidden from the market","community.admin.confirm":"Confirm","community.admin.cancel":"Cancel","community.admin.approveTitle":"Approve Indicator","community.admin.rejectTitle":"Reject Indicator","community.admin.noteLabel":"Note (optional)","community.admin.notePlaceholder":"Enter review note...","community.admin.loadFailed":"Failed to load","community.admin.reviewSuccess":"Review submitted","community.admin.reviewFailed":"Review failed","community.admin.unpublishSuccess":"Unpublished successfully","community.admin.unpublishFailed":"Failed to unpublish","community.admin.deleteSuccess":"Deleted successfully","community.admin.deleteFailed":"Failed to delete","fastAnalysis.aiAnalysis":"AI Analysis","fastAnalysis.analyzing":"AI is analyzing...","fastAnalysis.pleaseWait":"Please wait, fetching real-time data and generating professional report","fastAnalysis.error":"Analysis Failed","fastAnalysis.retry":"Retry","fastAnalysis.selectSymbol":"Select a symbol to start","fastAnalysis.selectHint":"Choose from your watchlist or add a new symbol","fastAnalysis.confidence":"Confidence","fastAnalysis.currentPrice":"Current Price","fastAnalysis.entryPrice":"Entry Price","fastAnalysis.stopLoss":"Stop Loss","fastAnalysis.takeProfit":"Take Profit","fastAnalysis.stopLossHint":"Based on 2x ATR & support","fastAnalysis.takeProfitHint":"Based on 3x ATR & resistance","fastAnalysis.atrBased":"ATR-based","fastAnalysis.riskReward":"Risk/Reward","fastAnalysis.technical":"Technical","fastAnalysis.fundamental":"Fundamental","fastAnalysis.sentiment":"Sentiment","fastAnalysis.overall":"Overall","fastAnalysis.keyReasons":"Key Reasons","fastAnalysis.risks":"Risks","fastAnalysis.indicators":"Technical Indicators","fastAnalysis.maTrend":"MA Trend","fastAnalysis.support":"Support","fastAnalysis.resistance":"Resistance","fastAnalysis.volatility":"Volatility","fastAnalysis.wasHelpful":"Was this analysis helpful?","fastAnalysis.helpful":"Helpful","fastAnalysis.notHelpful":"Not Helpful","fastAnalysis.feedbackThanks":"Thanks for your feedback!","fastAnalysis.feedbackFailed":"Failed to submit feedback","fastAnalysis.feedbackUnavailable":"Feedback unavailable, please re-analyze","fastAnalysis.analysisTime":"Analysis time","fastAnalysis.startAnalysis":"Analyze","fastAnalysis.history":"History","fastAnalysis.systemTitle":"QUANTDINGER AI","fastAnalysis.systemOnline":"Online","fastAnalysis.version":"Fast","fastAnalysis.preparing":"Preparing...","fastAnalysis.step1":"Fetching real-time data","fastAnalysis.step2":"Calculating indicators","fastAnalysis.step3":"AI deep analysis","fastAnalysis.step4":"Generating report","fastAnalysis.technicalAnalysis":"Technical Analysis","fastAnalysis.fundamentalAnalysis":"Fundamental Analysis","fastAnalysis.sentimentAnalysis":"Market Sentiment","fastAnalysis.signal.bullish":"Bullish","fastAnalysis.signal.bearish":"Bearish","fastAnalysis.signal.neutral":"Neutral","fastAnalysis.signal.overbought":"Overbought","fastAnalysis.signal.oversold":"Oversold","fastAnalysis.signal.strong_bullish":"Strong Bullish","fastAnalysis.signal.strong_bearish":"Strong Bearish","fastAnalysis.trend.uptrend":"Uptrend","fastAnalysis.trend.downtrend":"Downtrend","fastAnalysis.trend.sideways":"Sideways","fastAnalysis.trend.consolidating":"Consolidating","fastAnalysis.trend.golden_cross":"Golden Cross","fastAnalysis.trend.death_cross":"Death Cross","fastAnalysis.trend.strong_uptrend":"Strong Uptrend","fastAnalysis.trend.strong_downtrend":"Strong Downtrend","fastAnalysis.volatilityLevel.high":"High","fastAnalysis.volatilityLevel.medium":"Medium","fastAnalysis.volatilityLevel.low":"Low","fastAnalysis.volatilityLevel.unknown":"Unknown","fastAnalysis.marketOverview":"Market Overview","fastAnalysis.selectTip":"Select a symbol from your watchlist to start AI analysis","aiQuant.title":"AI Quant","aiQuant.strategyList":"Strategies","aiQuant.create":"Create","aiQuant.edit":"Edit","aiQuant.delete":"Delete","aiQuant.start":"Start","aiQuant.stop":"Stop","aiQuant.analyze":"Analyze Now","aiQuant.noStrategy":"No strategies yet, click to create","aiQuant.selectStrategy":"Select a strategy from the left","aiQuant.createFirst":"Create Your First Strategy","aiQuant.createStrategy":"Create Strategy","aiQuant.editStrategy":"Edit Strategy","aiQuant.confirmDelete":"Are you sure you want to delete this strategy?","aiQuant.latestAnalysis":"Latest Analysis","aiQuant.analysisHistory":"Analysis History","aiQuant.decision":"Decision","aiQuant.confidence":"Confidence","aiQuant.currentPrice":"Current Price","aiQuant.entryPrice":"Entry Price","aiQuant.stopLoss":"Stop Loss","aiQuant.takeProfit":"Take Profit","aiQuant.reason":"Reason","aiQuant.analyzedAt":"Analyzed At","aiQuant.tradeSettings":"Trade Settings","aiQuant.minutes":"min","aiQuant.hour":"hour","aiQuant.hours":"hours","aiQuant.stats.totalStrategies":"Total Strategies","aiQuant.stats.runningStrategies":"Running","aiQuant.stats.totalAnalyses":"Analyses","aiQuant.stats.totalPnl":"Total PnL","aiQuant.status.running":"Running","aiQuant.status.stopped":"Stopped","aiQuant.status.paused":"Paused","aiQuant.executionMode.signal":"Signal Only","aiQuant.executionMode.live":"Live Trading","aiQuant.marketType.spot":"Spot","aiQuant.marketType.futures":"Futures","aiQuant.field.strategyName":"Strategy Name","aiQuant.field.market":"Market","aiQuant.field.symbol":"Symbol","aiQuant.field.marketType":"Market Type","aiQuant.field.aiModel":"AI Model","aiQuant.field.interval":"Analysis Interval","aiQuant.field.aiPrompt":"AI Prompt","aiQuant.field.executionMode":"Execution Mode","aiQuant.field.positionSize":"Position Size","aiQuant.field.stopLoss":"Stop Loss %","aiQuant.field.takeProfit":"Take Profit %","aiQuant.field.totalAnalyses":"Total Analyses","aiQuant.field.totalTrades":"Total Trades","aiQuant.field.totalPnl":"Total PnL","aiQuant.placeholder.strategyName":"Enter strategy name","aiQuant.placeholder.market":"Select market","aiQuant.placeholder.symbol":"e.g., BTC/USDT","aiQuant.placeholder.aiModel":"Use system default","aiQuant.placeholder.aiPrompt":"Enter your trading strategy prompt, e.g., Buy when RSI is below 30...","aiQuant.validation.strategyName":"Please enter strategy name","aiQuant.validation.market":"Please select market","aiQuant.validation.symbol":"Please enter symbol","aiQuant.table.decision":"Decision","aiQuant.table.confidence":"Confidence","aiQuant.table.entryPrice":"Entry","aiQuant.table.stopLoss":"Stop Loss","aiQuant.table.takeProfit":"Take Profit","aiQuant.table.time":"Time","aiQuant.msg.createSuccess":"Strategy created successfully","aiQuant.msg.updateSuccess":"Strategy updated successfully","aiQuant.msg.deleteSuccess":"Strategy deleted successfully","aiQuant.msg.startSuccess":"Strategy started","aiQuant.msg.stopSuccess":"Strategy stopped","aiQuant.msg.analyzeSuccess":"Analysis completed","aiQuant.field.initialCapital":"Initial Capital","aiQuant.field.leverage":"Leverage","aiQuant.field.tradeDirection":"Trade Direction","aiQuant.field.trailingStop":"Trailing Stop","aiQuant.field.trailingStopPct":"Trailing Stop %","aiQuant.direction.long":"Long Only","aiQuant.direction.short":"Short Only","aiQuant.direction.both":"Both","aiQuant.riskControl":"Risk Control","aiQuant.aiSettings":"AI Settings","aiQuant.systemDefault":"System Default","aiQuant.placeholder.selectSymbol":"Select from watchlist","aiQuant.hint.symbolFromWatchlist":"Select from your watchlist, market type is auto-detected","aiQuant.hint.spotLeverageFixed":"Spot market leverage is fixed at 1x","aiQuant.hint.stopLossEnforced":"Enforced stop loss, AI cannot modify","aiQuant.hint.takeProfitEnforced":"Enforced take profit, AI cannot modify","aiQuant.hint.aiPromptOnly":"AI only determines direction based on prompt, will not modify your risk settings","aiQuant.aiLimitWarning":"AI Permission Restricted","aiQuant.aiLimitDescription":"AI can ONLY determine trade direction (BUY/SELL/HOLD). Leverage, position size, stop loss/take profit are fully controlled by you and CANNOT be modified by AI.","aiQuant.userStopLoss":"Your Stop Loss","aiQuant.userTakeProfit":"Your Take Profit","aiQuant.userLeverage":"Your Leverage","aiQuant.validation.initialCapital":"Please enter initial capital","aiQuant.table.currentPrice":"Current Price","aiQuant.field.promptTemplate":"Strategy Template","aiQuant.placeholder.selectTemplate":"Select a preset template","aiQuant.template.default":"📊 Comprehensive Analysis (Recommended)","aiQuant.template.trend":"📈 Trend Following","aiQuant.template.swing":"🔄 Swing Trading","aiQuant.template.news":"📰 News Driven","aiQuant.template.custom":"✏️ Custom","aiQuant.hint.dataProvided":"System auto-provides: real-time price, indicators (RSI/MACD/MA), recent news, macro data. AI analyzes these with your prompt to determine direction.","aiQuant.hint.liveWarning":"Live mode will trade with REAL money! Make sure you have configured exchange API and understand the risks!","trading-assistant.liveDisclaimer.title":"Live Trading Disclaimer","trading-assistant.liveDisclaimer.content":"Live trading involves significant risk and may result in partial or total loss of funds. The platform does not guarantee returns or profits. You are responsible for your own decisions and outcomes.","trading-assistant.liveDisclaimer.agree":"I have read and understood the disclaimer and still want to enable live trading","trading-assistant.liveDisclaimer.required":"Please accept the disclaimer before enabling live trading","trading-assistant.liveDisclaimer.blockTitle":"Please accept the disclaimer first","trading-assistant.liveDisclaimer.blockDesc":"You must accept the disclaimer to configure live trading connection and order settings.","menu.billing":"Membership","billing.title":"Membership / Credits","billing.desc":"Choose a plan to activate VIP and receive bonus credits.","billing.snapshot.credits":"Current Credits","billing.snapshot.vip":"VIP Status","billing.snapshot.notVip":"Not VIP","billing.snapshot.expires":"Expires","billing.vipRule.title":"VIP Benefit","billing.vipRule.desc":"VIP has only one special permission: VIP-free indicators can be used without credits deduction. Other paid features/indicators still consume credits.","billing.plan.monthly":"Monthly","billing.plan.yearly":"Yearly","billing.plan.lifetime":"Lifetime","billing.perMonth":"month","billing.perYear":"year","billing.once":"one-time","billing.credits":"Credits","billing.lifetimeMonthly":"Monthly bonus","billing.buyNow":"Buy Now","billing.purchaseSuccess":"Purchase successful","billing.purchaseFailed":"Purchase failed","billing.usdt.title":"USDT Scan to Pay","billing.usdt.hintTitle":"Scan with your wallet and send USDT","billing.usdt.hintDesc":"Make sure the network and amount are correct (TRC20 only for now). Membership will be activated automatically after payment is confirmed.","billing.usdt.chain":"Chain","billing.usdt.amount":"Amount","billing.usdt.address":"Deposit Address","billing.usdt.copyAddress":"Copy Address","billing.usdt.copyAmount":"Copy Amount","billing.usdt.refresh":"Refresh","billing.usdt.expires":"Expires","billing.usdt.paidSuccess":"Payment confirmed. Membership activated.","billing.usdt.status.pending":"Waiting for payment","billing.usdt.status.paid":"Payment detected","billing.usdt.status.confirmed":"Confirmed","billing.usdt.status.expired":"Expired","billing.usdt.status.cancelled":"Cancelled","billing.usdt.status.failed":"Failed","billing.usdt.expiredHint":"Order expired. If you already paid, please contact support with your TxHash and payment screenshot.","billing.usdt.confirmedHint":"Payment confirmed, membership activated! Thank you for your purchase.","community.vipFree":"VIP Free","dashboard.indicator.publish.vipFree":"VIP Free","dashboard.indicator.publish.vipFreeHint":"When enabled: VIP users can use this indicator for free (non-VIP still need to purchase).","quickTrade.title":"Quick Trade","quickTrade.selectSymbol":"Select Trading Pair","quickTrade.exchange":"Exchange","quickTrade.selectExchange":"Select exchange account","quickTrade.cryptoOnly":"Crypto only","quickTrade.noExchange":"No crypto exchange accounts yet. Add one in Profile → Exchange Config.","quickTrade.available":"Available","quickTrade.long":"Long","quickTrade.short":"Short","quickTrade.market":"Market","quickTrade.limit":"Limit","quickTrade.limitPrice":"Limit Price","quickTrade.enterPrice":"Enter price","quickTrade.amount":"Amount","quickTrade.enterAmount":"Enter amount","quickTrade.leverage":"Leverage","quickTrade.tpsl":"TP/SL Price (Optional)","quickTrade.tp":"Take Profit Price","quickTrade.sl":"Stop Loss Price","quickTrade.tpPlaceholder":"Enter TP price","quickTrade.slPlaceholder":"Enter SL price","quickTrade.optional":"Optional","quickTrade.buyLong":"Buy / Long","quickTrade.sellShort":"Sell / Short","quickTrade.currentPosition":"Current Position","quickTrade.side":"Side","quickTrade.posSize":"Size","quickTrade.entryPrice":"Entry Price","quickTrade.markPrice":"Mark Price","quickTrade.unrealizedPnl":"Unrealized PnL","quickTrade.closePosition":"Close Position","quickTrade.noPosition":"No Position","quickTrade.noPositionHint":"No position for current trading pair","quickTrade.recentTrades":"Recent Trades","quickTrade.orderSuccess":"Order placed successfully!","quickTrade.orderFailed":"Order failed","quickTrade.positionClosed":"Position closed!","quickTrade.openPanel":"Quick Trade","quickTrade.tradeNow":"Trade Now","profile.exchange.title":"Exchange Config","profile.exchange.hint":"Manage your exchange API keys and broker connections. They can be used in Trading Assistant and Quick Trade.","profile.exchange.addAccount":"Add Exchange Account","profile.exchange.noAccounts":"No exchange accounts yet. Click the button above to add one.","profile.exchange.colExchange":"Exchange","profile.exchange.colName":"Name","profile.exchange.colHint":"Connection Info","profile.exchange.colCreatedAt":"Created At","profile.exchange.colActions":"Actions","profile.exchange.deleteConfirm":"Are you sure you want to delete this exchange account? This cannot be undone.","profile.exchange.deleteSuccess":"Exchange account deleted","profile.exchange.addTitle":"Add Exchange Account","profile.exchange.selectExchange":"Select Exchange","profile.exchange.accountName":"Account Name (Optional)","profile.exchange.accountNamePlaceholder":"e.g. Main Account, Test Account","profile.exchange.apiKey":"API Key","profile.exchange.secretKey":"Secret Key","profile.exchange.passphrase":"Passphrase","profile.exchange.demoTrading":"Demo Trading","profile.exchange.ibkrHost":"TWS/Gateway Host","profile.exchange.ibkrPort":"TWS/Gateway Port","profile.exchange.ibkrPortHint":"TWS Paper:7497 | TWS Live:7496 | Gateway Paper:4002 | Gateway Live:4001","profile.exchange.ibkrClientId":"Client ID","profile.exchange.ibkrAccount":"Account (Optional)","profile.exchange.mt5Server":"Server","profile.exchange.mt5Login":"Login","profile.exchange.mt5Password":"Password","profile.exchange.mt5TerminalPath":"Terminal Path (Optional)","profile.exchange.mt5TerminalPathHint":"Path to MT5 terminal, e.g. C:\\Program Files\\MetaTrader 5\\terminal64.exe","profile.exchange.testConnection":"Test Connection","profile.exchange.testSuccess":"Connection successful!","profile.exchange.testFailed":"Connection failed","profile.exchange.saveSuccess":"Exchange account added successfully","profile.exchange.saveFailed":"Failed to add account","profile.exchange.typeCrypto":"Crypto Exchange","profile.exchange.typeIBKR":"US Stocks (IBKR)","profile.exchange.typeMT5":"Forex (MetaTrader 5)","profile.exchange.localDeploymentRequired":"Local deployment required","profile.exchange.localDeploymentHint":"This broker requires local deployment of QuantDinger to use.","profile.exchange.goToManage":"Go to Profile → Exchange Config to manage","profile.exchange.noCredentialHint":"Please add an exchange account in Profile first","adminOrders.tabTitle":"Order List","adminOrders.totalOrders":"Total Orders","adminOrders.paidOrders":"Paid","adminOrders.pendingOrders":"Pending","adminOrders.totalRevenue":"Total Revenue","adminOrders.filterAll":"All Status","adminOrders.filterPending":"Pending","adminOrders.filterPaid":"Paid","adminOrders.filterConfirmed":"Confirmed","adminOrders.filterExpired":"Expired","adminOrders.searchPlaceholder":"Search by username/email","adminOrders.colUser":"User","adminOrders.colType":"Type","adminOrders.colPlan":"Plan","adminOrders.colAmount":"Amount","adminOrders.colStatus":"Status","adminOrders.colChain":"Chain","adminOrders.colAddress":"Address","adminOrders.colTxHash":"Tx Hash","adminOrders.colCreatedAt":"Created","adminOrders.lifetime":"Lifetime","adminOrders.yearly":"Yearly","adminOrders.monthly":"Monthly","adminOrders.statusPaid":"Paid","adminOrders.statusConfirmed":"Confirmed","adminOrders.statusPending":"Pending","adminOrders.statusExpired":"Expired","adminOrders.statusCancelled":"Cancelled","adminOrders.statusFailed":"Failed","adminAiStats.tabTitle":"AI Analysis","adminAiStats.totalAnalyses":"Total Analyses","adminAiStats.activeUsers":"Active Users","adminAiStats.uniqueSymbols":"Symbols Analyzed","adminAiStats.accuracy":"Correct / Verified","adminAiStats.userStatsTitle":"Per-User Statistics","adminAiStats.recentTitle":"Recent Analysis Records","adminAiStats.searchPlaceholder":"Search by username","adminAiStats.colUser":"User","adminAiStats.colAnalysisCount":"Analyses","adminAiStats.colSymbols":"Symbols","adminAiStats.colMarkets":"Markets","adminAiStats.colAccuracy":"Correct / Wrong","adminAiStats.colFeedback":"Feedback","adminAiStats.colLastAnalysis":"Last Analysis","adminAiStats.colMarket":"Market","adminAiStats.colSymbol":"Symbol","adminAiStats.colModel":"Model","adminAiStats.colStatus":"Status","adminAiStats.colCreatedAt":"Time","adminAiStats.helpful":"Helpful","adminAiStats.notHelpful":"Not Helpful","polymarket.title":"Prediction Markets","polymarket.subtitle":"AI analysis and trading opportunity recommendations based on Polymarket prediction market data","polymarket.filter.category":"Select Category","polymarket.filter.sortBy":"Sort By","polymarket.sort.volume":"24h Volume","polymarket.sort.aiScore":"AI Opportunity Score","polymarket.sort.highProbability":"High Probability","polymarket.sort.highReturn":"High Return Ratio","polymarket.search.placeholder":"Search prediction markets...","polymarket.category.all":"All","polymarket.category.crypto":"Cryptocurrency","polymarket.category.politics":"Politics","polymarket.category.economics":"Economics","polymarket.category.sports":"Sports","polymarket.category.tech":"Tech","polymarket.category.finance":"Finance","polymarket.category.geopolitics":"Geopolitics","polymarket.category.culture":"Culture","polymarket.category.climate":"Climate","polymarket.category.entertainment":"Entertainment","polymarket.market.currentProbability":"Current Probability","polymarket.ai.predicted":"AI Predicted Probability","polymarket.ai.marketProbability":"Market Probability","polymarket.ai.recommendation":"AI Recommendation","polymarket.ai.confidence":"Confidence","polymarket.ai.opportunityScore":"Opportunity Score","polymarket.ai.reasoning":"Analysis Reasoning","polymarket.ai.keyFactors":"Key Factors","polymarket.recommendation.YES":"YES (Bullish)","polymarket.recommendation.NO":"NO (Bearish)","polymarket.recommendation.HOLD":"HOLD (Neutral)","polymarket.status.active":"Active","polymarket.status.closed":"Closed","polymarket.status.resolved":"Resolved","polymarket.action.viewDetail":"View Details","polymarket.action.viewOnPolymarket":"View on Polymarket","polymarket.detail.title":"Prediction Market Details","polymarket.detail.currentProbability":"Current Probability","polymarket.detail.volume24h":"24h Volume","polymarket.detail.liquidity":"Liquidity","polymarket.detail.aiAnalysis":"AI Analysis Results","polymarket.detail.assetOpportunities":"Related Asset Trading Opportunities","polymarket.opportunity.confidence":"Confidence","polymarket.opportunity.analyze":"Analyze Asset","polymarket.signal.BUY":"BUY","polymarket.signal.SELL":"SELL","polymarket.signal.HOLD":"HOLD","polymarket.error.loadFailed":"Failed to load markets","polymarket.error.searchFailed":"Search failed","polymarket.error.notFound":"Market not found","polymarket.error.loadDetailFailed":"Failed to load details","polymarket.viewOnPolymarket":"View on Polymarket","polymarket.filter.explanation.title":"Filter Explanation","polymarket.filter.explanation.volume":"Sorted by 24h trading volume, showing the most active prediction markets.","polymarket.filter.explanation.aiScore":"Sorted by AI opportunity score, considering AI-market divergence, confidence, and other factors. High-value opportunities are prioritized.","polymarket.filter.explanation.highProbability":"Sorted by AI predicted probability, prioritizing events with high AI probability (AI prediction > market probability + 10%).","polymarket.filter.explanation.highReturn":"Sorted by high return ratio, prioritizing opportunities with large AI-market divergence and high confidence (divergence × confidence). Suitable for finding undervalued predictions.","polymarket.deepAnalysis.prompt":"Currently showing rule-based simple analysis. Click the button below for AI deep analysis to get more accurate predictions and recommendations.","polymarket.deepAnalysis.button":"Deep Analysis","polymarket.deepAnalysis.success":"Deep analysis completed! Credits charged: {credits}, Remaining: {remaining}","polymarket.deepAnalysis.successFree":"Deep analysis completed!","polymarket.deepAnalysis.failed":"Deep analysis failed, please try again later","polymarket.deepAnalysis.insufficientCredits":"Insufficient credits! Required: {required}, Current: {current}, Shortage: {shortage}","polymarket.error.invalidMarketId":"Invalid market ID","polymarket.analysis.title":"Polymarket Prediction Market Analysis","polymarket.analysis.description":"Enter a Polymarket link or market title, and AI will analyze trading opportunities for you","polymarket.analysis.startAnalysis":"Start Analysis","polymarket.analysis.inputHint":"Please enter a Polymarket market link or market title","polymarket.analysis.inputPlaceholder":'e.g., https://polymarket.com/event/xxx or "Bitcoin price above $100k in 2025?"',"polymarket.analysis.inputRequired":"Please enter a Polymarket link or market title","polymarket.analysis.analyzeButton":"Start Analysis","polymarket.analysis.analyzing":"Analyzing, please wait...","polymarket.analysis.success":"Analysis completed!","polymarket.analysis.failed":"Analysis failed, please try again later","polymarket.analysis.insufficientCredits":"Insufficient credits, please recharge first","polymarket.analysis.viewOnPolymarket":"View on Polymarket","polymarket.analysis.aiAnalysis":"AI Analysis Results","polymarket.analysis.marketProbability":"Market Probability","polymarket.analysis.aiPredictedProbability":"AI Predicted Probability","polymarket.analysis.divergence":"Divergence","polymarket.analysis.recommendation":"Recommendation","polymarket.analysis.recommendationYes":"YES (Bullish)","polymarket.analysis.recommendationNo":"NO (Bearish)","polymarket.analysis.recommendationHold":"HOLD (Neutral)","polymarket.analysis.confidenceScore":"Confidence Score","polymarket.analysis.opportunityScore":"Opportunity Score","polymarket.analysis.reasoning":"Analysis Reasoning","polymarket.analysis.keyFactors":"Key Factors","polymarket.analysis.creditsCharged":"Credits charged for this analysis: {credits}","polymarket.analysis.remainingCredits":"Remaining credits: {credits}","polymarket.analysis.newAnalysis":"New Analysis","polymarket.analysis.tabAnalyze":"Analyze","polymarket.analysis.tabHistory":"History","polymarket.analysis.historyMarket":"Market","polymarket.analysis.historyRecommendation":"Recommendation","polymarket.analysis.historyOpportunityScore":"Opportunity Score","polymarket.analysis.historyCreatedAt":"Analysis Time","polymarket.analysis.historyTotal":"Total {total} records","polymarket.analysis.loadHistoryFailed":"Failed to load history","aiAssetAnalysis.tabs.polymarket":"Prediction Markets"};t["default"]=(0,i.A)((0,i.A)({},r),l)},55434:function(e,t,a){"use strict";a.d(t,{t:function(){return o}});var i=a(76338),s=a(95353),o={computed:(0,i.A)((0,i.A)({},(0,s.aH)({layout:function(e){return e.app.layout},navTheme:function(e){return e.app.theme},primaryColor:function(e){return e.app.color},colorWeak:function(e){return e.app.weak},fixedHeader:function(e){return e.app.fixedHeader},fixedSidebar:function(e){return e.app.fixedSidebar},contentWidth:function(e){return e.app.contentWidth},autoHideHeader:function(e){return e.app.autoHideHeader},isMobile:function(e){return e.app.isMobile},sideCollapsed:function(e){return e.app.sideCollapsed},multiTab:function(e){return e.app.multiTab}})),{},{isTopMenu:function(){return"topmenu"===this.layout}}),methods:{isSideMenu:function(){return!this.isTopMenu}}}},67569:function(e,t,a){"use strict";a.d(t,{Z$:function(){return i},dH:function(){return s}});a(27495);function i(){var e=new Date,t=e.getHours();return t<12?"Good morning":t<18?"Good afternoon":"Good evening"}function s(){var e=["休息一会儿吧","准备吃什么呢?","要不要打一把 DOTA","我猜你可能累了"],t=Math.floor(Math.random()*e.length);return e[t]}},75314:function(e,t,a){"use strict";a.d(t,{$C:function(){return y},Db:function(){return p},Fb:function(){return u},MV:function(){return c},OT:function(){return b},RM:function(){return l},Wb:function(){return g},Xh:function(){return i},cf:function(){return n},iK:function(){return o},jc:function(){return f},nc:function(){return s},nd:function(){return r},o6:function(){return h},sl:function(){return m},yG:function(){return d}});var i="Access-Token",s="User-Info",o="User-Roles",n="sidebar_type",r="is_mobile",l="nav_theme",d="layout",c="fixed_header",u="fixed_sidebar",m="content_width",g="auto_hide_header",p="color",h="weak",f="multi_tab",y="app_language",b={Fluid:"Fluid",Fixed:"Fixed"}},75769:function(e,t,a){"use strict";a.d(t,{He:function(){return y},Ay:function(){return b}});var i=a(44735),s=(a(74423),a(26099),a(27495),a(21699),a(71761),a(25440),a(42762),a(72505)),o=a.n(s),n=a(74053),r=a.n(n),l=a(56427),d={vm:{},install:function(e,t){this.installed||(this.installed=!0,t&&(e.axios=t,Object.defineProperties(e.prototype,{axios:{get:function(){return t}},$http:{get:function(){return t}}})))}},c=a(75314),u="PHPSESSID",m="lang",g=!1;function p(){var e=r().get(c.Xh);return e?("string"!==typeof e&&(e=e&&"object"===(0,i.A)(e)&&(e.token||e.value)||null),"string"===typeof e&&e.length>0?e:null):null}var h=o().create({baseURL:"/",timeout:3e4,withCredentials:!0}),f=function(e){if(e.response){var t=e.response.data;if(403===e.response.status&&l.A.error({message:"(Demo Mode)",description:t.msg||t.message||"Read-only in demo mode"}),401===e.response.status&&(!t.result||!t.result.isLogin)&&!g){g=!0;try{r().remove(c.Xh),r().remove(c.nc),r().remove(c.iK),r().remove(u)}catch(s){}l.A.error({message:"Unauthorized",description:t.msg||t.message||"Token invalid or expired, please login again."});var a=window.location.hash||"";if(!a.includes("/user/login")){var i=encodeURIComponent(a.replace("#","")||"/");window.location.assign("/#/user/login?redirect=".concat(i))}}}return Promise.reject(e)};h.interceptors.request.use(function(e){e.timeout&&e.timeout>0||e.url&&e.url.includes("/backtest")&&(e.timeout=6e5);var t=p(),a=r().get(m)||"en-US";if(e.headers["X-App-Lang"]=a,e.headers["Accept-Language"]=a,t)e.headers["Authorization"]="Bearer ".concat(t),e.headers[c.Xh]=t,e.headers["token"]=t;else if(e.url&&e.url.includes("/api/auth/info"))r().get(c.Xh);if(e.headers["Cache-Control"]="no-cache",e.headers["Pragma"]="no-cache",e.headers["If-Modified-Since"]="0","get"===(e.method||"get").toLowerCase()){var i=Date.now();e.params=Object.assign({},e.params||{},{_t:i})}var s=r().get(u);if(s&&"undefined"!==typeof document){var o=document.cookie,n=o.match(/PHPSESSID=([^;]+)/i),l=n?n[1].trim():null;if(!l||l!==s)try{window.location.hostname.includes("quantdinger.com")?document.cookie="PHPSESSID=".concat(s,"; path=/; domain=.quantdinger.com; SameSite=None; Secure"):document.cookie="PHPSESSID=".concat(s,"; path=/; SameSite=None; Secure")}catch(d){}}return e},f),h.interceptors.response.use(function(e){try{if("undefined"!==typeof document){var t=document.cookie,a=t.match(/PHPSESSID=([^;]+)/i);if(a&&a[1]){var i=a[1].trim(),s=r().get(u);s&&s===i||r().set(u,i,(new Date).getTime()+864e5)}}}catch(o){}return e.data},f);var y={vm:{},install:function(e){e.use(d,h)}},b=h},84161:function(e,t,a){"use strict";a(23792),a(3362),a(69085),a(9391),a(74423),a(21699),a(52675),a(89463),a(66412),a(60193),a(92168),a(2259),a(86964),a(83237),a(61833),a(67947),a(31073),a(45700),a(78125),a(20326),a(28706),a(26835),a(33771),a(2008),a(50113),a(48980),a(46449),a(78350),a(23418),a(48598),a(62062),a(31051),a(34782),a(26910),a(87478),a(54554),a(93514),a(30237),a(54743),a(46761),a(11745),a(89572),a(48957),a(62010),a(4731),a(36033),a(93153),a(82326),a(36389),a(64444),a(8085),a(77762),a(65070),a(60605),a(39469),a(72152),a(75376),a(56624),a(11367),a(5914),a(78553),a(98690),a(60479),a(70761),a(2892),a(45374),a(25428),a(32637),a(40150),a(59149),a(64601),a(44435),a(87220),a(25843),a(9868),a(17427),a(87607),a(5506),a(52811),a(53921),a(83851),a(81278),a(1480),a(40875),a(29908),a(94052),a(94003),a(221),a(79432),a(9220),a(7904),a(93967),a(93941),a(10287),a(26099),a(16034),a(39796),a(60825),a(87411),a(21211),a(40888),a(9065),a(86565),a(32812),a(84634),a(71137),a(30985),a(34268),a(34873),a(84864),a(27495),a(69479),a(38781),a(31415),a(23860),a(99449),a(27337),a(47764),a(71761),a(35701),a(68156),a(85906),a(42781),a(25440),a(5746),a(90744),a(11392),a(42762),a(39202),a(43359),a(89907),a(11898),a(35490),a(5745),a(94298),a(60268),a(69546),a(20781),a(50778),a(89195),a(46276),a(48718),a(16308),a(34594),a(29833),a(46594),a(72107),a(95477),a(21489),a(22134),a(3690),a(61740),a(81630),a(72170),a(75044),a(69539),a(31694),a(89955),a(33206),a(48345),a(44496),a(66651),a(12887),a(19369),a(66812),a(8995),a(52568),a(31575),a(36072),a(88747),a(28845),a(29423),a(57301),a(373),a(86614),a(41405),a(33684),a(73772),a(30958),a(23500),a(62953),a(59848),a(122),a(3296),a(27208),a(48408),a(7452);var i=a(85471),s=function(){var e=this,t=e._self._c;return t("a-config-provider",{attrs:{locale:e.locale,direction:e.direction}},[t("div",{attrs:{id:"app"}},[t("router-view")],1)])},o=[],n={navTheme:"light",primaryColor:"#13C2C2",layout:"sidemenu",contentWidth:"Fluid",fixedHeader:!0,fixSiderbar:!0,colorWeak:!1,menu:{locale:!0},title:"QuantDinger",pwa:!1,iconfontUrl:"",production:!0},r=function(e){document.title=e;var t=navigator.userAgent,a=/\bMicroMessenger\/([\d\.]+)/;if(a.test(t)&&/ip(hone|od|ad)/i.test(t)){var i=document.createElement("iframe");i.src="/favicon.ico",i.style.display="none",i.onload=function(){setTimeout(function(){i.remove()},9)},document.body.appendChild(i)}},l=n.title,d=a(76338),c=a(64765),u=a(74053),m=a.n(u),g=a(95093),p=a.n(g),h=a(45958);i.Ay.use(c.A);var f="en-US",y={"en-US":(0,d.A)({},h["default"])},b=new c.A({silentTranslationWarn:!0,locale:f,fallbackLocale:f,messages:y}),v=[f];function A(e){b.locale=e;var t=document.documentElement,a=/^ar/i.test(e);return t&&(t.setAttribute("lang",e),t.setAttribute("dir",a?"rtl":"ltr")),document.body&&(document.body.setAttribute("dir",a?"rtl":"ltr"),document.body.classList.toggle("rtl",a)),e}function k(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:f;return new Promise(function(t){return m().set("lang",e),b.locale!==e?v.includes(e)?t(A(e)):a(5839)("./".concat(e)).then(function(t){var a=t.default;return b.setLocaleMessage(e,a),v.push(e),p().updateLocale(a.momentName,a.momentLocale),A(e)}):t(e)})}function S(e){return b.t("".concat(e))}var w,T,P=b,C={data:function(){return{}},computed:{locale:function(){var e=this.$route.meta.title;return e&&r("".concat(S(e)," - ").concat(l)),this.$i18n.getLocaleMessage(this.$store.getters.lang).antLocale},direction:function(){var e=this.$store.getters.lang;return e&&/^ar/i.test(e)?"rtl":"ltr"},theme:function(){return this.$store.state.app.theme}},watch:{theme:{handler:function(e){"dark"===e||"realdark"===e?(document.body.classList.add("dark"),document.body.classList.remove("light")):(document.body.classList.remove("dark"),document.body.classList.add("light"))},immediate:!0}}},E=C,R=a(81656),I=(0,R.A)(E,s,o,!1,null,null,null),_=I.exports,M=a(40173),L=function(){var e=this,t=e._self._c;return t("div",{class:["user-layout-wrapper",e.isMobile&&"mobile"],attrs:{id:"userLayout"}},[t("div",{staticClass:"container"},[e._m(0),t("div",{staticClass:"user-layout-lang"},[t("select-lang",{staticClass:"select-lang-trigger"})],1),t("div",{staticClass:"user-layout-content"},[e._m(1),t("div",{staticClass:"main-content"},[t("router-view")],1),t("div",{staticClass:"footer"},[t("div",{staticClass:"copyright"},[e._v(" Copyright © 2025-2026 Quantdinger.com "),t("div",{staticStyle:{width:"70%","text-align":"center","margin-left":"15%","margin-top":"10px"}},[t("a",{staticStyle:{color:"#1890ff",cursor:"pointer"},on:{click:e.toggleRisk}},[e._v(" "+e._s(e.showRisk?e.$t("user.login.privacy.collapse"):e.$t("user.login.privacy.view"))+" ")]),e.showRisk?t("div",{staticStyle:{"margin-top":"10px","font-size":"12px",color:"rgba(0,0,0,0.65)","line-height":"1.6","text-align":"left"}},[t("div",{staticStyle:{"font-weight":"600","margin-bottom":"6px"}},[e._v(e._s(e.$t("user.login.privacy.title")))]),e._v(" "+e._s(e.$t("user.login.privacy.content"))+" ")]):e._e()])])])])])])},x=[function(){var e=this,t=e._self._c;return t("div",{staticClass:"fx-layer",attrs:{"aria-hidden":"true"}},[t("div",{staticClass:"fx-gradient"}),t("div",{staticClass:"fx-grid"})])},function(){var e=this,t=e._self._c;return t("div",{staticClass:"top"},[t("div",{staticClass:"header"},[t("a",{attrs:{href:"/"}},[t("img",{staticClass:"logo",attrs:{src:a(33153),alt:"logo"}})])])])}],D=a(95353),N={computed:(0,d.A)({},(0,D.aH)({isMobile:function(e){return e.app.isMobile}}))},F=(a(96205),a(77197)),O=(a(50769),a(40255)),B=(a(17735),a(36457)),H={computed:(0,d.A)({},(0,D.aH)({currentLang:function(e){return e.app.lang}})),methods:{setLang:function(e){this.$store.dispatch("setLang",e)}}},U=H,q=["en-US","ja-JP","ko-KR","vi-VN","th-TH","ar-SA","fr-FR","de-DE","zh-TW","zh-CN"],j={"zh-CN":"简体中文","zh-TW":"繁體中文","en-US":"English","ja-JP":"日本語","ko-KR":"한국어","vi-VN":"Tiếng Việt","th-TH":"ไทย","ar-SA":"العربية","fr-FR":"Français","de-DE":"Deutsch"},W={"zh-CN":"🇨🇳","zh-TW":"sg","en-US":"🇺🇸","ja-JP":"🇯🇵","ko-KR":"🇰🇷","vi-VN":"🇻🇳","th-TH":"🇹🇭","ar-SA":"🇸🇦","fr-FR":"🇫🇷","de-DE":"🇩🇪"},$={props:{prefixCls:{type:String,default:"ant-pro-drop-down"}},name:"SelectLang",mixins:[U],render:function(){var e=this,t=arguments[0],a=this.prefixCls,i=function(t){var a=t.key;e.setLang(a)},s=t(B.Ay,{class:["menu","ant-pro-header-menu"],attrs:{selectedKeys:[this.currentLang]},on:{click:i}},[q.map(function(e){return t(B.Ay.Item,{key:e},[t("span",{attrs:{role:"img","aria-label":j[e]}},[W[e]])," ",j[e]])})]);return t(F.Ay,{attrs:{overlay:s,placement:"bottomRight"}},[t("span",{class:a},[t(O.A,{attrs:{type:"global",title:S("navBar.lang")}})])])}},G=$,V={name:"UserLayout",components:{SelectLang:G},mixins:[N],data:function(){return{showRisk:!1}},methods:{toggleRisk:function(){this.showRisk=!this.showRisk}},mounted:function(){document.body.classList.add("userLayout")},beforeDestroy:function(){document.body.classList.remove("userLayout")}},Q=V,K=(0,R.A)(Q,L,x,!1,null,"7ae30672",null),z=K.exports,Y=function(){var e=this,t=e._self._c;return t("div",[t("router-view")],1)},X=[],J={name:"BlankLayout"},Z=J,ee=(0,R.A)(Z,Y,X,!1,null,"7f25f9eb",null),te=(ee.exports,function(){var e=this,t=e._self._c;return t("div",{class:["basic-layout-wrapper",e.settings.theme]},[t("pro-layout",e._b({attrs:{menus:e.menus,collapsed:e.collapsed,mediaQuery:e.query,isMobile:e.isMobile,handleMediaQuery:e.handleMediaQuery,handleCollapse:e.handleCollapse,i18nRender:e.i18nRender},scopedSlots:e._u([{key:"menuHeaderRender",fn:function(){return[t("div",[t("img",{attrs:{src:a(2304)}}),t("h1",[e._v(e._s(e.title))])])]},proxy:!0},{key:"headerContentRender",fn:function(){return[t("div",[t("a-tooltip",{attrs:{title:e.$t("menu.header.refreshPage")}},[t("a-icon",{staticStyle:{"font-size":"18px",cursor:"pointer"},attrs:{type:"reload"},on:{click:e.handleRefresh}})],1)],1)]},proxy:!0},{key:"rightContentRender",fn:function(){return[t("right-content",{attrs:{"top-menu":"topmenu"===e.settings.layout,"is-mobile":e.isMobile,theme:e.settings.theme}})]},proxy:!0},{key:"footerRender",fn:function(){return[t("div",{staticStyle:{display:"none"}})]},proxy:!0}])},"pro-layout",e.settings,!1),[t("a-modal",{attrs:{visible:e.showLegalModal,footer:null,title:e.$t("menu.footer.userAgreement"),width:800},on:{cancel:function(t){e.showLegalModal=!1}}},[t("div",{staticStyle:{"max-height":"60vh",overflow:"auto","white-space":"pre-wrap","line-height":"1.8",padding:"16px"}},[e._v(" "+e._s(e.menuFooterConfig.legal.user_agreement||e.$t("user.login.legal.content"))+" ")]),t("div",{staticStyle:{"margin-top":"12px","text-align":"right"}},[t("a-button",{attrs:{type:"primary"},on:{click:function(t){e.showLegalModal=!1}}},[e._v("OK")])],1)]),t("a-modal",{attrs:{visible:e.showPrivacyModal,footer:null,title:e.$t("menu.footer.privacyPolicy"),width:800},on:{cancel:function(t){e.showPrivacyModal=!1}}},[t("div",{staticStyle:{"max-height":"60vh",overflow:"auto","white-space":"pre-wrap","line-height":"1.8",padding:"16px"}},[e._v(" "+e._s(e.menuFooterConfig.legal.privacy_policy||e.$t("user.login.privacy.content"))+" ")]),t("div",{staticStyle:{"margin-top":"12px","text-align":"right"}},[t("a-button",{attrs:{type:"primary"},on:{click:function(t){e.showPrivacyModal=!1}}},[e._v("OK")])],1)]),t("setting-drawer",{ref:"settingDrawer",attrs:{settings:e.settings},on:{change:e.handleSettingChange}},[t("div",{staticStyle:{margin:"12px 0"}},[e._v(" This is SettingDrawer custom footer content. ")])]),t("router-view",{key:e.refreshKey})],1),t("div",{staticClass:"custom-menu-footer",class:{collapsed:e.collapsed,"drawer-open":e.isMobile&&e.isDrawerOpen,"drawer-animating":e.isMobile&&e.isDrawerAnimating}},[e.collapsed?e._e():t("div",{staticClass:"menu-footer-content"},[t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-title"},[e._v(e._s(e.$t("menu.footer.contactUs")))]),t("div",{staticClass:"section-links"},[t("a",{attrs:{href:e.menuFooterConfig.contact.support_url,target:"_blank"}},[e._v(e._s(e.$t("menu.footer.support")))]),t("span",{staticClass:"separator"},[e._v("|")]),t("a",{attrs:{href:e.menuFooterConfig.contact.feature_request_url,target:"_blank"}},[e._v(e._s(e.$t("menu.footer.featureRequest")))])])]),t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-title"},[e._v(e._s(e.$t("menu.footer.getSupport")))]),t("div",{staticClass:"section-links"},[t("a",{attrs:{href:"mailto:"+e.menuFooterConfig.contact.email}},[e._v(e._s(e.$t("menu.footer.email")))]),t("span",{staticClass:"separator"},[e._v("|")]),t("a",{attrs:{href:e.menuFooterConfig.contact.live_chat_url,target:"_blank"}},[e._v(e._s(e.$t("menu.footer.liveChat")))])])]),e.menuFooterConfig.social_accounts&&e.menuFooterConfig.social_accounts.length>0?t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-title"},[e._v(e._s(e.$t("menu.footer.socialAccounts")))]),t("div",{staticClass:"social-icons"},e._l(e.menuFooterConfig.social_accounts,function(e,a){return t("a",{key:a,staticClass:"social-icon",attrs:{href:e.url,target:"_blank",rel:"noopener noreferrer",title:e.name}},[t("Icon",{staticClass:"social-icon-svg",attrs:{icon:"simple-icons:".concat(e.icon)}})],1)}),0)]):e._e(),t("div",{staticClass:"footer-section"},[t("div",{staticClass:"section-links"},[t("a",{on:{click:function(t){e.showLegalModal=!0}}},[e._v(e._s(e.$t("menu.footer.userAgreement")))]),t("span",{staticClass:"separator"},[e._v("&")]),t("a",{on:{click:function(t){e.showPrivacyModal=!0}}},[e._v(e._s(e.$t("menu.footer.privacyPolicy")))])])]),t("div",{staticClass:"footer-section copyright"},[e._v(" "+e._s(e.menuFooterConfig.copyright)+" ")]),t("div",{staticClass:"footer-section version"},[e._v(" V2.2.2 ")])])])],1)}),ae=[],ie=a(18787),se=a(69511),oe=a.n(se),ne=a(58391),re=a.n(ne),le={getAntdSerials:function(e){var t=new Array(9).fill().map(function(t,a){return oe().varyColor.lighten(e,a/10)}),a=re()(e),i=oe().varyColor.toNum3(e.replace("#","")).join(",");return t.concat(a).concat(i)},changeColor:function(e){if(!oe()||!oe().changer||"function"!==typeof oe().changer.changeColor)return Promise.resolve();var t={newColors:this.getAntdSerials(e),changeUrl:function(e){return"/".concat(e)}};try{return oe().changer.changeColor(t,Promise)}catch(a){return Promise.resolve()}}},de=function(){return[{key:P.t("app.setting.themecolor.dust"),color:"#F5222D"},{key:P.t("app.setting.themecolor.volcano"),color:"#FA541C"},{key:P.t("app.setting.themecolor.sunset"),color:"#FAAD14"},{key:P.t("app.setting.themecolor.cyan"),color:"#13C2C2"},{key:P.t("app.setting.themecolor.green"),color:"#52C41A"},{key:P.t("app.setting.themecolor.daybreak"),color:"#1890FF"},{key:P.t("app.setting.themecolor.geekblue"),color:"#2F54EB"},{key:P.t("app.setting.themecolor.purple"),color:"#722ED1"}]},ce=function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=t?null:ie.A.loading(P.t("app.setting.theme.switching"),0);le.changeColor(e).finally(function(){a&&setTimeout(function(){a()},10)})},ue=function(e){var t=document.body.querySelector("#app");e?t.classList.add("colorWeak"):t.classList.remove("colorWeak")},me=a(75314),ge=function(){var e=this,t=e._self._c;return t("div",{class:e.wrpCls},[t("avatar-dropdown",{class:e.prefixCls,attrs:{menu:!0,"current-user":e.currentUser}}),t("notice-icon",{class:e.prefixCls}),t("select-lang",{class:e.prefixCls}),t("a-tooltip",{attrs:{title:e.$t("app.setting.tooltip")}},[t("span",{class:e.prefixCls,on:{click:e.handleSettingClick}},[t("a-icon",{staticStyle:{"font-size":"16px"},attrs:{type:"setting"}})],1)])],1)},pe=[],he=a(26297),fe=function(){var e=this,t=e._self._c;return e.currentUser&&e.currentUser.name?t("a-dropdown",{attrs:{placement:"bottomRight"},scopedSlots:e._u([{key:"overlay",fn:function(){return[t("a-menu",{staticClass:"ant-pro-drop-down menu",attrs:{"selected-keys":[]}},[t("a-menu-item",{key:"profile",on:{click:e.handleProfile}},[t("a-icon",{attrs:{type:"user"}}),e._v(" "+e._s(e.$t("menu.profile")||"My Profile")+" ")],1),t("a-menu-divider"),t("a-menu-item",{key:"logout",on:{click:e.handleLogout}},[t("a-icon",{attrs:{type:"logout"}}),e._v(" "+e._s(e.$t("menu.account.logout"))+" ")],1)],1)]},proxy:!0}],null,!1,2847446919)},[t("span",{staticClass:"ant-pro-account-avatar"},[t("a-avatar",{staticClass:"antd-pro-global-header-index-avatar",attrs:{size:"small",src:e.currentUser.avatar}}),t("span",[e._v(e._s(e.currentUser.name))])],1)]):t("span",[t("a-spin",{style:{marginLeft:8,marginRight:8},attrs:{size:"small"}})],1)},ye=[],be=(a(96305),a(43898)),ve={name:"AvatarDropdown",props:{currentUser:{type:Object,default:function(){return null}},menu:{type:Boolean,default:!0}},methods:{handleProfile:function(){this.$router.push({name:"Profile"})},handleLogout:function(e){var t=this;be.A.confirm({title:this.$t("layouts.usermenu.dialog.title"),content:this.$t("layouts.usermenu.dialog.content"),onOk:function(){return t.$store.dispatch("Logout").then(function(){t.$router.push({name:"login"})})},onCancel:function(){}})}}},Ae=ve,ke=(0,R.A)(Ae,fe,ye,!1,null,null,null),Se=ke.exports,we=function(){var e=this,t=e._self._c;return t("div",{staticClass:"notice-icon-wrapper"},[t("a-popover",{attrs:{trigger:"click",placement:"bottomRight",overlayClassName:"header-notice-wrapper",getPopupContainer:function(){return e.$refs.noticeRef.parentElement},autoAdjustOverflow:!0,arrowPointAtCenter:!0,overlayStyle:{width:"380px",top:"50px"}},model:{value:e.visible,callback:function(t){e.visible=t},expression:"visible"}},[t("template",{slot:"content"},[t("div",{staticClass:"notice-header"},[t("span",{staticClass:"notice-title"},[e._v(e._s(e.$t("notice.title")))]),e.notifications.length>0?t("a",{staticClass:"notice-action",on:{click:e.markAllRead}},[e._v(" "+e._s(e.$t("notice.markAllRead"))+" ")]):e._e()]),t("a-spin",{attrs:{spinning:e.loading}},[e.notifications.length>0?t("div",{staticClass:"notice-list"},e._l(e.notifications,function(a){return t("div",{key:a.id,staticClass:"notice-item",class:{unread:!a.is_read},on:{click:function(t){return e.handleNoticeClick(a)}}},[t("div",{staticClass:"notice-item-icon"},[t("a-icon",{style:{color:e.getNoticeColor(a.signal_type)},attrs:{type:e.getNoticeIcon(a.signal_type)}})],1),t("div",{staticClass:"notice-item-content"},[t("div",{staticClass:"notice-item-title"},[e._v(e._s(a.title))]),t("div",{staticClass:"notice-item-desc"},[e._v(e._s(e.truncateMessage(a.message)))]),t("div",{staticClass:"notice-item-time"},[e._v(e._s(e.formatTime(a.created_at)))])])])}),0):t("div",{staticClass:"notice-empty"},[t("a-empty",{attrs:{description:e.$t("notice.empty")}})],1)]),e.notifications.length>0?t("div",{staticClass:"notice-footer"},[t("a",{on:{click:e.clearNotifications}},[e._v(e._s(e.$t("notice.clear")))])]):e._e()],1),t("span",{ref:"noticeRef",staticClass:"header-notice",on:{click:e.fetchNotice}},[t("a-badge",{attrs:{count:e.unreadCount,overflowCount:99}},[t("a-icon",{staticStyle:{"font-size":"16px",padding:"4px"},attrs:{type:"bell"}})],1)],1)],2),t("a-modal",{attrs:{title:e.detailNotice?e.detailNotice.title:"",footer:null,width:e.isHtmlReport?900:600,wrapClassName:e.isHtmlReport?"notice-detail-modal html-report-modal":"notice-detail-modal",centered:""},model:{value:e.detailVisible,callback:function(t){e.detailVisible=t},expression:"detailVisible"}},[e.detailNotice?t("div",{staticClass:"notice-detail"},[t("div",{staticClass:"notice-detail-meta"},[t("div",{staticClass:"notice-detail-type"},[t("a-icon",{style:{color:e.getNoticeColor(e.detailNotice.signal_type)},attrs:{type:e.getNoticeIcon(e.detailNotice.signal_type)}}),t("span",{staticClass:"type-label"},[e._v(e._s(e.getNoticeTypeLabel(e.detailNotice.signal_type)))])],1),t("div",{staticClass:"notice-detail-time"},[t("a-icon",{attrs:{type:"clock-circle"}}),t("span",[e._v(e._s(e.formatFullTime(e.detailNotice.created_at)))])],1)]),t("a-divider"),t("div",{staticClass:"notice-detail-content",class:{"html-report":e.isHtmlReport}},[t("div",{staticClass:"message-body",domProps:{innerHTML:e._s(e.formatMessageHtml(e.detailNotice.message))}})]),!e.isHtmlReport&&e.detailNotice.payload&&Object.keys(e.detailNotice.payload).length>0?[t("a-divider"),t("div",{staticClass:"notice-detail-extra"},[t("div",{staticClass:"extra-title"},[e._v(e._s(e.$t("notice.detailInfo")))]),"ai_monitor"===e.detailNotice.signal_type?[e.detailNotice.payload.final_decision?t("div",{staticClass:"extra-item decision"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.aiDecision"))+":")]),t("a-tag",{attrs:{color:e.getDecisionColor(e.detailNotice.payload.final_decision)}},[e._v(" "+e._s(e.detailNotice.payload.final_decision)+" ")]),e.detailNotice.payload.confidence?t("span",{staticClass:"confidence"},[e._v(" ("+e._s(e.$t("notice.confidence"))+": "+e._s(e.detailNotice.payload.confidence)+"%) ")]):e._e()],1):e._e(),e.detailNotice.payload.reasoning?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.reasoning"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.reasoning))])]):e._e()]:e._e(),"price_alert"===e.detailNotice.signal_type?[e.detailNotice.payload.symbol?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.symbol"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.symbol))])]):e._e(),e.detailNotice.payload.price?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.currentPrice"))+":")]),t("span",{staticClass:"value"},[e._v("$"+e._s(e.detailNotice.payload.price))])]):e._e(),e.detailNotice.payload.trigger_price?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.triggerPrice"))+":")]),t("span",{staticClass:"value"},[e._v("$"+e._s(e.detailNotice.payload.trigger_price))])]):e._e()]:e._e(),"signal"===e.detailNotice.signal_type||"trade"===e.detailNotice.signal_type?[e.detailNotice.payload.symbol?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.symbol"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.symbol))])]):e._e(),e.detailNotice.payload.action?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.action"))+":")]),t("a-tag",{attrs:{color:"BUY"===e.detailNotice.payload.action?"green":"red"}},[e._v(" "+e._s(e.detailNotice.payload.action)+" ")])],1):e._e(),e.detailNotice.payload.quantity?t("div",{staticClass:"extra-item"},[t("span",{staticClass:"label"},[e._v(e._s(e.$t("notice.quantity"))+":")]),t("span",{staticClass:"value"},[e._v(e._s(e.detailNotice.payload.quantity))])]):e._e()]:e._e()],2)]:e._e(),t("div",{staticClass:"notice-detail-actions"},[e.detailNotice.payload&&e.detailNotice.payload.monitor_id?t("a-button",{attrs:{type:"primary"},on:{click:e.goToPortfolio}},[t("a-icon",{attrs:{type:"fund"}}),e._v(" "+e._s(e.$t("notice.viewPortfolio"))+" ")],1):e._e(),t("a-button",{on:{click:function(t){e.detailVisible=!1}}},[e._v(" "+e._s(e.$t("notice.close"))+" ")])],1)],2):e._e()])],1)},Te=[],Pe=a(81127),Ce=a(2403),Ee=a(56252),Re=a(36911),Ie=a(75769),_e={name:"HeaderNotice",data:function(){return{loading:!1,visible:!1,detailVisible:!1,detailNotice:null,notifications:[],lastFetchId:0,pollingTimer:null}},computed:{unreadCount:function(){return this.notifications.filter(function(e){return!e.is_read}).length},isHtmlReport:function(){return!(!this.detailNotice||!this.detailNotice.message)&&(this.detailNotice.message.includes('<div class="qd-report">')||this.detailNotice.message.includes("<style>"))}},mounted:function(){this.fetchNotifications(),this.startPolling()},beforeDestroy:function(){this.stopPolling()},methods:{startPolling:function(){var e=this;this.stopPolling(),this.pollingTimer=setInterval(function(){e.fetchNotifications(!0)},3e4)},stopPolling:function(){this.pollingTimer&&(clearInterval(this.pollingTimer),this.pollingTimer=null)},fetchNotifications:function(){var e=arguments,t=this;return(0,Ee.A)((0,Pe.A)().m(function a(){var i,s,o;return(0,Pe.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return i=e.length>0&&void 0!==e[0]&&e[0],i||(t.loading=!0),a.p=1,a.n=2,(0,Re.KP)({limit:50});case 2:o=a.v,1===o.code&&null!==(s=o.data)&&void 0!==s&&s.items&&(t.notifications=o.data.items.map(function(e){var t=e.payload_json;if("string"===typeof t)try{t=JSON.parse(t)}catch(a){t={}}return(0,d.A)((0,d.A)({},e),{},{payload:t,is_read:1===e.is_read||!0===e.is_read})}),t.notifications.length>0&&(t.lastFetchId=Math.max.apply(Math,(0,Ce.A)(t.notifications.map(function(e){return e.id}))))),a.n=4;break;case 3:a.p=3,a.v;case 4:return a.p=4,t.loading=!1,a.f(4);case 5:return a.a(2)}},a,null,[[1,3,4,5]])}))()},fetchNotice:function(){this.visible||this.fetchNotifications(),this.visible=!this.visible},getNoticeIcon:function(e){var t={ai_monitor:"robot",price_alert:"bell",signal:"thunderbolt",buy:"rise",sell:"fall",hold:"pause-circle",trade:"swap"};return t[e]||"notification"},getNoticeColor:function(e){var t={ai_monitor:"#722ed1",price_alert:"#faad14",signal:"#1890ff",buy:"#52c41a",sell:"#f5222d",hold:"#faad14",trade:"#13c2c2"};return t[e]||"#1890ff"},getNoticeTypeLabel:function(e){var t={ai_monitor:this.$t("notice.type.aiMonitor"),price_alert:this.$t("notice.type.priceAlert"),signal:this.$t("notice.type.signal"),buy:this.$t("notice.type.buy"),sell:this.$t("notice.type.sell"),hold:this.$t("notice.type.hold"),trade:this.$t("notice.type.trade")};return t[e]||this.$t("notice.type.notification")},getDecisionColor:function(e){var t={BUY:"green",SELL:"red",HOLD:"orange"};return t[e]||"blue"},truncateMessage:function(e){return e?e.length>80?e.substring(0,80)+"...":e:""},formatTime:function(e){if(!e)return"";var t;if("number"===typeof e)t=new Date(e<1e12?1e3*e:e);else{if("string"!==typeof e)return"";if(/^\d+$/.test(e)){var a=parseInt(e,10);t=new Date(a<1e12?1e3*a:a)}else t=new Date(e)}if(isNaN(t.getTime()))return"";var i=new Date,s=i-t,o=Math.floor(s/6e4),n=Math.floor(s/36e5),r=Math.floor(s/864e5);return o<1?this.$t("notice.justNow"):o<60?"".concat(o," ").concat(this.$t("notice.minutesAgo")):n<24?"".concat(n," ").concat(this.$t("notice.hoursAgo")):r<7?"".concat(r," ").concat(this.$t("notice.daysAgo")):t.toLocaleDateString()},formatFullTime:function(e){if(!e)return"";var t;if("number"===typeof e)t=new Date(e<1e12?1e3*e:e);else{if("string"!==typeof e)return"";if(/^\d+$/.test(e)){var a=parseInt(e,10);t=new Date(a<1e12?1e3*a:a)}else t=new Date(e)}return isNaN(t.getTime())?"":t.toLocaleString()},formatMessageHtml:function(e){if(!e)return"";if(e.includes('<div class="qd-report">')||e.includes("<style>"))return e;var t=e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/^### (.+)$/gm,"<h4>$1</h4>").replace(/^## (.+)$/gm,"<h3>$1</h3>").replace(/^# (.+)$/gm,"<h2>$1</h2>").replace(/\*\*(.+?)\*\*/g,"<strong>$1</strong>").replace(/\*(.+?)\*/g,"<em>$1</em>").replace(/^- (.+)$/gm,"<li>$1</li>").replace(/\n/g,"<br>");return t},handleNoticeClick:function(e){this.markAsRead(e.id),this.detailNotice=e,this.detailVisible=!0,this.visible=!1},goToPortfolio:function(){this.detailVisible=!1,this.$router.push({path:"/portfolio"}).catch(function(){})},markAsRead:function(e){var t=this;return(0,Ee.A)((0,Pe.A)().m(function a(){var i;return(0,Pe.A)().w(function(a){while(1)switch(a.p=a.n){case 0:return i=t.notifications.find(function(t){return t.id===e}),i&&(i.is_read=!0),a.p=1,a.n=2,(0,Ie.Ay)({url:"/api/strategies/notifications/read",method:"post",data:{id:e}});case 2:a.n=4;break;case 3:a.p=3,a.v;case 4:return a.a(2)}},a,null,[[1,3]])}))()},markAllRead:function(){var e=this;return(0,Ee.A)((0,Pe.A)().m(function t(){return(0,Pe.A)().w(function(t){while(1)switch(t.p=t.n){case 0:return e.notifications.forEach(function(e){e.is_read=!0}),t.p=1,t.n=2,(0,Ie.Ay)({url:"/api/strategies/notifications/read-all",method:"post"});case 2:t.n=4;break;case 3:t.p=3,t.v;case 4:return t.a(2)}},t,null,[[1,3]])}))()},clearNotifications:function(){var e=this;return(0,Ee.A)((0,Pe.A)().m(function t(){return(0,Pe.A)().w(function(t){while(1)switch(t.p=t.n){case 0:return e.notifications=[],t.p=1,t.n=2,(0,Ie.Ay)({url:"/api/strategies/notifications/clear",method:"delete"});case 2:t.n=4;break;case 3:t.p=3,t.v;case 4:e.visible=!1;case 5:return t.a(2)}},t,null,[[1,3]])}))()}}},Me=_e,Le=(0,R.A)(Me,we,Te,!1,null,"4726fe78",null),xe=Le.exports,De=xe,Ne={name:"RightContent",components:{AvatarDropdown:Se,SelectLang:G,NoticeIcon:De},props:{prefixCls:{type:String,default:"ant-pro-global-header-index-action"},isMobile:{type:Boolean,default:function(){return!1}},topMenu:{type:Boolean,required:!0},theme:{type:String,required:!0}},data:function(){return{apiBase:"https://api.quantdinger.com/"}},methods:{handleSettingClick:function(){this.$root.$emit("show-setting-drawer")}},computed:(0,d.A)((0,d.A)({},(0,D.L8)(["nickname","avatar"])),{},{currentUser:function(){return{name:this.nickname,avatar:this.avatar}},wrpCls:function(){return(0,he.A)({"ant-pro-global-header-index-right":!0},"ant-pro-global-header-index-".concat(this.isMobile||!this.topMenu?"light":this.theme),!0)}})},Fe=Ne,Oe=(0,R.A)(Fe,ge,pe,!1,null,null,null),Be=Oe.exports,He=function(){var e=this,t=e._self._c;return t("div",{staticClass:"setting-drawer"},[t("a-drawer",{attrs:{width:"300",placement:"right",closable:!0,visible:e.visible,"get-container":!1},on:{close:e.onClose}},[t("div",{staticClass:"setting-drawer-index-content"},[t("div",{style:{marginBottom:"24px"}},[t("h3",{staticClass:"setting-drawer-index-title"},[e._v(e._s(e.$t("app.setting.pagestyle")))]),t("div",{staticClass:"setting-drawer-index-blockChecbox"},[t("a-tooltip",[t("template",{slot:"title"},[e._v(" "+e._s(e.$t("app.setting.pagestyle.dark"))+" ")]),t("div",{staticClass:"setting-drawer-index-item",on:{click:function(t){return e.handleMenuTheme("dark")}}},[t("img",{attrs:{src:"https://gw.alipayobjects.com/zos/rmsportal/LCkqqYNmvBEbokSDscrm.svg",alt:"dark"}}),"dark"===e.currentNavTheme?t("div",{staticClass:"setting-drawer-index-selectIcon"},[t("a-icon",{attrs:{type:"check"}})],1):e._e()])],2),t("a-tooltip",[t("template",{slot:"title"},[e._v(" "+e._s(e.$t("app.setting.pagestyle.light"))+" ")]),t("div",{staticClass:"setting-drawer-index-item",on:{click:function(t){return e.handleMenuTheme("light")}}},[t("img",{attrs:{src:"https://gw.alipayobjects.com/zos/rmsportal/jpRkZQMyYRryryPNtyIC.svg",alt:"light"}}),"dark"!==e.currentNavTheme?t("div",{staticClass:"setting-drawer-index-selectIcon"},[t("a-icon",{attrs:{type:"check"}})],1):e._e()])],2)],1)]),t("div",{style:{marginBottom:"24px"}},[t("h3",{staticClass:"setting-drawer-index-title"},[e._v(e._s(e.$t("app.setting.themecolor")))]),t("div",{staticStyle:{height:"20px"}},e._l(e.colorList,function(a,i){return t("a-tooltip",{key:i,staticClass:"setting-drawer-theme-color-colorBlock"},[t("template",{slot:"title"},[e._v(" "+e._s(a.key)+" ")]),t("a-tag",{attrs:{color:a.color},on:{click:function(t){return e.changeColor(a.color)}}},[a.color===e.currentPrimaryColor?t("a-icon",{attrs:{type:"check"}}):e._e()],1)],2)}),1)]),t("a-divider"),t("div",{style:{marginBottom:"24px",display:"none"}},[t("h3",{staticClass:"setting-drawer-index-title"},[e._v(e._s(e.$t("app.setting.navigationmode")))]),t("div",{staticClass:"setting-drawer-index-blockChecbox"},[t("a-tooltip",[t("template",{slot:"title"},[e._v(" "+e._s(e.$t("app.setting.sidemenu.nav"))+" ")]),t("div",{staticClass:"setting-drawer-index-item",on:{click:function(t){return e.handleLayout("sidemenu")}}},[t("img",{attrs:{src:"https://gw.alipayobjects.com/zos/rmsportal/JopDzEhOqwOjeNTXkoje.svg",alt:"sidemenu"}}),"sidemenu"===e.layoutMode?t("div",{staticClass:"setting-drawer-index-selectIcon"},[t("a-icon",{attrs:{type:"check"}})],1):e._e()])],2),t("a-tooltip",[t("template",{slot:"title"},[e._v(" "+e._s(e.$t("app.setting.topmenu.nav"))+" ")]),t("div",{staticClass:"setting-drawer-index-item",on:{click:function(t){return e.handleLayout("topmenu")}}},[t("img",{attrs:{src:"https://gw.alipayobjects.com/zos/rmsportal/KDNDBbriJhLwuqMoxcAr.svg",alt:"topmenu"}}),"sidemenu"!==e.layoutMode?t("div",{staticClass:"setting-drawer-index-selectIcon"},[t("a-icon",{attrs:{type:"check"}})],1):e._e()])],2)],1),t("div",{style:{marginTop:"24px"}},[t("a-list",{attrs:{split:!1}},[t("a-list-item",[t("a-tooltip",{attrs:{slot:"actions"},slot:"actions"},[t("template",{slot:"title"},[e._v(" "+e._s(e.$t("app.setting.content-width.tooltip"))+" ")]),t("a-select",{staticStyle:{width:"80px"},attrs:{size:"small",defaultValue:e.currentContentWidth},on:{change:e.handleContentWidthChange}},[t("a-select-option",{attrs:{value:"Fixed"}},[e._v(e._s(e.$t("app.setting.content-width.fixed")))]),"sidemenu"!==e.layoutMode?t("a-select-option",{attrs:{value:"Fluid"}},[e._v(e._s(e.$t("app.setting.content-width.fluid")))]):e._e()],1)],2),t("a-list-item-meta",[t("div",{attrs:{slot:"title"},slot:"title"},[e._v(e._s(e.$t("app.setting.content-width")))])])],1),t("a-list-item",[t("a-switch",{attrs:{slot:"actions",size:"small",defaultChecked:e.currentFixedHeader},on:{change:e.handleFixedHeader},slot:"actions"}),t("a-list-item-meta",[t("div",{attrs:{slot:"title"},slot:"title"},[e._v(e._s(e.$t("app.setting.fixedheader")))])])],1),t("a-list-item",[t("a-switch",{attrs:{slot:"actions",size:"small",disabled:!e.currentFixedHeader,defaultChecked:e.currentAutoHideHeader},on:{change:e.handleFixedHeaderHidden},slot:"actions"}),t("a-list-item-meta",[t("a-tooltip",{attrs:{slot:"title",placement:"left"},slot:"title"},[t("template",{slot:"title"},[e._v(e._s(e.$t("app.setting.fixedheader.tooltip")))]),t("div",{style:{opacity:e.currentFixedHeader?"1":"0.5"}},[e._v(e._s(e.$t("app.setting.autoHideHeader")))])],2)],1)],1),t("a-list-item",[t("a-switch",{attrs:{slot:"actions",size:"small",disabled:"topmenu"===e.layoutMode,defaultChecked:e.fixSiderbar},on:{change:e.handleFixSiderbar},slot:"actions"}),t("a-list-item-meta",[t("div",{style:{textDecoration:"topmenu"===e.layoutMode?"line-through":"unset"},attrs:{slot:"title"},slot:"title"},[e._v(e._s(e.$t("app.setting.fixedsidebar")))])])],1)],1)],1)]),t("a-divider"),t("div",{style:{marginBottom:"24px"}},[t("h3",{staticClass:"setting-drawer-index-title"},[e._v(e._s(e.$t("app.setting.othersettings")))]),t("div",[t("a-list",{attrs:{split:!1}},[t("a-list-item",[t("a-switch",{attrs:{slot:"actions",size:"small",defaultChecked:e.currentColorWeak},on:{change:e.onColorWeak},slot:"actions"}),t("a-list-item-meta",[t("div",{attrs:{slot:"title"},slot:"title"},[e._v(e._s(e.$t("app.setting.weakmode")))])])],1),t("a-list-item",[t("a-switch",{attrs:{slot:"actions",size:"small",defaultChecked:e.currentMultiTab},on:{change:e.onMultiTab},slot:"actions"}),t("a-list-item-meta",[t("div",{attrs:{slot:"title"},slot:"title"},[e._v(e._s(e.$t("app.setting.multitab")))])])],1)],1)],1)]),t("a-divider")],1)])],1)},Ue=[],qe=function(){var e=this,t=e._self._c;return t("div",{staticClass:"setting-drawer-index-item"},[t("h3",{staticClass:"setting-drawer-index-title"},[e._v(e._s(e.title))]),e._t("default"),e.divider?t("a-divider"):e._e()],2)},je=[],We={name:"SettingItem",props:{title:{type:String,default:""},divider:{type:Boolean,default:!1}}},$e=We,Ge=(0,R.A)($e,qe,je,!1,null,"e773bc98",null),Ve=Ge.exports,Qe=a(55434),Ke={components:{SettingItem:Ve},props:{settings:{type:Object,default:function(){return{}}}},mixins:[Qe.t],data:function(){return{visible:!1}},computed:{colorList:function(){return de()},layoutMode:function(){return this.settings.layout||this.layout||"sidemenu"},fixSiderbar:function(){return void 0!==this.settings.fixSiderbar?this.settings.fixSiderbar:this.fixedSidebar||!1},currentNavTheme:function(){return this.settings.theme||this.navTheme||"light"},currentPrimaryColor:function(){return this.settings.primaryColor||this.primaryColor||"#1890FF"},currentFixedHeader:function(){return void 0!==this.settings.fixedHeader?this.settings.fixedHeader:this.fixedHeader||!1},currentContentWidth:function(){return this.settings.contentWidth||this.contentWidth||"Fluid"},currentAutoHideHeader:function(){return void 0!==this.settings.autoHideHeader?this.settings.autoHideHeader:this.autoHideHeader||!1},currentColorWeak:function(){return void 0!==this.settings.colorWeak?this.settings.colorWeak:this.colorWeak||!1},currentMultiTab:function(){return void 0!==this.settings.multiTab?this.settings.multiTab:this.multiTab||!1}},watch:{},mounted:function(){ce(this.currentPrimaryColor,!0),this.currentColorWeak!==n.colorWeak&&ue(this.currentColorWeak)},methods:{showDrawer:function(){this.visible=!0},onClose:function(){this.visible=!1},toggle:function(){this.visible=!this.visible},onColorWeak:function(e){this.$emit("change",{type:"colorWeak",value:e}),ue(e)},onMultiTab:function(e){this.$emit("change",{type:"multiTab",value:e})},handleMenuTheme:function(e){this.$emit("change",{type:"theme",value:e})},doCopy:function(){var e=this,t="export default {\n primaryColor: '".concat(this.currentPrimaryColor,"', // primary color of ant design\n navTheme: '").concat(this.currentNavTheme,"', // theme for nav menu\n layout: '").concat(this.layoutMode,"', // nav menu position: sidemenu or topmenu\n contentWidth: '").concat(this.currentContentWidth,"', // layout of content: Fluid or Fixed, only works when layout is topmenu\n fixedHeader: ").concat(this.currentFixedHeader,", // sticky header\n fixSiderbar: ").concat(this.fixSiderbar,", // sticky siderbar\n autoHideHeader: ").concat(this.currentAutoHideHeader,", // auto hide header\n colorWeak: ").concat(this.currentColorWeak,",\n multiTab: ").concat(this.currentMultiTab,",\n production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true'\n}");this.$copyText(t).then(function(t){e.$message.success(e.$t("app.setting.copy.success"))}).catch(function(){e.$message.error(e.$t("app.setting.copy.fail"))})},handleLayout:function(e){this.$emit("change",{type:"layout",value:e}),"topmenu"===e&&this.$emit("change",{type:"fixSiderbar",value:!1})},handleContentWidthChange:function(e){this.$emit("change",{type:"contentWidth",value:e})},changeColor:function(e){this.currentPrimaryColor!==e&&(this.$emit("change",{type:"primaryColor",value:e}),ce(e))},handleFixedHeader:function(e){this.$emit("change",{type:"fixedHeader",value:e})},handleFixedHeaderHidden:function(e){this.$emit("change",{type:"autoHideHeader",value:e})},handleFixSiderbar:function(e){"topmenu"!==this.layoutMode?this.$emit("change",{type:"fixSiderbar",value:e}):this.$emit("change",{type:"fixSiderbar",value:!1})}}},ze=Ke,Ye=(0,R.A)(ze,He,Ue,!1,null,"940007f2",null),Xe=Ye.exports,Je=a(93511),Ze={name:"BasicLayout",components:{SettingDrawer:Xe,RightContent:Be,Icon:Je.In},data:function(){return{isProPreviewSite:!1,isDev:!1,collapsed:!1,title:n.title,settings:{layout:n.layout,contentWidth:"sidemenu"===n.layout?me.OT.Fluid:n.contentWidth,theme:n.navTheme,primaryColor:n.primaryColor,fixedHeader:n.fixedHeader,fixSiderbar:n.fixSiderbar,colorWeak:n.colorWeak,hideHintAlert:!1,hideCopyButton:!1},query:{},isMobile:!1,showLegalModal:!1,showPrivacyModal:!1,refreshKey:0,isDrawerOpen:!1,isDrawerAnimating:!1,menuFooterConfig:{contact:{support_url:"https://t.me/quantdinger",feature_request_url:"https://github.com/brokermr810/QuantDinger/issues",email:"brokermr810@gmail.com",live_chat_url:"https://t.me/quantdinger"},social_accounts:[{name:"GitHub",icon:"github",url:"https://github.com/brokermr810/QuantDinger"},{name:"X",icon:"x",url:"https://x.com/HenryCryption"},{name:"Discord",icon:"discord",url:"https://discord.gg/cn6HVE2KC"},{name:"Telegram",icon:"telegram",url:"https://t.me/quantdinger"},{name:"YouTube",icon:"youtube",url:"https://youtube.com/@quantdinger"}],legal:{user_agreement:"",privacy_policy:""},copyright:"© 2025-2026 QuantDinger. All rights reserved."},isInitialThemeColorLoad:!0}},computed:(0,d.A)((0,d.A)({},(0,D.aH)({mainMenu:function(e){return e.permission.addRouters}})),{},{menus:function(){var e=this.mainMenu.find(function(e){return"/"===e.path});return e&&e.children||[]}}),created:function(){var e=this;this.settings.theme=this.$store.state.app.theme,this.settings.primaryColor=this.$store.state.app.color||n.primaryColor,this.$watch("collapsed",function(){e.$store.commit(me.cf,e.collapsed)}),this.$watch("isMobile",function(){e.$store.commit(me.nd,e.isMobile)}),this.$watch("$store.state.app.theme",function(t){e.settings.theme=t,"dark"===t||"realdark"===t?(document.body.classList.add("dark"),document.body.classList.remove("light")):(document.body.classList.remove("dark"),document.body.classList.add("light"))},{immediate:!0}),this.$watch("$store.state.app.color",function(t){t&&(e.settings.primaryColor=t)},{immediate:!0}),this.$watch("settings.theme",function(e){"dark"===e||"realdark"===e?(document.body.classList.add("dark"),document.body.classList.remove("light")):(document.body.classList.remove("dark"),document.body.classList.add("light"))},{immediate:!0})},mounted:function(){var e=this,t=navigator.userAgent;t.indexOf("Edge")>-1&&this.$nextTick(function(){e.collapsed=!e.collapsed,setTimeout(function(){e.collapsed=!e.collapsed},16)}),this.$root.$on("show-setting-drawer",function(){e.$refs.settingDrawer&&e.$refs.settingDrawer.showDrawer()}),this.$nextTick(function(){setTimeout(function(){e.updateMenuFooterPosition()},200)}),window.addEventListener("resize",this.updateMenuFooterPosition),this.isMobile||(this._desktopFooterInterval=setInterval(function(){e.updateMenuFooterPosition()},1e3));var a=new MutationObserver(function(){if(e.isMobile){var t=document.querySelector(".ant-drawer.ant-drawer-open"),a=e.isDrawerOpen,i=!!t;e.isDrawerOpen=i,a!==e.isDrawerOpen&&(e.isDrawerOpen?(e.isDrawerAnimating=!0,setTimeout(function(){e.isDrawerAnimating=!1,e.updateMenuFooterPosition()},300)):(e.isDrawerAnimating=!1,e.updateMenuFooterPosition()))}});a.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["class"]}),this._menuFooterObserver=a,this._menuFooterInterval=setInterval(function(){if(e.isMobile){var t=document.querySelector(".ant-drawer.ant-drawer-open"),a=!!t;e.isDrawerOpen!==a?(e.isDrawerOpen=a,a?(e.isDrawerAnimating=!0,setTimeout(function(){e.isDrawerAnimating=!1,e.updateMenuFooterPosition()},300)):(e.isDrawerAnimating=!1,e.updateMenuFooterPosition())):a&&!e.isDrawerAnimating&&e.updateMenuFooterPosition()}},200)},beforeDestroy:function(){this.$root.$off("show-setting-drawer"),window.removeEventListener("resize",this.updateMenuFooterPosition),this._menuFooterObserver&&this._menuFooterObserver.disconnect(),this._menuFooterInterval&&clearInterval(this._menuFooterInterval),this._desktopFooterInterval&&clearInterval(this._desktopFooterInterval)},methods:{i18nRender:S,updateMenuFooterPosition:function(){var e=this;this.$nextTick(function(){requestAnimationFrame(function(){var t,a,i=null===(t=e.$el)||void 0===t?void 0:t.querySelector(".custom-menu-footer");if(i)if(e.isMobile){var s=document.querySelector(".ant-drawer.ant-drawer-open");if(e.isDrawerOpen=!!s,s&&!e.isDrawerAnimating){i.style.position="fixed",i.style.bottom="0px",i.style.zIndex="1001",i.style.display="block",i.style.opacity="1";var o=i.offsetHeight||280,n=s.querySelector(".ant-drawer-body");return void(n&&(s.style.setProperty("--footer-height","".concat(o,"px")),n.style.paddingBottom="".concat(o+10,"px"),n.style.overflowY="auto",n.style.overflowX="hidden",n.style.webkitOverflowScrolling="touch"))}if(s&&e.isDrawerAnimating)return i.style.opacity="0",void(i.style.display="block");i.style.display="none",i.style.opacity="0";var r=document.querySelector(".ant-drawer");if(r){var l=r.querySelector(".ant-drawer-body");l&&(l.style.paddingBottom="",l.style.overflowY="",l.style.overflowX="")}}else{var d=(null===(a=e.$el)||void 0===a?void 0:a.querySelector(".ant-pro-sider"))||document.querySelector(".ant-pro-sider");if(d){var c=d.getBoundingClientRect(),u=i.offsetHeight||220;i.style.position="fixed",i.style.left="".concat(c.left,"px"),i.style.bottom="0px",i.style.zIndex="100",i.style.display="block",d.style.setProperty("--menu-footer-height","".concat(u,"px"));var m=d.querySelector(".ant-layout-sider-children");m&&(m.style.paddingBottom="".concat(u+12,"px"),m.style.overflowY="auto",m.style.overflowX="hidden",m.style.webkitOverflowScrolling="touch");var g=d.querySelector(".ant-pro-sider-menu")||d.querySelector(".ant-menu-root")||d.querySelector(".ant-menu");if(g){var p=Math.max(c.height-u-12,120);g.style.maxHeight="".concat(p,"px"),g.style.overflowY="auto",g.style.overflowX="hidden",g.style.webkitOverflowScrolling="touch"}}else i.style.position="fixed",i.style.left="0px",i.style.bottom="0px",i.style.zIndex="100",i.style.display="block"}})})},handleRefresh:function(){this.refreshKey+=1},handleMediaQuery:function(e){var t=this;if(this.query=e,this.isMobile&&!e["screen-xs"])return this.isMobile=!1,void this.$nextTick(function(){t.updateMenuFooterPosition()});!this.isMobile&&e["screen-xs"]&&(this.isMobile=!0,this.collapsed=!1,this.settings.contentWidth=me.OT.Fluid,this.$nextTick(function(){t.updateMenuFooterPosition()}))},handleCollapse:function(e){var t=this;this.collapsed=e,this.$nextTick(function(){t.updateMenuFooterPosition()})},handleMobileMenuToggle:function(){var e=this;this.$nextTick(function(){setTimeout(function(){e.updateMenuFooterPosition()},300)})},handleSettingChange:function(e){var t=e.type,a=e.value;switch(t&&(this.settings[t]=a),t){case"theme":this.$store.commit(me.RM,a);break;case"primaryColor":this.$store.commit(me.Db,a);break;case"layout":this.$store.commit(me.yG,a),"sidemenu"===a?this.settings.contentWidth=me.OT.Fluid:(this.settings.fixSiderbar=!1,this.settings.contentWidth=me.OT.Fixed);break;case"contentWidth":this.settings[t]=a,this.$store.commit(me.sl,a);break;case"fixedHeader":this.$store.commit(me.MV,a);break;case"autoHideHeader":this.$store.commit(me.Wb,a);break;case"fixSiderbar":this.$store.commit(me.Fb,a);break;case"colorWeak":this.$store.commit(me.o6,a);break;case"multiTab":this.$store.commit(me.jc,a);break}}}},et=Ze,tt=(0,R.A)(et,te,ae,!1,null,null,null),at=tt.exports,it={name:"RouteView",props:{keepAlive:{type:Boolean,default:!0}},data:function(){return{}},render:function(){var e=arguments[0],t=this.$route.meta,a=this.$store.getters,i=e("keep-alive",[e("router-view")]),s=e("router-view");return(a.multiTab||t.keepAlive)&&(this.keepAlive||a.multiTab||t.keepAlive)?i:s}},st=it,ot=(0,R.A)(st,w,T,!1,null,null,null),nt=(ot.exports,function(){var e=this,t=e._self._c;return t("page-header-wrapper",[t("router-view")],1)}),rt=[],lt={name:"PageView"},dt=lt,ct=(0,R.A)(dt,nt,rt,!1,null,null,null),ut=(ct.exports,[{path:"/",name:"index",component:at,meta:{title:"menu.home"},redirect:"/dashboard",children:[{path:"/dashboard",name:"Dashboard",component:function(){return Promise.all([a.e(529),a.e(201)]).then(a.bind(a,8201))},meta:{title:"menu.dashboard",keepAlive:!0,icon:"dashboard",permission:["dashboard"]}},{path:"/ai-analysis/:pageNo([1-9]\\d*)?",name:"Analysis",component:function(){return a.e(878).then(a.bind(a,20878))},hidden:!0,meta:{title:"menu.dashboard.analysis",keepAlive:!1,icon:"thunderbolt",permission:["dashboard"]}},{path:"/ai-asset-analysis",name:"AIAssetAnalysis",component:function(){return Promise.all([a.e(878),a.e(494),a.e(362),a.e(377)]).then(a.bind(a,14966))},meta:{title:"menu.dashboard.aiAssetAnalysis",keepAlive:!1,icon:"appstore",permission:["dashboard"]}},{path:"/indicator-analysis",name:"Indicator",component:function(){return Promise.all([a.e(529),a.e(362),a.e(99)]).then(a.bind(a,82952))},meta:{title:"menu.dashboard.indicator",keepAlive:!0,icon:"line-chart",permission:["dashboard"]}},{path:"/indicator-community",name:"IndicatorCommunity",component:function(){return a.e(55).then(a.bind(a,30055))},meta:{title:"menu.dashboard.community",keepAlive:!1,icon:"shop",permission:["dashboard"]}},{path:"/trading-assistant",name:"TradingAssistant",component:function(){return a.e(192).then(a.bind(a,57192))},meta:{title:"menu.dashboard.tradingAssistant",keepAlive:!0,icon:"robot",permission:["dashboard"]}},{path:"/portfolio",name:"Portfolio",component:function(){return a.e(494).then(a.bind(a,21494))},hidden:!0,meta:{title:"menu.dashboard.portfolio",keepAlive:!0,icon:"fund",permission:["dashboard"]}},{path:"/user-manage",name:"UserManage",component:function(){return a.e(113).then(a.bind(a,64494))},meta:{title:"menu.userManage",keepAlive:!1,icon:"team",permission:["admin"]}},{path:"/profile",name:"Profile",component:function(){return a.e(177).then(a.bind(a,49177))},meta:{title:"menu.myProfile",keepAlive:!1,icon:"user",permission:["dashboard"]}},{path:"/billing",name:"Billing",component:function(){return a.e(785).then(a.bind(a,1785))},meta:{title:"menu.billing",keepAlive:!1,icon:"wallet",permission:["dashboard"]}},{path:"/settings",name:"Settings",component:function(){return a.e(613).then(a.bind(a,64613))},meta:{title:"menu.settings",keepAlive:!1,icon:"setting",permission:["admin"]}}]},{path:"*",redirect:"/404",hidden:!0}]),mt=[{path:"/user",component:z,redirect:"/user/login",hidden:!0,children:[{path:"login",name:"login",component:function(){return a.e(806).then(a.bind(a,42250))}}]},{path:"/404",component:function(){return a.e(143).then(a.bind(a,32319))}}],gt=M.Ay.prototype.push;M.Ay.prototype.push=function(e,t,a){return t||a?gt.call(this,e,t,a):gt.call(this,e).catch(function(e){return e})},i.Ay.use(M.Ay);var pt=function(){return new M.Ay({mode:"hash",routes:mt})},ht=pt();function ft(){var e=pt();ht.matcher=e.matcher}var yt,bt=ht,vt={state:{sideCollapsed:!1,isMobile:!1,theme:m().get(me.RM,"light"),layout:"",contentWidth:"",fixedHeader:!1,fixedSidebar:!1,autoHideHeader:!1,color:m().get(me.Db,"#13C2C2"),weak:!1,multiTab:!0,lang:"en-US",_antLocale:{}},mutations:(yt={},(0,he.A)((0,he.A)((0,he.A)((0,he.A)((0,he.A)((0,he.A)((0,he.A)((0,he.A)((0,he.A)((0,he.A)(yt,me.cf,function(e,t){e.sideCollapsed=t,m().set(me.cf,t)}),me.nd,function(e,t){e.isMobile=t}),me.RM,function(e,t){e.theme=t,m().set(me.RM,t)}),me.yG,function(e,t){e.layout=t,m().set(me.yG,t)}),me.MV,function(e,t){e.fixedHeader=t,m().set(me.MV,t)}),me.Fb,function(e,t){e.fixedSidebar=t,m().set(me.Fb,t)}),me.sl,function(e,t){e.contentWidth=t,m().set(me.sl,t)}),me.Wb,function(e,t){e.autoHideHeader=t,m().set(me.Wb,t)}),me.Db,function(e,t){e.color=t,m().set(me.Db,t)}),me.o6,function(e,t){e.weak=t,m().set(me.o6,t)}),(0,he.A)((0,he.A)(yt,me.$C,function(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};e.lang=t,e._antLocale=a,m().set(me.$C,t)}),me.jc,function(e,t){m().set(me.jc,t),e.multiTab=t})),actions:{setLang:function(e,t){var a=e.commit;return new Promise(function(e,i){a(me.$C,t),k(t).then(function(){e()}).catch(function(e){i(e)})})}}},At=vt,kt=a(44735),St=a(26398),wt=a.n(St),Tt=a(505),Pt=a(67569);m().addPlugin(wt());var Ct={id:"default",permissionList:[]};function Et(e){return e?Array.isArray(e)?e:[e]:[]}function Rt(){var e=m().get(me.nc)||{};return e&&"object"===(0,kt.A)(e)?e:{}}function It(){var e=m().get(me.iK)||[];return Et(e)}function _t(){var e=m().get(me.Xh);return"string"===typeof e?e:e&&e.token?e.token:e}var Mt=Rt(),Lt=It();Mt&&"undefined"===typeof Mt.is_demo&&(Lt=[]);var xt=_t()||"",Dt=Mt.nickname||Mt.username||"",Nt=Mt.avatar||"",Ft=Dt?(0,Pt.dH)():"",Ot={state:{token:xt,name:Dt,welcome:Ft,avatar:Nt,roles:Lt,info:Mt},mutations:{SET_TOKEN:function(e,t){e.token=t},SET_NAME:function(e,t){var a=t.name,i=t.welcome;e.name=a,e.welcome=i},SET_AVATAR:function(e,t){e.avatar=t},SET_ROLES:function(e,t){e.roles=t},SET_INFO:function(e,t){e.info=t}},actions:{Login:function(e,t){var a=e.commit,i=e.dispatch;return new Promise(function(e,s){(0,Tt.iD)(t).then(function(t){if(t&&1===t.code&&t.data){var o=t.data,n=o.token,r=o.userinfo||{},l=(new Date).getTime()+6048e5;m().set(me.Xh,n,l),a("SET_TOKEN",n),a("SET_INFO",r),m().set(me.nc,r,l);var d=r.nickname||r.username||"User";a("SET_NAME",{name:d,welcome:(0,Pt.dH)()}),a("SET_AVATAR",r.avatar||"/avatar2.jpg");var c=[Ct];if(r.role){var u=r.role.id||r.role,g=r.role.permissions||[];c=[{id:u,permissionList:g.length>0?g:["dashboard"]}]}a("SET_ROLES",c),m().set(me.iK,c,l),i("ResetRoutes"),e(t)}else s(new Error(t&&t.msg||"Login failed"))}).catch(function(e){s(e)})})},Web3LoginFinalize:function(e,t){var a=e.commit;return new Promise(function(e,i){try{var s=t.token,o=t.userInfo;if(!s||!o)return void i(new Error("登录数据异常"));m().set(me.Xh,s,(new Date).getTime()+6048e5),a("SET_TOKEN",s),a("SET_INFO",o),o.nickname?a("SET_NAME",{name:o.nickname,welcome:(0,Pt.dH)()}):o.username&&a("SET_NAME",{name:o.username,welcome:(0,Pt.dH)()}),o.avatar&&a("SET_AVATAR",o.avatar),o.role?a("SET_ROLES",o.role):o.roles?a("SET_ROLES",o.roles):a("SET_ROLES",[{id:"default",permissionList:[]}]),e()}catch(n){i(n)}})},FetchUserInfo:function(e){var t=e.commit;return new Promise(function(e,a){(0,Tt.ug)().then(function(i){if(i&&1===i.code&&i.data){var s=i.data;t("SET_INFO",s),s.nickname?t("SET_NAME",{name:s.nickname,welcome:(0,Pt.dH)()}):s.username&&t("SET_NAME",{name:s.username,welcome:(0,Pt.dH)()}),s.avatar&&t("SET_AVATAR",s.avatar),e(s)}else a(new Error(i&&i.msg||"获取用户信息失败"))}).catch(function(e){return a(e)})})},GetInfo:function(e){var t=e.commit,a=e.state;return new Promise(function(e,i){if(a.info&&Object.keys(a.info).length>0&&"undefined"!==typeof a.info.is_demo){var s=a.info;if(s.role){var o=Et(s.role);t("SET_ROLES",o),m().set(me.iK,o,(new Date).getTime()+6048e5)}else if(s.roles){var n=Et(s.roles);t("SET_ROLES",n),m().set(me.iK,n,(new Date).getTime()+6048e5)}else t("SET_ROLES",[Ct]),m().set(me.iK,[Ct],(new Date).getTime()+6048e5);e(a.info)}else(0,Tt.ug)().then(function(a){if(a&&1===a.code&&a.data){var s=a.data;if(t("SET_INFO",s),m().set(me.nc,s,(new Date).getTime()+6048e5),s.nickname?t("SET_NAME",{name:s.nickname,welcome:(0,Pt.dH)()}):s.username&&t("SET_NAME",{name:s.username,welcome:(0,Pt.dH)()}),s.avatar&&t("SET_AVATAR",s.avatar),s.role){var o=Et(s.role);t("SET_ROLES",o),m().set(me.iK,o,(new Date).getTime()+6048e5)}else if(s.roles){var n=Et(s.roles);t("SET_ROLES",n),m().set(me.iK,n,(new Date).getTime()+6048e5)}else t("SET_ROLES",[Ct]),m().set(me.iK,[Ct],(new Date).getTime()+6048e5);e(s)}else i(new Error(a&&a.msg||"用户信息不存在"))}).catch(function(e){return i(e)})})},Logout:function(e){var t=e.commit,a=e.dispatch;return new Promise(function(e){(0,Tt.ri)().then(function(){t("SET_TOKEN",""),t("SET_ROLES",[]),t("SET_INFO",{}),t("SET_NAME",{name:"",welcome:""}),t("SET_AVATAR",""),m().remove(me.Xh),m().remove(me.nc),m().remove(me.iK),a("ResetRoutes"),e()}).catch(function(){m().remove(me.Xh),m().remove(me.nc),m().remove(me.iK),a("ResetRoutes"),e()}).finally(function(){})})}}},Bt=Ot,Ht=a(57532);function Ut(e,t){var a,i=[],s=(0,Ht.A)(e);try{for(s.s();!(a=s.n()).done;){var o,n=a.value,r=(0,d.A)({},n),l=(null===(o=r.meta)||void 0===o?void 0:o.permission)||[],c=l.includes("admin");c&&!t||(r.children&&r.children.length>0&&(r.children=Ut(r.children,t)),i.push(r))}}catch(u){s.e(u)}finally{s.f()}return i}function qt(){var e=m().get(me.nc)||{};if(e.role){var t="string"===typeof e.role?e.role:e.role.id;if("admin"===t)return!0}var a=m().get(me.iK)||[];if(Array.isArray(a)){var i,s=(0,Ht.A)(a);try{for(s.s();!(i=s.n()).done;){var o=i.value;if(o&&("admin"===o.id||"admin"===o))return!0}}catch(n){s.e(n)}finally{s.f()}}return!1}var jt=function(e){return new Promise(function(e){var t=qt(),a=Ut(ut,t);e(a)})},Wt={state:{routers:mt,addRouters:[]},mutations:{SET_ROUTERS:function(e,t){e.addRouters=t,e.routers=mt.concat(t)},RESET_ROUTERS:function(e){e.addRouters=[],e.routers=mt}},actions:{GenerateRoutes:function(e,t){var a=e.commit;e.rootState;return new Promise(function(e,i){var s=t.token;jt(s).then(function(t){a("SET_ROUTERS",t),e()}).catch(function(e){i(e)})})},ResetRoutes:function(e){var t=e.commit;t("RESET_ROUTERS")}}},$t=Wt,Gt={isMobile:function(e){return e.app.isMobile},lang:function(e){return e.app.lang},theme:function(e){return e.app.theme},color:function(e){return e.app.color},token:function(e){return e.user.token},avatar:function(e){return e.user.avatar},nickname:function(e){return e.user.name},welcome:function(e){return e.user.welcome},roles:function(e){return e.user.roles},userInfo:function(e){return e.user.info},addRouters:function(e){return e.permission.addRouters},multiTab:function(e){return e.app.multiTab}},Vt=Gt;i.Ay.use(D.Ay);var Qt=new D.Ay.Store({modules:{app:At,user:Bt,permission:$t},state:{},mutations:{},actions:{},getters:Vt}),Kt=a(20931),zt={theme:[{key:"dark",fileName:"dark.css",theme:"dark"},{key:"#F5222D",fileName:"#F5222D.css",modifyVars:{"@primary-color":"#F5222D"}},{key:"#FA541C",fileName:"#FA541C.css",modifyVars:{"@primary-color":"#FA541C"}},{key:"#FAAD14",fileName:"#FAAD14.css",modifyVars:{"@primary-color":"#FAAD14"}},{key:"#13C2C2",fileName:"#13C2C2.css",modifyVars:{"@primary-color":"#13C2C2"}},{key:"#52C41A",fileName:"#52C41A.css",modifyVars:{"@primary-color":"#52C41A"}},{key:"#2F54EB",fileName:"#2F54EB.css",modifyVars:{"@primary-color":"#2F54EB"}},{key:"#722ED1",fileName:"#722ED1.css",modifyVars:{"@primary-color":"#722ED1"}},{key:"#F5222D",theme:"dark",fileName:"dark-#F5222D.css",modifyVars:{"@primary-color":"#F5222D"}},{key:"#FA541C",theme:"dark",fileName:"dark-#FA541C.css",modifyVars:{"@primary-color":"#FA541C"}},{key:"#FAAD14",theme:"dark",fileName:"dark-#FAAD14.css",modifyVars:{"@primary-color":"#FAAD14"}},{key:"#13C2C2",theme:"dark",fileName:"dark-#13C2C2.css",modifyVars:{"@primary-color":"#13C2C2"}},{key:"#52C41A",theme:"dark",fileName:"dark-#52C41A.css",modifyVars:{"@primary-color":"#52C41A"}},{key:"#2F54EB",theme:"dark",fileName:"dark-#2F54EB.css",modifyVars:{"@primary-color":"#2F54EB"}},{key:"#722ED1",theme:"dark",fileName:"dark-#722ED1.css",modifyVars:{"@primary-color":"#722ED1"}}]},Yt=function(){};function Xt(){Yt(),Qt.commit(me.yG,m().get(me.yG,n.layout)),Qt.commit(me.MV,m().get(me.MV,n.fixedHeader)),Qt.commit(me.Fb,m().get(me.Fb,n.fixSiderbar)),Qt.commit(me.sl,m().get(me.sl,n.contentWidth)),Qt.commit(me.Wb,m().get(me.Wb,n.autoHideHeader)),Qt.commit(me.RM,m().get(me.RM,n.navTheme)),Qt.commit(me.o6,m().get(me.o6,n.colorWeak)),Qt.commit(me.Db,m().get(me.Db,n.primaryColor)),Qt.commit(me.jc,m().get(me.jc,n.multiTab));var e=m().get(me.Xh);e&&"string"!==typeof e&&(e=e.token||e.value||("object"===(0,kt.A)(e)?null:e)),e="string"===typeof e?e:null,Qt.commit("SET_TOKEN",e),Qt.dispatch("setLang",m().get(me.$C,"en-US"))}a(13559);var Jt,Zt,ea=a(56427),ta=(a(89999),a(3837),a(63956)),aa=(a(46696),a(30692)),ia=(a(27377),a(2970)),sa=(a(89996),a(8442)),oa=(a(61443),a(9426)),na=(a(88320),a(60304)),ra=(a(78377),a(12393)),la=(a(64291),a(90895)),da=(a(94891),a(50257)),ca=(a(98215),a(68263)),ua=(a(92283),a(93167)),ma=(a(37921),a(27448)),ga=(a(5228),a(83766)),pa=(a(7225),a(60031)),ha=(a(25257),a(97345)),fa=(a(24870),a(87298)),ya=(a(93316),a(64274)),ba=(a(94955),a(90500)),va=(a(78221),a(41446)),Aa=(a(45870),a(82840)),ka=(a(44043),a(39962)),Sa=(a(36417),a(65847)),wa=(a(53033),a(64719)),Ta=(a(85494),a(47132)),Pa=(a(69941),a(94261)),Ca=(a(6875),a(98169)),Ea=(a(47482),a(14248)),Ra=(a(42290),a(76806)),Ia=(a(35184),a(29966)),_a=(a(12854),a(812)),Ma=(a(76052),a(70742)),La=(a(8740),a(15001)),xa=(a(43751),a(34149)),Da=(a(1852),a(73856)),Na=(a(40662),a(25824)),Fa=(a(74721),a(75842)),Oa=(a(82187),a(63301)),Ba=(a(56042),a(91997)),Ha=(a(77050),a(49084)),Ua=(a(70208),a(66066)),qa=(a(92786),a(57155)),ja=(a(74332),a(37896)),Wa=(a(16878),a(39161)),$a=a(17756),Ga=a.n($a),Va=function(e){function t(t,a,i){var s=this;if(i=i||{},s&&s._isVue){var o=document.querySelector("body>div[type=dialog]");o||(o=document.createElement("div"),o.setAttribute("type","dialog"),document.body.appendChild(o));var n=function(e,t){if(e instanceof Function){var a=e();a instanceof Promise?a.then(function(e){e&&t()}):a&&t()}else e||t()},r=new e({data:function(){return{visible:!0}},router:s.$router,store:s.$store,mounted:function(){var e=this;this.$on("close",function(t){e.handleClose()})},methods:{handleClose:function(){var e=this;n(this.$refs._component.onCancel,function(){e.visible=!1,e.$refs._component.$emit("close"),e.$refs._component.$emit("cancel"),r.$destroy()})},handleOk:function(){var e=this;n(this.$refs._component.onOK||this.$refs._component.onOk,function(){e.visible=!1,e.$refs._component.$emit("close"),e.$refs._component.$emit("ok"),r.$destroy()})}},render:function(e){var s=this,o=i&&i.model;o&&delete i.model;var n=Object.assign({},o&&{model:o}||{},{attrs:Object.assign({},(0,d.A)({},i.attrs||i),{visible:this.visible}),on:Object.assign({},(0,d.A)({},i.on||i),{ok:function(){s.handleOk()},cancel:function(){s.handleClose()}})}),r=a&&a.model;r&&delete a.model;var l=Object.assign({},r&&{model:r}||{},{ref:"_component",attrs:Object.assign({},(0,d.A)({},a&&a.attrs||a)),on:Object.assign({},(0,d.A)({},a&&a.on||a))});return e(be.A,n,[e(t,l)])}}).$mount(o)}}Object.defineProperty(e.prototype,"$dialog",{get:function(){return function(){t.apply(this,arguments)}}})},Qa=new i.Ay,Ka={name:"MultiTab",data:function(){return{fullPathList:[],pages:[],activeKey:"",newTabIndex:0}},created:function(){var e=this;Qa.$on("open",function(t){if(!t)throw new Error("multi-tab: open tab ".concat(t," err"));e.activeKey=t}).$on("close",function(t){t?e.closeThat(t):e.closeThat(e.activeKey)}).$on("rename",function(t){var a=t.key,i=t.name;try{var s=e.pages.find(function(e){return e.path===a});s.meta.customTitle=i,e.$forceUpdate()}catch(o){}}),this.pages.push(this.$route),this.fullPathList.push(this.$route.fullPath),this.selectedLastPath()},methods:{onEdit:function(e,t){this[t](e)},remove:function(e){this.pages=this.pages.filter(function(t){return t.fullPath!==e}),this.fullPathList=this.fullPathList.filter(function(t){return t!==e}),this.fullPathList.includes(this.activeKey)||this.selectedLastPath()},selectedLastPath:function(){this.activeKey=this.fullPathList[this.fullPathList.length-1]},closeThat:function(e){this.fullPathList.length>1?this.remove(e):this.$message.info("这是最后一个标签了, 无法被关闭")},closeLeft:function(e){var t=this,a=this.fullPathList.indexOf(e);a>0?this.fullPathList.forEach(function(e,i){i<a&&t.remove(e)}):this.$message.info("左侧没有标签")},closeRight:function(e){var t=this,a=this.fullPathList.indexOf(e);a<this.fullPathList.length-1?this.fullPathList.forEach(function(e,i){i>a&&t.remove(e)}):this.$message.info("右侧没有标签")},closeAll:function(e){var t=this,a=this.fullPathList.indexOf(e);this.fullPathList.forEach(function(e,i){i!==a&&t.remove(e)})},closeMenuClick:function(e,t){this[e](t)},renderTabPaneMenu:function(e){var t=this,a=this.$createElement;return a("a-menu",{on:(0,d.A)({},{click:function(a){var i=a.key;a.item,a.domEvent;t.closeMenuClick(i,e)}})},[a("a-menu-item",{key:"closeThat"},["关闭当前标签"]),a("a-menu-item",{key:"closeRight"},["关闭右侧"]),a("a-menu-item",{key:"closeLeft"},["关闭左侧"]),a("a-menu-item",{key:"closeAll"},["关闭全部"])])},renderTabPane:function(e,t){var a=this.$createElement,i=this.renderTabPaneMenu(t);return a("a-dropdown",{attrs:{overlay:i,trigger:["contextmenu"]}},[a("span",{style:{userSelect:"none"}},[e])])}},watch:{$route:function(e){this.activeKey=e.fullPath,this.fullPathList.indexOf(e.fullPath)<0&&(this.fullPathList.push(e.fullPath),this.pages.push(e))},activeKey:function(e){this.$router.push({path:e})}},render:function(){var e=this,t=arguments[0],a=this.onEdit,i=this.$data.pages,s=i.map(function(a){return t("a-tab-pane",{style:{height:0},attrs:{tab:e.renderTabPane(a.meta.customTitle||a.meta.title,a.fullPath),closable:i.length>1},key:a.fullPath})});return t("div",{class:"ant-pro-multi-tab"},[t("div",{class:"ant-pro-multi-tab-wrapper"},[t("a-tabs",{attrs:{hideAdd:!0,type:"editable-card",tabBarStyle:{background:"#FFF",margin:0,paddingLeft:"16px",paddingTop:"1px"}},on:(0,d.A)({},{edit:a}),model:{value:e.activeKey,callback:function(t){e.activeKey=t}}},[s])])])}},za=Ka,Ya=(0,R.A)(za,Jt,Zt,!1,null,null,null),Xa=Ya.exports,Ja={open:function(e){Qa.$emit("open",e)},rename:function(e,t){Qa.$emit("rename",{key:e,name:t})},closeCurrentPage:function(){this.close()},close:function(e){Qa.$emit("close",e)}};Xa.install=function(e){e.prototype.$multiTab||(Ja.instance=Qa,e.prototype.$multiTab=Ja,e.component("MultiTab",Xa))};var Za=Xa,ei={name:"PageLoading",props:{tip:{type:String,default:"Loading.."},size:{type:String,default:"large"}},render:function(){var e=arguments[0],t={textAlign:"center",background:"rgba(0,0,0,0.6)",position:"fixed",top:0,bottom:0,left:0,right:0,zIndex:1100},a={position:"absolute",left:"50%",top:"40%",transform:"translate(-50%, -50%)"};return e("div",{style:t},[e(Aa.A,{attrs:{size:this.size,tip:this.tip},style:a})])}},ti="0.0.1",ai={newInstance:function(e,t){var a=document.querySelector("body>div[type=loading]");a||(a=document.createElement("div"),a.setAttribute("type","loading"),a.setAttribute("class","ant-loading-wrapper"),document.body.appendChild(a));var i=Object.assign({visible:!1,size:"large",tip:"Loading..."},t),s=new e({data:function(){return(0,d.A)({},i)},render:function(){var e=arguments[0],t=this.tip,a={};return this.tip&&(a.tip=t),this.visible?e(ei,{props:(0,d.A)({},a)}):null}}).$mount(a);function o(e){var t=(0,d.A)((0,d.A)({},i),e),a=t.visible,o=t.size,n=t.tip;s.$set(s,"visible",a),n&&s.$set(s,"tip",n),o&&s.$set(s,"size",o)}return{instance:s,update:o}}},ii={show:function(e){this.instance.update((0,d.A)((0,d.A)({},e),{},{visible:!0}))},hide:function(){this.instance.update({visible:!1})}},si=function(e,t){e.prototype.$loading||(ii.instance=ai.newInstance(e,t),e.prototype.$loading=ii)},oi={version:ti,install:si},ni=a(15863),ri={add:{key:"add",label:"新增"},delete:{key:"delete",label:"删除"},edit:{key:"edit",label:"修改"},query:{key:"query",label:"查询"},get:{key:"get",label:"详情"},enable:{key:"enable",label:"启用"},disable:{key:"disable",label:"禁用"},import:{key:"import",label:"导入"},export:{key:"export",label:"导出"}};function li(e){li.installed||(!e.prototype.$auth&&Object.defineProperties(e.prototype,{$auth:{get:function(){var e=this;return function(t){var a=t.split("."),i=(0,ni.A)(a,2),s=i[0],o=i[1],n=e.$store.getters.roles.permissions;return n.find(function(e){return e.permissionId===s}).actionList.findIndex(function(e){return e===o})>-1}}}}),!e.prototype.$enum&&Object.defineProperties(e.prototype,{$enum:{get:function(){return function(e){var t=ri;return e&&e.split(".").forEach(function(e){t=t&&t[e]||null}),t}}}}))}var di=li;i.Ay.directive("action",{inserted:function(e,t,a){var i=t.arg,s=Qt.getters.roles,o=a.context.$route.meta.permission,n="[object String]"===Object.prototype.toString.call(o)&&[o]||o;s.permissions.forEach(function(t){n.includes(t.permissionId)&&t.actionList&&!t.actionList.includes(i)&&(e.parentNode&&e.parentNode.removeChild(e)||(e.style.display="none"))})}});i.Ay.use(Wa.A),i.Ay.use(ja.A),i.Ay.use(qa.A),i.Ay.use(Ua.A),i.Ay.use(Ha.A),i.Ay.use(Ba.A),i.Ay.use(Oa.Ay),i.Ay.use(Fa.A),i.Ay.use(Na.Ay),i.Ay.use(Da.A),i.Ay.use(xa.A),i.Ay.use(La.Ay),i.Ay.use(Ma.Ay),i.Ay.use(_a.A),i.Ay.use(Ia.A),i.Ay.use(be.A),i.Ay.use(Ra.A),i.Ay.use(Ea.Ay),i.Ay.use(O.A),i.Ay.use(Ca.A),i.Ay.use(Pa.A),i.Ay.use(F.Ay),i.Ay.use(Ta.Ay),i.Ay.use(wa.A),i.Ay.use(Sa.A),i.Ay.use(ka.A),i.Ay.use(Aa.A),i.Ay.use(B.Ay),i.Ay.use(va.A),i.Ay.use(ba.A),i.Ay.use(ya.A),i.Ay.use(fa.A),i.Ay.use(ha.A),i.Ay.use(pa.A),i.Ay.use(ga.Ay),i.Ay.use(ma.Ay),i.Ay.use(ua.A),i.Ay.use(ca.A),i.Ay.use(da.A),i.Ay.use(la.A),i.Ay.use(ra.Ay),i.Ay.use(na.A),i.Ay.use(oa.Ay),i.Ay.use(sa.Ay),i.Ay.use(ia.Ay),i.Ay.use(aa.A),i.Ay.use(ta.A),i.Ay.prototype.$confirm=be.A.confirm,i.Ay.prototype.$message=ie.A,i.Ay.prototype.$notification=ea.A,i.Ay.prototype.$info=be.A.info,i.Ay.prototype.$success=be.A.success,i.Ay.prototype.$error=be.A.error,i.Ay.prototype.$warning=be.A.warning,i.Ay.use(Va),i.Ay.use(Za),i.Ay.use(oi),i.Ay.use(di),i.Ay.use(Ga());var ci=a(5947),ui=a.n(ci);ui().configure({showSpinner:!1});var mi=["login"],gi="/user/login",pi="/dashboard";bt.beforeEach(function(e,t,a){ui().start(),e.meta&&"undefined"!==typeof e.meta.title&&r("".concat(S(e.meta.title)," - ").concat(l));var i=m().get(me.Xh);if(i&&"string"!==typeof i&&(i=i.token||i.value||("object"===(0,kt.A)(i)?null:i)),i="string"===typeof i?i:null,i)if(e.path===gi)a({path:pi}),ui().done();else if(0===Qt.getters.roles.length)Qt.dispatch("GetInfo").then(function(s){Qt.dispatch("GenerateRoutes",{token:i}).then(function(){ft(),Qt.getters.addRouters.forEach(function(e){bt.addRoute(e)});var i=decodeURIComponent(t.query.redirect||e.path);e.path===i?a((0,d.A)((0,d.A)({},e),{},{replace:!0})):a({path:i})})}).catch(function(t){var s=t&&t.response&&t.response.status;401!==s?(Qt.commit("SET_ROLES",[{id:"default",permissionList:[]}]),Qt.dispatch("GenerateRoutes",{token:i}).then(function(){ft(),Qt.getters.addRouters.forEach(function(e){return bt.addRoute(e)}),a((0,d.A)((0,d.A)({},e),{},{replace:!0}))}).catch(function(){a()})):Qt.dispatch("Logout").finally(function(){a({path:gi,query:{redirect:e.fullPath}}),ui().done()})});else{var s=Qt.getters.addRouters;s&&0!==s.length?a():Qt.dispatch("GenerateRoutes",{token:i}).then(function(){ft(),Qt.getters.addRouters.forEach(function(e){bt.addRoute(e)}),a((0,d.A)((0,d.A)({},e),{},{replace:!0}))}).catch(function(){a()})}else mi.includes(e.name)?a():(a({path:gi,query:{redirect:e.fullPath}}),ui().done())}),bt.afterEach(function(){ui().done()});a(52648);if(p().locale("zh-cn"),i.Ay.filter("NumberFormat",function(e){if(!e)return"0";var t=e.toString().replace(/(\d)(?=(?:\d{3})+$)/g,"$1,");return t}),i.Ay.filter("dayjs",function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"YYYY-MM-DD HH:mm:ss";return p()(e).format(t)}),i.Ay.filter("moment",function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"YYYY-MM-DD HH:mm:ss";return p()(e).format(t)}),i.Ay.config.productionTip=!1,"undefined"!==typeof window){var hi=function(e){var t=e&&(e.reason&&e.reason.message||e.message)||"";if(t.includes("ResizeObserver loop")||t.includes("ResizeObserver loop limit exceeded"))return e.preventDefault&&e.preventDefault(),e.stopImmediatePropagation&&e.stopImmediatePropagation(),!1};window.addEventListener("error",hi),window.addEventListener("unhandledrejection",hi)}i.Ay.use(Ie.He),i.Ay.component("ProLayout",Kt.Ay),i.Ay.component("PageContainer",Kt.sm),i.Ay.component("PageHeaderWrapper",Kt.sm),window.umi_plugin_ant_themeVar=zt.theme,new i.Ay({router:bt,store:Qt,i18n:P,created:Xt,render:function(e){return e(_)}}).$mount("#app")}},t={};function a(i){var s=t[i];if(void 0!==s)return s.exports;var o=t[i]={id:i,loaded:!1,exports:{}};return e[i].call(o.exports,o,o.exports,a),o.loaded=!0,o.exports}a.m=e,function(){var e=[];a.O=function(t,i,s,o){if(!i){var n=1/0;for(c=0;c<e.length;c++){i=e[c][0],s=e[c][1],o=e[c][2];for(var r=!0,l=0;l<i.length;l++)(!1&o||n>=o)&&Object.keys(a.O).every(function(e){return a.O[e](i[l])})?i.splice(l--,1):(r=!1,o<n&&(n=o));if(r){e.splice(c--,1);var d=s();void 0!==d&&(t=d)}}return t}o=o||0;for(var c=e.length;c>0&&e[c-1][2]>o;c--)e[c]=e[c-1];e[c]=[i,s,o]}}(),function(){a.n=function(e){var t=e&&e.__esModule?function(){return e["default"]}:function(){return e};return a.d(t,{a:t}),t}}(),function(){a.d=function(e,t){for(var i in t)a.o(t,i)&&!a.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})}}(),function(){a.f={},a.e=function(e){return Promise.all(Object.keys(a.f).reduce(function(t,i){return a.f[i](e,t),t},[]))}}(),function(){a.u=function(e){return"js/"+({143:"fail",301:"lang-th-TH",424:"lang-vi-VN",618:"lang-ar-SA",638:"lang-ja-JP",644:"lang-zh-CN",806:"user",840:"lang-ko-KR",879:"lang-de-DE",892:"lang-zh-TW",969:"lang-fr-FR"}[e]||e)+"-legacy."+{55:"50f03e02",99:"4dc22e38",113:"3de45678",143:"f78aef6d",177:"2b7663a7",192:"c0ec9e99",201:"a0d260f7",301:"e5529fc0",362:"d0919219",377:"927b43d0",424:"572e1707",494:"becf1b1a",529:"21232985",613:"d556f610",618:"2f792422",638:"90e4c17b",644:"2dcdb0c7",785:"7cb39e0d",806:"d3124242",824:"97e5def2",840:"3f132a00",878:"7d5e6dd5",879:"39ccb5ff",892:"0e9cf26c",969:"80c6db65"}[e]+".js"}}(),function(){a.miniCssF=function(e){return"css/"+(806===e?"user":e)+"."+{55:"0fa7daa0",99:"1113ae8a",113:"fea2e0fa",177:"2ed32d66",192:"443c56d4",201:"02ed56c8",377:"729cfe93",494:"c3803b75",613:"20e2b587",785:"9a2b4136",806:"2e836280",878:"23a4bc42"}[e]+".css"}}(),function(){a.g=function(){if("object"===typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"===typeof window)return window}}()}(),function(){a.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}}(),function(){var e={},t="vue-antd-pro:";a.l=function(i,s,o,n){if(e[i])e[i].push(s);else{var r,l;if(void 0!==o)for(var d=document.getElementsByTagName("script"),c=0;c<d.length;c++){var u=d[c];if(u.getAttribute("src")==i||u.getAttribute("data-webpack")==t+o){r=u;break}}r||(l=!0,r=document.createElement("script"),r.charset="utf-8",r.timeout=120,a.nc&&r.setAttribute("nonce",a.nc),r.setAttribute("data-webpack",t+o),r.src=i),e[i]=[s];var m=function(t,a){r.onerror=r.onload=null,clearTimeout(g);var s=e[i];if(delete e[i],r.parentNode&&r.parentNode.removeChild(r),s&&s.forEach(function(e){return e(a)}),t)return t(a)},g=setTimeout(m.bind(null,void 0,{type:"timeout",target:r}),12e4);r.onerror=m.bind(null,r.onerror),r.onload=m.bind(null,r.onload),l&&document.head.appendChild(r)}}}(),function(){a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}}(),function(){a.nmd=function(e){return e.paths=[],e.children||(e.children=[]),e}}(),function(){a.p="/"}(),function(){if("undefined"!==typeof document){var e=function(e,t,i,s,o){var n=document.createElement("link");n.rel="stylesheet",n.type="text/css",a.nc&&(n.nonce=a.nc);var r=function(a){if(n.onerror=n.onload=null,"load"===a.type)s();else{var i=a&&a.type,r=a&&a.target&&a.target.href||t,l=new Error("Loading CSS chunk "+e+" failed.\n("+i+": "+r+")");l.name="ChunkLoadError",l.code="CSS_CHUNK_LOAD_FAILED",l.type=i,l.request=r,n.parentNode&&n.parentNode.removeChild(n),o(l)}};return n.onerror=n.onload=r,n.href=t,i?i.parentNode.insertBefore(n,i.nextSibling):document.head.appendChild(n),n},t=function(e,t){for(var a=document.getElementsByTagName("link"),i=0;i<a.length;i++){var s=a[i],o=s.getAttribute("data-href")||s.getAttribute("href");if("stylesheet"===s.rel&&(o===e||o===t))return s}var n=document.getElementsByTagName("style");for(i=0;i<n.length;i++){s=n[i],o=s.getAttribute("data-href");if(o===e||o===t)return s}},i=function(i){return new Promise(function(s,o){var n=a.miniCssF(i),r=a.p+n;if(t(n,r))return s();e(i,r,null,s,o)})},s={524:0};a.f.miniCss=function(e,t){var a={55:1,99:1,113:1,177:1,192:1,201:1,377:1,494:1,613:1,785:1,806:1,878:1};s[e]?t.push(s[e]):0!==s[e]&&a[e]&&t.push(s[e]=i(e).then(function(){s[e]=0},function(t){throw delete s[e],t}))}}}(),function(){var e={524:0};a.f.j=function(t,i){var s=a.o(e,t)?e[t]:void 0;if(0!==s)if(s)i.push(s[2]);else{var o=new Promise(function(a,i){s=e[t]=[a,i]});i.push(s[2]=o);var n=a.p+a.u(t),r=new Error,l=function(i){if(a.o(e,t)&&(s=e[t],0!==s&&(e[t]=void 0),s)){var o=i&&("load"===i.type?"missing":i.type),n=i&&i.target&&i.target.src;r.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",r.name="ChunkLoadError",r.type=o,r.request=n,s[1](r)}};a.l(n,l,"chunk-"+t,t)}},a.O.j=function(t){return 0===e[t]};var t=function(t,i){var s,o,n=i[0],r=i[1],l=i[2],d=0;if(n.some(function(t){return 0!==e[t]})){for(s in r)a.o(r,s)&&(a.m[s]=r[s]);if(l)var c=l(a)}for(t&&t(i);d<n.length;d++)o=n[d],a.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return a.O(c)},i=self["webpackChunkvue_antd_pro"]=self["webpackChunkvue_antd_pro"]||[];i.forEach(t.bind(null,0)),i.push=t.bind(null,i.push.bind(i))}();var i=a.O(void 0,[504],function(){return a(84161)});i=a.O(i)})(); |