PageSourceSearch

https://letsmain.com/login

html letsmain.com collected 2026-09-24 10:41:45 UTC 32,786 bytes, 576 lines download raw bytes

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                &copy; 2026&nbsp;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.