web 6.7.2: downloads point at desktop 1.0.1
CodeQL Analysis / Analyze CodeQL (push) Canceled after 0s
Deploy Application / deploy (push) Canceled after 0s
Mirror to PrivacyGuides / mirror (push) Canceled after 0s
Mirror to Codeberg / mirror (push) Canceled after 0s

1.0.1 is the first desktop build that works on Linux at all. It also carries
the desktop.callsNotHere string these dictionaries now define for it — calls
are not available on the Linux desktop yet and the app says so rather than
failing.
This commit is contained in:
SecureBitChatVolodymyr
2026-09-02 17:00:14 -04:00
parent 2294e38e53
commit 30e335f9e9
40 changed files with 454 additions and 387 deletions
+15
View File
@@ -1,5 +1,20 @@
# Changelog
## v6.7.2 — Desktop 1.0.1
Download links point at desktop 1.0.1, which is the first build that works on
Linux at all.
1.0.0 could not open a channel there. WebKitGTK is built with WebRTC compiled
out — its own configuration ties `ENABLE_WEB_RTC` to `ENABLE_EXPERIMENTAL_FEATURES`,
which release builds turn off — so `RTCPeerConnection` was not a variable that
existed, on any distribution, in any package format. The desktop client now
carries its own WebRTC in Rust and presents the browser's API shape to the page,
so the connection code stays the same one this repository shares with it.
Calls are not available on the Linux desktop yet and it says so; they are
unaffected on macOS, Windows and here in the browser.
## v6.7.1 — Download links for desktop 1.0.0
The desktop client reached 1.0.0, and the buttons on this site now point at it.
+1 -1
View File
@@ -9,7 +9,7 @@
No accounts. No servers storing your messages. No installation required.
[![License: MIT](https://img.shields.io/badge/License-MIT-f0892a.svg)](LICENSE)
[![Version](https://img.shields.io/badge/version-6.7.1-3ecf8e.svg)](CHANGELOG.md)
[![Version](https://img.shields.io/badge/version-6.7.2-3ecf8e.svg)](CHANGELOG.md)
[![PWA](https://img.shields.io/badge/PWA-installable-3ecf8e.svg)](#install-as-an-app)
[![Encryption](https://img.shields.io/badge/crypto-ECDH%20P--384%20%C2%B7%20AES--256--GCM-blue.svg)](#security-model)
[![Forward secrecy](https://img.shields.io/badge/forward%20secrecy-Double%20Ratchet-3ecf8e.svg)](#forward-secrecy)
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ar/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/de/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+28 -15
View File
@@ -5258,7 +5258,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Cover traffic active: random fake frames (32-128 B every 15-30 s) on the ratcheted channel",
"desktop.sec.coverOff": "The cover traffic generator is not running",
"desktop.sec.coverUnsupported": "Cover traffic needs a Double Ratchet session (the peer is on an older release)",
"desktop.tagline": "End-to-end freedom"
"desktop.tagline": "End-to-end freedom",
"desktop.callsNotHere": "Calls are not available in this build yet. Messages, files and group chats work as usual."
},
"de": {
"language.label": "Sprache",
@@ -6107,7 +6108,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Verdeckter Verkehr aktiv: zuf\xE4llige Scheinframes (32-128 B alle 15-30 s) auf dem Ratchet-Kanal",
"desktop.sec.coverOff": "Der Generator f\xFCr verdeckten Verkehr l\xE4uft nicht",
"desktop.sec.coverUnsupported": "Verdeckter Verkehr braucht eine Double-Ratchet-Sitzung (die Gegenstelle nutzt eine \xE4ltere Version)",
"desktop.tagline": "Ende-zu-Ende-Freiheit"
"desktop.tagline": "Ende-zu-Ende-Freiheit",
"desktop.callsNotHere": "Anrufe sind in dieser Version noch nicht verf\xFCgbar. Nachrichten, Dateien und Gruppenchats funktionieren wie gewohnt."
},
"fr": {
"language.label": "Langue",
@@ -6956,7 +6958,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Trafic de couverture actif : trames factices al\xE9atoires (32-128 o toutes les 15-30 s) sur le canal \xE0 ratchet",
"desktop.sec.coverOff": "Le g\xE9n\xE9rateur de trafic de couverture ne tourne pas",
"desktop.sec.coverUnsupported": "Le trafic de couverture exige une session Double Ratchet (le pair utilise une version plus ancienne)",
"desktop.tagline": "La libert\xE9 de bout en bout"
"desktop.tagline": "La libert\xE9 de bout en bout",
"desktop.callsNotHere": "Les appels ne sont pas encore disponibles dans cette version. Les messages, les fichiers et les discussions de groupe fonctionnent normalement."
},
"es": {
"language.label": "Idioma",
@@ -7805,7 +7808,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Tr\xE1fico de cobertura activo: tramas falsas aleatorias (32-128 B cada 15-30 s) en el canal con ratchet",
"desktop.sec.coverOff": "El generador de tr\xE1fico de cobertura no est\xE1 en marcha",
"desktop.sec.coverUnsupported": "El tr\xE1fico de cobertura requiere una sesi\xF3n Double Ratchet (el par usa una versi\xF3n anterior)",
"desktop.tagline": "Libertad de extremo a extremo"
"desktop.tagline": "Libertad de extremo a extremo",
"desktop.callsNotHere": "Las llamadas a\xFAn no est\xE1n disponibles en esta versi\xF3n. Los mensajes, los archivos y los chats grupales funcionan con normalidad."
},
"uk": {
"language.label": "\u041C\u043E\u0432\u0430",
@@ -8654,7 +8658,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u041F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u0438\u0439 \u0442\u0440\u0430\u0444\u0456\u043A \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439: \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u0456 \u0444\u0430\u043B\u044C\u0448\u0438\u0432\u0456 \u043A\u0430\u0434\u0440\u0438 (32-128 \u0411 \u043A\u043E\u0436\u043D\u0456 15-30 \u0441) \u0443 \u043A\u0430\u043D\u0430\u043B\u0456 \u0437 \u0440\u0430\u0442\u0447\u0435\u0442\u043E\u043C",
"desktop.sec.coverOff": "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440 \u043F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u043E\u0433\u043E \u0442\u0440\u0430\u0444\u0456\u043A\u0443 \u043D\u0435 \u043F\u0440\u0430\u0446\u044E\u0454",
"desktop.sec.coverUnsupported": "\u041F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u0438\u0439 \u0442\u0440\u0430\u0444\u0456\u043A \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u0454 \u0441\u0435\u0430\u043D\u0441\u0443 Double Ratchet (\u0443 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0441\u0442\u0430\u0440\u0456\u0448\u0430 \u0432\u0435\u0440\u0441\u0456\u044F)",
"desktop.tagline": "\u041D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0430 \u0441\u0432\u043E\u0431\u043E\u0434\u0430"
"desktop.tagline": "\u041D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0430 \u0441\u0432\u043E\u0431\u043E\u0434\u0430",
"desktop.callsNotHere": "\u0414\u0437\u0432\u0456\u043D\u043A\u0438 \u0432 \u0446\u0456\u0439 \u0437\u0431\u0456\u0440\u0446\u0456 \u043F\u043E\u043A\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456. \u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F, \u0444\u0430\u0439\u043B\u0438 \u0442\u0430 \u0433\u0440\u0443\u043F\u043E\u0432\u0456 \u0447\u0430\u0442\u0438 \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C \u044F\u043A \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u043E."
},
"ru": {
"language.label": "\u042F\u0437\u044B\u043A",
@@ -9503,7 +9508,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u041F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043A \u0430\u043A\u0442\u0438\u0432\u0435\u043D: \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0435 \u0444\u0430\u043B\u044C\u0448\u0438\u0432\u044B\u0435 \u043A\u0430\u0434\u0440\u044B (32-128 \u0411 \u043A\u0430\u0436\u0434\u044B\u0435 15-30 \u0441) \u0432 \u043A\u0430\u043D\u0430\u043B\u0435 \u0441 \u0440\u044D\u0442\u0447\u0435\u0442\u043E\u043C",
"desktop.sec.coverOff": "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440 \u043F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u0442\u0440\u0430\u0444\u0438\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442",
"desktop.sec.coverUnsupported": "\u041F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u043C\u0443 \u0442\u0440\u0430\u0444\u0438\u043A\u0443 \u043D\u0443\u0436\u0435\u043D \u0441\u0435\u0430\u043D\u0441 Double Ratchet (\u0443 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0432\u0435\u0440\u0441\u0438\u044F \u043F\u043E\u0441\u0442\u0430\u0440\u0448\u0435)",
"desktop.tagline": "\u0421\u043A\u0432\u043E\u0437\u043D\u0430\u044F \u0441\u0432\u043E\u0431\u043E\u0434\u0430"
"desktop.tagline": "\u0421\u043A\u0432\u043E\u0437\u043D\u0430\u044F \u0441\u0432\u043E\u0431\u043E\u0434\u0430",
"desktop.callsNotHere": "\u0417\u0432\u043E\u043D\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0441\u0431\u043E\u0440\u043A\u0435 \u043F\u043E\u043A\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B. \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F, \u0444\u0430\u0439\u043B\u044B \u0438 \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 \u0447\u0430\u0442\u044B \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u043E."
},
"zh": {
"language.label": "\u8BED\u8A00",
@@ -10352,7 +10358,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u63A9\u62A4\u6D41\u91CF\u5DF2\u542F\u7528\uFF1A\u5728\u68D8\u8F6E\u901A\u9053\u4E0A\u53D1\u9001\u968F\u673A\u4F2A\u5E27\uFF08\u6BCF 15-30 \u79D2 32-128 \u5B57\u8282\uFF09",
"desktop.sec.coverOff": "\u63A9\u62A4\u6D41\u91CF\u751F\u6210\u5668\u672A\u8FD0\u884C",
"desktop.sec.coverUnsupported": "\u63A9\u62A4\u6D41\u91CF\u9700\u8981 Double Ratchet \u4F1A\u8BDD\uFF08\u5BF9\u65B9\u4F7F\u7528\u8F83\u65E7\u7248\u672C\uFF09",
"desktop.tagline": "\u7AEF\u5230\u7AEF\u7684\u81EA\u7531"
"desktop.tagline": "\u7AEF\u5230\u7AEF\u7684\u81EA\u7531",
"desktop.callsNotHere": "\u6B64\u7248\u672C\u6682\u4E0D\u652F\u6301\u901A\u8BDD\u3002\u6D88\u606F\u3001\u6587\u4EF6\u548C\u7FA4\u804A\u4E00\u5207\u6B63\u5E38\u3002"
},
"ko": {
"language.label": "\uC5B8\uC5B4",
@@ -11201,7 +11208,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\uC704\uC7A5 \uD2B8\uB798\uD53D \uC791\uB3D9 \uC911: \uB798\uCE6B \uCC44\uB110\uC5D0 \uBB34\uC791\uC704 \uB354\uBBF8 \uD504\uB808\uC784 (15-30\uCD08\uB9C8\uB2E4 32-128 B)",
"desktop.sec.coverOff": "\uC704\uC7A5 \uD2B8\uB798\uD53D \uC0DD\uC131\uAE30\uAC00 \uC2E4\uD589\uB418\uACE0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"desktop.sec.coverUnsupported": "\uC704\uC7A5 \uD2B8\uB798\uD53D\uC5D0\uB294 Double Ratchet \uC138\uC158\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 (\uC0C1\uB300\uAC00 \uAD6C\uBC84\uC804\uC785\uB2C8\uB2E4)",
"desktop.tagline": "\uC885\uB2E8 \uAC04 \uC790\uC720"
"desktop.tagline": "\uC885\uB2E8 \uAC04 \uC790\uC720",
"desktop.callsNotHere": "\uC774 \uBE4C\uB4DC\uC5D0\uC11C\uB294 \uC544\uC9C1 \uD1B5\uD654\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uBA54\uC2DC\uC9C0, \uD30C\uC77C, \uADF8\uB8F9 \uCC44\uD305\uC740 \uD3C9\uC18C\uB300\uB85C \uC791\uB3D9\uD569\uB2C8\uB2E4."
},
"hi": {
"language.label": "\u092D\u093E\u0937\u093E",
@@ -12050,7 +12058,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0938\u0915\u094D\u0930\u093F\u092F: \u0930\u0948\u091A\u0947\u091F \u091A\u0948\u0928\u0932 \u092A\u0930 \u092F\u093E\u0926\u0943\u091A\u094D\u091B\u093F\u0915 \u0928\u0915\u0932\u0940 \u092B\u093C\u094D\u0930\u0947\u092E (\u0939\u0930 15-30 \u0938\u0947\u0915\u0902\u0921 \u092E\u0947\u0902 32-128 B)",
"desktop.sec.coverOff": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u091C\u0928\u0930\u0947\u091F\u0930 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0930\u0939\u093E",
"desktop.sec.coverUnsupported": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0915\u0947 \u0932\u093F\u090F Double Ratchet \u0938\u0924\u094D\u0930 \u091A\u093E\u0939\u093F\u090F (\u0938\u093E\u0925\u0940 \u092A\u0941\u0930\u093E\u0928\u0947 \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u092A\u0930 \u0939\u0948)",
"desktop.tagline": "\u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u0906\u091C\u093C\u093E\u0926\u0940"
"desktop.tagline": "\u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u0906\u091C\u093C\u093E\u0926\u0940",
"desktop.callsNotHere": "\u0907\u0938 \u092C\u093F\u0932\u094D\u0921 \u092E\u0947\u0902 \u0915\u0949\u0932 \u0905\u092D\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0902\u0964 \u0938\u0902\u0926\u0947\u0936, \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u0914\u0930 \u0938\u092E\u0942\u0939 \u091A\u0948\u091F \u0938\u093E\u092E\u093E\u0928\u094D\u092F \u0930\u0942\u092A \u0938\u0947 \u0915\u093E\u092E \u0915\u0930\u0924\u0947 \u0939\u0948\u0902\u0964"
},
"ar": {
"language.label": "\u0627\u0644\u0644\u063A\u0629",
@@ -12899,7 +12908,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0646\u0634\u0637\u0629: \u0625\u0637\u0627\u0631\u0627\u062A \u0648\u0647\u0645\u064A\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 (32-128 \u0628\u0627\u064A\u062A \u0643\u0644 15-30 \u062B\u0627\u0646\u064A\u0629) \u0639\u0644\u0649 \u0642\u0646\u0627\u0629 \u0627\u0644\u0631\u0627\u062A\u0634\u064A\u062A",
"desktop.sec.coverOff": "\u0645\u0648\u0644\u0651\u062F \u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0644\u0627 \u064A\u0639\u0645\u0644",
"desktop.sec.coverUnsupported": "\u062A\u062D\u062A\u0627\u062C \u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0625\u0644\u0649 \u062C\u0644\u0633\u0629 Double Ratchet (\u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0639\u0644\u0649 \u0625\u0635\u062F\u0627\u0631 \u0623\u0642\u062F\u0645)",
"desktop.tagline": "\u062D\u0631\u064A\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641"
"desktop.tagline": "\u062D\u0631\u064A\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641",
"desktop.callsNotHere": "\u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629 \u0628\u0639\u062F \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0646\u0633\u062E\u0629. \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0648\u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0648\u0627\u0644\u062F\u0631\u062F\u0634\u0627\u062A \u0627\u0644\u062C\u0645\u0627\u0639\u064A\u0629 \u062A\u0639\u0645\u0644 \u0643\u0627\u0644\u0645\u0639\u062A\u0627\u062F."
},
"he": {
"language.label": "\u05E9\u05E4\u05D4",
@@ -13748,7 +13758,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D4: \u05DE\u05E1\u05D2\u05E8\u05D5\u05EA \u05DE\u05D6\u05D5\u05D9\u05E4\u05D5\u05EA \u05D0\u05E7\u05E8\u05D0\u05D9\u05D5\u05EA (32-128 \u05D1\u05EA\u05D9\u05DD \u05DB\u05DC 15-30 \u05E9\u05E0\u05D9\u05D5\u05EA) \u05D1\u05E2\u05E8\u05D5\u05E5 \u05D4\u05E8\u05D0\u05E6\u05F3\u05D8",
"desktop.sec.coverOff": "\u05DE\u05D7\u05D5\u05DC\u05DC \u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05E4\u05D5\u05E2\u05DC",
"desktop.sec.coverUnsupported": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05DE\u05D7\u05D9\u05D9\u05D1\u05EA \u05D4\u05E4\u05E2\u05DC\u05EA Double Ratchet (\u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D9\u05E9\u05E0\u05D4 \u05D9\u05D5\u05EA\u05E8)",
"desktop.tagline": "\u05D7\u05D5\u05E4\u05E9 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4"
"desktop.tagline": "\u05D7\u05D5\u05E4\u05E9 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4",
"desktop.callsNotHere": "\u05E9\u05D9\u05D7\u05D5\u05EA \u05D0\u05D9\u05E0\u05DF \u05D6\u05DE\u05D9\u05E0\u05D5\u05EA \u05E2\u05D3\u05D9\u05D9\u05DF \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D6\u05D5. \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA, \u05E7\u05D1\u05E6\u05D9\u05DD \u05D5\u05E6\u05F3\u05D0\u05D8\u05D9\u05DD \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05D9\u05DD \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05DB\u05E8\u05D2\u05D9\u05DC."
},
"fa": {
"language.label": "\u0632\u0628\u0627\u0646",
@@ -14597,7 +14608,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u0641\u0639\u0627\u0644 \u0627\u0633\u062A: \u0642\u0627\u0628\u200C\u0647\u0627\u06CC \u0633\u0627\u062E\u062A\u06AF\u06CC \u062A\u0635\u0627\u062F\u0641\u06CC (\u06F3\u06F2 \u062A\u0627 \u06F1\u06F2\u06F8 \u0628\u0627\u06CC\u062A \u0647\u0631 \u06F1\u06F5 \u062A\u0627 \u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647) \u0631\u0648\u06CC \u06A9\u0627\u0646\u0627\u0644 \u0631\u0686\u062A",
"desktop.sec.coverOff": "\u0645\u0648\u0644\u062F \u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627 \u0646\u06CC\u0633\u062A",
"desktop.sec.coverUnsupported": "\u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u0628\u0647 \u0646\u0634\u0633\u062A Double Ratchet \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u062F (\u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0646\u0633\u062E\u0647\u0654 \u0642\u062F\u06CC\u0645\u06CC\u200C\u062A\u0631\u06CC \u062F\u0627\u0631\u062F)",
"desktop.tagline": "\u0622\u0632\u0627\u062F\u06CC \u0633\u0631\u062A\u0627\u0633\u0631\u06CC"
"desktop.tagline": "\u0622\u0632\u0627\u062F\u06CC \u0633\u0631\u062A\u0627\u0633\u0631\u06CC",
"desktop.callsNotHere": "\u062A\u0645\u0627\u0633\u200C\u0647\u0627 \u0647\u0646\u0648\u0632 \u062F\u0631 \u0627\u06CC\u0646 \u0646\u0633\u062E\u0647 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A\u0646\u062F. \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u060C \u0641\u0627\u06CC\u0644\u200C\u0647\u0627 \u0648 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648\u0647\u0627\u06CC \u06AF\u0631\u0648\u0647\u06CC \u0637\u0628\u0642 \u0645\u0639\u0645\u0648\u0644 \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F."
},
"ur": {
"language.label": "\u0632\u0628\u0627\u0646",
@@ -15446,7 +15458,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u0641\u0639\u0627\u0644: \u0631\u06CC\u0686\u0679 \u0686\u06CC\u0646\u0644 \u067E\u0631 \u0628\u06D2 \u062A\u0631\u062A\u06CC\u0628 \u062C\u0639\u0644\u06CC \u0641\u0631\u06CC\u0645 (\u06C1\u0631 15-30 \u0633\u06CC\u06A9\u0646\u0688 \u0645\u06CC\u06BA 32-128 B)",
"desktop.sec.coverOff": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u062C\u0646\u0631\u06CC\u0679\u0631 \u0646\u06C1\u06CC\u06BA \u0686\u0644 \u0631\u06C1\u0627",
"desktop.sec.coverUnsupported": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06D2 \u0644\u06CC\u06D2 Double Ratchet \u0633\u06CC\u0634\u0646 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2 (\u0633\u0627\u062A\u06BE\u06CC \u067E\u0631\u0627\u0646\u06D2 \u0648\u0631\u0698\u0646 \u067E\u0631 \u06C1\u06D2)",
"desktop.tagline": "\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0622\u0632\u0627\u062F\u06CC"
"desktop.tagline": "\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0622\u0632\u0627\u062F\u06CC",
"desktop.callsNotHere": "\u0627\u0633 \u0628\u0644\u0688 \u0645\u06CC\u06BA \u06A9\u0627\u0644\u06CC\u06BA \u0627\u0628\u06BE\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA \u06C1\u06CC\u06BA\u06D4 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A\u060C \u0641\u0627\u0626\u0644\u06CC\u06BA \u0627\u0648\u0631 \u06AF\u0631\u0648\u067E \u0686\u06CC\u0679\u0633 \u0645\u0639\u0645\u0648\u0644 \u06A9\u06D2 \u0645\u0637\u0627\u0628\u0642 \u06A9\u0627\u0645 \u06A9\u0631\u062A\u06CC \u06C1\u06CC\u06BA\u06D4"
}
};
@@ -32659,7 +32672,7 @@ var SecureMasterKeyManager = class {
var import_NotificationIntegration = __toESM(require_NotificationIntegration());
// package.json
var version = "6.7.1";
var version = "6.7.2";
// src/components/ui/LanguageSwitcher.jsx
var LanguageSwitcher = () => {
@@ -33292,7 +33305,7 @@ Right-click or Ctrl+click to disconnect`,
window.EnhancedMinimalHeader = EnhancedMinimalHeader;
// src/components/ui/DownloadApps.jsx
var DESKTOP_VERSION = "1.0.0";
var DESKTOP_VERSION = "1.0.1";
var DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${DESKTOP_VERSION}`;
var DownloadApps = () => {
const apps = [
+2 -2
View File
File diff suppressed because one or more lines are too long
Vendored
+27 -14
View File
@@ -1095,7 +1095,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Cover traffic active: random fake frames (32-128 B every 15-30 s) on the ratcheted channel",
"desktop.sec.coverOff": "The cover traffic generator is not running",
"desktop.sec.coverUnsupported": "Cover traffic needs a Double Ratchet session (the peer is on an older release)",
"desktop.tagline": "End-to-end freedom"
"desktop.tagline": "End-to-end freedom",
"desktop.callsNotHere": "Calls are not available in this build yet. Messages, files and group chats work as usual."
},
"de": {
"language.label": "Sprache",
@@ -1944,7 +1945,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Verdeckter Verkehr aktiv: zuf\xE4llige Scheinframes (32-128 B alle 15-30 s) auf dem Ratchet-Kanal",
"desktop.sec.coverOff": "Der Generator f\xFCr verdeckten Verkehr l\xE4uft nicht",
"desktop.sec.coverUnsupported": "Verdeckter Verkehr braucht eine Double-Ratchet-Sitzung (die Gegenstelle nutzt eine \xE4ltere Version)",
"desktop.tagline": "Ende-zu-Ende-Freiheit"
"desktop.tagline": "Ende-zu-Ende-Freiheit",
"desktop.callsNotHere": "Anrufe sind in dieser Version noch nicht verf\xFCgbar. Nachrichten, Dateien und Gruppenchats funktionieren wie gewohnt."
},
"fr": {
"language.label": "Langue",
@@ -2793,7 +2795,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Trafic de couverture actif : trames factices al\xE9atoires (32-128 o toutes les 15-30 s) sur le canal \xE0 ratchet",
"desktop.sec.coverOff": "Le g\xE9n\xE9rateur de trafic de couverture ne tourne pas",
"desktop.sec.coverUnsupported": "Le trafic de couverture exige une session Double Ratchet (le pair utilise une version plus ancienne)",
"desktop.tagline": "La libert\xE9 de bout en bout"
"desktop.tagline": "La libert\xE9 de bout en bout",
"desktop.callsNotHere": "Les appels ne sont pas encore disponibles dans cette version. Les messages, les fichiers et les discussions de groupe fonctionnent normalement."
},
"es": {
"language.label": "Idioma",
@@ -3642,7 +3645,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "Tr\xE1fico de cobertura activo: tramas falsas aleatorias (32-128 B cada 15-30 s) en el canal con ratchet",
"desktop.sec.coverOff": "El generador de tr\xE1fico de cobertura no est\xE1 en marcha",
"desktop.sec.coverUnsupported": "El tr\xE1fico de cobertura requiere una sesi\xF3n Double Ratchet (el par usa una versi\xF3n anterior)",
"desktop.tagline": "Libertad de extremo a extremo"
"desktop.tagline": "Libertad de extremo a extremo",
"desktop.callsNotHere": "Las llamadas a\xFAn no est\xE1n disponibles en esta versi\xF3n. Los mensajes, los archivos y los chats grupales funcionan con normalidad."
},
"uk": {
"language.label": "\u041C\u043E\u0432\u0430",
@@ -4491,7 +4495,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u041F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u0438\u0439 \u0442\u0440\u0430\u0444\u0456\u043A \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439: \u0432\u0438\u043F\u0430\u0434\u043A\u043E\u0432\u0456 \u0444\u0430\u043B\u044C\u0448\u0438\u0432\u0456 \u043A\u0430\u0434\u0440\u0438 (32-128 \u0411 \u043A\u043E\u0436\u043D\u0456 15-30 \u0441) \u0443 \u043A\u0430\u043D\u0430\u043B\u0456 \u0437 \u0440\u0430\u0442\u0447\u0435\u0442\u043E\u043C",
"desktop.sec.coverOff": "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440 \u043F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u043E\u0433\u043E \u0442\u0440\u0430\u0444\u0456\u043A\u0443 \u043D\u0435 \u043F\u0440\u0430\u0446\u044E\u0454",
"desktop.sec.coverUnsupported": "\u041F\u0440\u0438\u043A\u0440\u0438\u0432\u0430\u044E\u0447\u0438\u0439 \u0442\u0440\u0430\u0444\u0456\u043A \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u0454 \u0441\u0435\u0430\u043D\u0441\u0443 Double Ratchet (\u0443 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0441\u0442\u0430\u0440\u0456\u0448\u0430 \u0432\u0435\u0440\u0441\u0456\u044F)",
"desktop.tagline": "\u041D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0430 \u0441\u0432\u043E\u0431\u043E\u0434\u0430"
"desktop.tagline": "\u041D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u0430 \u0441\u0432\u043E\u0431\u043E\u0434\u0430",
"desktop.callsNotHere": "\u0414\u0437\u0432\u0456\u043D\u043A\u0438 \u0432 \u0446\u0456\u0439 \u0437\u0431\u0456\u0440\u0446\u0456 \u043F\u043E\u043A\u0438 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0456. \u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F, \u0444\u0430\u0439\u043B\u0438 \u0442\u0430 \u0433\u0440\u0443\u043F\u043E\u0432\u0456 \u0447\u0430\u0442\u0438 \u043F\u0440\u0430\u0446\u044E\u044E\u0442\u044C \u044F\u043A \u0437\u0432\u0438\u0447\u0430\u0439\u043D\u043E."
},
"ru": {
"language.label": "\u042F\u0437\u044B\u043A",
@@ -5340,7 +5345,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u041F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0438\u0439 \u0442\u0440\u0430\u0444\u0438\u043A \u0430\u043A\u0442\u0438\u0432\u0435\u043D: \u0441\u043B\u0443\u0447\u0430\u0439\u043D\u044B\u0435 \u0444\u0430\u043B\u044C\u0448\u0438\u0432\u044B\u0435 \u043A\u0430\u0434\u0440\u044B (32-128 \u0411 \u043A\u0430\u0436\u0434\u044B\u0435 15-30 \u0441) \u0432 \u043A\u0430\u043D\u0430\u043B\u0435 \u0441 \u0440\u044D\u0442\u0447\u0435\u0442\u043E\u043C",
"desktop.sec.coverOff": "\u0413\u0435\u043D\u0435\u0440\u0430\u0442\u043E\u0440 \u043F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u0433\u043E \u0442\u0440\u0430\u0444\u0438\u043A\u0430 \u043D\u0435 \u0440\u0430\u0431\u043E\u0442\u0430\u0435\u0442",
"desktop.sec.coverUnsupported": "\u041F\u0440\u0438\u043A\u0440\u044B\u0432\u0430\u044E\u0449\u0435\u043C\u0443 \u0442\u0440\u0430\u0444\u0438\u043A\u0443 \u043D\u0443\u0436\u0435\u043D \u0441\u0435\u0430\u043D\u0441 Double Ratchet (\u0443 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0432\u0435\u0440\u0441\u0438\u044F \u043F\u043E\u0441\u0442\u0430\u0440\u0448\u0435)",
"desktop.tagline": "\u0421\u043A\u0432\u043E\u0437\u043D\u0430\u044F \u0441\u0432\u043E\u0431\u043E\u0434\u0430"
"desktop.tagline": "\u0421\u043A\u0432\u043E\u0437\u043D\u0430\u044F \u0441\u0432\u043E\u0431\u043E\u0434\u0430",
"desktop.callsNotHere": "\u0417\u0432\u043E\u043D\u043A\u0438 \u0432 \u044D\u0442\u043E\u0439 \u0441\u0431\u043E\u0440\u043A\u0435 \u043F\u043E\u043A\u0430 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B. \u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F, \u0444\u0430\u0439\u043B\u044B \u0438 \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u044B\u0435 \u0447\u0430\u0442\u044B \u0440\u0430\u0431\u043E\u0442\u0430\u044E\u0442 \u043A\u0430\u043A \u043E\u0431\u044B\u0447\u043D\u043E."
},
"zh": {
"language.label": "\u8BED\u8A00",
@@ -6189,7 +6195,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u63A9\u62A4\u6D41\u91CF\u5DF2\u542F\u7528\uFF1A\u5728\u68D8\u8F6E\u901A\u9053\u4E0A\u53D1\u9001\u968F\u673A\u4F2A\u5E27\uFF08\u6BCF 15-30 \u79D2 32-128 \u5B57\u8282\uFF09",
"desktop.sec.coverOff": "\u63A9\u62A4\u6D41\u91CF\u751F\u6210\u5668\u672A\u8FD0\u884C",
"desktop.sec.coverUnsupported": "\u63A9\u62A4\u6D41\u91CF\u9700\u8981 Double Ratchet \u4F1A\u8BDD\uFF08\u5BF9\u65B9\u4F7F\u7528\u8F83\u65E7\u7248\u672C\uFF09",
"desktop.tagline": "\u7AEF\u5230\u7AEF\u7684\u81EA\u7531"
"desktop.tagline": "\u7AEF\u5230\u7AEF\u7684\u81EA\u7531",
"desktop.callsNotHere": "\u6B64\u7248\u672C\u6682\u4E0D\u652F\u6301\u901A\u8BDD\u3002\u6D88\u606F\u3001\u6587\u4EF6\u548C\u7FA4\u804A\u4E00\u5207\u6B63\u5E38\u3002"
},
"ko": {
"language.label": "\uC5B8\uC5B4",
@@ -7038,7 +7045,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\uC704\uC7A5 \uD2B8\uB798\uD53D \uC791\uB3D9 \uC911: \uB798\uCE6B \uCC44\uB110\uC5D0 \uBB34\uC791\uC704 \uB354\uBBF8 \uD504\uB808\uC784 (15-30\uCD08\uB9C8\uB2E4 32-128 B)",
"desktop.sec.coverOff": "\uC704\uC7A5 \uD2B8\uB798\uD53D \uC0DD\uC131\uAE30\uAC00 \uC2E4\uD589\uB418\uACE0 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4",
"desktop.sec.coverUnsupported": "\uC704\uC7A5 \uD2B8\uB798\uD53D\uC5D0\uB294 Double Ratchet \uC138\uC158\uC774 \uD544\uC694\uD569\uB2C8\uB2E4 (\uC0C1\uB300\uAC00 \uAD6C\uBC84\uC804\uC785\uB2C8\uB2E4)",
"desktop.tagline": "\uC885\uB2E8 \uAC04 \uC790\uC720"
"desktop.tagline": "\uC885\uB2E8 \uAC04 \uC790\uC720",
"desktop.callsNotHere": "\uC774 \uBE4C\uB4DC\uC5D0\uC11C\uB294 \uC544\uC9C1 \uD1B5\uD654\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uBA54\uC2DC\uC9C0, \uD30C\uC77C, \uADF8\uB8F9 \uCC44\uD305\uC740 \uD3C9\uC18C\uB300\uB85C \uC791\uB3D9\uD569\uB2C8\uB2E4."
},
"hi": {
"language.label": "\u092D\u093E\u0937\u093E",
@@ -7887,7 +7895,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0938\u0915\u094D\u0930\u093F\u092F: \u0930\u0948\u091A\u0947\u091F \u091A\u0948\u0928\u0932 \u092A\u0930 \u092F\u093E\u0926\u0943\u091A\u094D\u091B\u093F\u0915 \u0928\u0915\u0932\u0940 \u092B\u093C\u094D\u0930\u0947\u092E (\u0939\u0930 15-30 \u0938\u0947\u0915\u0902\u0921 \u092E\u0947\u0902 32-128 B)",
"desktop.sec.coverOff": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u091C\u0928\u0930\u0947\u091F\u0930 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0930\u0939\u093E",
"desktop.sec.coverUnsupported": "\u0906\u0935\u0930\u0923 \u091F\u094D\u0930\u0948\u092B\u093C\u093F\u0915 \u0915\u0947 \u0932\u093F\u090F Double Ratchet \u0938\u0924\u094D\u0930 \u091A\u093E\u0939\u093F\u090F (\u0938\u093E\u0925\u0940 \u092A\u0941\u0930\u093E\u0928\u0947 \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u092A\u0930 \u0939\u0948)",
"desktop.tagline": "\u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u0906\u091C\u093C\u093E\u0926\u0940"
"desktop.tagline": "\u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u0906\u091C\u093C\u093E\u0926\u0940",
"desktop.callsNotHere": "\u0907\u0938 \u092C\u093F\u0932\u094D\u0921 \u092E\u0947\u0902 \u0915\u0949\u0932 \u0905\u092D\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0902\u0964 \u0938\u0902\u0926\u0947\u0936, \u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u0914\u0930 \u0938\u092E\u0942\u0939 \u091A\u0948\u091F \u0938\u093E\u092E\u093E\u0928\u094D\u092F \u0930\u0942\u092A \u0938\u0947 \u0915\u093E\u092E \u0915\u0930\u0924\u0947 \u0939\u0948\u0902\u0964"
},
"ar": {
"language.label": "\u0627\u0644\u0644\u063A\u0629",
@@ -8736,7 +8745,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0646\u0634\u0637\u0629: \u0625\u0637\u0627\u0631\u0627\u062A \u0648\u0647\u0645\u064A\u0629 \u0639\u0634\u0648\u0627\u0626\u064A\u0629 (32-128 \u0628\u0627\u064A\u062A \u0643\u0644 15-30 \u062B\u0627\u0646\u064A\u0629) \u0639\u0644\u0649 \u0642\u0646\u0627\u0629 \u0627\u0644\u0631\u0627\u062A\u0634\u064A\u062A",
"desktop.sec.coverOff": "\u0645\u0648\u0644\u0651\u062F \u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0644\u0627 \u064A\u0639\u0645\u0644",
"desktop.sec.coverUnsupported": "\u062A\u062D\u062A\u0627\u062C \u062D\u0631\u0643\u0629 \u0627\u0644\u062A\u0645\u0648\u064A\u0647 \u0625\u0644\u0649 \u062C\u0644\u0633\u0629 Double Ratchet (\u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0639\u0644\u0649 \u0625\u0635\u062F\u0627\u0631 \u0623\u0642\u062F\u0645)",
"desktop.tagline": "\u062D\u0631\u064A\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641"
"desktop.tagline": "\u062D\u0631\u064A\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641",
"desktop.callsNotHere": "\u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629 \u0628\u0639\u062F \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u0646\u0633\u062E\u0629. \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0648\u0627\u0644\u0645\u0644\u0641\u0627\u062A \u0648\u0627\u0644\u062F\u0631\u062F\u0634\u0627\u062A \u0627\u0644\u062C\u0645\u0627\u0639\u064A\u0629 \u062A\u0639\u0645\u0644 \u0643\u0627\u0644\u0645\u0639\u062A\u0627\u062F."
},
"he": {
"language.label": "\u05E9\u05E4\u05D4",
@@ -9585,7 +9595,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05E4\u05E2\u05D9\u05DC\u05D4: \u05DE\u05E1\u05D2\u05E8\u05D5\u05EA \u05DE\u05D6\u05D5\u05D9\u05E4\u05D5\u05EA \u05D0\u05E7\u05E8\u05D0\u05D9\u05D5\u05EA (32-128 \u05D1\u05EA\u05D9\u05DD \u05DB\u05DC 15-30 \u05E9\u05E0\u05D9\u05D5\u05EA) \u05D1\u05E2\u05E8\u05D5\u05E5 \u05D4\u05E8\u05D0\u05E6\u05F3\u05D8",
"desktop.sec.coverOff": "\u05DE\u05D7\u05D5\u05DC\u05DC \u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05D0\u05D9\u05E0\u05D5 \u05E4\u05D5\u05E2\u05DC",
"desktop.sec.coverUnsupported": "\u05EA\u05E2\u05D1\u05D5\u05E8\u05EA \u05D4\u05E1\u05D5\u05D5\u05D0\u05D4 \u05DE\u05D7\u05D9\u05D9\u05D1\u05EA \u05D4\u05E4\u05E2\u05DC\u05EA Double Ratchet (\u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D9\u05E9\u05E0\u05D4 \u05D9\u05D5\u05EA\u05E8)",
"desktop.tagline": "\u05D7\u05D5\u05E4\u05E9 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4"
"desktop.tagline": "\u05D7\u05D5\u05E4\u05E9 \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4",
"desktop.callsNotHere": "\u05E9\u05D9\u05D7\u05D5\u05EA \u05D0\u05D9\u05E0\u05DF \u05D6\u05DE\u05D9\u05E0\u05D5\u05EA \u05E2\u05D3\u05D9\u05D9\u05DF \u05D1\u05D2\u05E8\u05E1\u05D4 \u05D6\u05D5. \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA, \u05E7\u05D1\u05E6\u05D9\u05DD \u05D5\u05E6\u05F3\u05D0\u05D8\u05D9\u05DD \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05D9\u05DD \u05E4\u05D5\u05E2\u05DC\u05D9\u05DD \u05DB\u05E8\u05D2\u05D9\u05DC."
},
"fa": {
"language.label": "\u0632\u0628\u0627\u0646",
@@ -10434,7 +10445,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u0641\u0639\u0627\u0644 \u0627\u0633\u062A: \u0642\u0627\u0628\u200C\u0647\u0627\u06CC \u0633\u0627\u062E\u062A\u06AF\u06CC \u062A\u0635\u0627\u062F\u0641\u06CC (\u06F3\u06F2 \u062A\u0627 \u06F1\u06F2\u06F8 \u0628\u0627\u06CC\u062A \u0647\u0631 \u06F1\u06F5 \u062A\u0627 \u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647) \u0631\u0648\u06CC \u06A9\u0627\u0646\u0627\u0644 \u0631\u0686\u062A",
"desktop.sec.coverOff": "\u0645\u0648\u0644\u062F \u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627 \u0646\u06CC\u0633\u062A",
"desktop.sec.coverUnsupported": "\u062A\u0631\u0627\u0641\u06CC\u06A9 \u067E\u0648\u0634\u0634\u06CC \u0628\u0647 \u0646\u0634\u0633\u062A Double Ratchet \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u062F (\u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0646\u0633\u062E\u0647\u0654 \u0642\u062F\u06CC\u0645\u06CC\u200C\u062A\u0631\u06CC \u062F\u0627\u0631\u062F)",
"desktop.tagline": "\u0622\u0632\u0627\u062F\u06CC \u0633\u0631\u062A\u0627\u0633\u0631\u06CC"
"desktop.tagline": "\u0622\u0632\u0627\u062F\u06CC \u0633\u0631\u062A\u0627\u0633\u0631\u06CC",
"desktop.callsNotHere": "\u062A\u0645\u0627\u0633\u200C\u0647\u0627 \u0647\u0646\u0648\u0632 \u062F\u0631 \u0627\u06CC\u0646 \u0646\u0633\u062E\u0647 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A\u0646\u062F. \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u060C \u0641\u0627\u06CC\u0644\u200C\u0647\u0627 \u0648 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648\u0647\u0627\u06CC \u06AF\u0631\u0648\u0647\u06CC \u0637\u0628\u0642 \u0645\u0639\u0645\u0648\u0644 \u06A9\u0627\u0631 \u0645\u06CC\u200C\u06A9\u0646\u0646\u062F."
},
"ur": {
"language.label": "\u0632\u0628\u0627\u0646",
@@ -11283,7 +11295,8 @@ var DICTIONARIES = {
"desktop.sec.coverOn": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u0641\u0639\u0627\u0644: \u0631\u06CC\u0686\u0679 \u0686\u06CC\u0646\u0644 \u067E\u0631 \u0628\u06D2 \u062A\u0631\u062A\u06CC\u0628 \u062C\u0639\u0644\u06CC \u0641\u0631\u06CC\u0645 (\u06C1\u0631 15-30 \u0633\u06CC\u06A9\u0646\u0688 \u0645\u06CC\u06BA 32-128 B)",
"desktop.sec.coverOff": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u062C\u0646\u0631\u06CC\u0679\u0631 \u0646\u06C1\u06CC\u06BA \u0686\u0644 \u0631\u06C1\u0627",
"desktop.sec.coverUnsupported": "\u06A9\u0648\u0631 \u0679\u0631\u06CC\u0641\u06A9 \u06A9\u06D2 \u0644\u06CC\u06D2 Double Ratchet \u0633\u06CC\u0634\u0646 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2 (\u0633\u0627\u062A\u06BE\u06CC \u067E\u0631\u0627\u0646\u06D2 \u0648\u0631\u0698\u0646 \u067E\u0631 \u06C1\u06D2)",
"desktop.tagline": "\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0622\u0632\u0627\u062F\u06CC"
"desktop.tagline": "\u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0622\u0632\u0627\u062F\u06CC",
"desktop.callsNotHere": "\u0627\u0633 \u0628\u0644\u0688 \u0645\u06CC\u06BA \u06A9\u0627\u0644\u06CC\u06BA \u0627\u0628\u06BE\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA \u06C1\u06CC\u06BA\u06D4 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A\u060C \u0641\u0627\u0626\u0644\u06CC\u06BA \u0627\u0648\u0631 \u06AF\u0631\u0648\u067E \u0686\u06CC\u0679\u0633 \u0645\u0639\u0645\u0648\u0644 \u06A9\u06D2 \u0645\u0637\u0627\u0628\u0642 \u06A9\u0627\u0645 \u06A9\u0631\u062A\u06CC \u06C1\u06CC\u06BA\u06D4"
}
};
@@ -18141,7 +18154,7 @@ var EnhancedConnectionSetup = ({
}, disabled: !hasInvite || connectionStatus === "connecting", style: { width: "100%", display: "inline-flex", alignItems: "center", justifyContent: "center", gap: "9px", padding: "14px", borderRadius: "13px", border: "none", background: hasInvite && connectionStatus !== "connecting" ? C_ORANGE : "rgba(255,255,255,0.05)", color: hasInvite && connectionStatus !== "connecting" ? "#1a0f04" : "#56565e", fontFamily: "inherit", fontSize: "15px", fontWeight: 700, cursor: hasInvite && connectionStatus !== "connecting" ? "pointer" : "not-allowed", boxShadow: hasInvite && connectionStatus !== "connecting" ? "0 8px 24px rgba(240,137,42,0.28)" : "none" } }, connectionStatus === "connecting" ? t("intro.connecting") : t("intro.connect"))
]);
}
const SB_DESKTOP_VERSION = "1.0.0";
const SB_DESKTOP_VERSION = "1.0.1";
const SB_DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${SB_DESKTOP_VERSION}`;
const DOWNLOADS = {
mac: { name: "macOS", format: ".dmg \xB7 Apple Silicon & Intel", icon: "fab fa-apple", url: `${SB_DESKTOP_RELEASE}/SecureBit.Chat_${SB_DESKTOP_VERSION}_x64.dmg` },
+2 -2
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -7,7 +7,7 @@ this document describes.
| | |
| --- | --- |
| Release | v6.7.1 |
| Release | v6.7.2 |
| Protocol version | 4.1 |
| Ratchet wire version | 1 |
@@ -347,5 +347,5 @@ no leg may stop a capture it borrowed.
## Scope
This describes the browser implementation as it stands in v6.7.1. It is not a
This describes the browser implementation as it stands in v6.7.2. It is not a
substitute for independent cryptographic review.
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/es/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/fa/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/fr/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/he/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/hi/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ko/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "حركة التمويه نشطة: إطارات وهمية عشوائية (32-128 بايت كل 15-30 ثانية) على قناة الراتشيت",
"desktop.sec.coverOff": "مولّد حركة التمويه لا يعمل",
"desktop.sec.coverUnsupported": "تحتاج حركة التمويه إلى جلسة Double Ratchet (الطرف الآخر على إصدار أقدم)",
"desktop.tagline": "حرية من طرف إلى طرف"
"desktop.tagline": "حرية من طرف إلى طرف",
"desktop.callsNotHere": "المكالمات غير متاحة بعد في هذه النسخة. الرسائل والملفات والدردشات الجماعية تعمل كالمعتاد."
}
}
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "Verdeckter Verkehr aktiv: zufällige Scheinframes (32-128 B alle 15-30 s) auf dem Ratchet-Kanal",
"desktop.sec.coverOff": "Der Generator für verdeckten Verkehr läuft nicht",
"desktop.sec.coverUnsupported": "Verdeckter Verkehr braucht eine Double-Ratchet-Sitzung (die Gegenstelle nutzt eine ältere Version)",
"desktop.tagline": "Ende-zu-Ende-Freiheit"
"desktop.tagline": "Ende-zu-Ende-Freiheit",
"desktop.callsNotHere": "Anrufe sind in dieser Version noch nicht verfügbar. Nachrichten, Dateien und Gruppenchats funktionieren wie gewohnt."
}
}
+2 -1
View File
@@ -876,6 +876,7 @@
"desktop.sec.coverOn": "Cover traffic active: random fake frames (32-128 B every 15-30 s) on the ratcheted channel",
"desktop.sec.coverOff": "The cover traffic generator is not running",
"desktop.sec.coverUnsupported": "Cover traffic needs a Double Ratchet session (the peer is on an older release)",
"desktop.tagline": "End-to-end freedom"
"desktop.tagline": "End-to-end freedom",
"desktop.callsNotHere": "Calls are not available in this build yet. Messages, files and group chats work as usual."
}
}
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "Tráfico de cobertura activo: tramas falsas aleatorias (32-128 B cada 15-30 s) en el canal con ratchet",
"desktop.sec.coverOff": "El generador de tráfico de cobertura no está en marcha",
"desktop.sec.coverUnsupported": "El tráfico de cobertura requiere una sesión Double Ratchet (el par usa una versión anterior)",
"desktop.tagline": "Libertad de extremo a extremo"
"desktop.tagline": "Libertad de extremo a extremo",
"desktop.callsNotHere": "Las llamadas aún no están disponibles en esta versión. Los mensajes, los archivos y los chats grupales funcionan con normalidad."
}
}
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "ترافیک پوششی فعال است: قاب‌های ساختگی تصادفی (۳۲ تا ۱۲۸ بایت هر ۱۵ تا ۳۰ ثانیه) روی کانال رچت",
"desktop.sec.coverOff": "مولد ترافیک پوششی در حال اجرا نیست",
"desktop.sec.coverUnsupported": "ترافیک پوششی به نشست Double Ratchet نیاز دارد (طرف مقابل نسخهٔ قدیمی‌تری دارد)",
"desktop.tagline": "آزادی سرتاسری"
"desktop.tagline": "آزادی سرتاسری",
"desktop.callsNotHere": "تماس‌ها هنوز در این نسخه در دسترس نیستند. پیام‌ها، فایل‌ها و گفت‌وگوهای گروهی طبق معمول کار می‌کنند."
}
}
+2 -1
View File
@@ -876,7 +876,8 @@
"desktop.sec.coverOn": "Trafic de couverture actif : trames factices aléatoires (32-128 o toutes les 15-30 s) sur le canal à ratchet",
"desktop.sec.coverOff": "Le générateur de trafic de couverture ne tourne pas",
"desktop.sec.coverUnsupported": "Le trafic de couverture exige une session Double Ratchet (le pair utilise une version plus ancienne)",
"desktop.tagline": "La liberté de bout en bout"
"desktop.tagline": "La liberté de bout en bout",
"desktop.callsNotHere": "Les appels ne sont pas encore disponibles dans cette version. Les messages, les fichiers et les discussions de groupe fonctionnent normalement."
},
"manifest": {
"name": "SecureBit.chat - Messagerie privée et chiffrée",
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "תעבורת הסוואה פעילה: מסגרות מזויפות אקראיות (32-128 בתים כל 15-30 שניות) בערוץ הראצ׳ט",
"desktop.sec.coverOff": "מחולל תעבורת ההסוואה אינו פועל",
"desktop.sec.coverUnsupported": "תעבורת הסוואה מחייבת הפעלת Double Ratchet (הצד השני בגרסה ישנה יותר)",
"desktop.tagline": "חופש מקצה לקצה"
"desktop.tagline": "חופש מקצה לקצה",
"desktop.callsNotHere": "שיחות אינן זמינות עדיין בגרסה זו. הודעות, קבצים וצ׳אטים קבוצתיים פועלים כרגיל."
}
}
+2 -1
View File
@@ -876,7 +876,8 @@
"desktop.sec.coverOn": "आवरण ट्रैफ़िक सक्रिय: रैचेट चैनल पर यादृच्छिक नकली फ़्रेम (हर 15-30 सेकंड में 32-128 B)",
"desktop.sec.coverOff": "आवरण ट्रैफ़िक जनरेटर नहीं चल रहा",
"desktop.sec.coverUnsupported": "आवरण ट्रैफ़िक के लिए Double Ratchet सत्र चाहिए (साथी पुराने संस्करण पर है)",
"desktop.tagline": "सिरे से सिरे तक आज़ादी"
"desktop.tagline": "सिरे से सिरे तक आज़ादी",
"desktop.callsNotHere": "इस बिल्ड में कॉल अभी उपलब्ध नहीं हैं। संदेश, फ़ाइलें और समूह चैट सामान्य रूप से काम करते हैं।"
},
"manifest": {
"name": "SecureBit.chat - निजी, एन्क्रिप्टेड मैसेंजर",
+2 -1
View File
@@ -876,7 +876,8 @@
"desktop.sec.coverOn": "위장 트래픽 작동 중: 래칫 채널에 무작위 더미 프레임 (15-30초마다 32-128 B)",
"desktop.sec.coverOff": "위장 트래픽 생성기가 실행되고 있지 않습니다",
"desktop.sec.coverUnsupported": "위장 트래픽에는 Double Ratchet 세션이 필요합니다 (상대가 구버전입니다)",
"desktop.tagline": "종단 간 자유"
"desktop.tagline": "종단 간 자유",
"desktop.callsNotHere": "이 빌드에서는 아직 통화를 사용할 수 없습니다. 메시지, 파일, 그룹 채팅은 평소대로 작동합니다."
},
"manifest": {
"name": "SecureBit.chat - 종단 간 암호화 비공개 메신저",
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "Прикрывающий трафик активен: случайные фальшивые кадры (32-128 Б каждые 15-30 с) в канале с рэтчетом",
"desktop.sec.coverOff": "Генератор прикрывающего трафика не работает",
"desktop.sec.coverUnsupported": "Прикрывающему трафику нужен сеанс Double Ratchet (у собеседника версия постарше)",
"desktop.tagline": "Сквозная свобода"
"desktop.tagline": "Сквозная свобода",
"desktop.callsNotHere": "Звонки в этой сборке пока недоступны. Сообщения, файлы и групповые чаты работают как обычно."
}
}
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "Прикриваючий трафік активний: випадкові фальшиві кадри (32-128 Б кожні 15-30 с) у каналі з ратчетом",
"desktop.sec.coverOff": "Генератор прикриваючого трафіку не працює",
"desktop.sec.coverUnsupported": "Прикриваючий трафік потребує сеансу Double Ratchet (у співрозмовника старіша версія)",
"desktop.tagline": "Наскрізна свобода"
"desktop.tagline": "Наскрізна свобода",
"desktop.callsNotHere": "Дзвінки в цій збірці поки недоступні. Повідомлення, файли та групові чати працюють як звичайно."
}
}
+2 -1
View File
@@ -881,6 +881,7 @@
"desktop.sec.coverOn": "کور ٹریفک فعال: ریچٹ چینل پر بے ترتیب جعلی فریم (ہر 15-30 سیکنڈ میں 32-128 B)",
"desktop.sec.coverOff": "کور ٹریفک جنریٹر نہیں چل رہا",
"desktop.sec.coverUnsupported": "کور ٹریفک کے لیے Double Ratchet سیشن درکار ہے (ساتھی پرانے ورژن پر ہے)",
"desktop.tagline": "سرے سے سرے تک آزادی"
"desktop.tagline": "سرے سے سرے تک آزادی",
"desktop.callsNotHere": "اس بلڈ میں کالیں ابھی دستیاب نہیں ہیں۔ پیغامات، فائلیں اور گروپ چیٹس معمول کے مطابق کام کرتی ہیں۔"
}
}
+2 -1
View File
@@ -876,7 +876,8 @@
"desktop.sec.coverOn": "掩护流量已启用:在棘轮通道上发送随机伪帧(每 15-30 秒 32-128 字节)",
"desktop.sec.coverOff": "掩护流量生成器未运行",
"desktop.sec.coverUnsupported": "掩护流量需要 Double Ratchet 会话(对方使用较旧版本)",
"desktop.tagline": "端到端的自由"
"desktop.tagline": "端到端的自由",
"desktop.callsNotHere": "此版本暂不支持通话。消息、文件和群聊一切正常。"
},
"manifest": {
"name": "SecureBit.chat - 私密的端到端加密通讯工具",
+7 -7
View File
@@ -1,10 +1,10 @@
{
"version": "1788321149505",
"buildVersion": "1788321149505",
"appVersion": "6.7.1",
"buildTime": "2026-09-02T03:52:29.547Z",
"buildId": "1788321149505-c5b759e",
"gitHash": "c5b759e",
"version": "1788382788139",
"buildVersion": "1788382788139",
"appVersion": "6.7.2",
"buildTime": "2026-09-02T20:59:48.213Z",
"buildId": "1788382788139-2294e38",
"gitHash": "2294e38",
"generated": true,
"generatedAt": "2026-09-02T03:52:29.548Z"
"generatedAt": "2026-09-02T20:59:48.215Z"
}
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "securebit-chat",
"version": "6.7.1",
"version": "6.7.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "securebit-chat",
"version": "6.7.1",
"version": "6.7.2",
"license": "MIT",
"dependencies": {
"base64-js": "1.5.1",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "securebit-chat",
"version": "6.7.1",
"version": "6.7.2",
"description": "Secure P2P Communication Application with End-to-End Encryption",
"main": "index.html",
"scripts": {
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ru/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+1 -1
View File
@@ -1680,7 +1680,7 @@ import { GroupCallMedia, mediaErrorCode } from './group/groupCallMedia.js';
// /download/v0.3.0/SecureBit.Chat_0.1.0_x64-setup.exe, a file that never
// existed, and the download 404s. A pinned tag keeps serving a real
// installer instead.
const SB_DESKTOP_VERSION = '1.0.0';
const SB_DESKTOP_VERSION = '1.0.1';
const SB_DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${SB_DESKTOP_VERSION}`;
const DOWNLOADS = {
mac: { name: 'macOS', format: '.dmg · Apple Silicon & Intel', icon: 'fab fa-apple', url: `${SB_DESKTOP_RELEASE}/SecureBit.Chat_${SB_DESKTOP_VERSION}_x64.dmg` },
+1 -1
View File
@@ -5,7 +5,7 @@
// The tag is pinned rather than using /releases/latest/download/: the filenames
// carry the version, so a `latest` link 404s the moment a newer release exists,
// whereas a pinned tag keeps serving a working (if older) installer.
const DESKTOP_VERSION = '1.0.0';
const DESKTOP_VERSION = '1.0.1';
const DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${DESKTOP_VERSION}`;
const DownloadApps = () => {
+26 -13
View File
@@ -944,7 +944,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "Cover traffic active: random fake frames (32-128 B every 15-30 s) on the ratcheted channel",
"desktop.sec.coverOff": "The cover traffic generator is not running",
"desktop.sec.coverUnsupported": "Cover traffic needs a Double Ratchet session (the peer is on an older release)",
"desktop.tagline": "End-to-end freedom"
"desktop.tagline": "End-to-end freedom",
"desktop.callsNotHere": "Calls are not available in this build yet. Messages, files and group chats work as usual."
},
"de": {
"language.label": "Sprache",
@@ -1793,7 +1794,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "Verdeckter Verkehr aktiv: zufällige Scheinframes (32-128 B alle 15-30 s) auf dem Ratchet-Kanal",
"desktop.sec.coverOff": "Der Generator für verdeckten Verkehr läuft nicht",
"desktop.sec.coverUnsupported": "Verdeckter Verkehr braucht eine Double-Ratchet-Sitzung (die Gegenstelle nutzt eine ältere Version)",
"desktop.tagline": "Ende-zu-Ende-Freiheit"
"desktop.tagline": "Ende-zu-Ende-Freiheit",
"desktop.callsNotHere": "Anrufe sind in dieser Version noch nicht verfügbar. Nachrichten, Dateien und Gruppenchats funktionieren wie gewohnt."
},
"fr": {
"language.label": "Langue",
@@ -2642,7 +2644,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "Trafic de couverture actif : trames factices aléatoires (32-128 o toutes les 15-30 s) sur le canal à ratchet",
"desktop.sec.coverOff": "Le générateur de trafic de couverture ne tourne pas",
"desktop.sec.coverUnsupported": "Le trafic de couverture exige une session Double Ratchet (le pair utilise une version plus ancienne)",
"desktop.tagline": "La liberté de bout en bout"
"desktop.tagline": "La liberté de bout en bout",
"desktop.callsNotHere": "Les appels ne sont pas encore disponibles dans cette version. Les messages, les fichiers et les discussions de groupe fonctionnent normalement."
},
"es": {
"language.label": "Idioma",
@@ -3491,7 +3494,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "Tráfico de cobertura activo: tramas falsas aleatorias (32-128 B cada 15-30 s) en el canal con ratchet",
"desktop.sec.coverOff": "El generador de tráfico de cobertura no está en marcha",
"desktop.sec.coverUnsupported": "El tráfico de cobertura requiere una sesión Double Ratchet (el par usa una versión anterior)",
"desktop.tagline": "Libertad de extremo a extremo"
"desktop.tagline": "Libertad de extremo a extremo",
"desktop.callsNotHere": "Las llamadas aún no están disponibles en esta versión. Los mensajes, los archivos y los chats grupales funcionan con normalidad."
},
"uk": {
"language.label": "Мова",
@@ -4340,7 +4344,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "Прикриваючий трафік активний: випадкові фальшиві кадри (32-128 Б кожні 15-30 с) у каналі з ратчетом",
"desktop.sec.coverOff": "Генератор прикриваючого трафіку не працює",
"desktop.sec.coverUnsupported": "Прикриваючий трафік потребує сеансу Double Ratchet (у співрозмовника старіша версія)",
"desktop.tagline": "Наскрізна свобода"
"desktop.tagline": "Наскрізна свобода",
"desktop.callsNotHere": "Дзвінки в цій збірці поки недоступні. Повідомлення, файли та групові чати працюють як звичайно."
},
"ru": {
"language.label": "Язык",
@@ -5189,7 +5194,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "Прикрывающий трафик активен: случайные фальшивые кадры (32-128 Б каждые 15-30 с) в канале с рэтчетом",
"desktop.sec.coverOff": "Генератор прикрывающего трафика не работает",
"desktop.sec.coverUnsupported": "Прикрывающему трафику нужен сеанс Double Ratchet (у собеседника версия постарше)",
"desktop.tagline": "Сквозная свобода"
"desktop.tagline": "Сквозная свобода",
"desktop.callsNotHere": "Звонки в этой сборке пока недоступны. Сообщения, файлы и групповые чаты работают как обычно."
},
"zh": {
"language.label": "语言",
@@ -6038,7 +6044,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "掩护流量已启用:在棘轮通道上发送随机伪帧(每 15-30 秒 32-128 字节)",
"desktop.sec.coverOff": "掩护流量生成器未运行",
"desktop.sec.coverUnsupported": "掩护流量需要 Double Ratchet 会话(对方使用较旧版本)",
"desktop.tagline": "端到端的自由"
"desktop.tagline": "端到端的自由",
"desktop.callsNotHere": "此版本暂不支持通话。消息、文件和群聊一切正常。"
},
"ko": {
"language.label": "언어",
@@ -6887,7 +6894,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "위장 트래픽 작동 중: 래칫 채널에 무작위 더미 프레임 (15-30초마다 32-128 B)",
"desktop.sec.coverOff": "위장 트래픽 생성기가 실행되고 있지 않습니다",
"desktop.sec.coverUnsupported": "위장 트래픽에는 Double Ratchet 세션이 필요합니다 (상대가 구버전입니다)",
"desktop.tagline": "종단 간 자유"
"desktop.tagline": "종단 간 자유",
"desktop.callsNotHere": "이 빌드에서는 아직 통화를 사용할 수 없습니다. 메시지, 파일, 그룹 채팅은 평소대로 작동합니다."
},
"hi": {
"language.label": "भाषा",
@@ -7736,7 +7744,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "आवरण ट्रैफ़िक सक्रिय: रैचेट चैनल पर यादृच्छिक नकली फ़्रेम (हर 15-30 सेकंड में 32-128 B)",
"desktop.sec.coverOff": "आवरण ट्रैफ़िक जनरेटर नहीं चल रहा",
"desktop.sec.coverUnsupported": "आवरण ट्रैफ़िक के लिए Double Ratchet सत्र चाहिए (साथी पुराने संस्करण पर है)",
"desktop.tagline": "सिरे से सिरे तक आज़ादी"
"desktop.tagline": "सिरे से सिरे तक आज़ादी",
"desktop.callsNotHere": "इस बिल्ड में कॉल अभी उपलब्ध नहीं हैं। संदेश, फ़ाइलें और समूह चैट सामान्य रूप से काम करते हैं।"
},
"ar": {
"language.label": "اللغة",
@@ -8585,7 +8594,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "حركة التمويه نشطة: إطارات وهمية عشوائية (32-128 بايت كل 15-30 ثانية) على قناة الراتشيت",
"desktop.sec.coverOff": "مولّد حركة التمويه لا يعمل",
"desktop.sec.coverUnsupported": "تحتاج حركة التمويه إلى جلسة Double Ratchet (الطرف الآخر على إصدار أقدم)",
"desktop.tagline": "حرية من طرف إلى طرف"
"desktop.tagline": "حرية من طرف إلى طرف",
"desktop.callsNotHere": "المكالمات غير متاحة بعد في هذه النسخة. الرسائل والملفات والدردشات الجماعية تعمل كالمعتاد."
},
"he": {
"language.label": "שפה",
@@ -9434,7 +9444,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "תעבורת הסוואה פעילה: מסגרות מזויפות אקראיות (32-128 בתים כל 15-30 שניות) בערוץ הראצ׳ט",
"desktop.sec.coverOff": "מחולל תעבורת ההסוואה אינו פועל",
"desktop.sec.coverUnsupported": "תעבורת הסוואה מחייבת הפעלת Double Ratchet (הצד השני בגרסה ישנה יותר)",
"desktop.tagline": "חופש מקצה לקצה"
"desktop.tagline": "חופש מקצה לקצה",
"desktop.callsNotHere": "שיחות אינן זמינות עדיין בגרסה זו. הודעות, קבצים וצ׳אטים קבוצתיים פועלים כרגיל."
},
"fa": {
"language.label": "زبان",
@@ -10283,7 +10294,8 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "ترافیک پوششی فعال است: قاب‌های ساختگی تصادفی (۳۲ تا ۱۲۸ بایت هر ۱۵ تا ۳۰ ثانیه) روی کانال رچت",
"desktop.sec.coverOff": "مولد ترافیک پوششی در حال اجرا نیست",
"desktop.sec.coverUnsupported": "ترافیک پوششی به نشست Double Ratchet نیاز دارد (طرف مقابل نسخهٔ قدیمی‌تری دارد)",
"desktop.tagline": "آزادی سرتاسری"
"desktop.tagline": "آزادی سرتاسری",
"desktop.callsNotHere": "تماس‌ها هنوز در این نسخه در دسترس نیستند. پیام‌ها، فایل‌ها و گفت‌وگوهای گروهی طبق معمول کار می‌کنند."
},
"ur": {
"language.label": "زبان",
@@ -11132,6 +11144,7 @@ export const DICTIONARIES = {
"desktop.sec.coverOn": "کور ٹریفک فعال: ریچٹ چینل پر بے ترتیب جعلی فریم (ہر 15-30 سیکنڈ میں 32-128 B)",
"desktop.sec.coverOff": "کور ٹریفک جنریٹر نہیں چل رہا",
"desktop.sec.coverUnsupported": "کور ٹریفک کے لیے Double Ratchet سیشن درکار ہے (ساتھی پرانے ورژن پر ہے)",
"desktop.tagline": "سرے سے سرے تک آزادی"
"desktop.tagline": "سرے سے سرے تک آزادی",
"desktop.callsNotHere": "اس بلڈ میں کالیں ابھی دستیاب نہیں ہیں۔ پیغامات، فائلیں اور گروپ چیٹس معمول کے مطابق کام کرتی ہیں۔"
}
};
+1 -1
View File
@@ -11,7 +11,7 @@ let DYNAMIC_CACHE = 'securebit-pwa-dynamic-v4.7.56';
// Build stamp — rewritten by scripts/post-build.js on every release so this file's
// bytes change each deploy. That is what makes the browser detect a new Service Worker,
// reinstall it, drop stale caches and (via controllerchange) prompt the page to update.
const SW_BUILD_VERSION = '1788321149505';
const SW_BUILD_VERSION = '1788382788139';
// Locale subdirectories, rewritten by scripts/build-i18n.js. Each localized page is a
// separate document at its own URL, so the shell has to be cached and served per
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/uk/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/ur/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>
+24 -24
View File
@@ -30,7 +30,7 @@
<!-- PWA Manifest -->
<link rel="manifest" href="/zh/manifest.json">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- PWA Meta Tags -->
<meta name="mobile-web-app-capable" content="yes">
@@ -96,7 +96,7 @@
<link rel="apple-touch-startup-image" media="screen and (device-width: 744px) and (device-height: 1133px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)" href="/logo/splash/splash_screens/8.3__iPad_Mini_portrait.png">
<!-- Apple Touch Icons -->
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" href="/logo/icon-180x180.png?v=1788382788139">
<link rel="apple-touch-icon" sizes="57x57" href="/logo/icon-57x57.png">
<link rel="apple-touch-icon" sizes="60x60" href="/logo/icon-60x60.png">
<link rel="apple-touch-icon" sizes="72x72" href="/logo/icon-72x72.png">
@@ -105,7 +105,7 @@
<link rel="apple-touch-icon" sizes="120x120" href="/logo/icon-120x120.png">
<link rel="apple-touch-icon" sizes="144x144" href="/logo/icon-144x144.png">
<link rel="apple-touch-icon" sizes="152x152" href="/logo/icon-152x152.png">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788321149505">
<link rel="apple-touch-icon" sizes="180x180" href="/logo/icon-180x180.png?v=1788382788139">
<!-- Microsoft Tiles -->
<meta name="msapplication-TileColor" content="#ff6b35">
@@ -222,7 +222,7 @@
<!-- Render-blocking JS is deferred: classic deferred scripts and module scripts
both execute in document order after parsing, so React still runs before the
app modules below, but the parser / first paint is no longer blocked. -->
<script defer src="/config/ice-servers.js?v=1788321149505"></script>
<script defer src="/config/ice-servers.js?v=1788382788139"></script>
<script defer src="/libs/react/react.production.min.js"></script>
<script defer src="/libs/react-dom/react-dom.production.min.js"></script>
<!-- Prism syntax highlighting (vendored, offline). Tokenizes code as TEXT only —
@@ -230,8 +230,8 @@
Its CSS is loaded async via load-async-css.js (not paint-critical). -->
<script defer src="/libs/prism/prism.js"></script>
<!-- Critical, paint-defining CSS stays render-blocking (avoids FOUC / layout shift). -->
<link rel="stylesheet" href="/assets/tailwind.css?v=1788321149505">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788321149505">
<link rel="stylesheet" href="/assets/tailwind.css?v=1788382788139">
<link rel="icon" type="image/x-icon" href="/logo/favicon.ico?v=1788382788139">
<!-- Preload only the fonts needed for first paint. fa-solid covers the bulk of UI
icons; fa-regular/fa-brands are loaded on demand by their CSS (rarely on the
first screen). Inter latin 400/700 cover body text and headings/buttons. -->
@@ -239,38 +239,38 @@
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-400.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/assets/fonts/inter/files/inter-latin-700.woff2" as="font" type="font/woff2" crossorigin>
<link rel="stylesheet" href="/assets/fonts/inter/inter.css">
<link rel="stylesheet" href="/src/styles/main.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/components.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/main.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/animations.css?v=1788382788139">
<link rel="stylesheet" href="/src/styles/components.css?v=1788382788139">
<!-- Loads after components.css on purpose: press feedback, material weight,
size-specific tracking and the reduced-motion / -transparency / -contrast
answers all need to settle arguments with the sheets above on source order. -->
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/apple-motion.css?v=1788382788139">
<!-- Last of the hand-written sheets: the mirroring rules must win over anything
above them, and they only ever apply under [dir="rtl"]. -->
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788321149505">
<link rel="stylesheet" href="/src/styles/rtl.css?v=1788382788139">
<!-- Non-critical CSS (FontAwesome ~102KB, Prism) loaded async — no longer blocks paint. -->
<script defer src="/src/scripts/load-async-css.js?v=1788321149505"></script>
<script defer src="/src/scripts/load-async-css.js?v=1788382788139"></script>
<noscript>
<link rel="stylesheet" href="/assets/fontawesome/css/all.min.css">
<link rel="stylesheet" href="/libs/prism/prism.css">
</noscript>
<script defer src="/src/scripts/fa-check.js?v=1788321149505"></script>
<script defer src="/src/scripts/fa-check.js?v=1788382788139"></script>
<!-- Update Manager - система принудительного обновления -->
<script defer src="/src/utils/updateManager.js?v=1788321149505"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788321149505"></script>
<script type="module" src="/dist/qr-local.js?v=1788321149505"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788321149505"></script>
<script defer src="/src/utils/updateManager.js?v=1788382788139"></script>
<script type="module" src="/src/components/UpdateChecker.jsx?v=1788382788139"></script>
<script type="module" src="/dist/qr-local.js?v=1788382788139"></script>
<script type="module" src="/src/components/QRScanner.js?v=1788382788139"></script>
</head>
<body>
<div id="root"></div>
<script type="module" src="/dist/app-boot.js?v=1788321149505"></script>
<script type="module" src="/dist/app.js?v=1788321149505"></script>
<script type="module" src="/dist/app-boot.js?v=1788382788139"></script>
<script type="module" src="/dist/app.js?v=1788382788139"></script>
<script defer src="/src/scripts/pwa-register.js?v=1788321149505"></script>
<script src="/src/pwa/install-prompt.js?v=1788321149505" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788321149505" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788321149505"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788321149505">
<script defer src="/src/scripts/pwa-register.js?v=1788382788139"></script>
<script src="/src/pwa/install-prompt.js?v=1788382788139" type="module"></script>
<script src="/src/pwa/pwa-manager.js?v=1788382788139" type="module"></script>
<script defer src="/src/scripts/pwa-offline-test.js?v=1788382788139"></script>
<link rel="stylesheet" href="/src/styles/pwa.css?v=1788382788139">
</body>
</html>