From e5387b40a555650f8753a0ba7c6db58dc6f83fc4 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 16 Feb 2026 07:32:40 +0000 Subject: [PATCH] Autosave: 20260216-073240 --- assets/css/terminal.css | 237 +++++++++-- assets/pasted-20260216-060142-d6502859.png | Bin 0 -> 25050 bytes assets/pasted-20260216-072002-eb8999c7.png | Bin 0 -> 8948 bytes auth/register.php | 4 +- .../003_update_users_for_profile.sql | 17 + includes/footer.php | 5 +- includes/header.php | 7 +- includes/lang.php | 154 +++++++ includes/terminal_layout.php | 390 +++++++++++++++--- kyc.php | 203 +++++++++ profile.php | 226 ++++++---- recharge.php | 295 +++++++++++++ security.php | 162 ++++++++ swap.php | 10 +- withdraw.php | 325 +++++++++++++++ 15 files changed, 1835 insertions(+), 200 deletions(-) create mode 100644 assets/pasted-20260216-060142-d6502859.png create mode 100644 assets/pasted-20260216-072002-eb8999c7.png create mode 100644 db/migrations/003_update_users_for_profile.sql create mode 100644 kyc.php create mode 100644 recharge.php create mode 100644 security.php create mode 100644 withdraw.php diff --git a/assets/css/terminal.css b/assets/css/terminal.css index cd84221..f7ce835 100644 --- a/assets/css/terminal.css +++ b/assets/css/terminal.css @@ -7,7 +7,7 @@ --term-primary: #0062ff; --term-success: #26a69a; --term-danger: #ef5350; - --header-height: 60px; + --header-height: 70px; --sidebar-width: 280px; --orderbook-width: 300px; } @@ -364,65 +364,216 @@ display: none; } -/* Binary Order Panel */ +/* Binary Order Panel Improvements */ .cycle-grid { display: grid; grid-template-columns: repeat(5, 1fr); - gap: 1px; - background: var(--term-border); - border: 1px solid var(--term-border); - border-radius: 4px; - overflow: hidden; + gap: 8px; + background: transparent; + border: none; + padding: 0; + margin-bottom: 20px; } .cycle-btn { - background: var(--term-bg); - border: none; + background: #1e2329; + border: 1px solid var(--term-border); color: var(--term-muted); - padding: 12px 5px; + padding: 10px 4px; font-size: 11px; - font-weight: 600; - transition: all 0.2s; + font-weight: 700; + border-radius: 8px; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 2px; } .cycle-btn:hover { - background: rgba(255,255,255,0.05); - color: var(--term-text); + background: #2b3139; + border-color: var(--term-primary); + color: #fff; + transform: translateY(-2px); } .cycle-btn.active { - background: var(--term-primary); + background: linear-gradient(135deg, var(--term-primary), #004ecc); + border-color: var(--term-primary); + color: #fff; + box-shadow: 0 4px 15px rgba(0, 98, 255, 0.3); +} + +.cycle-btn .cycle-time { font-size: 13px; } +.cycle-btn .cycle-profit { font-size: 10px; opacity: 0.8; } + +.amount-input-wrapper input { + height: 44px; + font-size: 16px; + font-weight: 700; + text-align: center; + border-radius: 8px; + background: #0b0e11 !important; + border: 1px solid var(--term-border) !important; + color: #fff !important; +} + +.amount-input-wrapper input:focus { + border-color: var(--term-primary) !important; + box-shadow: 0 0 0 1px var(--term-primary) !important; +} + +.binary-order-panel .btn-buy-sell { + height: 60px; /* Reduced height as requested */ + border-radius: 12px; + transition: all 0.2s; + border: none; + position: relative; + overflow: hidden; +} + +.binary-order-panel .btn-buy-sell:active { + transform: scale(0.98); +} + +.btn-success.btn-buy-sell { + background: linear-gradient(135deg, #26a69a, #1b8076); + box-shadow: 0 4px 12px rgba(38, 166, 154, 0.2); +} + +.btn-danger.btn-buy-sell { + background: linear-gradient(135deg, #ef5350, #c62828); + box-shadow: 0 4px 12px rgba(239, 83, 80, 0.2); +} + +/* Ensure history is visible */ +.terminal-content { + display: flex; + flex-direction: column; + height: 100%; +} + +.kline-container { + flex: 1; + min-height: 300px; /* Allow it to shrink slightly to show more history */ +} + +.order-history { + height: 300px; /* Fixed height for scrollable area */ + border-top: 1px solid var(--term-border); + background: var(--term-surface); +} + +.trading-panels { + padding: 15px 20px; + border-bottom: 1px solid var(--term-border); +} + +/* Enhanced Balance and Profit visibility */ +.balance-highlight { + color: #0062ff !important; + text-shadow: 0 0 10px rgba(0, 98, 255, 0.3); +} + +.profit-highlight { + color: #26a69a !important; + font-size: 1.1rem; + text-shadow: 0 0 10px rgba(38, 166, 154, 0.3); +} + +/* Order Countdown Popup */ +.order-popup-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.85); + backdrop-filter: blur(5px); + z-index: 9999; + display: none; + align-items: center; + justify-content: center; +} + +.order-popup { + background: #1e2329; + width: 360px; + border-radius: 20px; + padding: 30px; + box-shadow: 0 20px 40px rgba(0,0,0,0.5); + text-align: center; + border: 1px solid rgba(255,255,255,0.05); +} + +.order-popup h5 { + color: #848e9c; + font-size: 16px; + margin-bottom: 30px; +} + +.countdown-circle { + position: relative; + width: 160px; + height: 160px; + margin: 0 auto 30px; +} + +.countdown-circle svg { + width: 160px; + height: 160px; + transform: rotate(-90deg); +} + +.countdown-circle circle { + fill: none; + stroke-width: 8; +} + +.countdown-circle .bg { + stroke: #2b3139; +} + +.countdown-circle .progress { + stroke: #26a69a; + stroke-linecap: round; + transition: stroke-dashoffset 1s linear; +} + +.countdown-circle .time-text { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + font-size: 36px; + font-weight: 700; color: #fff; } -.amount-input-wrapper input { - height: 50px; - font-size: 18px; - font-weight: bold; - text-align: center; - border-radius: 8px; -} - -.section-title { - font-size: 12px; - font-weight: 600; - color: var(--term-muted); - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.quick-amounts .btn { - font-weight: 600; - background: #2b3139; - border: none; -} - -.quick-amounts .btn:hover { - background: #3b424c; -} - -.binary-order-panel { - background: var(--term-surface); +.popup-details { + background: rgba(255,255,255,0.03); border-radius: 12px; + padding: 15px; + margin-bottom: 20px; +} + +.popup-row { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + font-size: 13px; +} + +.popup-row .label { color: #848e9c; } +.popup-row .value { color: #eaecef; font-weight: 600; } + +.popup-footer { + font-size: 11px; + color: #5e6673; +} + +.terminal-main { + height: calc(100vh - var(--header-height)); } diff --git a/assets/pasted-20260216-060142-d6502859.png b/assets/pasted-20260216-060142-d6502859.png new file mode 100644 index 0000000000000000000000000000000000000000..79fbbed26d792c48cbb6940ea9caafafa432998a GIT binary patch literal 25050 zcmaI;1yq$$*EWn&3WziU(v6gabW2KicS(0QN_QjO2uMkTbV_$hcX#){_Vc{&H~#O8 zbB<#$TzhlhE9RQ(nsZ)rE<)vH#gX6Oy@7&)LYDXc#duQ~cv>P-6U!kQ?gR8J<#o%HtR2Q{~jEUxNauHFlbrrnJW z`L^cWEW8ZGn|N#fqmU31L_mO+BgsaMVI(Di3-B{VL*qM-a7JSc@IymDK;w%$fnh-W zq9>%!3nvoYD=hc#4K!&sCGd799?s$b&ml9`As1B zjk;NA85$bQ2nC79ru3hQdeAl^CGlXz)->c%g)wA=>lG5bG^4NSRt3{A#X#e8pwijX zLO}Rd3Fh&~FUjWg;5%6(I*d@e3Y^v6csB9pj?Z4mU;la`A|XYFMs70`Pq5I_)3bjR zt7vP7ZuuPjgk}^J70G8B%I7W_bop~pOiYvon|+`RcDAn%Ar2O~AQVhtgWB#JLBveP zxLHJ4lt?0zAbku*=Hoat828bZAeJO?}Qj;+_yOfIm%a8SN4_?f1q@}n3)+X z!{vEt79j~1!i@OF&hCw@s6WY+tgdEX*SXxYzQ)7E#Egr>3@$7x`cfhm_YTb4A7QRQ zobZT{kT8R{|Jye)uN`yLH*abvlu1}w1Cm8)#`SQ|lZUtKX4oyvMYSjcgM(9se~v`S zZp}Ebr40|u42v19qCHjNMkJ5#Io)Ct5G+nC{#&r@?47dwRbk7ir6#~zTUTd5A^`-5 zN}>OQXpJLoYH8Y<74PBUK`T{jf0SKa(Nc^DB<$*QeW;33W{PU=C%B5fBugj zRU5bPSc>#QB@j2eI=h(aDE?Sjn~xtjz0M=0<)-B){m4Q)q0iLa+Y`4VnTc^8_H_^0 zU@l4_G_hqw08pv@`ZrV!>z#4kS^ zkI&DG_C5zRuugGke#gR!G;S;tSQuMa;A!SCOyAzduI^u)o}ZtYS)QH`ta7TUkN?kT zPNECXt{datFTVmdqrn_EzO*X6nXmCB22!pcwiZYzWl1-3?)G zjJ!n`XGraf-Kjoa6;8FOex|$BdIyz;P5h5^n3$KVI!gm3>AcwV1h zA^+_7WLuD<9q5O4N&v%tY4#YEi;~p+9Aex^Y1E=8-0X%a?l-yc$*w41Mnnt+&ctBN z;1Clr6=AF)uF#l-nCsLCIvHJsRE)LWO=?sa16CubE?GhhC|NYwsy3e?($^OsYXls) zz=ogK(u9SxA}YpT;5c_>9hE-0TT~*xee)I>(SEfwW6h4y<+PUYfrk>^B{reiAu{y+ zS}>P69YkG+5jhp2frw*K4+2VKN~QWxUuY-}B+dthaB=4xpG^@;OA@@~T;;sIVN(kh zqxK}brxv7E9=U#?aVn0kYO!zqa4h`yHfymN~D& zquf7izDwhlEq(`shlZO*wC8kR)Zt71l?hMz^-f6e@W`pFR(aYuRhFov@mRL1UKM+S-y5(mZC?uiE`m01DfS;SQ(CGf-m3L`B6h2-w)zi`#O^ z^xvNcg?qmb9mWeCis=rL+LPzFWfTYrLtnp0|V0sw;S{8TU*%+i9{Esg%F;uETXkDw~muER-q_? zGRG9hYxq|^J%3-ndX+2l`SWK2iuZ3{+jz=Qy=H&31!{Hp6Q?UcoZiw+~ z@c`P-!Ny+g_*ow7CPXhGL(Rzv3p%_&yV!X(jOZ2IuBMje96>BvYf_SGXJtr;of9o7 zX(pe(leCkvG6iJ>ks0eR;)CDTBI9lyKavyBaIyNZU^b;707a!=LFDY@bgg|G7v8lB z&b>(3u$q!lJfFuD00_Lu*9sU|2bUf7g@Pq#-3$XRW;Kbw|5S z(qfsatE&N^$HsyD2)kNdZu4du^Eh_OIv-+0sL_9`MF*jdPL3#`kcobEI|`v}@z*0) zjch|>-rwEDB@2HW62G*x1gCxd_8VV6kyNGq8|b~MHbl;H@#kTguZ+M5UISZKV@k^h zY~3m@uyubMB*6q%cg6IvjFEDPKjC4mC z7g!Zf;eNZZzGd}8st9f@pcgq^!ZR6!TO81Q(X>q|LpwEw8JQuM%WS%(f>>U3&|&En znr(oe048YeO#f&^f*vIU9cmnqE*D|OXs%F!4+{r$)tE5LB7&EFX{u6Q?_gSGK(l^U z?JG50bEsd*RbSd%NCjjoll+kR!eakx*Tvwh!qSlWEaLw6V{eH#`$G6PTg+r8gU*3O zx{5#d`;5!yJx#~02M;$(H`Ooq6)Vrj^>P9aLo3f`H}JDBTu&Jf&bHpw2g5wD%gxl6 z!=8C7x2m0%E2*ag^;MY< z>FCram80!ezh{LK@#5Y6Pu?$=f0lhdUA^tLdpj`3>4(oL+(_X|wQ9q6ZhC#3#zWfQ zw&=-7d-@>ocoNC6oE#tjNmb9qDIL!ev!``t>RI)Il+w0w9m;0)?Z-9TV~t-F8)`rw zA1xYTKeilJ>Ah@o9I%(ZjI?>fzq4~YmyFm@zu;DSFhjOS{A-6wZSTzbiRMNHCRe=m zPZiEkcsxl|?#tbFS~TDDoN2{fX@`D8w#OldqmWYX@~$>gi>&KMjsd-f;P{5Hu7=2q zJY31j3Wz4wz9VGGQYlfh7pt~;@>q@IzZX<13{zpY`rg0pH!6!skosWrM(gfFgBn`C2N60XfBw%yVH*K{sBOi;u=e z-KP$T80n^OqyzStXx>Q`pSyrbFSmXte|Sl(@VP2b({0_`P7^Di$-O)d=pi;;x!am^ z$MnxVIy~7g+7pm#8j{^u`zjqQ!CbqhqPUI^gydyJD3H;!-V>hXemxKGd#>-`a9&uj zF_=ied)om|{J3%Q;&v}5CvaaP?)#WW{BqE8zl)nEeQiKwOr z5zypOEzDrvKhO6EdOllQJjcylIWw@4w6wIkzDKn$kNv*Oc1u@C=Q}Ize>0+=&Z0wP zO-*+MuWp~m5Ou~$mnOJ`nb5kJi@FFuY5W}OCOrO(=Ya=7HLY0YhxktnJFaanPhD*u z#*!}A$@uVaHTCsv=jU{KPv>egy3Z*OCrvLEjLmkd?a=V|@0BqB=a}_EFXAephA}IB zU6&?CkPOvsNd=&(#;DgWilcMc9WSTrKAngnotK}#85>O8dLBmSd)W@VP;cv+4KI_* z#EP=|dSo>Y)|_)D^}g9>>SSVHFggQDIIVouvY`;v4{gbkG9idFsoMR~m*{pp`nc(Zze#!&zvb*6 zU$1%ZYw(T8PLuukiq)dsyI^}yY2oj$IE^gGdNYOFC$IV(zqm(Hw>>W4y3rgVpouOBSg!%@$KBSHv~`-tY;R)08Si_?~h+Pn!K z+Stm<%N#K=`GDKbk?Wz=`nRu~qgcrZla-TvXwU<)M$8ukKsK4x*mZpKw;c~iI1Dw` z9A;!D1Y@y@j zeSFOLx8iwo{B%ES<9$}a`0Ks9BjJAzPNoDDveUJCSR^&XrUt0|Uh69HeM!rBkw4gw zNwaCXI!H`RWcRo{x1j1{O)2HOfFguCs>H&t2Z-bFfH7yc`Xib*{l^c}F0t6{AyxhsXTon3iv^6o= z|Fj*g`G%+n>01Zj&!XsZZ-bhS_p~qHr6azW|Fqu2fZEIBVHSL~kB7m%;BV7&l2@gC zNroHPK&CbwHb!INjIFozZ4Vj9c^&(d;i|ZA+5eXdz_wkevt~M&#Ub(QB!csMb>c2{ zw@?k)`WcT^ndisHm6tW&{yAy)i|y&z*#*`MOjvoS?#%x0IDHUdh9ia$HR3izt~oe3 z5c%B3{{GE`?*a|2rfV;%Rif7{SsmJG2!-}r-9~)S52r7iXjpJy38MNso8m+_ddDrU z4!xVP2c?p>ZAW!gr#rfp zi5Bo!{U*o%+%3U>D_GwS9XlNAhquZ;+})lC#G@^tWnG$_oD6&nsbRz4$1l&P!D_lb zCQNic6cGIo z4O7-oC@#+U#m*2mLT!S`xwI!7XT{*4jrL!w^@2YtKc@wbB69>(gCBe8?RS{puq%ob z?{6R!1LKQh-oj%-`LAE=d;7=x{Ii13RsP_)*WAupX{Xa^Qe{D4vaA7n`f7T2`)X=) z_rxYyZjWb1;?Z23e#9KGc)L^3P+64n^|6|>KxG|}cND}^IPJ*_f90v7s(M|n1v5TR zoBC#ruVQ7mK@&nv!|NleBS7W~4Xrmxjzco(g20Z{-``K`eSLEy@O+C&`&!W?9tx_X z$gmgVHyZe~g$ER*e2w?~Ly2m|pa0lF9=-cpqv(^fGCdwopReT)_nGFK~t4i^AakN_k zv*LGwIIrl@(UH-yCf-|eC^3B$y4GyJEq#TLAL8(5A;My?Eg8RMML|TYq{U73-nime zKHGlbu-^4r^hTAA`Q_H(@cRQ~zE)tqBUHQ=FKW8Q*DKuYY;5z7yu`JZ#khe`U!Zv; zw*)KibKk1>5&xIvSsH(6y{sDiI+V`r;oV+R(X4rF{nAo9;KZB%Cf`rRK1kHST={MO zKrx(`PIUSkTY?Nd^MlRZjQSNK@tX-JWf=C3f7+=EO-W()00r*H?-@#i)S!6VO#;$UXizOs(bC*@C}k$#Z|#jXXr61^x}FXiDHTc&_LsmNur9w z>B<{~o;Wxbcvo>J?F@Ozpq=~Z(FR!!g=w58$QmVLh$h56Tt=l8!L@ z?Hcq+(ifi#gx>*8ptWNy*K9D0m5gR!VDQ|$5&Q+^AoQ-iqkN+BKCYNGf%Y#%%Duy} zs^Q94MGflgmQnJArufc>`%>&9IR$riFwf=UU7?&6#%sBOv>7LKw2H-vwAASGf6H5q zWgYsnn%?m_jPDnMe+31_Z|f{)KPGAxJ77RNAJV@^+R4u;SXcumBIuL7WazM-L8WEk zZmd#YiK_)>({P~DiJrw@5I>noHxO_{MT9AuYbz>FjF0C4smqc}mJXDyZG<&vpbm6VjISY+t*kk@+*rw-1R6EZMp{FyRijoKB{*4BQ0y!)Z;Q9R*t zMfqbWg@=Ph(YlKKdZSm!`F0;^N37o4!EBryhru$z!fR@3Zj($v46oOWY4^(LSr*~V zo76V_j>kYGObkp0i+8wK32~`^jOVM~e=_AB+xfE0)gn#Udf&;l#3g{QKeQ6)(<@%R zCnommXm;vl5@|SntehO~1EYWdKk4Vf$#F|xUtc*nIa^ys_c+-?sVq+WnZtSGhO5(j z6g}@XUM~yXoy^_wK&kB-o~vk$EAdWq*^C2D3f3v6+Xu&{KY#e=YxY`@@q_ZeA1%mG zO>!M{v>|-Y&CP?ah6cN-#bLV)5RTaUv}1&j=TB2p;(2#|{#*kmOD870Q1rs6?F|Birw_a`Y@YWv0Cg%9H~dNp$si;I(!c}}?4MCHc3 zcfbC#KzH5c-L&1m%8w8-@Xl?wNS;+TdAJYs>SzDdF$H0&ZSstM~~~# zwPo6M+L8RX@Q;3rC`}=_qSdaBit@?`fCVeNE{c|Tah55^pNpqd6UC6&s_CkPh@|3@ zG8OtzKj7k*4#&mCVSUT1uXc8xQQ71|$l^4gsM;E2Y&m4v5{LWPc&TW^^)j$$Gg(fKys)Ix-g4vT(@dsHmvu))YNs zEc5<$V$Z2)I&|YNNCQ+>QVgkgRV44c?-nKxaN1eD0_# z)9Uwn92fr^P3TxbtMQl+fe-Oj5PYPh!Uw(xN9ilmvsDO1&@&DOxkfSBR|#u>$`4zb zAJVAa-r5Nc2#}vPWyd^>>9ZSrwj7V6JY4Fd3;q4UX)I0)rSV`ilhR0{Il830T&$3u zvV5qhOHGec?S2o{D3qwtEKy5KQ$y%{!6BthU9=enD$rMK%9kWeDIY8^ zrl~=Ma(uOTBZdQTDYdTVSFd;_PIIn9tlUm8bHj8>FZv*c? zxRp!kQ~oTwSTp`iKnDSnc2K!R<0I-M>yC!PFgi%#`4 zH?koV3cwT&)zKc^3;@X7#KRVe;!ZWkQv$i-mRnN}H5+CoCZ?u^ERt^O$)Y^q z=yK`grmq(L`t?TYJSl*}zC3>sFvsFqFQ$~!Dk^`Yhzbx@%--h)(b`+^b1*W}(?o^n0d<@^<|G5ol4H&ntrU4QsmYKKge~m7_vc;nVaT3*l!jzj zZ)zv-mK)Gr*rsObeg!bU242o!5@UT-+Xq*ZuuuhmAgA)nN#b4%ASc>-xBa`=fk$+t zxG?Bn`8I+Jq%XJywYAQ(BN=J@kEinH=4xsrgOR zhs8<^ji* z8f$y0%#vRPI#!nO3#0=qN}3b%!s5BqaE{f2hUSgLDbwz6a?d3-k-wzmCpGA=GHKpc zljIcrRR zd~kLw!3v^ndK1l95R@4!f9U;gdxT<%R$%cUzb z4-5{f6+7#`ORI>dmc_!x^1AGRPx56G@&QrsfWV5{`_vY78Rx60@83~ZeD%yrSU2ZF zevu+`1<*3k+!;^)yjk%aHI!c1HxN+Z%Fj`RV*D#44=jTh9#KjGps4Dw&(?5oYZyVgAK*Rvs zT5nb{pg%r7UTr$6${a&Gj0i<=NW1ilF$HpDA^=<%EfSdb7>E??7hk709&=5&7_;z? zixF~$_rx{2B!M=I(Mx{56$2Cf_Oxavkkg(z2(EK>U2?5NJq~YVcckhbd z{(QDC11=~5`G4F)0(=F{V&GaT?&R4YwdRr~5*13PR5|S_zJo2Eh=D4CE}zJ`H-z|p z!2s>KB5b;Y*x%66(M1z*cfEb?TwEHt9MYg{<>uEj6auZ71o*LCEi2B zzm6jy*T*a!F0i-4zFNKgUoJq~+yoU!-t&XG?ZtC%Bqh9*@_ozMPyFiYY8B8GGz_2> zB!#g93lzYX7eeATTHV@_*)mV@0&Xg*?eeA*h%Ue*_+kB~MV`hHEyz(e2Y&t+%!nwb z&erU~{U4jCC+mL>Dw-sHu+2Gf#HIWY6%%LZ;lpzcSD$J1ZU8Z0P3Lvq-G5al8+*&E z_EO1L?|xzp>yMtiuUkz(AND75iaQZ#m(tn4-No%fdmEeb;ljRNTt&VwP!a6}Ls1@; zjRbjh32!2SPi+o2kz>Q|U9*??Lr=lhMFpZXIzB=1`)QUr_M0zNRN8B2ttlQN{*s2aW7B6WDdZ zzJ_YM&P>_59kLrMUTS7wu$Gm1AODBW-QB(IX~}jP1nH@OWcaGX!i(y%ipux{15`us zIUrr5zur>%liTbS@TMd;T&>LGa<;9GHs-Jh4(e68LJ2$_6v}l+sW$I-AY5^JSXn?s z@);cH<5ydjw`^0t++niBDI);#g!Z*0B*5C-+D8P6wb=9qCjxN26%|TPD%N3FKibX{ zwc312;(i?1!L&nC+5C?d0HWs&ERIMahiLA6}TU-G8qhd zC-oUh-OmUUF6OiKr1V>DX&{T9cI&sUo2RkF0;hSInM4p)$=Ch4@%Gj&?W>Oo;FRXl zS=_$8wMa`cTr~v2;75>dY+%r;d))m7Z?*6W4(sqkL`Xsw6ld@oEGRD5yn7tCZ>1LN zWr@qj^}Dgu<*Nr3Ezf;j(Q_N~%elG5TuMikm)7`z1$3^4ogJ(9It%|BMOgj!5^!fXKTuy-I4S0cjBM)-Ql*n< z7CxaveIJLAivN{%z2)WLjP}3fWt-?dopMUlnAEm(TLYYMu z%r!t9yoDd_AK|x$Q!IDdtknNl&Ff`)9%HXOc}oDkl|{z09cbXS`u)$y`eDh-K1)@r zwZ~V0Xs!LbR8v!v^?Yb5$A4wqYWtL{^|LEK84t527#8Ru=-ds0=BOG7O^Xd@7kX|- zwX=sT$O!7*{gjM=yLWB7X*oT$<4JQXeXpcX1`;jvdlcF2CWV#B?*H?m=hE%X!|}^i zUi3fnvdO*UyKO$kmh*F!<;RzXHD1U|e@8<75#(L)!c%r2VzZ+t;X#7zkN>OM-yBV)G}XJ zfUMSni@<)nFP41ed8Qulq~7o9o_YMxJ$F>@WjIzY7m-HW>g_l3+U~AqZJQWY?gVPP z(f&`uk^E1gZeKzQ=Oq01KLt}BufQf(s8cP-wgNohSaG_@vU)0%pd~ca^*@!=mu8FwHuvdA^m$?a5Kz>XUY#C}$$y^H9CV z^B)4Y(Ju`TnVvS!>o~Kzl`j1gl#_*WauO1V?;pv!7y^|I{NDGn=8z8W1(ff`*z7H$ z;7my;lS~>{Nox$t?l(t*6H#B5%;1ZJgk<}0KkIuvnU%ri*qc<=az$`Z3Zg{Ete3?j z*Tv_S6W^0IpJ%<7hhPETmrf+xmW%7{GA$GWdMe;?3jJbge`}OF7PEaFWjq)q!ORBI z3)b_JEjN(-XDeIv-;JFt&*N~8rN@E6iaDc026jlYk_PlyQpbs+<^>ymx`M9U76?06-YU0iHZgqJ(*3vfwzM-wFBv7xsuER z;uDB3qjOMDS${BF@v?^cY;?4h^%;Ta@yy@0`T0I{!{~X|F6ypZ@a^C1w~??7-#$e- zQss9Wi9)l*{ga&NtIckK#Bk9ME#**lkFY`q*= zu=PFfrxq0zO?;Q=?CiYcuV>s)5JUTxsVkX^HJ>YE>>c3*L&m3oFj&Pcc9>%#^~=5` zy4CrOEN*8DR`0vc9sZY;K}NkgT}4CCk6$(DlPm4_C8VmQ z1-yGmxrOfn>9Zev;B|NI<{(|w1IfP6A*@Yci8PHjQ+x#gL~lXO)A zGLku4HxB9Q5?t>=3n&*wl=Os@(*V87e}oDCK?vbPe2iORNnZVArVi!>V9D!6y!Q6?aZSlaP%A3b?gMij5{k@MB|dTJ`h^}+P^Sg?W;b@l$Fr|H z&`%1{EL;5JmD=kIUYPY*G&@RY{Igg(o!ClHLVM~61mW|HOfrcBLj)<=@y8a{Mu*{- zZJ)UmiMB$I^8kX-hNRt8@=XXp+X`S$mFSm!FpM1}_*9F%j3mL+@+2w>>LFTMS{|;Cmo(Ii@_+V*4EU>kHm*WP0h}ptkg$SvwH3;8^R1Q(2$XlQB(h2oOLa#N!W>9HtWRnuBnQX zO%UNi;>8Y_xVcjs&`WpEO1T^p`ssSj(9R<;3iE$bX%Mp0 z)H=L_@saYw4W2~J?-23}?un!Bf)yt^<1e=nquQR(k z&)-3+>UhkGJn9;8q?9e$wJ4UGD??HwoJdHh2yS|mm`VjuEA7<^f|xP)v>dNa7;Dx ztPhAc)FK-|??@8BD)gKos2onY9f#m1(QAoOh{B1WCTL+aF=fsS(I~l%cbh982L7c= zFUkM;^V}((UWRqZtW^99mD8McRm*8^LDcB9ze?%x_9$7Li^AhJ->>%rR1 z6@d6b#M^3s^Bwu4!G`1zS9gRK%8tAVOPp7jpLFjX9OuA%i{sABaN4}-Z=|)H4QcF_ z)$Cx7SvEGd0(ew1iCq*=R^{T7>UfUT41cu<#L}SK5ZQOwSXK*FueiwbSLg6Q^#m0r zYstDLY7JM6Oysp^lSG}J5q&UNTZ7fohz|`xzdAZOApc}cHHQxiD~^;9ggXeiP|$@4 z_X^&Tshd>7R&MlE6Dth!crEL`ON!pw-9f^-tSkTv>veE|h?tl|JBx9JaH6V&5g%Dn z8nY$#!br@j{$)WyV+t~LXE&(;wQ1PoF0;6y z+N!QW#BXyxVU2^FY8+Uu3x=Qv=T?6vcVaiW%V|6G7H`1$TtkCK zwdqCbmx@W`N2c*rIYPiB!gL5VpPyeC0mh$py{zp@omFJeEN}>v+>Vhp3G|Tgl6@!r zplp+2Ut1t-#h_m(OpL<}w;pEMh|SYINerXcQ$B(P=W`3y#&{eORLG)=B{ zPX+n@|A#x&2E47iSr5;DRz1X|`jCp-)Syj>{RKI9a@UC;m7x6_Fp)@CmA)n(2p7t zedJH0=>_=t0{-j#okhZ`N7R|;q{R+JCPAh$VaA@eUu>*qrG&CZwdDDQ|wVPk=q4DVUf{E;< znV+9@aEy*@XWegF_8m%;14dAbH7^#9liq4rmB zXyimghR5}6sheN4`T=4<*B^@0z?7M~r&dXgZ zouy2jrjeEDbdAL+G&2C;H&N(oGIcuL#|Mjr>OZ*7DI2P^RRI$>b(0oVEK>885YH_^W=tu&y zdDw5IYPCrVthy57>AWo~?oXMtUZh$YrNW?~piDkbY`$L=B^yvYAT=!bjZj-lOH0Yo z(aVb$uRGj#O47ZZ?MB9kuTyQAgoUz4VVRJfjWq_G5;ITVWiF-- z*3dqA^N;^IgOX4=Tn?KEJS^QGxM_doHmCC;ldGzzoTUnoGTZ;V+{+*&w6Y(vav$2B znwq*p!ucwfq3L@~uYi&Cj|xEdYEfZRQ*FU3#=(JsC{^Y3_m4s*oC2B+ZuZK`SmL5n z=T%JXAIlH>(6>WpSnA8mKW@Hv7fRb6%4pIbCmY~8?Nx_piY%ERYx|7x!S-T>=3=$py{7#NrQlNMV1>QoL49Wq|1H|i6Xdh zKtNho;7k|c76V#tl3dS_&Jo-#)3<`ebiGog5Ss$2*50X1%mi&*djs55On!*lhhSrkD|d09_9x7 zKwJBZ;N`9mk;BdcoUuzL#FSOfiZ^4zJVWBsELE*-S~%V`KgX*tg_9=6U#Y067Xr|5 zag#yCiIa4Mj1(k}ZfAz^M*rNBQaMv>DJr&r^R?cGq3!J3^zh4{Qh{#Hv1-}bM%ux2 z++`lhC{4w`TS_vRxv6a}&88k?uf3UbmXIb!-#b?5IFu7z-Q2i3I~T|%>$9SaI6Ad~ za89_ZlbeS}oa23IY&Z~m6vl49l;z`D>QCZwDz@j%iJ&aK<@OpX4Zmu4Hq+wFPC z-sl~d){>!uet5nOe=PSlM+OUBN{30WdV;T{WmdyJKO|0S+GN{Y5JX|iV*VaWC;itfeG_%>uSw5 zF{o8dY+}}RSL=^3KNp^|7u9K>hK{(co>{iJAuH_r5-lU2YSG#0l9NN3=8M`QQ6~h0qDr;Ao&L!CJ+5I&tX0F`rzwpxcA8ytK-oh zv+JXqo%d5xBHpjbUGPcWllk+^8guYorpz!7AD|ML1yZVP2mJ0cbv@8(YMkaZFBKPl z+<5$u-RApc?Q~%`S&qZTYI1#jofCoBhKdrXWJFebdn-NL#MoGei&gjX+vze9X&C|a zX&iK8-ud*~$k}zDbAH8lXjV*9b%9oV%b$1(j*zOGE^1aFk~K^T_6TgUT~ zxXz%LS!s&69{$}dniz6AS?$$jPml{kN+Lni=jZ{HqqFjl?Aa@7IL< z_|NsQPo&>|4mJEKv@yFMIS;`Jzm(C5WyH4sM|gH)xRs7CWgTC=p0|nylQFiv{ngTS zJ`gzY>OUfQ7zqKlrH=#cDCD+*s^-j)fu+uMs@rDijLjTHnL^d0elt<~p=Hf?Cdfyg z=pjCml$f}{g5=j5gfZu9JPXaHor2e#JA)b?3CS_w?(M?NKZ_$5Gqa+8pc`Kul=oNu$VxIn~J`h65o07*oPDL-8F+{sdmtIfCt57!mVHH za|f}c1%ZPTp|YZ7Dw=hw*Eb)HdP2En;Jo!KNNQ@zIM>cU?nN_XvwZvfx%q+k*d}XU zTUWQWttdpf#?{tbBGjE?9&cG*5}5Pf@q)YJiHJ9?@2`*14~Ik1uiBcwMAF*L}_yctI7MW@AtwH46gJR_s3z`Pi#7a)ECEkj@l58OQid9aq$xy z8+8=1nwMx0Hls%8L+!ldHXuC?4sq8WLu9m9?mk&{7I8W57-oI4)>KpbF%b&6m^&6D z==-~pgF1(Uqd(5g|Lb0x0NI@U0+F)APfK^Pqv|XUlkV3zDz2llr1Wo|e)B%V zalLD|BiVq-;Lj*oi$K3FIL@~$nKtjw{Ri%YM%Dt~eq&afXxFV+xgKRV;>yf#A&UH) zc2=KA1eD-Z7ZM{ixvV#$ow7kpQ`;mW$_&YFj}1WCa~%){(78qn+x3=5y0EizDf(Ie47c zTC|&3j*6s}>j$urj(3tL0FdS&IT#;RLmJ?VIYKz}9~GAnj{XVmQ6~D3nmh?&Qz2KC z{{Qg!J5q4QAO8W5U?QpT5^}?H1B^ysO3eV-`u`SE7jS_26Hu?7cx-ZVnL`GffvcI# z8~gnm5YV@`x0jbr{vBw9gk`e_U7ej1RMKO6PQs5IxRD(l9rpJ2{avk{LjK+E&2|QRDb91zakO&dIpqE)IGgVa=_WQs{=P)VU+p3ST&A_(u%LxKr z1k1wG(qB_vK4#nuaHwU)2<4&@50`J$Snj^R1e&#XQjsbGt;`3VV+xRug^H>^G0y~CUM6jCpOcG65%O8Eq~I!>OYwd-5Y^Cd zbaXT{TyJjX6*)Sbuf~ciVoQ-`CG|bOJ>##|FfW)^G2(;S9qAM@%w1kyj=H`cDKDS! zhX>WX-?W;2U+NgN@Lq?`PR{_w%FcLddLB^N#Xp0BNJBw}5&;Eq+~U_nG@2a`bmpss zqO#gVI#e%xc{C3Zt4?Z;l~djw+;ndDI9pF;5_(=@g2fyi9PntViMQtD7~CR8OoVm;|0N_oJAH35FE`gOuxXduR3hD2I2|oi z6Fa-4X~Dp?AP4Of8HShKOcJoYa&pnkOlZ*ihldoG`Yzz_VDMg8Z6RdKrzCawqhvl_ zU%Ome0+zw*o@o`^DAmc?xw0fTOv_VIAaeL?l#>F7vnLk#I|A(#DU#uTA$<7)s|_3{6wt?LYjGwQYoiQYwx=uC7%bUt+uB}DH;i{5*S z(M1q#7@ZJ7)I?7r69%J;p6Em`L9}qseC6Kf-sk>%pYfXa%$ak}-g~XJ*A&R^OvHz+ zqw^kljd5JgNqyJD>{pH+rKyB4hM@wIU;B>TunZ@edP-Kx?q{<1OLVnSxwk)^8MBZ$ zbbbDgdLq-6Bwg3;dFqFq1XPi3=nd5wF_KHQRK!bev(LEy zWmMFBI!{GiA>z3n2bt!##EK&)`?cD8(h^XOJfSGrB0ag)svYMx3%{O{dgiFiXkn+x z@8660SflqZGwJp4aA4}KYl(ry;~mKZsD8F@#NlbIPw=^XtnNFc!y>0B>ju22;^<^$ zL%kaO z2xG_~zxcC2j-aOmNOCdvI1cegG8rA@WjCw_+HK#BUmc_?6|%>Xf|_L=s9P!0y%~Cu zKuEfXBGNRrQ)NqDE{#OTt9uCH7Ti3e8&x2TiJYR)wQMTob4?3e8KU}9|M33OiJu<; zz2I;-q7s}>))6BU^T`}(^k=Q`iKjb33&ZW=a--*!sw@~{8K3I?S6u-Y2ANod&u?+( zttMy0Yftl-TF79~FNeVbEt>uJhf(2m9MAM~^))5;FC{i|g?+g8DEc7=0xi$qtMLeL zeI*M2iQmo3%8FeyqhDcY`1HV(f~4UJjdv7*h;Huhw~I~)Oe|Y%Rm46PP+(EQ$Ihl$ z3}I$P4GeGeSBULTP_V1M2VHD~WOFZ^$18qcTS6Q)zpzK^@jUPcG?=TnT0PPd^{5R`lZyQt+qba2XWUza{vWkh78WkWKz?Pv#uQ{ zlVmm7R|EKwI-O^s(}h;nY$#8NB{M6-I+`=ckpqkw>iuUZUs)FVYFU5?OTrQX`M6`P zNy=RPwsze*FJb0!4us@~Z>9~V?!Jc&h_aRyrDMOAs0@&4v*1$WXiu@*(_sKlz|DeK z-jDz#hDAEyma+SRG-50CpPmy_7*6$`3q8ivX;Yn z-dCjoa1#@N8BT-I%IQSvEOcC5Vc(;trd`hiu&A6DTj6+|hNhN-=qpvI6VDpz?i2{r za@XoI=3x##y1FA^kAs}?s6j+-2q5LoNpL@n#~S^)BIN+!C~GmUnA%uf9qG3Pii-3s z2T+ukb~4ZGv&|;=59P|XpQ7Q3N8ZOt9}FsVvhT?uGBd@(dWbcPVAkvy#&|JDHb5Ya zwm-(p$LIHGBB6M&GZhyPkwUQ=rNCpu>OJ_`?8hBe}NLlj~H>ix(&a)NR2>)2CWQ5uz{^OJMwo}$0(Jbk{*@#JAy~D@ZMQoczmXAWmMi5`JT@TxRn5RuSkE9l0qu= zEJ>~4q1RYhU0of}ti2A<18CBSgNotN#<1fCJTFgrnctzNrsfw4;E!-g5j6d4&hJl+ zzS8YU2ka=ILV`mQ_~%T`KV$vd;E^-@*!jgI|=#1-v>4 z|AETN>lqNFm@9QGt~8*SE8}mmtLVqqjIa#l>5Y%I96{t@G)Ky?7-q?+AoyuDKH`<47!R zEmifdN{C}|RUr|5p#1$n5ki5}rD{DLnsQ&d$I&0e3czpbFuh8)1zb-zw-g!6emws3 zHzdrAhdf^1$gkZ56lzVNZ6&dOEs>5Sp*Z8gDG$?xH?*4|L2tPXaLKSxo^IQRbSSEQ z$j2Xs8#5WYVxe-83JE-9q@>JR0hOG--Ra2~^flh9KZR-LgS{r82Mt19w|!mNKPx)v z8<`C(-Hy`;MNmD8iH&*kb9$sMWMc@#k;dZ1Dm2*bZdBqN1r%b1>Ji<4vsul$Z z1>nqtPh5YPgS^Rz0Qv3PA^FR@-7LJ5RBA2~&dYp=-_Dwngx@A%ff^JHmOP`Z(u^4? z<20OJZHh8qsH!>|8=Jm!tWe9cwXrj-TCC)lE9V4#YiX?W+%J$7%9RWeXIxp59g(z! zrINi*r(|99zzq~cY7=tirsr#+yOSb*zQvAuG{r=D_&nKL1i{2Aixi{tp;X3j(5z(3 zFSHL+B0#f{xnwF}0@ztlhiO%D|G@&#=wuye5fy`Yv8R?6V)%jcVov#|!k?)evm#ls z>LId<%5SvuRI4jJpZsaQUoMsxlzsm$^N_ffddGy0x~5%~?2jKxx%w)v>z zh8@&6rc?@Q-i|}727aJ7vHy^qokbRefSsDu0?_anr=fAyu>ogW{UsH=8T#&AeU<~=+-#2p&<1#QWa(xS@h%IPjY z-ZgVc>t#f|H}l7_bV|}ZXvZwqX>qFZu|k}ApPkS0nU{OLq_H{LSukcY!RxI(-?m~6 zQ0-875dPWwiIK>dn6$?undN-r15PJnGzw^M9_P8``ptgwxZhSv$1~N?&@ekY3o5l5 z>594KTX(R^rcnkUFuvyk+`*R@IjP$R%5|d3WwCRW83$~y*ULsPjGTE56hEsGoXs{h zO|e_CbNt4j5(XGlLdCQPbB*DG&0u91DV7l?ZJ^mq>rK-GD_;&s?2aKseV8DRK|uD_ z1WSSI*8v3N1Ue>AZTvuKY>z)y$EZ0Y-78w0E=*TKz@(l78*T?iBmVJy(HUSGfE{C+ zV@-J=JMI;R8J2(Fg|@&C#5{D^l?=(@e7uJgG3RR(#I_C+RSkwbCmP>15_24z>x>y{3uTiV8$Hdpkq%PvJ%df}*rI|MqcFzM{an#z0K%Q0A^+!}%hbcrmuLx8uJ(owv|Bz`}@cR$~WBhm%NvH>PJ zpL>ZhVt@}8`3OVquYadnh>7&T%x%p{#tc5T2gc%S@Evy-5%vb9r{6x%D{u*{fHffm z%yvpgQBaH~u@-aF^JS3&a9s-im*HiyM@Dopv)L zPH5@qT7pmdw`(tVQk(pD*FcGL_ina@f8WuXX677R)G>6=XNvyiZQwciG9~4@o7O!( zIk|{KHmuv|(?xksj?>Yk^T}4y1{z+TF*1BIWhJ^wurV2I{*975o8L_Frk~%))z;3A zl5%;|ZFB6~l;!2jocrYic0FiKdX}J7H(y2vu$@|pb#X-J)XtmMx=dD=I1cc43X2W! z1B8Cez2nda0_i(uqNi`Q{t`-Td#B45yq_m=9!M571ugE;(gLtV$qfp{kC}wX$+;h` zs%sE5qjS^6TnslhhV=>m-SqN_P^J>#Vj-v0VONI^n#^Xo&>GbBOZBZ zKY!kz9}u1&o>fTO{_9s|vx{J<|2o=SbAvcHGxP1#HeC#?@(^kjdYB0OAVLq9Rk&Wi zt@G>!&Mp`8J`rxNuHBK;^z_1Bw!vP9U*h8rT74YZ9|FOk&pLW&AWu_Kx-KClMO$6{ zZDr+CS01&n?yp}_sdYBxT_VhUZfWk^fcP2 z&odAg)(%yhh*rIO7qk;pf}atnu@L0=bzJA>d}rput~Vub(BTcRx6I6!wZFNxJ>oSq zM^c^jFnUlKq6-Vv2okWO$obgq#sJtA_`#^!IQFOP&6Vb{zL}YkzRzvOZQrwlw2=|r z*f->yTl8mAe{L!wjz@b1I}XN{zS=wZEXZFUUJT{8du<*KOyS_1rv3d3V%~v9M$`HGpH~98`M}$?M_>2PEMWIN*wS=xVhSxla$nda-Z$Z zRz(xc@*k!D?H^+9ZxsTUhytvosFt~b{l9DpHiSwB2wVtNO zJ0mN!T+#@as3;ZOtRrw~vSzNmJ%sw!#V{Hz5qgIIMBUXD{Uw_7$&)l7A(Qf4WbvBp zdtJf6z|dEuYj3|sYtbabZgAiNF3suagBS=VTljL0wp|B@Y76D>}F*9GH%a0X|U>4g`pZ*}J zbjG>cRM+8-*Do}uq2B*$Xd+vjStMAxb@Mq2@OqS*dhS8C!Z{+Gyb=<0nXKez8}bW^ z$?HqonhheO$%f>&OC#PAP;gx0&2 zCGykJZ|C4~(+VJl_t5F7b|3uujaz!{Y5Y8 zJvTe6I}DChzQ@ZeE2!$ugG%j9!`fPmcTw;Xm{o za0?VB9QQ%i!s#Fk4<3y%cxT8W{BUafL`=-F_S1DE%$kl^J^pD(h;+>6rn9oZvkVx+ zSmG}0hL}fZa|#bcL_|bN>L}Nx)+NQx0vPD82e! zkC54|#Hp0WkD4_!9;bQdo_KcDV@)=X*p zyLY1CAORh_!j40aaiSRATTYX#I?_6Ov>t^OxIsNV$@fubSloohEuLQ*>@{b)!p@d@ zk<=CzKfrM!G8QTDP+a`5e)w77SxZU|XaN`-=bo4>;M7>QS+}73%F2mAO-vwK*K^-x z@tcX1v3e^JP)27MZ&Nt-LCL;QTuS(>uRhTuZ3O#zs@gVgF}iO!`CQvM26|eWD3XjyDsJE zhjJ3wQ|`y|oi-APOsdhj5n#Ki35U2^2fpF12}Tm`ZrABwDd2Lx~K-6|c8mxn1f zHJ1VS@ZuuM&cOkuD6DK?Kr%}Bwz^tIQj(tFE8P#9IeU>4)}Y4-WfpjvF#P4}Tm1^5 zx-xLe71az54kD;1&g%9{tHOl3*p;wQ=384sW4j>wq;-J%it?TTksyw+D@QAaehWD- zWV|=JB)qb;TA+*fz2*ACC1{n9DBy`A-{*P?TUg3L@}arcRg`!ATVV6Fau69mLa@6S zRaWDtC^oGM;bgiE+`8FALH8qj+LQiPVE;+^O$fO@XeMcA+X95#yFWV}2Xnvo_1*I5 zuVbBT*{b3V%*o5mZQ=YrIqC1~OFr+#0n@}M?DBfi<-2K{60WDO4^cL$;}90Jm0CYJ zo!ch8Ck4Ap&O}cftf+z`OQ|-SlLkbIK3Tp4{Eq~TQ+t2GUUG0o{2na)^!LU)@OD}kep zo;A@zeb7o*Jsfcz?9X#}=mo<0bcN?t@i-n&9#KJ)N9f82>HVvVDg)j$EV-qix*4{^ zlHheTeQ@Wsxm9!o-ff1oNc{@!QqpL=LQ7q#43iK%HH6`zPqmHINbtOYt zIYBnIOziY$uT!Se$fEgf?})TA_CHqP8@@ebsd1qo{wr1ih&K>4nQY%%kQB%quLI9^^&`fJY$iP+2IF{`P0i@B7YBi&2mUB)3_;Kcu^|H z!mvrlZ;dYWyu5F%Di5>Up;reze~Tr!1|+1U>tXlLfycGDI|{M3gOK^cWsu&Zs^GFs z)Ro!1XMWMB6*+wHal!HiwEG5cy>*-sprG|MA52;4<1U73mw+b`Owe*$DyWtxy0AXexgkXb@i z9UbXdHRa_eYuPuaKSS=burc}Zn>HN)eGFadNHwihXmfpieWjB;W80^{yJ8t$ed#J^ zO0F-keg0A9FkJ8tqt(Lj3&B^iryNntq9S>hLUid8t`}q3?gb*8RKjdsjC$|pOI`s3 z_#UZ{50;PwkYLk{QhC2k9vGEyG)`ptbDFDbe7hNu|60v6^MkkFzsv{k)8+EhZGE-- zNu3OP1H96+t}>3m%pmq8@It_et0bg!YZd&1d= zq4VbltW-g((xN^ncMBU1dJ$+7{6I=jpz4^C9ID`-VYG5LmJ#sI|J7UOj*8|;JM$yTp62XQf>>7B&P>@w z;qpThySCYG+jN)&xKMaY@RVNO;uAXhH2C{rg{3u>?W8a$lAj)?lWPG9-Q2Qo*c)uP z&b~g8W?$kh;4TPWT)qa`+bZ2#+VM_R=@kPFsu1|`#4u7od)s`T5OpX;33{WyO+~^t zd4Db*9kO{azkYS%!J{E~RO(xqoyP2Uhl1`RemcCy5O{nTR7?1BG4IB&oT>T8W}tyg z25%3kY>$>I8}#`c>8pH(s>;sa(#!u9Vle9rz7Qz{`v3jN>bv9`KolFfRqa~W&}{dj zzpC&1kCBU{G%^$YTStkC()55mk+);Va)$fNcdT|pHn$kf3}lqk({%C{qf&Z3I$GQ{ zcVhc&}~aN2*2@tZq>XBSaX^q`#qeJ(l|UuQoBO% zAP6j*p?sabq+xEvHhXy`TFKamU$?xQ(>#EjSL6x*8+f0C=~x0su>eaGGPMbo;yfwC zm9QWeGX9Q%@hg!pY%-C9gA&Z{e$>(XVLDMia=pcbWZIqjD5>|$&kACe_^E9+d0mJU zg3Z2`5QIjuZ)_$!PuFA?OyqYv9(f$$g+LfHz+d9{82d<@LgWiVoKgt{9`2+p9jy9| z`+SGz%zhhTf+v1bESy;~nDR7&MYEr9NQFY_-#P^q#eV%2ckyfd%@av%dfke~mr^s_ zk(Y}{7(2^vb5L5ti5C{f7?X7Dy3ZUfdLH6)E}uZMylX{jYGi$7n)1^K!iOYR|GAel zul4?I#H1x)57-%Jq&k4sUOw z469Qy?@BFe@O3*?5{p2S9*HwBRl_SwH=QTaa-%|{^TTX%KJ+i!SL^p_92=x>oxiVo zSIwk7@%}jv{3w*($iIJl^42JtIVa1?QB*&RO&EhtG)c#K zDg-{<&Z~ZjYv3$>w5AhQeWa6{0oJ6}%ab-S%W)xI+v~i^iB8?fT2@$dmLtLI8Y27+ zbbUAZN1}+ivHxjMgiP9XmzCH5eCzFI>r)dsM&2QJpgdKH zWBBf&YNGOQ?+X@utcjKeaCgx@8ud+9R4lKKdlS0CP-=s-B zlz!!T^NY6Z>*%7+HY*d{FC!WaAQ#;r3%B|!$qXee;=6+gZ(oL)3TGc&&l#awqJC<0 za~!KsYP8t1eYT=FP&?mIRvdiy(P zclelX_c5nim)>68OChc2n$JBp=GbC8p>-5&*F!3MA^F2y80$-MDz|mNeA+e=PLO*M z(NLyck}UJ;`OMF!FJ!B8o>=?MKPdn^0QwHF`CTv0FS}W<**|AVu+)>hUtuxZ1$WG| zsvwHtKUa_4_{{dL$X78-4FhO4o-EJ!L3!jOG41lw(wtfP&FW|HBptQFuD&P2%X!BS zpTMYp)`pjzjI`2X68Gdq8%#6=u2+|qs%L5Apgg)@1{8aEX=$l%<%|^~=x=oIjp$vx zXivM@II{G^NOzI8Cp=MiG!!|qyYn}pcU5Dbo>d_W*ZL*e@`_1a?>^5}tB7y>7)|y^ zv7&vPa`Nu$cN1UqLaLfXs+#taZ~gsc_(Wy)_OK4sSXM}mYya8WZ*y%bi|ietJXbbC zMODpA)YXx35lZ*(vy+u>wQ^|!WV(O=IvR9iKWl+tcj80P#Ax206tsX^d=LgBvEZq`5N{{GAlyrNd%5~P({wWQ!bH)8tzG7;{qc8Ay3B1-Dl$yJh`Sijgj5w0$L^Q-;7(C<}4clj4%&3D=gGH53byyRsP5LXfD_q5ZB~FFDH;?9i9=wpLi$$c(`re)-J(|m~0maf#a+cbc>L~%EoX_UA9G;T< z$~_$&Mye}r8+ACCOg=os#yi-g?ZB4>U|)&&pjkU>8YX)*0Of60crnmm5l{XHytQW> zAki#Sh4gX&LwXmLF8GBQNcv)^l?uEOJ0RiODD_DlcdM3Oe|duV^#^m%R2cTHvBBX9Xy3ON`8q`kAe z*6RmSg}wr}7t!441JP?J5o#E!m2@JW91{gGNIi6&bv|zyF(GwvIbHlgNAp=>dK>Sj z(u3MzIi_OA(wfCx&b2O7WS`D{aaJKQED)1>2(qC!C7F;^_!{h(FS`{rlu?DOK-UdN z1oGuNlz0$5$8MH>FaMU}cB9`SAd~O)KPu9@hrBkHP!rNCpF~(?{)Hu6I*KL#&LPmL zY_qxaAXhvHsF@SsxLl@d|1!{TUf(ipY21@}v#FAtVomZkp`s)g`qn>(D8cTx!hPaS z5TXpX-ohz=c9JKNlH6nrN3qfyT60jQc#dI;qy-}lAH!;`MHah@O>Lvdn=8se=RTI* ze&m$DZem~b1*X3_# zQr<>Eksio!?uFLUbVI@q)J9^V6?^g5@EQ}j*<@0{SM49Its7TUXU6n-)gkb&`e8lM z>s(Vz%bd=WNM@IQ?5m#HCQp5vRa9?X+oNScss5kr7n6Xq>W4j!Ci;hbPPy&dp7?d@ z)ctJuTSV_au4w z*yb`UH)Ue(#-wNXX4J15Rn1h7y&cCdJs7j7{_Q5ICMl4ri$?>96!4P`Ym`JZ>=;`< zb!CYy6Oe>XFTyixu<5B$J?4<@cSc)s&5f+x^O}uy&K9nK1y8{#)m?Gf?SrxoI=n0x zf`DW6@g^yJIsnRICAi=;sWNQ_H&PDWZiu zk?8_nT)d~Nr^hhIfS%GX=FFEY{R7l9K`gHIw|etp=Dx%k-F`@;tNI6Fq)prB zQfmr!RDKPEj!^N)+Y=H^d#yuJ1B+&8tesVYDiu-HtIXh0X!L48wIKP1l8*|Lx4SNa%&t1>~aCnhcCIDniBvQ z*Ptkhyu#T}Sp{(HFAfP7C&X8rMoTinSJ-NNKP{}g&&t|G(iv{c`Ys`8R*-FWF6>^f zk4Y0CYwS#_M`cMPW)hl(fCwm3tDl!ocF(Kw!)~ zUjjqDHd#41E`9|7w-&J9nu?0WA2eBcxUX+f613?7Bkk|@8~o59D<7Q9q7@k0yBs=K zU?1qa_2*SiX*I~PK*FSGoK9UUSWN(6!uh457++!ceOi71?fFbBa1~#WF;F@BzDQ%) zHDGQR&+}lX=tS(DOml;Q=f3I>Ymm-4#vv_ok1n~Nwjb1O*xj_xtMNKUk>jz7 zaukE1^eWbk7lZELuX9j};bYqPq4%;63~vL zx8l!PS0^7Ix3h9aU0OyI4vlev$ON{IQqn9BlJFi5yb7gu4;jG+h*gaaO?b|g>=>;x za*TPNj5PBkM_8th=QVAcDQOp%Yzj4-b2XNS6}b^iqpj+^eqD*}y}@EI4{w(`pK`Uw z2otu(|APq?kKSG#P}vna%JP)oSx`WGy@hQf?Cz1VF*Ldy=}eze0U`z->CsKX18t~| z*tTx6aTrElW;?g%BT+)Nve#TfUO#1(S?^<1#_4Qvm(s1<}kKeC=|y;%d+0(AaNdyZF~>&FwPAxD%$$TG#kX4ADq_@f2*Ato|tas-lL_ zB|guqjvoB7$jEkf1$JYtSzVE9{gs%^i3f!flgNtb-U+%cEoJBN*Z+=fg5A*=CnzC0 zD0em7V47A&lX|P%EB>dweh=!6KC{$3HS}LCAnPey28l?FE2?0PgpV1alVQo$#$koV zLijF$RDVPhbKXkP^EGpWd(REb??~I=BcUJ{%8E3>7N7E71*Ma>E?Di>aYY&l#W{N6W28kJsDdHy&(`#NbN$!4^ zCzQ5!@5lhumPzh*zM{nfY14r^SCSjy84Hrle)GF@2pteLK3zJ@Xj^Voro7gfu$ojxN__T zDYM7gO;97X%Y1C5cUqw}KFcx_#RLheh^ipw6Gvwg)%1-bfQ%+2v&)%fru9}|%E%ly znskj#@(6AT7EH{Qb;qNg5GA`j5d+%a&yU?O$;9<6Rw#lLB`Q^yP_dKJDa!BqkF`sc zq>nT;ouF!v{$-2ekd?uZP1KM}?0coIJF>8bhairA>Gq|?f=0Uh;paI}2E`$A+$vbw z7~}_7_=Bn$>~sJ#jlAQ@eLzYL1@9a>c$A<9mKfjWk<+yatjFgL$|RU zSL;XJvNYLZUN&DUNLYv%<%+IrwOy8)v{`RdNuHF9>)nnH$`GxaWNGnwEN& zyclEajd4yvFURO7RH2h*rkC3Ehg__3%e*SOh{j&gk-UFTSHw#njSUr2Lo#Cs<48h; zK!=ZUFL7>lpm6+4-m*zv#>S@`o5HlCdHFy!j-(jifIh>4c_%LRPdd}bbDuFKZ`CWPQa?M#fJk&Zgz}fhyC}4^<0DoAml0 zH4$1;QT5TYmlR}Lw8zU*l{i^sA_cYEBc97F50GDjITu70Yt7%xmE1Wz)SPPFX=0qy zd>W>={sIJvm%8C$1wqao*QgHUcQ|~+W>sRIC$OqJlBI=H2K~4xDgfbsuuJ^m797*n zxIXq@4-7|gPNlZ=C}{GIX$Xov+pvRNj<{J%Jeg`bxxb;<+#lwrrY7_FI-C+F1X8sV z%kH%6eY9X>NeFfe)^9Pl`!u20`t-1Gdbtdc`rmKesX%94wdS_2??#=sMN=XG5a|9d zpbLa4qf%HiD`@Ly*2{fneo;PDDdpXk1I41LRUoygsIqz|ZFQmt zXBQl;aX^CMP(`=?@6liUERu0gJ*$d|nN#=)?Uy$4EwwNCFNvM8$&k4s4o4^;U1BMA^5gnzVvGt2uc9a7gjgWQ8_ea@)lakCM`7~2e* z1bUInF&Rdx`+Rd*D%{T6dxKY`7i%<(FS=8xHp;P?pcSke{Gi~|3`mIpLHQsslzUGM+M;__`yQ6}|e zD#|93FEjgQx2SNHX|p0lv)S&)11k8}Im73z<%gHTL&)%!p*K8ETub5iU#JIiKd$Dj zzqYjzo;37!CR{g->R~nKK;Kon?;n{RapPB+_qY=BxdK`z2foU!qwC*2tiMmCojA7X zJe>FJGXp zdcoJs=WY!%OUU@mD@2@4WV13lT2R1nlrkj^*M|pv7EWi}8-l3kEx%Prah@=1mXu2% zuRy=6K?K>R3vqobM)hA@KFVn}e&Vc1ah8x7jL=OqU+?PK)IVKB8aVJ@9!=nMryhFj zIDW1?Tp@flFgP_g52r6ib(}c3M>dpK$Tqy>pgejh4WP8H_sb*dG5Upt>1_&v zBxNDP?*K8XYGiX;vh;o>XNB$f6u^t;<5%bR8%)84M9y-V|23LpqFBRS3^(^dE%<*x z4ZeMdjbghNys}^o^(!2x`!II%UF|OfLz0Y;Ex8nspfq-2b}|{85g|5Za;`v zGzTJktU8tkDxF+G@D$4%seQ2EN&wi?Nh>JYB~lpl2tT+bq6h?P?i(Zr^g1JF#J^|$ z;10?GvQstVn)!FcEz?KJYJ=eV?MEjImgd4?(8nSl+>751-}=)ztiG?ny`Gd8p@Q z`0Jm@K~Nk)(taFr>XqBb&#O~TmKP6amGiquz+C-XJSakbg z!Kii;2HdGcvSZlfnKhU}ZjrDb@O;GrZwOu!QnpdmyB5r|?ajn#lqx@tdLr#9K5D_D zq2CV=W0qdR5b~(S`UYNlcM!-ZVZfjrvca_@^=nb2rrwM1A^MS=@yXyyOE^Vry9;w% zoRRKf;XdDLLIYg;@4VH$RO989Zu${P5ZKlsB(x>A%djgTqKd?2`=iIqZw{hZ&Qi|x z1i$$u4XrPPDhhqjE1sOQXR@}5OeRU3%OE*0<)k~JB!*0i2Rl9Wa}OtZmdqN^Bqth> zPhGvr#W1XqqIix~KQo64FBrV&^Ii8GbeMw?9t9!ZP4YSAJm! z$b;*?`skgICw=kdb@35w_6+kgrJf0%W4Z*lGNb+RWcBydG0xSDBx!h{)VUGG$2|G+0D*vtU{iLi|q<`C4Op}O1>TxCxkq8Vt zfm+srPsgYZwEZf>t*C2nl!&OIxOB2~In97?nB3sf$Twn+8W+tcj6acO6>bbJ?7!fD5xdmAEh zvp?H()$gD~GmueMjbB;^j~1Xb-Eh~ftbkgM0@_GX03e-OuiY;vBNrXPBljWY-oFPZ z4G>&3+}m)cT|A5Im1u@748A&3>G#Oz_h3o(pTHCszH24eVM^k2PU=N?#$BPH=r2wUcoUlHhN{t9W%{tcw z*z-6i*5%+5JZO-(0|&k#f}j`+Nh1Jf5DbSe?3dM}82@}Dy6o)@4Rn-Wd6SzxTyw?A z>U9HPBWY3k($nETsQ@pIwcJs8trB|uuN3YU!Jef!E9nKd*(%FHNlTkb7z=ZR-*Xk& zSNF^?@w!1g@Ua)7mKoW$PpS3#+)&8lm!Xj0S2NMvq%t%4Epq&@BNvR6mX+==yiP>Y zWf-|8;;l5dKY-f=EgH3a)yaKrZm`hxEa_kI&!@m21rn(L3rN%58;uyA=Bs$W1nxOL zG0U<`oJ?m-BIu|$a)@x|Q*YkM9ME^RL$<{stIu+8qq#d+-LkX9lPonQyBlwRz(K7G z#69*)oq@1FpNOvEMfDnr3D50?Ww_W?5(&&UGMX0zQke=)fANo@yP;-XLW-P7uB9q* zF*|Bg`Awyp-NcjSyT8!t&lxHYuM6ZOqS{}=-)De3aVESK9MprsM#HD6unsuPbWuK2 zG$AOjJX8FE)dLTLUgw}2U!A~SG2rSl_2aj(&Q-kx3B)<|(O{x?xK%75F zO9S{n1Qz#%Mx^HPWo>A3GErl(!;H<}6x3}cft_Td5Qb+9|b#9xFzt@SDjSQb9) z*Kv`ZbAEp3xvQW1)%priyL44!82|hZo*fzD%Ty^8$z_p0-t*qSkLNp?XSw zn=+SqQucYI4GzwdWZ7U3oKvS=QWW$_YyT*|_UkQq}7S)0R@*))Be z9iz_Q3QNFKtM*{07#Qz-Ci;`WXq~rD>s@g7eki6t@nRCeUybdMM)zP4?t-SAmAgWx z&U_Ph&ol)E*YUO&)UykNo`Zu>V8yvtBdJuh)11jmTwE}}_Ay%KW_o#h8sc#Blf1j( z!KG(tyNqWCeffL}90luKWrh-NUD7!*R93owf5ac24LvhL^!@ZQNC`4x3FcN^14=rq zf?(Z0eJ4=0joaCNv$GGG%a#B#4t#I8_wO@r1AyiHRPfjRFHvRz|K?CWUij@mNn?c; pL&0BG_V$WekGF##N2tzuh%V;D$1cX-VFRFr4x@=hm#AO9`#*Ul%OU^( literal 0 HcmV?d00001 diff --git a/auth/register.php b/auth/register.php index 437818a..c2957dc 100644 --- a/auth/register.php +++ b/auth/register.php @@ -33,8 +33,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } else { try { $hash = password_hash($password, PASSWORD_DEFAULT); - $uid = '618120' . mt_rand(100000, 999999); - $stmt = db()->prepare("INSERT INTO users (username, email, password_hash, uid, credit_score) VALUES (?, ?, ?, ?, ?)"); + $uid = str_pad(mt_rand(0, 99999999), 8, '0', STR_PAD_LEFT); + $stmt = db()->prepare("INSERT INTO users (username, email, password_hash, uid, credit_score, total_recharge) VALUES (?, ?, ?, ?, ?, 0)"); $username = strpos($account, '@') === false ? $account : explode('@', $account)[0]; $email = strpos($account, '@') !== false ? $account : $account . '@byro.io'; diff --git a/db/migrations/003_update_users_for_profile.sql b/db/migrations/003_update_users_for_profile.sql new file mode 100644 index 0000000..88080bb --- /dev/null +++ b/db/migrations/003_update_users_for_profile.sql @@ -0,0 +1,17 @@ +-- Add missing fields for Profile, KYC and Security +ALTER TABLE users +ADD COLUMN total_recharge DECIMAL(16,4) DEFAULT 0, +ADD COLUMN transaction_password VARCHAR(255) DEFAULT NULL, +ADD COLUMN kyc_name VARCHAR(100) DEFAULT NULL, +ADD COLUMN kyc_id_number VARCHAR(50) DEFAULT NULL, +ADD COLUMN kyc_photo_front VARCHAR(255) DEFAULT NULL, +ADD COLUMN kyc_photo_back VARCHAR(255) DEFAULT NULL, +ADD COLUMN kyc_photo_handheld VARCHAR(255) DEFAULT NULL, +ADD COLUMN kyc_status INT DEFAULT 0 COMMENT '0: Unverified, 1: Pending, 2: Verified, 3: Rejected'; + +-- Update credit_score default +ALTER TABLE users MODIFY COLUMN credit_score INT DEFAULT 80; + +-- Ensure existing users have a credit score and UID if missing +UPDATE users SET credit_score = 80 WHERE credit_score IS NULL; +UPDATE users SET uid = LPAD(FLOOR(RAND() * 100000000), 8, '0') WHERE uid IS NULL OR uid = ''; diff --git a/includes/footer.php b/includes/footer.php index eecf857..4ed7499 100644 --- a/includes/footer.php +++ b/includes/footer.php @@ -72,7 +72,10 @@
diff --git a/includes/header.php b/includes/header.php index 872291a..42b1ec5 100644 --- a/includes/header.php +++ b/includes/header.php @@ -322,8 +322,11 @@ function getSetting($key, $default = null) {
- - + + __('unverified'), 1 => __('pending'), 2 => __('verified'), 3 => __('rejected')]; + echo $statusMap[$user['kyc_status'] ?? 0] ?? __('unverified'); + ?>
diff --git a/includes/lang.php b/includes/lang.php index b86b2de..ca9b2b1 100644 --- a/includes/lang.php +++ b/includes/lang.php @@ -122,6 +122,83 @@ $translations = [ 'buy_up' => '买涨', 'buy_down' => '买跌', 'profit' => '收益', + 'enter_amount' => '请输入有效金额', + 'insufficient_balance' => '余额不足', + 'order_in_progress' => '订单进行中', + 'current_price' => '现价', + 'cycle' => '周期', + 'direction' => '方向', + 'quantity' => '数量', + 'opening_price' => '开仓价', + 'final_price_settlement' => '最终价格以系统结算为准', + 'open_orders' => '当前委托', + 'settlement_history' => '历史结算', + 'no_records_found' => '暂无记录', + 'executing' => '正在执行', + 'loss' => '亏损', + 'amount_too_low' => '买入金额低于最小限制', + 'amount_too_high' => '买入金额超过最大限制', + 'fiat_recharge' => '法币充值', + 'crypto_recharge' => '数字货币充值', + 'select_currency' => '选择币种', + 'fiat_amount' => '法币金额', + 'est_usdt' => '预计到账 (USDT)', + 'confirm_order' => '确认订单', + 'recharge_request_sent' => '充值请求已提交给客服', + 'back' => '返回', + 'network' => '网络', + 'address' => '充值地址', + 'copy' => '复制', + 'withdraw_amount' => '提现金额', + 'withdraw_address' => '提现地址', + 'receive' => '预计到账', + 'withdraw_request_sent' => '提现申请已提交,请等待审核', + 'all' => '全部', + 'crypto_withdraw' => 'USDT提现', + 'fiat_withdraw' => '法币提现', + 'withdraw_password' => '提现密码', + 'to_receive' => '预计到账', + 'est_receive_fiat' => '预计收到法币', + 'recharge_steps' => '充值步骤', + 'withdraw_steps' => '提现步骤', + 'security_tips' => '安全提示', + 'secure' => '安全', + 'fast' => '极速', + 'support_247' => '24/7支持', + 'i_have_paid' => '我已完成支付', + 'crypto_recharge_warning' => '请务必仅向此地址发送 USDT。发送其他资产可能会导致永久丢失。', + 'kyc' => '实名认证', + 'security' => '安全设置', + 'vip_level' => 'VIP等级', + 'unverified' => '未认证', + 'pending' => '审核中', + 'verified' => '已认证', + 'rejected' => '已驳回', + 'full_name' => '真实姓名', + 'id_number' => '身份证号', + 'id_front' => '身份证正面', + 'id_back' => '身份证反面', + 'id_handheld' => '手持身份证', + 'upload' => '点击上传', + 'submit' => '提交', + 'login_password' => '登录密码', + 'trade_password' => '交易密码', + 'change_password' => '修改密码', + 'set_password' => '设置密码', + 'kyc_instructions' => '请确保上传的照片清晰可见,且与填写的身份证号一致。', + 'security_instructions' => '请定期修改您的密码,并确保交易密码与登录密码不同。', + 'old_password' => '原密码', + 'new_password' => '新密码', + 'confirm_new_password' => '确认新密码', + 'kyc_steps' => '实名认证步骤', + 'kyc_step1' => '填写您的真实姓名和身份证号码。', + 'kyc_step2' => '上传您的身份证正反面照片。', + 'kyc_step3' => '上传您手持身份证的照片,并确保面部清晰。', + 'security_steps' => '安全设置步骤', + 'security_step1' => '设置强密码,包含字母、数字和符号。', + 'security_step2' => '交易密码用于提现和重要操作,请务必妥善保存。', + 'frozen' => '冻结', + 'converted_to' => '折合', ], 'en' => [ 'home' => 'Home', @@ -237,6 +314,83 @@ $translations = [ 'buy_up' => 'Buy Up', 'buy_down' => 'Buy Down', 'profit' => 'Profit', + 'enter_amount' => 'Please enter a valid amount', + 'insufficient_balance' => 'Insufficient balance', + 'order_in_progress' => 'Order in Progress', + 'current_price' => 'Current Price', + 'cycle' => 'Cycle', + 'direction' => 'Direction', + 'quantity' => 'Quantity', + 'opening_price' => 'Opening Price', + 'final_price_settlement' => 'Final price is subject to system settlement', + 'open_orders' => 'Open Orders', + 'settlement_history' => 'Settlement History', + 'no_records_found' => 'No records found', + 'executing' => 'Executing', + 'loss' => 'Loss', + 'amount_too_low' => 'Amount too low', + 'amount_too_high' => 'Amount too high', + 'fiat_recharge' => 'Fiat Deposit', + 'crypto_recharge' => 'Crypto Deposit', + 'select_currency' => 'Select Currency', + 'fiat_amount' => 'Fiat Amount', + 'est_usdt' => 'Estimated USDT', + 'confirm_order' => 'Confirm Order', + 'recharge_request_sent' => 'Deposit request sent to support', + 'back' => 'Back', + 'network' => 'Network', + 'address' => 'Deposit Address', + 'copy' => 'Copy', + 'withdraw_amount' => 'Withdraw Amount', + 'withdraw_address' => 'Withdraw Address', + 'receive' => 'Receive', + 'withdraw_request_sent' => 'Withdrawal request submitted for review', + 'all' => 'All', + 'crypto_withdraw' => 'USDT Withdrawal', + 'fiat_withdraw' => 'Fiat Withdrawal', + 'withdraw_password' => 'Withdrawal Password', + 'to_receive' => 'To Receive', + 'est_receive_fiat' => 'Est. Fiat Receive', + 'recharge_steps' => 'Recharge Steps', + 'withdraw_steps' => 'Withdrawal Steps', + 'security_tips' => 'Security Tips', + 'secure' => 'Secure', + 'fast' => 'Fast', + 'support_247' => '24/7 Support', + 'i_have_paid' => 'I have paid', + 'crypto_recharge_warning' => 'Please only send USDT to this address. Sending other assets may result in permanent loss.', + 'kyc' => 'Identity Verification', + 'security' => 'Security Settings', + 'vip_level' => 'VIP Level', + 'unverified' => 'Unverified', + 'pending' => 'Pending', + 'verified' => 'Verified', + 'rejected' => 'Rejected', + 'full_name' => 'Full Name', + 'id_number' => 'ID Number', + 'id_front' => 'ID Front', + 'id_back' => 'ID Back', + 'id_handheld' => 'Hand-held ID', + 'upload' => 'Upload', + 'submit' => 'Submit', + 'login_password' => 'Login Password', + 'trade_password' => 'Trade Password', + 'change_password' => 'Change Password', + 'set_password' => 'Set Password', + 'kyc_instructions' => 'Please ensure that the uploaded photos are clear and consistent with the ID number filled in.', + 'security_instructions' => 'Please change your password regularly and ensure that the transaction password is different from the login password.', + 'old_password' => 'Old Password', + 'new_password' => 'New Password', + 'confirm_new_password' => 'Confirm New Password', + 'kyc_steps' => 'KYC Steps', + 'kyc_step1' => 'Fill in your real name and ID number.', + 'kyc_step2' => 'Upload photos of the front and back of your ID card.', + 'kyc_step3' => 'Upload a photo of you holding your ID card, ensuring your face is clear.', + 'security_steps' => 'Security Steps', + 'security_step1' => 'Set a strong password containing letters, numbers, and symbols.', + 'security_step2' => 'The transaction password is used for withdrawals and important operations. Please keep it safe.', + 'frozen' => 'Frozen', + 'converted_to' => 'Equivalent', ] ]; diff --git a/includes/terminal_layout.php b/includes/terminal_layout.php index 4cf1f43..7669500 100644 --- a/includes/terminal_layout.php +++ b/includes/terminal_layout.php @@ -4,6 +4,14 @@ function renderTerminal($activeTab = 'spot') { $currentSymbol = $_GET['symbol'] ?? 'BTC'; $currentSymbol = strtoupper($currentSymbol); + $usdt_balance = 0; + if ($user) { + $stmt = db()->prepare("SELECT available FROM user_balances WHERE user_id = ? AND symbol = 'USDT'"); + $stmt->execute([$user['id']]); + $bal = $stmt->fetch(); + $usdt_balance = $bal['available'] ?? 0; + } + $full_coins = [ ['symbol' => 'BTC', 'name' => 'Bitcoin', 'price' => '64,234.50', 'change' => '+2.45%'], ['symbol' => 'ETH', 'name' => 'Ethereum', 'price' => '3,456.20', 'change' => '+1.12%'], @@ -113,41 +121,59 @@ function renderTerminal($activeTab = 'spot') {
-
-
- - - - - +
+
+
: USDT
+
+
+ + + + +
-
(USDT)
+
(USDT)
- +
- - + +
-
-
1,000.00 USDT
-
0.00 USDT
+
+
+
0.00 USDT
-
-
@@ -156,13 +182,21 @@ function renderTerminal($activeTab = 'spot') { @@ -188,7 +352,7 @@ function renderTerminal($activeTab = 'spot') {
-
: 1,000.00 USDT
+
: USDT
@@ -241,26 +405,68 @@ function renderTerminal($activeTab = 'spot') {
-
当前委托 (Open Orders)
-
结算部位 (Settlement)
-
成交历史 (Trade History)
-
资产 (Assets)
+
+
@@ -329,56 +535,72 @@ function renderTerminal($activeTab = 'spot') { + + +
+
+
+ +
+ + + + + +
+ + + + +
+
diff --git a/kyc.php b/kyc.php new file mode 100644 index 0000000..e5f44f4 --- /dev/null +++ b/kyc.php @@ -0,0 +1,203 @@ +prepare("SELECT * FROM users WHERE id = ?"); +$stmt->execute([$user['id']]); +$userData = $stmt->fetch(); + +$success = ''; +$error = ''; + +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $real_name = $_POST['real_name'] ?? ''; + $id_number = $_POST['id_number'] ?? ''; + + // Handle uploads + $uploadDir = 'uploads/kyc/'; + if (!is_dir($uploadDir)) mkdir($uploadDir, 0777, true); + + $front = $userData['kyc_photo_front']; + $back = $userData['kyc_photo_back']; + $handheld = $userData['kyc_photo_handheld']; + + if (isset($_FILES['photo_front']) && $_FILES['photo_front']['error'] === 0) { + $ext = pathinfo($_FILES['photo_front']['name'], PATHINFO_EXTENSION); + $front = $uploadDir . $user['id'] . '_front_' . time() . '.' . $ext; + move_uploaded_file($_FILES['photo_front']['tmp_name'], $front); + } + + if (isset($_FILES['photo_back']) && $_FILES['photo_back']['error'] === 0) { + $ext = pathinfo($_FILES['photo_back']['name'], PATHINFO_EXTENSION); + $back = $uploadDir . $user['id'] . '_back_' . time() . '.' . $ext; + move_uploaded_file($_FILES['photo_back']['tmp_name'], $back); + } + + if (isset($_FILES['photo_handheld']) && $_FILES['photo_handheld']['error'] === 0) { + $ext = pathinfo($_FILES['photo_handheld']['name'], PATHINFO_EXTENSION); + $handheld = $uploadDir . $user['id'] . '_handheld_' . time() . '.' . $ext; + move_uploaded_file($_FILES['photo_handheld']['tmp_name'], $handheld); + } + + if (empty($real_name) || empty($id_number)) { + $error = "Please fill in all fields"; + } else { + $stmt = db()->prepare("UPDATE users SET kyc_name = ?, kyc_id_number = ?, kyc_photo_front = ?, kyc_photo_back = ?, kyc_photo_handheld = ?, kyc_status = 1 WHERE id = ?"); + $stmt->execute([$real_name, $id_number, $front, $back, $handheld, $user['id']]); + $success = "Verification request submitted successfully!"; + // Refresh user data + $userData['kyc_status'] = 1; + } +} + +$kycStatus = $userData['kyc_status'] ?? 0; +?> + +
+
+
+ + +
+
+

+ + +

+
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+ +

+

()

+
+ +
+ +

+

Your application is being reviewed by our team.

+
+ +
+
+
+ + +
+
+ + +
+
+ +
+
+ +
+ +
+ + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+
+ +
+ +
+ + +
+ +
+
+
+ +
+
+ +
+
    +
  • +
  • +
  • +
+
+ + + + +
+
+ + +
+
+
+

+ +

+
+
+
+
+
+ + + + diff --git a/profile.php b/profile.php index 659c437..eeb6ccf 100644 --- a/profile.php +++ b/profile.php @@ -6,113 +6,163 @@ if (!$user) { exit; } +// Get user data again to ensure we have latest fields +$stmt = db()->prepare("SELECT * FROM users WHERE id = ?"); +$stmt->execute([$user['id']]); +$userData = $stmt->fetch(); + // Get balances $stmt = db()->prepare("SELECT * FROM user_balances WHERE user_id = ?"); $stmt->execute([$user['id']]); $balances = $stmt->fetchAll(); + +// Total USDT Balance calculation +$totalBalanceUsdt = 0; +foreach ($balances as $b) { + if ($b['symbol'] === 'USDT') { + $totalBalanceUsdt += $b['available'] + $b['frozen']; + } +} + +function getVipLevel($totalRecharge) { + if ($totalRecharge >= 10000000) return 7; + if ($totalRecharge >= 5000000) return 6; + if ($totalRecharge >= 1000000) return 5; + if ($totalRecharge >= 500000) return 4; + if ($totalRecharge >= 100000) return 3; + if ($totalRecharge >= 50000) return 2; + if ($totalRecharge >= 10001) return 1; + return 0; +} + +$vipLevel = getVipLevel($userData['total_recharge'] ?? 0); + +$kycStatusText = [ + 0 => __('unverified'), + 1 => __('pending'), + 2 => __('verified'), + 3 => __('rejected') +]; +$kycStatusColor = [ + 0 => 'text-white-50', + 1 => 'text-warning', + 2 => 'text-success', + 3 => 'text-danger' +]; ?> -
+
- -
-
-
-
-
- -
-
-
-

-

- -
-
- UID - -
-
- Account Status - Verified -
-
- Credit Score - + +
+
+
+ +
+
+
+ +
+
-
- - + +
+
+ UID + +
+
+ + +
+
+ + VIP +
+ + + + + + + + + + + + + + + + +
- -
-
+ +
+ +
-
-

Wallet Balances

-
- - +
+
+

(USDT)

+

USDT

+
+
- -
-
- - - - - - - - - - - '325/small/tether.png', - 'BTC' => '1/small/bitcoin.png', - 'ETH' => '279/small/ethereum.png', - 'BNB' => '825/small/binance-coin-logo.png' - ]; - foreach($balances as $b): - ?> - - - - - - - - + + - - - - - - -
AssetIconAvailableFrozenAction
-
-
- - -
-
- - - -
- - No assets found in your wallet. -
-
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
(USDT)
+
+ + +
+
+ + + + + + + +
diff --git a/recharge.php b/recharge.php new file mode 100644 index 0000000..a91fc1e --- /dev/null +++ b/recharge.php @@ -0,0 +1,295 @@ +query("SELECT setting_key, setting_value FROM system_settings"); +$settings = $stmt->fetchAll(PDO::FETCH_KEY_PAIR); + +$trc20_addr = $settings['usdt_trc20_address'] ?? 'TYv9V5J1P1eEwz7y3WqJg9M2yv7f7xXv3x'; +$erc20_addr = $settings['usdt_erc20_address'] ?? '0x742d35Cc6634C0532925a3b844Bc454e4438f44e'; +$bep20_addr = $settings['usdt_bep20_address'] ?? '0x742d35Cc6634C0532925a3b844Bc454e4438f44e'; +?> + +
+
+
+ + + +
+
+

+ + +

+
+ +
+ + + +
+ +
+
+
+ + +
+ +
+ +
+ + USD +
+
+ +
+
+ + 0.00 USDT +
+
+ + : 1 USDT ≈ 1.00 USD +
+
+ + +
+
+ + +
+
+ +
+ USDT +
+
USDT
+
Tether USD
+
+
+
+ +
+ +
+ + + +
+
+ +
+ QR Code +
+ +
+ +
+ + +
+
+ +
+ + ⚠️ +
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+ 1 + 选择充值方式(法币或加密货币) +
+
+ 2 + 填写金额或复制充值地址 +
+
+ 3 + 完成支付后点击确认提交 +
+
+ 4 + 等待客服核实,资金通常在2-5分钟内到账 +
+
+
+
+
+
+
+
+
+
+
    +
  • 请勿向任何非官方提供的地址充值
  • +
  • 充值前请仔细核对主网协议(如 TRC20/ERC20)
  • +
  • 请保管好您的支付凭证,以便在需要时提供给客服
  • +
  • 平台绝不会要求您在非官方页面输入支付密码
  • +
+
+
+
+
+
+ +
+
+ + + +
+
+
+
+
+ + + + + + diff --git a/security.php b/security.php new file mode 100644 index 0000000..97bb15a --- /dev/null +++ b/security.php @@ -0,0 +1,162 @@ +prepare("SELECT password_hash FROM users WHERE id = ?"); + $stmt->execute([$user['id']]); + $current_pwd_hash = $stmt->fetchColumn(); + + if (!password_verify($old_pwd, $current_pwd_hash)) { + $error = "Old password incorrect"; + } elseif ($new_pwd !== $confirm_pwd) { + $error = "Passwords do not match"; + } elseif (strlen($new_pwd) < 6) { + $error = "Password must be at least 6 characters"; + } else { + $new_hash = password_hash($new_pwd, PASSWORD_DEFAULT); + $stmt = db()->prepare("UPDATE users SET password_hash = ? WHERE id = ?"); + $stmt->execute([$new_hash, $user['id']]); + $success = "Login password changed successfully"; + } + } elseif ($action === 'set_trade_password') { + $trade_pwd = $_POST['trade_password'] ?? ''; + $confirm_trade_pwd = $_POST['confirm_trade_password'] ?? ''; + + if ($trade_pwd !== $confirm_trade_pwd) { + $error = "Passwords do not match"; + } elseif (strlen($trade_pwd) < 6) { + $error = "Transaction password must be at least 6 characters"; + } else { + // Store plain or hashed? Usually hashed but user might want simple numeric. + // I'll hash it for security. + $trade_hash = password_hash($trade_pwd, PASSWORD_DEFAULT); + $stmt = db()->prepare("UPDATE users SET transaction_password = ? WHERE id = ?"); + $stmt->execute([$trade_hash, $user['id']]); + $success = "Transaction password updated successfully"; + } + } +} + +$stmt = db()->prepare("SELECT transaction_password FROM users WHERE id = ?"); +$stmt->execute([$user['id']]); +$hasTradePwd = !empty($stmt->fetchColumn()); +?> + +
+
+
+ + +
+
+

+ + +

+
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
    +
  • +
  • +
+
+ +
+
+
+

+ +

+
+
+
+
+
+
+
+ + diff --git a/swap.php b/swap.php index 40cec13..76e2551 100644 --- a/swap.php +++ b/swap.php @@ -1,6 +1,14 @@ prepare("SELECT available FROM user_balances WHERE user_id = ? AND symbol = 'USDT'"); + $stmt->execute([$user['id']]); + $bal = $stmt->fetch(); + $usdt_balance = $bal['available'] ?? 0; +} ?>
@@ -14,7 +22,7 @@ require_once __DIR__ . '/includes/header.php';
- : 1,000.00 + :
diff --git a/withdraw.php b/withdraw.php new file mode 100644 index 0000000..c336e2f --- /dev/null +++ b/withdraw.php @@ -0,0 +1,325 @@ +prepare("SELECT available FROM user_balances WHERE user_id = ? AND symbol = 'USDT'"); +$stmt->execute([$user['id']]); +$bal = $stmt->fetch(); +$available = $bal['available'] ?? 0; +?> + +
+
+
+ + + +
+
+

+ + +

+
+ +
+ + + +
+ +
+
+
+ +
+ USDT +
+
USDT
+
Tether USD
+
+
+
+ +
+ +
+ + + +
+
+ +
+ + +
+ +
+
+ + : USDT +
+
+ + +
+
+ +
+ + +
+ +
+
+ 手续费 (Fee) + 1.00 USDT +
+
+ + 0.00 USDT +
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
+ + : USDT +
+
+ + +
+
+ +
+ + +
+ +
+
+ : 1 USDT ≈ + 1.00 USD +
+
+ + 0.00 USD +
+
+ + +
+
+
+
+
+ + +
+
+
+
+
+
+
+ 1 + 选择提现方式(加密货币或法币) +
+
+ 2 + 填写提现地址/选择币种并输入金额 +
+
+ 3 + 输入提现密码(默认123456) +
+
+ 4 + 确认后提交审核,预计10-30分钟内处理 +
+
+
+
+
+
+
+
+
+
+
    +
  • 提现前请务必确认地址正确,转错将无法找回
  • +
  • 为了您的资金安全,大额提现可能需要人工电话核实
  • +
  • 请确保提现主网与接收端主网一致(如均为 TRC20)
  • +
  • 严禁参与任何非法洗钱活动,平台将配合监管部门调查
  • +
+
+
+
+
+
+ +
+
+ + + +
+
+
+
+
+ + + + + +