Skip to content

Commit 54e2c9e

Browse files
author
HugoFara
committed
doc: adds upgrade instructions (#198).
1 parent 9801afe commit 54e2c9e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+380
-113
lines changed

docs-src/.vitepress/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export default defineConfig({
5454
items: [
5555
{ text: 'Introduction', link: '/guide/getting-started' },
5656
{ text: 'Installation', link: '/guide/installation' },
57+
{ text: 'Upgrading', link: '/guide/upgrade' },
5758
{ text: 'Post-Installation', link: '/guide/post-installation' }
5859
]
5960
},

docs-src/changelog.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ ones are marked like "v1.0.0-fork".
1414

1515
### Added
1616

17+
* **Notes Field for Terms** ([#128](https://github.com/HugoFara/lwt/issues/128)):
18+
Added a dedicated "Notes" field to terms/words, allowing users to add personal
19+
notes separate from translations. Includes database migration, updated entity
20+
classes, service layer, UI forms, and API endpoints.
1721
* Official support for PHP 8.3 and 8.4.
1822
* **Multi-user support** ([#221](https://github.com/HugoFara/lwt/issues/221)):
1923
Users are now stored in a dedicated `users` table with proper foreign key
@@ -69,9 +73,28 @@ ones are marked like "v1.0.0-fork".
6973
* **TTS Settings Storage** ([#186](https://github.com/HugoFara/lwt/issues/186)):
7074
Text-to-Speech language settings (voice, rate, pitch) now use browser localStorage
7175
instead of cookies. Includes automatic migration from old cookie format.
76+
* **Removed SYSTEM_VARIABLES_ADMIN Privilege Requirement**
77+
([#167](https://github.com/HugoFara/lwt/issues/167)): LWT no longer requires
78+
elevated database privileges for word imports. The `SET GLOBAL max_heap_table_size`
79+
call has been removed and replaced with chunked batch inserts (500 rows per batch)
80+
that stream files line-by-line, reducing memory usage for large imports.
7281

7382
### Fixed
7483

84+
* **Tag Duplicate Key Error** ([#120](https://github.com/HugoFara/lwt/issues/120)):
85+
Fixed rare error when updating a word with tags. When the session cache was
86+
stale, saving a word with an existing tag would fail with "Duplicate entry
87+
for key 'TgText'" and remove the tag from the word. Changed tag insertion
88+
to use `INSERT IGNORE` to handle race conditions and stale cache gracefully.
89+
* **Japanese Annotations** ([#101](https://github.com/HugoFara/lwt/issues/101)):
90+
Fixed annotations not displaying correctly in Japanese texts. The
91+
`annotationToJson()` function was using an off-by-one index that didn't
92+
match the `Ti2Order` values used by the frontend, causing approximately
93+
50% of annotations to fail to display.
94+
* **Text Parsing** ([#114](https://github.com/HugoFara/lwt/issues/114)): Fixed
95+
last word of text not being recognized when text ends without punctuation.
96+
Words at the end of a text are now correctly identified regardless of trailing
97+
punctuation.
7598
* **PHP 8.3 Compatibility**: Fixed deprecation warnings in `langFromDict()` and
7699
`targetLangFromDict()` - both functions now check for null query strings before
77100
calling `parse_str()`.
@@ -81,6 +104,10 @@ ones are marked like "v1.0.0-fork".
81104
* **SQL Prefix Queries**: Fixed `prefixQuery()` in database migrations:
82105
* Now handles `DROP TABLE IF EXISTS` syntax (previously only `IF NOT EXISTS`).
83106
* Now case-insensitive for SQL keywords (CREATE, DROP, ALTER, INSERT).
107+
* **Punctuation Formatting** ([#125](https://github.com/HugoFara/lwt/issues/125)):
108+
Fixed punctuation marks (periods, commas, quotation marks) breaking away from
109+
adjacent words onto separate lines. Punctuation now stays "stuck" to the word
110+
it belongs to by wrapping word+punctuation pairs in non-breaking groups.
84111

85112
### Security
86113

@@ -103,6 +130,24 @@ ones are marked like "v1.0.0-fork".
103130
user-based multi-tenancy. Existing prefixed tables will be migrated to the
104131
new system automatically.
105132

133+
### Removed
134+
135+
* **Orphaned Frame Settings** ([#116](https://github.com/HugoFara/lwt/issues/116)):
136+
Removed all legacy frame-related settings from the admin settings page:
137+
* `set-text-h-frameheight-no-audio` - Frame height without audio
138+
* `set-text-h-frameheight-with-audio` - Frame height with audio
139+
* `set-text-l-framewidth-percent` - Width of left frames (text)
140+
* `set-text-r-frameheight-percent` - Height of right frame (text)
141+
* `set-test-h-frameheight` - Frame height (test)
142+
* `set-test-l-framewidth-percent` - Width of left frames (test)
143+
* `set-test-r-frameheight-percent` - Height of right frame (test)
144+
145+
These settings controlled frame dimensions in the text reading and test
146+
interfaces, but became non-functional after the iframe-based layout was
147+
replaced with Alpine.js components ([#166](https://github.com/HugoFara/lwt/issues/166)).
148+
Also removed the dead `initFrameResizable()` function from TypeScript.
149+
Closes #116.
150+
106151
## 2.10.0-fork (April 1 2024)
107152

108153
### Added in 2.10.0-fork

docs-src/guide/installation.md

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -229,17 +229,12 @@ The official repository is at <https://packagist.org/packages/hugofara/lwt>.
229229

230230
## Upgrade LWT
231231

232-
1. Backup the LWT directory. Backup your database (within LWT).
232+
Already have LWT installed? See the [Upgrading Guide](./upgrade.md) for detailed instructions on how to safely upgrade to a newer version, including:
233233

234-
2. Get the [latest GitHub release](https://github.com/HugoFara/lwt/releases).
235-
236-
You can also try to download the [latest stable version](https://github.com/HugoFara/lwt/archive/refs/heads/main.zip) if you want the cutting-edge updates (that may include some bugs)
237-
238-
3. Unzip it.
239-
240-
4. Copy the following (if not already at its place and OK) from your LWT backup into the LWT directory: ".env" and the whole "media" sub-directory (if you created one; contains your MP3 audio files).
241-
242-
5. Clear the web browser cache and open LWT as usual.
234+
- Backup procedures
235+
- Automatic database migrations
236+
- Upgrading from very old versions
237+
- Troubleshooting common issues
243238

244239
## Something Went Wrong
245240

docs-src/guide/upgrade.md

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
# Upgrading LWT
2+
3+
This guide covers how to upgrade Learning with Texts to a newer version safely.
4+
5+
## How Upgrades Work
6+
7+
LWT uses an **automatic database migration system**. When you start LWT after updating the files, it automatically:
8+
9+
1. Detects your current database version
10+
2. Runs any pending migrations to update the database schema
11+
3. Updates the `dbversion` setting to match the current version
12+
13+
This means most upgrades are seamless - just replace the files and open LWT.
14+
15+
## Standard Upgrade Process
16+
17+
### Step 1: Backup Your Data
18+
19+
Before any upgrade, create backups:
20+
21+
**Database backup (recommended):**
22+
23+
1. Open LWT in your browser
24+
2. Go to **Settings** (gear icon)
25+
3. Click **Backup/Restore/Empty Database**
26+
4. Click **Backup ENTIRE Database** to download a backup file
27+
28+
**File backup:**
29+
30+
Copy your entire LWT directory to a safe location. Important files include:
31+
32+
- `.env` - Your database configuration
33+
- `media/` - Your audio files (if you created this folder)
34+
35+
### Step 2: Download the New Version
36+
37+
Get the latest release:
38+
39+
- **Stable releases**: [GitHub Releases](https://github.com/HugoFara/lwt/releases)
40+
- **Latest development**: [Download main branch](https://github.com/HugoFara/lwt/archive/refs/heads/main.zip)
41+
42+
### Step 3: Replace Files
43+
44+
1. Extract the new version
45+
2. Copy your `.env` file from the backup into the new LWT directory
46+
3. Copy your `media/` folder (if it exists) into the new directory
47+
4. Replace the old LWT directory with the new one
48+
49+
### Step 4: Clear Browser Cache
50+
51+
Clear your browser cache to ensure you're loading the new JavaScript and CSS files. You can also try:
52+
53+
- Hard refresh: `Ctrl+Shift+R` (Windows/Linux) or `Cmd+Shift+R` (Mac)
54+
- Or open LWT in a private/incognito window
55+
56+
### Step 5: Open LWT
57+
58+
Open LWT in your browser as usual. The database will be automatically updated if needed.
59+
60+
## Docker Upgrades
61+
62+
If you're using Docker:
63+
64+
```bash
65+
# Stop the current container
66+
docker compose down
67+
68+
# Pull the latest image (if using pre-built images)
69+
docker compose pull
70+
71+
# Or rebuild from source
72+
docker compose build --no-cache
73+
74+
# Start the updated container
75+
docker compose up -d
76+
```
77+
78+
Your data persists in Docker volumes, so it will be preserved across upgrades.
79+
80+
## Upgrading from Very Old Versions
81+
82+
If you're upgrading from a version older than 2.7.0 (released before 2022), special considerations apply:
83+
84+
### Database Schema Changes
85+
86+
Older versions used a different database structure. The migration system will attempt to convert your data, but for very old versions:
87+
88+
1. **Export your data first**: Use LWT's export features to save your terms and texts
89+
2. **Consider a fresh install**: Create a new database, then import your exported data
90+
3. **Test thoroughly**: After upgrading, verify your terms and texts are intact
91+
92+
### Configuration File Changes
93+
94+
- Versions before 3.0 used `connect.inc.php` instead of `.env`
95+
- If upgrading from these versions, create a new `.env` file based on `.env.example`
96+
- Copy your database credentials from `connect.inc.php` to `.env`
97+
98+
### PHP Version Requirements
99+
100+
Modern LWT requires **PHP 8.1 or higher**. If your server runs an older PHP version, you'll need to upgrade PHP first.
101+
102+
| LWT Version | Minimum PHP |
103+
|-------------|-------------|
104+
| 3.0+ | PHP 8.1 |
105+
| 2.9.x | PHP 8.0 |
106+
| 2.0-2.8 | PHP 7.4 |
107+
| < 2.0 | PHP 5.6 |
108+
109+
## Troubleshooting
110+
111+
### "Database needs to be reinstalled" Error
112+
113+
This usually means the migration couldn't complete. Try:
114+
115+
1. Restore your database backup
116+
2. Check that your `.env` credentials are correct
117+
3. Ensure your MySQL/MariaDB user has ALTER TABLE permissions
118+
119+
### Features Not Working After Upgrade
120+
121+
1. **Clear browser cache** completely
122+
2. **Check browser console** (F12) for JavaScript errors
123+
3. **Rebuild assets** if you're running from source:
124+
125+
```bash
126+
npm install
127+
npm run build:all
128+
```
129+
130+
### Tests Not Auto-Advancing
131+
132+
If tests don't advance to the next word after upgrading:
133+
134+
1. Clear your browser cache
135+
2. Check if JavaScript is loading correctly (F12 > Console)
136+
3. Try a different browser to isolate the issue
137+
138+
### Database Connection Errors
139+
140+
Verify your `.env` file has the correct settings:
141+
142+
```bash
143+
DB_HOST=localhost # Or your database host
144+
DB_USER=root # Your database username
145+
DB_PASSWORD= # Your database password
146+
DB_NAME=learning-with-texts
147+
```
148+
149+
## Checking Your Version
150+
151+
To see your current LWT version:
152+
153+
1. Look at the footer of any LWT page
154+
2. Or check the `dbversion` value in your database's `settings` table
155+
156+
## Downgrading
157+
158+
Downgrading is **not officially supported** because newer database migrations cannot be reversed automatically. If you need to downgrade:
159+
160+
1. Restore your database backup from before the upgrade
161+
2. Use the older LWT files
162+
163+
This is why backups before upgrading are essential.
164+
165+
## Getting Help
166+
167+
If you encounter issues:
168+
169+
- [GitHub Issues](https://github.com/HugoFara/lwt/issues) - Report bugs or search existing issues

docs/404.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<link rel="preload stylesheet" href="/docs/assets/style.JSR2-pMR.css" as="style">
1010
<link rel="preload stylesheet" href="/docs/vp-icons.css" as="style">
1111

12-
<script type="module" src="/docs/assets/app.ckiVg2pP.js"></script>
12+
<script type="module" src="/docs/assets/app.apQhqRhn.js"></script>
1313
<link rel="preload" href="/docs/assets/inter-roman-latin.Di8DUHzh.woff2" as="font" type="font/woff2" crossorigin="">
1414
<link rel="icon" href="/docs/assets/images/lwt_icon.png">
1515
<link rel="apple-touch-icon" href="/docs/assets/images/apple-touch-icon-57x57.png">
@@ -18,7 +18,7 @@
1818
</head>
1919
<body>
2020
<div id="app"></div>
21-
<script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"D-Ya70a9\",\"developer_api.md\":\"Cvfyka0X\",\"developer_contributing.md\":\"CTt53uUA\",\"developer_icon-migration.md\":\"B-jtgdlM\",\"developer_js-php-modernization-plan.md\":\"Bb3KQ9yP\",\"developer_v3-changes.md\":\"DVPZBgTg\",\"guide_faq.md\":\"C0BvW6nh\",\"guide_getting-started.md\":\"DbT121eA\",\"guide_how-to-learn.md\":\"DRtwGqxO\",\"guide_how-to-use.md\":\"Dll6op2m\",\"guide_installation.md\":\"g8CtzQbF\",\"guide_post-installation.md\":\"23x4gBln\",\"guide_troubleshooting_ipad.md\":\"DLwINN0X\",\"guide_troubleshooting_wordpress.md\":\"BNCUbkXq\",\"index.md\":\"CfRhdxOD\",\"legal_license.md\":\"CSn3UMW8\",\"legal_links.md\":\"DE6l5SW6\",\"legal_third-party-licenses.md\":\"AM24dijs\",\"reference_database-schema.md\":\"IbR0ML6E\",\"reference_export-templates.md\":\"V4de5Gbu\",\"reference_features.md\":\"C9eg8jGp\",\"reference_keyboard-shortcuts.md\":\"DnHCnyN9\",\"reference_language-setup.md\":\"CUkll5hM\",\"reference_new-features.md\":\"Cd6no244\",\"reference_restrictions.md\":\"DljYZhD_\",\"reference_term-scores.md\":\"lnIZ7pv_\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"LWT Documentation\",\"description\":\"Learning with Texts - Documentation\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/assets/images/lwt_icon_big.png\",\"siteTitle\":\"LWT Docs\",\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/guide/getting-started\"},{\"text\":\"User Guide\",\"items\":[{\"text\":\"Installation\",\"link\":\"/guide/installation\"},{\"text\":\"Post-Installation\",\"link\":\"/guide/post-installation\"},{\"text\":\"How to Use\",\"link\":\"/guide/how-to-use\"},{\"text\":\"FAQ\",\"link\":\"/guide/faq\"}]},{\"text\":\"Reference\",\"link\":\"/reference/features\"},{\"text\":\"Developer\",\"link\":\"/developer/api\"},{\"text\":\"Changelog\",\"link\":\"/changelog\"}],\"sidebar\":{\"/guide/\":[{\"text\":\"Getting Started\",\"items\":[{\"text\":\"Introduction\",\"link\":\"/guide/getting-started\"},{\"text\":\"Installation\",\"link\":\"/guide/installation\"},{\"text\":\"Post-Installation\",\"link\":\"/guide/post-installation\"}]},{\"text\":\"Using LWT\",\"items\":[{\"text\":\"How to Learn\",\"link\":\"/guide/how-to-learn\"},{\"text\":\"How to Use\",\"link\":\"/guide/how-to-use\"},{\"text\":\"FAQ\",\"link\":\"/guide/faq\"}]},{\"text\":\"Troubleshooting\",\"items\":[{\"text\":\"iPad/Tablet Setup\",\"link\":\"/guide/troubleshooting/ipad\"},{\"text\":\"WordPress Integration\",\"link\":\"/guide/troubleshooting/wordpress\"}]}],\"/reference/\":[{\"text\":\"Reference\",\"items\":[{\"text\":\"Features\",\"link\":\"/reference/features\"},{\"text\":\"New Features\",\"link\":\"/reference/new-features\"},{\"text\":\"Keyboard Shortcuts\",\"link\":\"/reference/keyboard-shortcuts\"},{\"text\":\"Language Setup\",\"link\":\"/reference/language-setup\"},{\"text\":\"Term Scores\",\"link\":\"/reference/term-scores\"},{\"text\":\"Export Templates\",\"link\":\"/reference/export-templates\"},{\"text\":\"Database Schema\",\"link\":\"/reference/database-schema\"},{\"text\":\"Restrictions\",\"link\":\"/reference/restrictions\"}]}],\"/developer/\":[{\"text\":\"Developer Guide\",\"items\":[{\"text\":\"API Reference\",\"link\":\"/developer/api\"},{\"text\":\"Contributing\",\"link\":\"/developer/contributing\"},{\"text\":\"V3 Changes\",\"link\":\"/developer/v3-changes\"}]}],\"/legal/\":[{\"text\":\"Legal\",\"items\":[{\"text\":\"License\",\"link\":\"/legal/license\"},{\"text\":\"Third-Party Licenses\",\"link\":\"/legal/third-party-licenses\"},{\"text\":\"Links\",\"link\":\"/legal/links\"}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/HugoFara/lwt\"}],\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"Released into the Public Domain under the Unlicense.\",\"copyright\":\"Learning with Texts Community\"},\"editLink\":{\"pattern\":\"https://github.com/HugoFara/lwt/edit/main/docs-src/:path\",\"text\":\"Edit this page on GitHub\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
21+
<script>window.__VP_HASH_MAP__=JSON.parse("{\"changelog.md\":\"B5PnDPvR\",\"developer_api.md\":\"Cvfyka0X\",\"developer_contributing.md\":\"CTt53uUA\",\"developer_icon-migration.md\":\"B-jtgdlM\",\"developer_js-php-modernization-plan.md\":\"Bb3KQ9yP\",\"developer_v3-changes.md\":\"DVPZBgTg\",\"guide_faq.md\":\"C0BvW6nh\",\"guide_getting-started.md\":\"DbT121eA\",\"guide_how-to-learn.md\":\"DRtwGqxO\",\"guide_how-to-use.md\":\"Dll6op2m\",\"guide_installation.md\":\"Cf2KlytL\",\"guide_post-installation.md\":\"23x4gBln\",\"guide_troubleshooting_ipad.md\":\"DLwINN0X\",\"guide_troubleshooting_wordpress.md\":\"BNCUbkXq\",\"guide_upgrade.md\":\"D72fu_Ej\",\"index.md\":\"CfRhdxOD\",\"legal_license.md\":\"CSn3UMW8\",\"legal_links.md\":\"DE6l5SW6\",\"legal_third-party-licenses.md\":\"AM24dijs\",\"reference_database-schema.md\":\"IbR0ML6E\",\"reference_export-templates.md\":\"V4de5Gbu\",\"reference_features.md\":\"C9eg8jGp\",\"reference_keyboard-shortcuts.md\":\"DnHCnyN9\",\"reference_language-setup.md\":\"CUkll5hM\",\"reference_new-features.md\":\"Cd6no244\",\"reference_restrictions.md\":\"DljYZhD_\",\"reference_term-scores.md\":\"lnIZ7pv_\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"LWT Documentation\",\"description\":\"Learning with Texts - Documentation\",\"base\":\"/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"/assets/images/lwt_icon_big.png\",\"siteTitle\":\"LWT Docs\",\"nav\":[{\"text\":\"Home\",\"link\":\"/\"},{\"text\":\"Getting Started\",\"link\":\"/guide/getting-started\"},{\"text\":\"User Guide\",\"items\":[{\"text\":\"Installation\",\"link\":\"/guide/installation\"},{\"text\":\"Post-Installation\",\"link\":\"/guide/post-installation\"},{\"text\":\"How to Use\",\"link\":\"/guide/how-to-use\"},{\"text\":\"FAQ\",\"link\":\"/guide/faq\"}]},{\"text\":\"Reference\",\"link\":\"/reference/features\"},{\"text\":\"Developer\",\"link\":\"/developer/api\"},{\"text\":\"Changelog\",\"link\":\"/changelog\"}],\"sidebar\":{\"/guide/\":[{\"text\":\"Getting Started\",\"items\":[{\"text\":\"Introduction\",\"link\":\"/guide/getting-started\"},{\"text\":\"Installation\",\"link\":\"/guide/installation\"},{\"text\":\"Upgrading\",\"link\":\"/guide/upgrade\"},{\"text\":\"Post-Installation\",\"link\":\"/guide/post-installation\"}]},{\"text\":\"Using LWT\",\"items\":[{\"text\":\"How to Learn\",\"link\":\"/guide/how-to-learn\"},{\"text\":\"How to Use\",\"link\":\"/guide/how-to-use\"},{\"text\":\"FAQ\",\"link\":\"/guide/faq\"}]},{\"text\":\"Troubleshooting\",\"items\":[{\"text\":\"iPad/Tablet Setup\",\"link\":\"/guide/troubleshooting/ipad\"},{\"text\":\"WordPress Integration\",\"link\":\"/guide/troubleshooting/wordpress\"}]}],\"/reference/\":[{\"text\":\"Reference\",\"items\":[{\"text\":\"Features\",\"link\":\"/reference/features\"},{\"text\":\"New Features\",\"link\":\"/reference/new-features\"},{\"text\":\"Keyboard Shortcuts\",\"link\":\"/reference/keyboard-shortcuts\"},{\"text\":\"Language Setup\",\"link\":\"/reference/language-setup\"},{\"text\":\"Term Scores\",\"link\":\"/reference/term-scores\"},{\"text\":\"Export Templates\",\"link\":\"/reference/export-templates\"},{\"text\":\"Database Schema\",\"link\":\"/reference/database-schema\"},{\"text\":\"Restrictions\",\"link\":\"/reference/restrictions\"}]}],\"/developer/\":[{\"text\":\"Developer Guide\",\"items\":[{\"text\":\"API Reference\",\"link\":\"/developer/api\"},{\"text\":\"Contributing\",\"link\":\"/developer/contributing\"},{\"text\":\"V3 Changes\",\"link\":\"/developer/v3-changes\"}]}],\"/legal/\":[{\"text\":\"Legal\",\"items\":[{\"text\":\"License\",\"link\":\"/legal/license\"},{\"text\":\"Third-Party Licenses\",\"link\":\"/legal/third-party-licenses\"},{\"text\":\"Links\",\"link\":\"/legal/links\"}]}]},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/HugoFara/lwt\"}],\"search\":{\"provider\":\"local\"},\"footer\":{\"message\":\"Released into the Public Domain under the Unlicense.\",\"copyright\":\"Learning with Texts Community\"},\"editLink\":{\"pattern\":\"https://github.com/HugoFara/lwt/edit/main/docs-src/:path\",\"text\":\"Edit this page on GitHub\"}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":true}");</script>
2222

2323
</body>
2424
</html>

0 commit comments

Comments
 (0)