1 2 3<!doctype html> 4<html> 5<head> 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 8 <title>Login_LetsMain_Free and useful tools for scientific Internet access and acceleration</title> 9 <meta name="keywords" content="LetsMain,Accelerator,Scientific Internet,OpenAI Access,OpenAI Cannot Access,ChatGPT Access,ChatGPT Cannot Access,ChatGPT Access Master,Google Access,Google Cannot Access,Google Access,Google Cannot Access,Google Access Master"> 10 <meta name="description" content="LetsMain It is specially for education, scientific research, games, news, foreign trade, cross-border e-commerce, seafood and developers to solve the inaccessibility of common overseas websites and Internet access acceleration browser extensions"> 11 <!-- Icons --> 12 <link rel="shortcut icon" href="//cdn.letsmain.com/static/img/favicon.ico"> 13 <!-- Stylesheets --> 14 <link rel="stylesheet" href="//cdn.staticfile.net/tailwindcss/2.2.19/tailwind.min.css"> 15 <!--<link rel="stylesheet" href="//cdn.jsdelivr.net/npm/[email protected]/dist/tailwind.min.css">--> 16 17 <style> 18 .text-cyan-main{color:#0dcaf0} 19 .text-cyan-main:hover{color:#3dd5f3} 20 .text-cyan-100{color:#d5f4fc} 21 .text-cyan-200{color:#abebfa} 22 .text-cyan-300{color:#86e0f7} 23 .text-cyan-400{color:#66d6f4} 24 .text-cyan-500{color:#54cbf2} 25 .text-cyan-600{color:#42a3c1} 26 .text-cyan-700{color:#307a91} 27 .text-cyan-800{color:#1e5261} 28 .text-cyan-900{color:#0c2830} 29 .bg-cyan-100{background-color:#d5f4fc} 30 .bg-cyan-200{background-color:#abebfa} 31 .bg-cyan-300{background-color:#86e0f7} 32 .bg-cyan-400{background-color:#66d6f4} 33 .bg-cyan-500{background-color:#54cbf2} 34 .bg-cyan-600{background-color:#42a3c1} 35 .bg-cyan-700{background-color:#307a91} 36 .bg-cyan-800{background-color:#1e5261} 37 .bg-cyan-900{background-color:#0c2830} 38 .border-cyan-100{border-color:#d5f4fc} 39 .border-cyan-200{border-color:#abebfa} 40 .border-cyan-300{border-color:#86e0f7} 41 .border-cyan-400{border-color:#66d6f4} 42 .border-cyan-500{border-color:#54cbf2} 43 .border-cyan-600{border-color:#42a3c1} 44 .border-cyan-700{border-color:#307a91} 45 .border-cyan-800{border-color:#1e5261} 46 .border-cyan-900{border-color:#0c2830} 47 .anchor-link:hover{background:#e5e7eb} 48 .checked[type=checkbox]{position:relative;width:16px;height:16px;cursor:pointer} 49 .checked[type=checkbox]::after{position:absolute;top:0;color:#000;width:16px;height:16px;display:inline-block;visibility:visible;padding-left:0;text-align:center;content:' ';border-radius:3px} 50 .checked[type=checkbox]:checked::after{content:"â";color:#fff;font-size:12px;line-height:16px;font-weight:700;background-color:#0dcaf0} 51 .dropdown{display:none;z-index:10;opacity:0;transition:opacity .3s ease} 52 .show{display:block;opacity:1} 53 #j-scroll-top{transition:opacity .2s ease-in-out} 54 #j-scroll-top:hover{opacity:.8} 55 56 .upgrade-btn { 57 background: linear-gradient(90deg, #0dcaf0, #54cbf2); 58 background-size: 200% auto; 59 animation: gradient 2s ease infinite, pulse 2s ease infinite; 60 transition: all 0.3s ease; 61 } 62 .upgrade-btn:hover { 63 background-position: right center; 64 transform: translateY(-1px); 65 box-shadow: 0 4px 12px rgba(13, 202, 240, 0.3); 66 } 67 @keyframes gradient { 68 0% { 69 background-position: 0% 50%; 70 } 71 50% { 72 background-position: 100% 50%; 73 } 74 100% { 75 background-position: 0% 50%; 76 } 77 } 78 @keyframes pulse { 79 0% { 80 box-shadow: 0 0 0 0 rgba(13, 202, 240, 0.4); 81 } 82 70% { 83 box-shadow: 0 0 0 10px rgba(13, 202, 240, 0); 84 } 85 100% { 86 box-shadow: 0 0 0 0 rgba(13, 202, 240, 0); 87 } 88 } 89 90 .glow-price-card { 91 position: relative; 92 transition: all 0.3s ease; 93 background: #111827; 94 animation: price-breathing 3s ease infinite; 95 border-radius: 0.375rem; 96 } 97 .glow-price-card:hover { 98 transform: translateY(-1px); 99 animation: price-breathing-hover 3s ease infinite; 100 } 101 @keyframes price-breathing { 102 0% { 103 box-shadow: 0 0 8px rgba(13, 202, 240, 0.2), 104 0 0 16px rgba(13, 202, 240, 0.1); 105 } 106 50% { 107 box-shadow: 0 0 12px rgba(13, 202, 240, 0.3), 108 0 0 24px rgba(13, 202, 240, 0.15); 109 } 110 100% { 111 box-shadow: 0 0 8px rgba(13, 202, 240, 0.2), 112 0 0 16px rgba(13, 202, 240, 0.1); 113 } 114 } 115 @keyframes price-breathing-hover { 116 0% { 117 box-shadow: 0 0 12px rgba(13, 202, 240, 0.3), 118 0 0 24px rgba(13, 202, 240, 0.15); 119 } 120 50% { 121 box-shadow: 0 0 16px rgba(13, 202, 240, 0.4), 122 0 0 32px rgba(13, 202, 240, 0.2); 123 } 124 100% { 125 box-shadow: 0 0 12px rgba(13, 202, 240, 0.3), 126 0 0 24px rgba(13, 202, 240, 0.15); 127 } 128 } 129 130 #notification-popup { 131 .max-w-sm { 132 max-width: 24rem; 133 } 134 .bg-white { 135 min-width: 280px; 136 width: auto; 137 } 138 #notification-text { 139 white-space: normal; 140 word-wrap: break-word; 141 } 142 } 143 @keyframes slideUp { 144 from { 145 transform: translateY(100%); 146 opacity: 0; 147 } 148 to { 149 transform: translateY(0); 150 opacity: 1;
151 } 152 } 153 @keyframes slideDown { 154 from { 155 transform: translateY(0); 156 opacity: 1; 157 } 158 to { 159 transform: translateY(100%); 160 opacity: 0; 161 } 162 } 163 .animate-slide-up { 164 animation: slideUp 0.3s ease-out; 165 } 166 .animate-slide-down { 167 animation: slideDown 0.3s ease-out; 168 } 169 170 171 172 173 174 175 </style> 176 177 <!-- Google Adsense --> 178
178<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3907737269806206" crossorigin="anonymous"></script>
178 179 <!-- Adsterra --> 180
180<script src="//pl27947455.effectivegatecpm.com/84/2d/e8/842de8ddeb8ee4e2da704471bcdcdd18.js" type="text/javascript"></script>
180 181
181<script src="//pl27947715.effectivegatecpm.com/7d87f12e405996574fe0430670f2483d/invoke.js" async="async" data-cfasync="false"></script>
181 182
182<script src="//pl27956338.effectivegatecpm.com/2a/5e/c6/2a5ec65677e7b1364bfc31cec0874d41.js" type="text/javascript"></script>
182 183 <!-- Monetag --> 184 <!--
184<script>(function(s){s.dataset.zone='10114399',s.src='https://forfrogadiertor.com/tag.min.js'})([document.documentElement, document.body].filter(Boolean).pop().appendChild(document.createElement('script')))</script>
184--> 185
185<script src="//fpyf8.com/88/tag.min.js" data-zone="181546" async data-cfasync="false"></script>
185 186 <!-- Google Analytics -->
vendor: 63 bytes, lines 186-187
186 187 <script async src="//www.googletagmanager.com/gtag/js?id=
187G-T62BCR6ZC1
vendor: 17 bytes, lines 187-188
187"></script> 188
188<script> 189
vendor: 154 bytes, lines 189-192
189window.dataLayer = window.dataLayer || []; 190 function gtag(){dataLayer.push(arguments);} 191 gtag('js', new Date()); 192 gtag('config', '
192G-T62BCR6ZC1
vendor: 9 bytes, lines 192-193
192'); 193
193</script>
193 194</head> 195<body> 196 197<div class="page"> 198 199<nav class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> 200 <div class="flex justify-between pt-7"> 201 <a href="/"> 202 <img class="h-12 w-auto inline-block dark:hidden" src="//cdn.letsmain.com/static/img/logo.png" alt="LetsMain Logo" /> 203 <!--<img class="h-12 w-auto hidden dark:inline-block" src="static/img/logo.png" alt=" Logo" />--> 204 </a> 205 </div> 206</nav> 207<main> 208 <div class="flex flex-col justify-center py-12 px-4 sm:px-6 lg:px-8"> 209 <div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md"> 210 <div class="py-12 px-4 shadow-glow sm:rounded-lg sm:px-10"> 211 <h1 class="text-center text-2xl font-semibold text-cyan-900 dark:text-cyan-50"> 212 Welcome back! </h1> 213 <p class="text-gray-700 dark:text-gray-300 mt-2.5 text-sm text-center"> 214 Log in to your account,Or <a href="/sign-up" class="text-sm text-cyan-main dark:text-cyan-300"> 215 create an account </a> 216 </p> 217 <form id="j-login" class="space-y-6" action="javascript:;" method="POST"> 218 <div> 219 <label for="email" class="text-sm font-medium text-cyan-700 dark:text-cyan-300" title="E-mail"> 220 Account </label> 221 <div class="mt-1 rounded-lg shadow-sm"> 222 <input class="block w-full py-2.5 px-2 sm:text-sm rounded-lg text-cyan-900 dark:text-cyan-50 placeholder-cyan-500 focus:border-brand-500 bg-white dark:bg-cyan-900 focus:ring-brand-500 border-2 border-gray-300 hover:border-gray-400" id="account" name="account" type="text" placeholder="Jack or [email protected]" value="" required /> 223 </div> 224 </div> 225 <div> 226 <label for="password" class="text-sm font-medium text-cyan-700 dark:text-cyan-300" title="Password"> 227 Password </label> 228 <div class="mt-1 relative rounded-lg" x-data="passwordVisibilty"> 229 <input class="block w-full py-2.5 px-2 sm:text-sm rounded-lg text-cyan-900 dark:text-cyan-50 placeholder-cyan-500 focus:border-brand-500 bg-white dark:bg-cyan-900 focus:ring-brand-500 border-2 border-gray-300 hover:border-gray-400" id="password" name="password" type="password" placeholder="secret" required x-ref="password" value="" /> 230 <div class="absolute inset-y-0 right-0 pr-3 flex items-center"> 231 <button type="button" id="j-password-btn" class="group focus:outline-none" @click="toggle"> 232 <svg class="h-5 w-5 text-gray-300 hover:text-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" x-show="!visible"> 233 <path fill="none" d="M0 0h24v24H0z"/> 234 <path d="M12 3c5.392 0 9.878 3.88 10.819 9-.94 5.12-5.427 9-10.819 9-5.392 0-9.878-3.88-10.819-9C2.121 6.88 6.608 3 12 3zm0 16a9.005 9.005 0 0 0 8.777-7 9.005 9.005 0 0 0-17.554 0A9.005 9.005 0 0 0 12 19zm0-2.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zm0-2a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/> 235 </svg> 236 <svg class="h-5 w-5 text-gray-300 hover:text-gray-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" x-show="visible" style="display:none"> 237 <path fill="none" d="M0 0h24v24H0z"/> 238 <path d="M17.882 19.297A10.949 10.949 0 0 1 12 21c-5.392 0-9.878-3.88-10.819-9a10.982 10.982 0 0 1 3.34-6.066L1.392 2.808l1.415-1.415 19.799 19.8-1.415 1.414-3.31-3.31zM5.935 7.35A8.965 8.965 0 0 0 3.223 12a9.005 9.005 0 0 0 13.201 5.838l-2.028-2.028A4.5 4.5 0 0 1 8.19 9.604L5.935 7.35zm6.979 6.978l-3.242-3.242a2.5 2.5 0 0 0 3.241 3.241zm7.893 2.264l-1.431-1.43A8.935 8.935 0 0 0 20.777 12 9.005 9.005 0 0 0 9.552 5.338L7.974 3.76C9.221 3.27 10.58 3 12 3c5.392
2380 9.878 3.88 10.819 9a10.947 10.947 0 0 1-2.012 4.592zm-9.084-9.084a4.5 4.5 0 0 1 4.769 4.769l-4.77-4.769z" fill="currentColor"/> 239 </svg> 240 </button> 241 </div> 242 </div> 243 </div> 244 <div class="flex justify-between"> 245 <div class="flex space-x-3 items-center"> 246 <input id="remember" name="remember" type="checkbox" class="checked w-4 h-4 text-cyan-600 rounded border-cyan-300 dark:border-cyan-500 focus:ring-cyan-500" value="on" /> 247 <input type="hidden" name="_csrf" value="851b[a]PI8hpDdXytnUyzS17iTtkT7DrIrxoXxIUfhLmyDDwBP2W18" /> 248 <label for="remember" class="text-cyan-500 dark:text-cyan-300 text-sm"> 249 Keep me logged in </label> 250 </div> 251 <a class="text-sm text-cyan-main dark:text-cyan-400 hover:underline" href="/forgot-password"> 252 Forgot your password? </a> 253 </div> 254 <button class="w-full px-6 py-3 bg-cyan-500 text-white rounded-md" type="submit"> 255 Log in </button> 256 </form> 257 </div> 258 </div> 259 </div> 260</main> 261 262 263 264<footer class="dark:bg-slate-900"> 265 <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8"> 266 <div class="py-5 pt-10"> 267 <img class="w-36 mx-auto hidden dark:block" src="//cdn.letsmain.com/static/img/logo.png" alt="LetsMain Logo" /> 268 <img class="w-36 mx-auto block dark:hidden" src="//cdn.letsmain.com/static/img/logo.png" alt="LetsMain Logo" /> 269 <nav class="mt-10 text-sm" aria-label="quick links"> 270 <div class="-my-1 flex justify-center gap-x-6"> 271 <a class="inline-block rounded-lg py-1 px-2 text-sm text-slate-700 dark:text-slate-50 hover:bg-slate-100 hover:text-slate-900 dark:hover:text-slate-700" href="/privacy">Privacy</a> 272 <a class="inline-block rounded-lg py-1 px-2 text-sm text-slate-700 dark:text-slate-50 hover:bg-slate-100 hover:text-slate-900 dark:hover:text-slate-700" href="/terms">Terms</a> 273 <a class="inline-block rounded-lg py-1 px-2 text-sm text-slate-700 dark:text-slate-50 hover:bg-slate-100 hover:text-slate-900 dark:hover:text-slate-700" href="/about">About</a> 274 <a class="inline-block rounded-lg py-1 px-2 text-sm text-slate-700 dark:text-slate-50 hover:bg-slate-100 hover:text-slate-900 dark:hover:text-slate-700" href="/contact">Contact</a> 275 </div> 276 </nav> 277 </div> 278 <div class="flex flex-col items-center border-t border-slate-400/10 pt-5 pb-16 sm:flex-row-reverse sm:justify-between"> 279 <div class="flex gap-x-6"> 280 <a class="group" aria-label="" href="http://github.com/letsmain/letsmain" target="_blank"> 281 <svg width="24" height="24" viewBox="0 0 16 16" aria-hidden="true" fill="currentColor" class="h-6 w-6 text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-gray-400"> 282 <path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"/> 283 </svg> 284 </a> 285 <a class="group" aria-label="" href="mailto:[email protected]" target="_blank"> 286 <svg width="24" height="24" viewBox="0 0 16 16" aria-hidden="true" fill="currentColor" class="h-6 w-6 text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-gray-400"> 287 <path d="M.05 3.555A2 2 0 0 1 2 2h12a2 2 0 0 1 1.95 1.555L8 8.414.05 3.555ZM0 4.697v7.104l5.803-3.558L0 4.697ZM6.761 8.83l-6.57 4.027A2 2 0 0 0 2 14h12a2 2 0 0 0 1.808-1.144l-6.57-4.027L8 9.586l-1.239-.757Zm3.436-.586L16 11.801V4.697l-5.803 3.546Z"/> 288 </svg> 289 </a> 290 <a class="group" aria-label="" href="" target="_blank" style="display:none;"> 291 <svg width="24" height="24" viewBox="0 0 16 16" aria-hidden="true" fill="currentColor" class="h-6 w-6 text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-gray-400"> 292 <path fill-rule="evenodd" d="M16 8a8.001 8.001 0 0 1-7.022 7.94l1.902-7.098a2.995 2.995 0 0 0 .05-1.492A2.977 2.977 0 0 0 10.237 6h5.511A8 8 0 0 1 16 8ZM0 8a8 8 0 0 0 7.927 8l1.426-5.321a2.978 2.978 0 0 1-.723.255 2.979 2.979 0 0 1-1.743-.147 2.986 2.986 0 0 1-1.043-.7L.633 4.876A7.975 7.975 0 0 0 0 8Zm5.004-.167L1.108 3.936A8.003 8.003 0 0 1 15.418 5H8.066a2.979 2.979 0 0 0-1.252.243 2.987 2.987 0 0 0-1.81 2.59ZM8 10a2 2 0 1 0 0-4 2 2 0 0 0 0 4Z"/> 293 </svg> 294 </a> 295 <a class="group" aria-label="" href="" target="_blank" style="display:none;"> 296 <svg width="24" height="24" viewBox="0 0 16 16" aria-hidden="true" fill="currentColor" class="h-6 w-6 text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-gray-400"> 297 <path d="M13.384 3.408c.535.276 1.22 1.152 1.556 1.963a7.98 7.98 0 0 1 .503 3.897l-.009.077a8.533 8.533 0 0 1-.026.224A7.758 7.758 0 0 1 .006 8.257v-.04c.016-.363.055-.724.114-1.082.01-.074.075-.42.09-.489l.01-.051a6.551 6.551 0 0 1 1.041-2.35c.217-.31.46-.6.725-.87.233-.238.487-.456.758-.65a1.5 1.5 0 0 1 .26-.137c-.018.268-.04 1.553.268 1.943h.003a5.744 5.744 0 0 1 1.868-1.443 3.597 3.597 0 0 0 .021 1.896c.07.047.137.098.2.152.107.09.226.207.454.433l.068.066.009.009a1.933 1.933 0 0 0 .213.18c.383.287.943.563 1.306.741.201.1.342.168.359.193l.004.008c-.012.193-.695.858-.933.858-2.206 0-2.564 1.335-2.564 1.335.087.997.714 1.839 1.517 2.357a3.72 3.72 0 0 0 .439.241c.076.034.152.065.228.094.325.115.665.18 1.01.194 3.043.143 4.155-2.804 3.129-4.745v-.001a3.005 3.005 0 0 0-.731-.9 2.945 2.945 0 0 0-.571-.37l-.003-.002a2.679 2.679 0 0 1 1.87.454 3.915 3.915 0 0 0-3.396-1.983c-.078 0-.153.005-.23.01l-.042.003V4.31h-.002a3.882 3.882 0 0 0-.8.14 6.454 6.454 0 0 0-.333-.314 2.321 2.321 0 0 0-.2-.152 3.594 3.594 0 0 1-.088-.383 4.88 4.88 0 0 1 1.352-.289l.05-.003c.052-.004.125-.01.205-.012C7.996 2.212 8.733.843 10.17.002l-.003.005.003-.001.002-.002h.002l.002-.002a.028.028 0 0 1 .015 0 .02.02 0 0 1 .012.007 2.408 2.408 0 0 0 .206.48c.06.103.122.2.183.297.49.774 1.023 1.379 1.543 1.968.771.874 1.512 1.715 2.036 3.02l-.001-.013a8.06 8.06 0 0 0-.786-2.353Z"/> 298 </svg> 299 </a> 300 <a class="group" aria-label="" href="" target="_blank" style="display:none;"> 301 <svg width="24" height="24" viewBox="0 0 16 16" aria-hidden="true" fill="currentColor" class="h-6 w-6 text-gray-700 dark:text-gray-300 group-hover:text-gray-900 dark:group-hover:text-gray-400"> 302 <path d="M9.482 9.341c-.069.062-.17.153-.17.309 0 .162.107.325.3.456.877.613 2.521.54 2.592.538h.002c.667 0 1.32-.18 1.894-.519A3.838 3.838 0 0 0 16 6.819c.018-1.316-.44-2.218-.666-2.664l-.04-.08C13.963 1.487 11.106 0 8 0A8 8 0 0 0 .473 5.29C1.488 4.048 3.183 3.262 5 3.262c2.83 0 5.01 1.885 5.01 4.797h-.004v.002c0 .338-.168.832-.487 1.244l.006-.006a.594.594 0 0 1-.043.041Z"/> 303 <path d="M.01 7.753a8.137 8.137 0 0 0 .753 3.641 8 8 0 0 0 6.495 4.564 5.21 5.21 0 0 1-.785-.377h-.01l-.12-.075a5.45 5.45 0 0 1-1.56-1.463A5.543 5.543 0 0 1 6.81 5.8l.01-.004.025-.012c.208-.098.62-.292
3031.167-.285.129.001.257.012.384.033a4.037 4.037 0 0 0-.993-.698l-.01-.005C6.348 4.282 5.199 4.263 5 4.263c-2.44 0-4.824 1.634-4.99 3.49Zm10.263 7.912c.088-.027.177-.054.265-.084-.102.032-.204.06-.307.086l.042-.002Z"/> 304 <path d="M10.228 15.667a5.21 5.21 0 0 0 .303-.086l.082-.025a8.019 8.019 0 0 0 4.162-3.3.25.25 0 0 0-.331-.35c-.215.112-.436.21-.663.294a6.367 6.367 0 0 1-2.243.4c-2.957 0-5.532-2.031-5.532-4.644.002-.135.017-.268.046-.399a4.543 4.543 0 0 0-.46 5.898l.003.005c.315.441.707.821 1.158 1.121h.003l.144.09c.877.55 1.721 1.078 3.328.996Z"/> 305 </svg> 306 </a> 307 </div> 308 <p class="text-sm text-slate-700 dark:text-slate-400 sm:mt-0"> 309 © 2026 LetsMain Studio. All rights reserved. 310 </p> 311 </div> 312 </div> 313</footer> 314 315<button id="j-scroll-top" class="fixed flex justify-center items-center bottom-16 right-4 bg-cyan-500 text-white rounded-full h-12 w-12 p-2 hidden"> 316 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6"> 317 <path stroke-linecap="round" stroke-linejoin="round" d="M4.5 15.75l7.5-7.5 7.5 7.5" /> 318 </svg> 319</button> 320 321<alert id="j-alert-area" class="fixed top-0 w-full flex justify-center"> 322 <div class="j-alert-success alert-section w-full relative flex justify-center items-center px-4 py-3 text-sm text-green-600 bg-green-200 bg-transparent opacity-95" role="alert" style="display:none;"> 323 <p class="w-full text-center"></p> 324 <button class="alert-close absolute top-0 bottom-0 right-0 px-4 py-3"> 325 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x-circle w-6 h-6 text-green-600" viewBox="0 0 16 16"> 326 <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"></path> 327 </svg> 328 </button> 329 </div> 330 <div class="j-alert-danger alert-section w-full relative flex justify-center items-center px-4 py-3 text-sm text-yellow-600 bg-yellow-200 bg-transparent opacity-95" role="alert" style="display:none;"> 331 <p class="w-full text-center"></p> 332 <button class="alert-close absolute top-0 bottom-0 right-0 px-4 py-3"> 333 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x-circle w-6 h-6 text-yellow-600" viewBox="0 0 16 16"> 334 <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"></path> 335 </svg> 336 </button> 337 </div> 338 <div class="j-alert-warning alert-section w-full relative flex justify-center items-center px-4 py-3 text-sm text-red-600 bg-red-200 bg-transparent opacity-95" role="alert" style="display:none;"> 339 <p class="w-full text-center"></p> 340 <button class="alert-close absolute top-0 bottom-0 right-0 px-4 py-3"> 341 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-x-circle w-6 h-6 text-red-600" viewBox="0 0 16 16"> 342 <path d="M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z"></path> 343 </svg> 344 </button> 345 </div> 346</alert> 347 348</div> 349 350 351
352<script type="text/javascript"> 353 const scrollTopBtn = document.getElementById('j-scroll-top'); 354 window.addEventListener('scroll', function() { 355 const y = window.scrollY; 356 if (y >= 600) { 357 scrollTopBtn.classList.remove('hidden'); 358 } else { 359 scrollTopBtn.classList.add('hidden'); 360 } 361 }); 362 scrollTopBtn.addEventListener('click', function() { 363 window.scrollTo({ 364 top: 0, 365 behavior: 'smooth' 366 }); 367 }); 368 function showAlert(type, message, delay, redirectUrl) { 369 const alertArea = document.querySelector('#j-alert-area'); 370 const alertSection = alertArea.querySelector(`.j-alert-${type}`); 371 const pTag = alertSection.querySelector('p'); 372 const closeBtn = alertSection.querySelector('.alert-close'); 373 pTag.textContent = message; 374 alertSection.style.display = 'block'; 375 if (delay) { 376 setTimeout(() => { 377 closeAlert(alertSection, redirectUrl); 378 }, 379 delay * 1000); 380 } 381 closeBtn.addEventListener('click', () => { 382 closeAlert(alertSection, redirectUrl); 383 }); 384 function closeAlert(section, url) { 385 section.style.display = 'none'; 386 if (url) { 387 window.location.href = url; 388 } 389 } 390 } 391 const userMenuBtn = document.getElementById('j-user-menu-btn'); 392 const userMenuSelect = document.getElementById('j-user-menu-select'); 393 if (userMenuBtn) { 394 userMenuBtn.addEventListener('click', (event) => { 395 userMenuSelect.style.display = userMenuSelect.style.display === 'none' ? 'block' : 'none'; 396 }); 397 } 398 document.addEventListener('click', (event) => { 399 if (userMenuBtn && userMenuSelect) { 400 if (!userMenuBtn.contains(event.target) && !userMenuSelect.contains(event.target)) { 401 userMenuSelect.style.display = 'none'; 402 } 403 } 404 var passwordBtn = document.querySelector('.j-password-btn'); 405 var password = document.getElementById('password'); 406 var password2 = document.getElementById('password2'); 407 if (passwordBtn) { 408 passwordBtn.onmousedown = function() { 409 password.type = 'text'; 410 password2.type = 'text'; 411 }; 412 passwordBtn.onmouseup = passwordBtn.onmouseout = function() { 413 password.type = 'password' 414 password2.type = 'password' 415 }; 416 } 417 }); 418 const projectDropdown = document.getElementById('dropdown-project'); 419 if (projectDropdown) { 420 const projectMenuItems = projectDropdown.querySelectorAll('ul.dropdown li'); 421 function showProjectDropdown() { 422 clearTimeout(timer); 423 projectDropdown.querySelector('ul.dropdown').classList.add('show'); 424 } 425 function hideProjectDropdown() { 426 timer = setTimeout(function(){ 427 projectDropdown.querySelector('ul.dropdown').classList.remove('show'); 428 }, 150) 429 } 430 projectDropdown.addEventListener('mouseover', showProjectDropdown); 431 projectDropdown.addEventListener('mouseout', hideProjectDropdown); 432 projectMenuItems.forEach((item) => { 433 item.addEventListener('click', hideProjectDropdown); 434 }); 435 } 436 const languageDropdown = document.getElementById('dropdown-language'); 437 if (languageDropdown) { 438 const languageDropdownTrigger = languageDropdown.querySelector('a'); 439 function showLanguageDropdownMenu() { 440 languageDropdown.querySelector('ul.dropdown').classList.add('show'); 441 document.addEventListener('click', closeLanguageDropdownMenu); 442 } 443 function hideLanguageDropdownMenu() { 444 languageDropdown.querySelector('ul.dropdown').classList.remove('show'); 445 document.removeEventListener('click', closeLanguageDropdownMenu); 446 } 447 function closeLanguageDropdownMenu(event) { 448 if (!languageDropdown.contains(event.target) && event.target !== languageDropdownTrigger) { 449 hideLanguageDropdownMenu(); 450 } 451 } 452 languageDropdownTrigger.addEventListener('click', function(event) { 453 event.preventDefault(); 454 if (languageDropdown.querySelector('ul.dropdown').classList.contains('show')) { 455 hideLanguageDropdownMenu(); 456 } else { 457 showLanguageDropdownMenu(); 458 } 459 }); 460 languageDropdown.querySelectorAll('ul.dropdown li a').forEach(function(item) { 461 item.addEventListener('click', function(event) { 462 var languageValue = this.getAttribute('data-value'); 463 document.cookie = 'language=' + languageValue + '; path=/'; 464 window.location.reload(); 465 event.preventDefault(); 466 hideLanguageDropdownMenu(); 467 }); 468 }); 469 languageDropdown.querySelector('ul.dropdown').addEventListener('mouseleave', function(event) { 470 hideLanguageDropdownMenu(); 471 }); 472 } 473 function copyStr(id) { 474 var str = document.getElementById(id); 475 str.select(); 476 return document.execCommand('Copy'); 477 }
478 Object.prototype.serialize = function () { 479 var res = [], 480 current = null, 481 i, 482 len, 483 k, 484 optionLen, 485 option, 486 optionValue, 487 form = this; 488 489 for (i = 0, len = form.elements.length; i < len; i++) { 490 current = form.elements[i]; 491 492 if (current.disabled) continue; 493 494 switch (current.type) { 495 case "file": 496 case "submit": 497 case "button": 498 case "image": 499 case "reset": 500 case undefined: 501 break; 502 503 case "select-one": 504 case "select-multiple": 505 if (current.name && current.name.length) { 506 //console.log(current); 507 for (k = 0, optionLen = current.options.length; k < optionLen; k++) { 508 option = current.options[k]; 509 optionValue = ""; 510 if (option.selected) { 511 if (option.hasAttribute) { 512 optionValue = option.hasAttribute("value") 513 ? option.value 514 : option.text; 515 } else { 516 optionValue = option.attributes("value").specified 517 ? option.value 518 : option.text; 519 } 520 res.push( 521 encodeURIComponent(current.name) + 522 "=" + 523 encodeURIComponent(optionValue) 524 ); 525 } 526 } 527 } 528 break; 529 530 case "radio": 531 case "checkbox": 532 if (!current.checked) break; 533 534 default: 535 if (current.name && current.name.length) { 536 res.push( 537 encodeURIComponent(current.name) + 538 "=" + 539 encodeURIComponent(current.value) 540 ); 541 } 542 } 543 } 544 return res.join("&"); 545 }; 546 547 548 549 let formElement = document.querySelector('#j-login'); 550 formElement.addEventListener('submit', async e => { 551 let body = formElement.serialize(); 552 const data = await fetch('/login-async', { 553 method: 'POST', 554 headers: { 555 'Accept': 'application/json', 556 'Content-Type': 'application/x-www-form-urlencoded' 557 }, 558 body 559 }).then(res => res.json()); 560 var type,msg,time,redirectUrl; 561 time = 3; 562 msg = data.msg; 563 if(data.status == 'ok') { 564 type = 'success'; 565 redirectUrl = '/user/account'; 566 } else { 567 type = 'warning'; 568 } 569 showAlert(type, msg, time, redirectUrl); 570 }) 571 572 573</script>
573 574 575</body> 576</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.