diff --git a/ar/index.html b/ar/index.html index f4d236b..98128b3 100644 --- a/ar/index.html +++ b/ar/index.html @@ -30,7 +30,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -105,7 +105,7 @@ - + @@ -222,7 +222,7 @@ - + - - + + @@ -239,38 +239,38 @@ - - - + + + - + - + - + - + - - - - + + + +
- - + + - - - - - + + + + + \ No newline at end of file diff --git a/de/index.html b/de/index.html index 5925564..7de5394 100644 --- a/de/index.html +++ b/de/index.html @@ -30,7 +30,7 @@ - + @@ -96,7 +96,7 @@ - + @@ -105,7 +105,7 @@ - + @@ -222,7 +222,7 @@ - + - - + + @@ -239,38 +239,38 @@ - - - + + + - + - + - + - + - - - - + + + +
- - + + - - - - - + + + + + \ No newline at end of file diff --git a/dist/app-boot.js b/dist/app-boot.js index 59e52cf..018d8fe 100644 --- a/dist/app-boot.js +++ b/dist/app-boot.js @@ -5183,7 +5183,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} is speaking", "groupCall.pin": "Show {name} large", "groupCall.unpin": "Back to everyone", - "groupCall.showEveryone": "Everyone" + "groupCall.showEveryone": "Everyone", + "msg.after5s": "5s after reading", + "msg.after15s": "15s after reading", + "msg.after30s": "30s after reading", + "msg.after1m": "1m after reading", + "msg.sec30": "30 seconds", + "msg.min5": "5 minutes", + "msg.hour1": "1 hour", + "desktop.shareDesc": "Send the code to your peer. It is one-time and expires shortly.", + "desktop.invitationCreated": "Secure invitation created - send it to your peer.", + "desktop.joinDesc": "Paste your peer's invitation code to build your secure answer.", + "desktop.offerTag": "offer \xB7 copy text", + "desktop.answerTag": "answer \xB7 copy text", + "desktop.offerPlaceholder": "Invitation code will appear here\u2026", + "desktop.answerPlaceholder": "Response code will appear here\u2026", + "desktop.backToChats": "Back to chats", + "desktop.sendFeedback": "Send feedback", + "desktop.callsNeedVerified": "Calls require a verified secure channel.", + "desktop.noOpenChannel": "No open secure channel.", + "desktop.chatCarriesCall": "This chat is carrying a group call. Leave the group call before placing a 1:1 call.", + "desktop.err.permission_denied": "The call could not start - microphone and camera access is blocked. Allow it in system settings, then try again.", + "desktop.language": "Language", + "desktop.languageHint": "Applies at once. Messages already sent keep the words they were written in.", + "desktop.compareCode": "Compare the verification code with your peer and confirm if it matches.", + "desktop.verifyBeforeFiles": "Complete verification before sending files.", + "desktop.verifyBeforeSending": "Complete verification before sending messages.", + "desktop.disconnectedByBackend": "Connection securely disconnected.", + "desktop.restoreFailed": "Could not restore the connection. Closing this chat.", + "desktop.channelNotReady": "The data channel is not available yet. Wait for the connection to establish.", + "desktop.enterCode": "Enter the verification code to confirm.", + "desktop.noOffer": "No invitation found. Create one first.", + "desktop.notInitiator": "You did not create this connection, so there is no answer for you to apply.", + "desktop.decryptFailed": "A message could not be decrypted and was discarded.", + "desktop.badMessageFormat": "A malformed frame arrived and was discarded.", + "desktop.notSentNotReady": "Message not sent: the secure channel is not ready. Wait for verification to finish, or reconnect.", + "desktop.micDenied": "Microphone access was denied.", + "desktop.noChannelWait": "No open secure channel - wait for the connection to establish.", + "desktop.sasFailed": "Verification failed. A machine-in-the-middle may be present, so the connection was aborted.", + "desktop.sasOk": "Verification succeeded. This channel is authenticated end to end.", + "desktop.iceForgotten": "Saved servers forgotten. Using public ICE servers.", + "desktop.icePublic": "Using public ICE servers.", + "desktop.verificationInProgress": "Security verification is still running. Wait for it to finish.", + "desktop.fileGone": "This file is no longer available for download.", + "desktop.codeMismatch": "The verification codes do not match. Disconnecting for safety.", + "desktop.noLocalCode": "Verification failed: there is no locally derived code to compare against. Disconnecting for safety.", + "desktop.protocolViolation": "The peer claimed the code was confirmed before you confirmed it. Disconnecting for safety.", + "desktop.verificationRejected": "Verification rejected. The connection was aborted for safety.", + "secLevel.HIGH": "HIGH", + "secLevel.MEDIUM": "MEDIUM", + "secLevel.LOW": "LOW", + "desktop.rerun": "Re-run", + "desktop.ice.customDesc": "Up to {max} servers, one URL per line or JSON.", + "desktop.ice.persistDesc": "Stored locally on this device. Leave off to use only for this session.", + "desktop.group.leaveNote": "The other members are told you left. Nothing about this group is kept on this device afterwards - there is no server holding a copy to rejoin from, so you would need a fresh invitation.", + "desktop.sec.ecdsaOk": "Peer key package signature verified during the handshake (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "No completed handshake", + "desktop.sec.ecdhOk": "Session keys derived from an ephemeral ECDH P-384 exchange via HKDF-SHA-256", + "desktop.sec.ecdhNone": "No session keys derived", + "desktop.sec.encryptionOk": "AES-GCM encryption and decryption verified inside the core", + "desktop.sec.encryptionNa": "The AES-GCM self-test could not be run", + "desktop.sec.integrityOk": "Message integrity verified (AES-GCM authentication)", + "desktop.sec.integrityNa": "The integrity self-test could not be run", + "desktop.sec.pfsOk": "Double Ratchet active - every message has a key of its own", + "desktop.sec.pfsNa": "Not measured", + "desktop.sec.replayOk": "Ratchet message keys are destroyed once used, so a captured frame cannot be replayed", + "desktop.sec.replayNa": "Not measured", + "desktop.sec.dtlsPinned": "Peer DTLS fingerprint pinned: {fp}", + "desktop.sec.dtlsNone": "No remote DTLS fingerprint available", + "desktop.sec.sasBoth": "Both peers confirmed the out-of-band safety code", + "desktop.sec.sasIncomplete": "The safety code has not been confirmed by both peers", + "desktop.sec.metadataOk": "A dedicated metadata key was derived (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "No metadata key", + "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" }, "de": { "language.label": "Sprache", @@ -5957,7 +6032,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} spricht", "groupCall.pin": "{name} gro\xDF anzeigen", "groupCall.unpin": "Zur\xFCck zu allen", - "groupCall.showEveryone": "Alle" + "groupCall.showEveryone": "Alle", + "msg.after5s": "5 Sek. nach dem Lesen", + "msg.after15s": "15 Sek. nach dem Lesen", + "msg.after30s": "30 Sek. nach dem Lesen", + "msg.after1m": "1 Min. nach dem Lesen", + "msg.sec30": "30 Sekunden", + "msg.min5": "5 Minuten", + "msg.hour1": "1 Stunde", + "desktop.shareDesc": "Sende den Code an deinen Peer. Er gilt einmalig und l\xE4uft bald ab.", + "desktop.invitationCreated": "Sichere Einladung erstellt - sende sie an deinen Peer.", + "desktop.joinDesc": "F\xFCge den Einladungscode deines Peers ein, um deine sichere Antwort zu erzeugen.", + "desktop.offerTag": "Einladung \xB7 Text kopieren", + "desktop.answerTag": "Antwort \xB7 Text kopieren", + "desktop.offerPlaceholder": "Hier erscheint der Einladungscode\u2026", + "desktop.answerPlaceholder": "Hier erscheint der Antwortcode\u2026", + "desktop.backToChats": "Zur\xFCck zu den Chats", + "desktop.sendFeedback": "Feedback senden", + "desktop.callsNeedVerified": "Anrufe erfordern einen verifizierten sicheren Kanal.", + "desktop.noOpenChannel": "Kein offener sicherer Kanal.", + "desktop.chatCarriesCall": "\xDCber diesen Chat l\xE4uft ein Gruppenanruf. Verlasse den Gruppenanruf, bevor du einen Einzelanruf startest.", + "desktop.err.permission_denied": "Der Anruf konnte nicht starten - der Zugriff auf Mikrofon und Kamera ist blockiert. Erlaube ihn in den Systemeinstellungen und versuche es erneut.", + "desktop.language": "Sprache", + "desktop.languageHint": "Gilt sofort. Bereits gesendete Nachrichten behalten ihren Wortlaut.", + "desktop.compareCode": "Vergleiche den Pr\xFCfcode mit deinem Peer und best\xE4tige ihn, wenn er \xFCbereinstimmt.", + "desktop.verifyBeforeFiles": "Schlie\xDFe die Verifizierung ab, bevor du Dateien sendest.", + "desktop.verifyBeforeSending": "Schlie\xDFe die Verifizierung ab, bevor du Nachrichten sendest.", + "desktop.disconnectedByBackend": "Verbindung sicher getrennt.", + "desktop.restoreFailed": "Die Verbindung konnte nicht wiederhergestellt werden. Dieser Chat wird geschlossen.", + "desktop.channelNotReady": "Der Datenkanal ist noch nicht verf\xFCgbar. Warte, bis die Verbindung steht.", + "desktop.enterCode": "Gib den Pr\xFCfcode zur Best\xE4tigung ein.", + "desktop.noOffer": "Keine Einladung gefunden. Erstelle zuerst eine.", + "desktop.notInitiator": "Du hast diese Verbindung nicht erstellt, also gibt es f\xFCr dich keine Antwort zum Anwenden.", + "desktop.decryptFailed": "Eine Nachricht konnte nicht entschl\xFCsselt werden und wurde verworfen.", + "desktop.badMessageFormat": "Ein fehlerhaftes Frame kam an und wurde verworfen.", + "desktop.notSentNotReady": "Nachricht nicht gesendet: Der sichere Kanal ist nicht bereit. Warte, bis die Verifizierung abgeschlossen ist, oder verbinde dich neu.", + "desktop.micDenied": "Der Zugriff auf das Mikrofon wurde verweigert.", + "desktop.noChannelWait": "Kein offener sicherer Kanal - warte, bis die Verbindung steht.", + "desktop.sasFailed": "Verifizierung fehlgeschlagen. M\xF6glicherweise sitzt jemand dazwischen, deshalb wurde die Verbindung abgebrochen.", + "desktop.sasOk": "Verifizierung erfolgreich. Dieser Kanal ist Ende zu Ende authentifiziert.", + "desktop.iceForgotten": "Gespeicherte Server verworfen. Es werden \xF6ffentliche ICE-Server verwendet.", + "desktop.icePublic": "Es werden \xF6ffentliche ICE-Server verwendet.", + "desktop.verificationInProgress": "Die Sicherheitspr\xFCfung l\xE4uft noch. Warte, bis sie fertig ist.", + "desktop.fileGone": "Diese Datei steht nicht mehr zum Download bereit.", + "desktop.codeMismatch": "Die Pr\xFCfcodes stimmen nicht \xFCberein. Die Verbindung wird zur Sicherheit getrennt.", + "desktop.noLocalCode": "Verifizierung fehlgeschlagen: Es gibt keinen lokal abgeleiteten Code zum Vergleich. Die Verbindung wird zur Sicherheit getrennt.", + "desktop.protocolViolation": "Der Peer hat den Code als best\xE4tigt ausgegeben, bevor du ihn best\xE4tigt hast. Die Verbindung wird zur Sicherheit getrennt.", + "desktop.verificationRejected": "Verifizierung abgelehnt. Die Verbindung wurde zur Sicherheit abgebrochen.", + "secLevel.HIGH": "HOCH", + "secLevel.MEDIUM": "MITTEL", + "secLevel.LOW": "NIEDRIG", + "desktop.rerun": "Erneut pr\xFCfen", + "desktop.ice.customDesc": "Bis zu {max} Server, eine URL pro Zeile oder JSON.", + "desktop.ice.persistDesc": "Lokal auf diesem Ger\xE4t gespeichert. Aus lassen, um sie nur f\xFCr diese Sitzung zu verwenden.", + "desktop.group.leaveNote": "Den anderen Mitgliedern wird mitgeteilt, dass du gegangen bist. Danach bleibt nichts von dieser Gruppe auf diesem Ger\xE4t - es gibt keinen Server mit einer Kopie, \xFCber den du zur\xFCckkehren k\xF6nntest, du br\xE4uchtest also eine neue Einladung.", + "desktop.sec.ecdsaOk": "Signatur des Schl\xFCsselpakets der Gegenstelle beim Handshake gepr\xFCft (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "Kein abgeschlossener Handshake", + "desktop.sec.ecdhOk": "Sitzungsschl\xFCssel aus einem fl\xFCchtigen ECDH-P-384-Austausch \xFCber HKDF-SHA-256 abgeleitet", + "desktop.sec.ecdhNone": "Keine Sitzungsschl\xFCssel abgeleitet", + "desktop.sec.encryptionOk": "AES-GCM-Ver- und Entschl\xFCsselung im Kern verifiziert", + "desktop.sec.encryptionNa": "Der AES-GCM-Selbsttest konnte nicht ausgef\xFChrt werden", + "desktop.sec.integrityOk": "Nachrichtenintegrit\xE4t verifiziert (AES-GCM-Authentifizierung)", + "desktop.sec.integrityNa": "Der Integrit\xE4ts-Selbsttest konnte nicht ausgef\xFChrt werden", + "desktop.sec.pfsOk": "Double Ratchet aktiv - jede Nachricht hat ihren eigenen Schl\xFCssel", + "desktop.sec.pfsNa": "Nicht gemessen", + "desktop.sec.replayOk": "Ratchet-Nachrichtenschl\xFCssel werden nach Gebrauch vernichtet, ein mitgeschnittenes Frame l\xE4sst sich nicht erneut abspielen", + "desktop.sec.replayNa": "Nicht gemessen", + "desktop.sec.dtlsPinned": "DTLS-Fingerabdruck der Gegenstelle verankert: {fp}", + "desktop.sec.dtlsNone": "Kein DTLS-Fingerabdruck der Gegenstelle verf\xFCgbar", + "desktop.sec.sasBoth": "Beide Seiten haben den Sicherheitscode au\xDFerhalb des Kanals best\xE4tigt", + "desktop.sec.sasIncomplete": "Der Sicherheitscode wurde nicht von beiden Seiten best\xE4tigt", + "desktop.sec.metadataOk": "Ein eigener Metadatenschl\xFCssel wurde abgeleitet (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "Kein Metadatenschl\xFCssel", + "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" }, "fr": { "language.label": "Langue", @@ -6731,7 +6881,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} parle", "groupCall.pin": "Afficher {name} en grand", "groupCall.unpin": "Revenir \xE0 tous", - "groupCall.showEveryone": "Tout le monde" + "groupCall.showEveryone": "Tout le monde", + "msg.after5s": "5 s apr\xE8s lecture", + "msg.after15s": "15 s apr\xE8s lecture", + "msg.after30s": "30 s apr\xE8s lecture", + "msg.after1m": "1 min apr\xE8s lecture", + "msg.sec30": "30 secondes", + "msg.min5": "5 minutes", + "msg.hour1": "1 heure", + "desktop.shareDesc": "Envoyez le code \xE0 votre pair. Il est \xE0 usage unique et expire rapidement.", + "desktop.invitationCreated": "Invitation s\xE9curis\xE9e cr\xE9\xE9e - envoyez-la \xE0 votre pair.", + "desktop.joinDesc": "Collez le code d'invitation de votre pair pour construire votre r\xE9ponse s\xE9curis\xE9e.", + "desktop.offerTag": "invitation \xB7 copier le texte", + "desktop.answerTag": "r\xE9ponse \xB7 copier le texte", + "desktop.offerPlaceholder": "Le code d'invitation appara\xEEtra ici\u2026", + "desktop.answerPlaceholder": "Le code de r\xE9ponse appara\xEEtra ici\u2026", + "desktop.backToChats": "Retour aux discussions", + "desktop.sendFeedback": "Envoyer un retour", + "desktop.callsNeedVerified": "Les appels n\xE9cessitent un canal s\xE9curis\xE9 v\xE9rifi\xE9.", + "desktop.noOpenChannel": "Aucun canal s\xE9curis\xE9 ouvert.", + "desktop.chatCarriesCall": "Cette discussion porte un appel de groupe. Quittez l'appel de groupe avant de lancer un appel \xE0 deux.", + "desktop.err.permission_denied": "L'appel n'a pas pu d\xE9marrer - l'acc\xE8s au micro et \xE0 la cam\xE9ra est bloqu\xE9. Autorisez-le dans les r\xE9glages syst\xE8me, puis r\xE9essayez.", + "desktop.language": "Langue", + "desktop.languageHint": "S'applique imm\xE9diatement. Les messages d\xE9j\xE0 envoy\xE9s gardent leurs mots.", + "desktop.compareCode": "Comparez le code de v\xE9rification avec votre pair et confirmez s\u2019il correspond.", + "desktop.verifyBeforeFiles": "Terminez la v\xE9rification avant d\u2019envoyer des fichiers.", + "desktop.verifyBeforeSending": "Terminez la v\xE9rification avant d\u2019envoyer des messages.", + "desktop.disconnectedByBackend": "Connexion ferm\xE9e de fa\xE7on s\xE9curis\xE9e.", + "desktop.restoreFailed": "Impossible de r\xE9tablir la connexion. Fermeture de cette discussion.", + "desktop.channelNotReady": "Le canal de donn\xE9es n\u2019est pas encore disponible. Attendez que la connexion soit \xE9tablie.", + "desktop.enterCode": "Saisissez le code de v\xE9rification pour confirmer.", + "desktop.noOffer": "Aucune invitation trouv\xE9e. Cr\xE9ez-en une d\u2019abord.", + "desktop.notInitiator": "Vous n\u2019avez pas cr\xE9\xE9 cette connexion, il n\u2019y a donc aucune r\xE9ponse \xE0 appliquer.", + "desktop.decryptFailed": "Un message n\u2019a pas pu \xEAtre d\xE9chiffr\xE9 et a \xE9t\xE9 \xE9cart\xE9.", + "desktop.badMessageFormat": "Une trame mal form\xE9e est arriv\xE9e et a \xE9t\xE9 \xE9cart\xE9e.", + "desktop.notSentNotReady": "Message non envoy\xE9 : le canal s\xE9curis\xE9 n\u2019est pas pr\xEAt. Attendez la fin de la v\xE9rification ou reconnectez-vous.", + "desktop.micDenied": "L\u2019acc\xE8s au micro a \xE9t\xE9 refus\xE9.", + "desktop.noChannelWait": "Aucun canal s\xE9curis\xE9 ouvert - attendez que la connexion soit \xE9tablie.", + "desktop.sasFailed": "\xC9chec de la v\xE9rification. Un interm\xE9diaire est peut-\xEAtre pr\xE9sent : la connexion a \xE9t\xE9 interrompue.", + "desktop.sasOk": "V\xE9rification r\xE9ussie. Ce canal est authentifi\xE9 de bout en bout.", + "desktop.iceForgotten": "Serveurs enregistr\xE9s oubli\xE9s. Utilisation des serveurs ICE publics.", + "desktop.icePublic": "Utilisation des serveurs ICE publics.", + "desktop.verificationInProgress": "La v\xE9rification de s\xE9curit\xE9 est encore en cours. Attendez la fin.", + "desktop.fileGone": "Ce fichier n\u2019est plus disponible au t\xE9l\xE9chargement.", + "desktop.codeMismatch": "Les codes de v\xE9rification ne correspondent pas. D\xE9connexion par s\xE9curit\xE9.", + "desktop.noLocalCode": "\xC9chec de la v\xE9rification : aucun code d\xE9riv\xE9 localement \xE0 comparer. D\xE9connexion par s\xE9curit\xE9.", + "desktop.protocolViolation": "Le pair a affirm\xE9 que le code \xE9tait confirm\xE9 avant que vous ne le confirmiez. D\xE9connexion par s\xE9curit\xE9.", + "desktop.verificationRejected": "V\xE9rification rejet\xE9e. La connexion a \xE9t\xE9 interrompue par s\xE9curit\xE9.", + "secLevel.HIGH": "\xC9LEV\xC9", + "secLevel.MEDIUM": "MOYEN", + "secLevel.LOW": "FAIBLE", + "desktop.rerun": "Relancer", + "desktop.ice.customDesc": "Jusqu'\xE0 {max} serveurs, une URL par ligne ou du JSON.", + "desktop.ice.persistDesc": "Enregistr\xE9 localement sur cet appareil. Laissez d\xE9sactiv\xE9 pour ne l\u2019utiliser que pendant cette session.", + "desktop.group.leaveNote": "Les autres membres sont inform\xE9s de votre d\xE9part. Rien de ce groupe ne reste ensuite sur cet appareil - aucun serveur n\u2019en garde de copie, il vous faudrait donc une nouvelle invitation.", + "desktop.sec.ecdsaOk": "Signature du paquet de cl\xE9s du pair v\xE9rifi\xE9e pendant la poign\xE9e de main (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "Aucune poign\xE9e de main achev\xE9e", + "desktop.sec.ecdhOk": "Cl\xE9s de session d\xE9riv\xE9es d\u2019un \xE9change ECDH P-384 \xE9ph\xE9m\xE8re via HKDF-SHA-256", + "desktop.sec.ecdhNone": "Aucune cl\xE9 de session d\xE9riv\xE9e", + "desktop.sec.encryptionOk": "Chiffrement et d\xE9chiffrement AES-GCM v\xE9rifi\xE9s dans le c\u0153ur", + "desktop.sec.encryptionNa": "L\u2019autotest AES-GCM n\u2019a pas pu \xEAtre ex\xE9cut\xE9", + "desktop.sec.integrityOk": "Int\xE9grit\xE9 des messages v\xE9rifi\xE9e (authentification AES-GCM)", + "desktop.sec.integrityNa": "L\u2019autotest d\u2019int\xE9grit\xE9 n\u2019a pas pu \xEAtre ex\xE9cut\xE9", + "desktop.sec.pfsOk": "Double Ratchet actif - chaque message a sa propre cl\xE9", + "desktop.sec.pfsNa": "Non mesur\xE9", + "desktop.sec.replayOk": "Les cl\xE9s de message du ratchet sont d\xE9truites apr\xE8s usage : une trame captur\xE9e ne peut pas \xEAtre rejou\xE9e", + "desktop.sec.replayNa": "Non mesur\xE9", + "desktop.sec.dtlsPinned": "Empreinte DTLS du pair \xE9pingl\xE9e : {fp}", + "desktop.sec.dtlsNone": "Aucune empreinte DTLS distante disponible", + "desktop.sec.sasBoth": "Les deux pairs ont confirm\xE9 le code de s\xE9curit\xE9 hors bande", + "desktop.sec.sasIncomplete": "Le code de s\xE9curit\xE9 n\u2019a pas \xE9t\xE9 confirm\xE9 par les deux pairs", + "desktop.sec.metadataOk": "Une cl\xE9 de m\xE9tadonn\xE9es d\xE9di\xE9e a \xE9t\xE9 d\xE9riv\xE9e (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "Aucune cl\xE9 de m\xE9tadonn\xE9es", + "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" }, "es": { "language.label": "Idioma", @@ -7505,7 +7730,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} est\xE1 hablando", "groupCall.pin": "Ver a {name} en grande", "groupCall.unpin": "Volver a todos", - "groupCall.showEveryone": "Todos" + "groupCall.showEveryone": "Todos", + "msg.after5s": "5 s tras leerse", + "msg.after15s": "15 s tras leerse", + "msg.after30s": "30 s tras leerse", + "msg.after1m": "1 min tras leerse", + "msg.sec30": "30 segundos", + "msg.min5": "5 minutos", + "msg.hour1": "1 hora", + "desktop.shareDesc": "Env\xEDa el c\xF3digo a tu par. Es de un solo uso y caduca pronto.", + "desktop.invitationCreated": "Invitaci\xF3n segura creada: env\xEDasela a tu par.", + "desktop.joinDesc": "Pega el c\xF3digo de invitaci\xF3n de tu par para construir tu respuesta segura.", + "desktop.offerTag": "invitaci\xF3n \xB7 copiar texto", + "desktop.answerTag": "respuesta \xB7 copiar texto", + "desktop.offerPlaceholder": "El c\xF3digo de invitaci\xF3n aparecer\xE1 aqu\xED\u2026", + "desktop.answerPlaceholder": "El c\xF3digo de respuesta aparecer\xE1 aqu\xED\u2026", + "desktop.backToChats": "Volver a los chats", + "desktop.sendFeedback": "Enviar comentarios", + "desktop.callsNeedVerified": "Las llamadas requieren un canal seguro verificado.", + "desktop.noOpenChannel": "No hay ning\xFAn canal seguro abierto.", + "desktop.chatCarriesCall": "Este chat est\xE1 transportando una llamada de grupo. Sal de la llamada de grupo antes de iniciar una llamada 1:1.", + "desktop.err.permission_denied": "La llamada no pudo iniciarse: el acceso al micr\xF3fono y la c\xE1mara est\xE1 bloqueado. Perm\xEDtelo en los ajustes del sistema e int\xE9ntalo de nuevo.", + "desktop.language": "Idioma", + "desktop.languageHint": "Se aplica al instante. Los mensajes ya enviados conservan sus palabras.", + "desktop.compareCode": "Compara el c\xF3digo de verificaci\xF3n con tu par y conf\xEDrmalo si coincide.", + "desktop.verifyBeforeFiles": "Completa la verificaci\xF3n antes de enviar archivos.", + "desktop.verifyBeforeSending": "Completa la verificaci\xF3n antes de enviar mensajes.", + "desktop.disconnectedByBackend": "Conexi\xF3n cerrada de forma segura.", + "desktop.restoreFailed": "No se pudo restablecer la conexi\xF3n. Cerrando este chat.", + "desktop.channelNotReady": "El canal de datos a\xFAn no est\xE1 disponible. Espera a que se establezca la conexi\xF3n.", + "desktop.enterCode": "Introduce el c\xF3digo de verificaci\xF3n para confirmar.", + "desktop.noOffer": "No se encontr\xF3 ninguna invitaci\xF3n. Crea una primero.", + "desktop.notInitiator": "No creaste esta conexi\xF3n, as\xED que no hay ninguna respuesta que aplicar.", + "desktop.decryptFailed": "No se pudo descifrar un mensaje y se descart\xF3.", + "desktop.badMessageFormat": "Lleg\xF3 una trama con formato incorrecto y se descart\xF3.", + "desktop.notSentNotReady": "Mensaje no enviado: el canal seguro no est\xE1 listo. Espera a que termine la verificaci\xF3n o vuelve a conectarte.", + "desktop.micDenied": "Se deneg\xF3 el acceso al micr\xF3fono.", + "desktop.noChannelWait": "No hay canal seguro abierto: espera a que se establezca la conexi\xF3n.", + "desktop.sasFailed": "La verificaci\xF3n fall\xF3. Puede haber alguien en medio, as\xED que se abort\xF3 la conexi\xF3n.", + "desktop.sasOk": "Verificaci\xF3n correcta. Este canal est\xE1 autenticado de extremo a extremo.", + "desktop.iceForgotten": "Servidores guardados olvidados. Se usar\xE1n servidores ICE p\xFAblicos.", + "desktop.icePublic": "Se usar\xE1n servidores ICE p\xFAblicos.", + "desktop.verificationInProgress": "La verificaci\xF3n de seguridad sigue en curso. Espera a que termine.", + "desktop.fileGone": "Este archivo ya no est\xE1 disponible para descargar.", + "desktop.codeMismatch": "Los c\xF3digos de verificaci\xF3n no coinciden. Desconectando por seguridad.", + "desktop.noLocalCode": "Verificaci\xF3n fallida: no hay c\xF3digo derivado localmente con el que comparar. Desconectando por seguridad.", + "desktop.protocolViolation": "El par afirm\xF3 que el c\xF3digo estaba confirmado antes de que t\xFA lo confirmaras. Desconectando por seguridad.", + "desktop.verificationRejected": "Verificaci\xF3n rechazada. La conexi\xF3n se abort\xF3 por seguridad.", + "secLevel.HIGH": "ALTO", + "secLevel.MEDIUM": "MEDIO", + "secLevel.LOW": "BAJO", + "desktop.rerun": "Volver a ejecutar", + "desktop.ice.customDesc": "Hasta {max} servidores, una URL por l\xEDnea o JSON.", + "desktop.ice.persistDesc": "Guardado localmente en este dispositivo. D\xE9jalo desactivado para usarlo solo en esta sesi\xF3n.", + "desktop.group.leaveNote": "Se avisa a los dem\xE1s miembros de que te has ido. Despu\xE9s no queda nada de este grupo en este dispositivo: ning\xFAn servidor guarda una copia desde la que volver, as\xED que necesitar\xEDas una invitaci\xF3n nueva.", + "desktop.sec.ecdsaOk": "Firma del paquete de claves del par verificada durante el saludo (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "No hay un saludo completado", + "desktop.sec.ecdhOk": "Claves de sesi\xF3n derivadas de un intercambio ECDH P-384 ef\xEDmero mediante HKDF-SHA-256", + "desktop.sec.ecdhNone": "No se derivaron claves de sesi\xF3n", + "desktop.sec.encryptionOk": "Cifrado y descifrado AES-GCM verificados en el n\xFAcleo", + "desktop.sec.encryptionNa": "No se pudo ejecutar la autocomprobaci\xF3n de AES-GCM", + "desktop.sec.integrityOk": "Integridad de los mensajes verificada (autenticaci\xF3n AES-GCM)", + "desktop.sec.integrityNa": "No se pudo ejecutar la autocomprobaci\xF3n de integridad", + "desktop.sec.pfsOk": "Double Ratchet activo: cada mensaje tiene su propia clave", + "desktop.sec.pfsNa": "No medido", + "desktop.sec.replayOk": "Las claves de mensaje del ratchet se destruyen al usarse, as\xED que una trama capturada no puede reproducirse", + "desktop.sec.replayNa": "No medido", + "desktop.sec.dtlsPinned": "Huella DTLS del par fijada: {fp}", + "desktop.sec.dtlsNone": "No hay huella DTLS remota disponible", + "desktop.sec.sasBoth": "Ambos pares confirmaron el c\xF3digo de seguridad fuera de banda", + "desktop.sec.sasIncomplete": "El c\xF3digo de seguridad no ha sido confirmado por ambos pares", + "desktop.sec.metadataOk": "Se deriv\xF3 una clave de metadatos dedicada (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "Sin clave de metadatos", + "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" }, "uk": { "language.label": "\u041C\u043E\u0432\u0430", @@ -8279,7 +8579,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u0433\u043E\u0432\u043E\u0440\u0438\u0442\u044C", "groupCall.pin": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u0438 {name} \u0432\u0435\u043B\u0438\u043A\u0438\u043C", "groupCall.unpin": "\u041F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438\u0441\u044F \u0434\u043E \u0432\u0441\u0456\u0445", - "groupCall.showEveryone": "\u0423\u0441\u0456" + "groupCall.showEveryone": "\u0423\u0441\u0456", + "msg.after5s": "5 \u0441 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F", + "msg.after15s": "15 \u0441 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F", + "msg.after30s": "30 \u0441 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F", + "msg.after1m": "1 \u0445\u0432 \u043F\u0456\u0441\u043B\u044F \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u043D\u043D\u044F", + "msg.sec30": "30 \u0441\u0435\u043A\u0443\u043D\u0434", + "msg.min5": "5 \u0445\u0432\u0438\u043B\u0438\u043D", + "msg.hour1": "1 \u0433\u043E\u0434\u0438\u043D\u0430", + "desktop.shareDesc": "\u041D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u043A\u043E\u0434 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443. \u0412\u0456\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0438\u0439 \u0456 \u0448\u0432\u0438\u0434\u043A\u043E \u0432\u0442\u0440\u0430\u0447\u0430\u0454 \u0447\u0438\u043D\u043D\u0456\u0441\u0442\u044C.", + "desktop.invitationCreated": "\u0417\u0430\u0445\u0438\u0449\u0435\u043D\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u0442\u0432\u043E\u0440\u0435\u043D\u043E - \u043D\u0430\u0434\u0456\u0448\u043B\u0456\u0442\u044C \u0439\u043E\u0433\u043E \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0443.", + "desktop.joinDesc": "\u0412\u0441\u0442\u0430\u0432\u0442\u0435 \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430, \u0449\u043E\u0431 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0443 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C.", + "desktop.offerTag": "\u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \xB7 \u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0442\u0435\u043A\u0441\u0442", + "desktop.answerTag": "\u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \xB7 \u043A\u043E\u043F\u0456\u044E\u0432\u0430\u0442\u0438 \u0442\u0435\u043A\u0441\u0442", + "desktop.offerPlaceholder": "\u0422\u0443\u0442 \u0437\u2019\u044F\u0432\u0438\u0442\u044C\u0441\u044F \u043A\u043E\u0434 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F\u2026", + "desktop.answerPlaceholder": "\u0422\u0443\u0442 \u0437\u2019\u044F\u0432\u0438\u0442\u044C\u0441\u044F \u043A\u043E\u0434 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u0456\u2026", + "desktop.backToChats": "\u041D\u0430\u0437\u0430\u0434 \u0434\u043E \u0447\u0430\u0442\u0456\u0432", + "desktop.sendFeedback": "\u041D\u0430\u0434\u0456\u0441\u043B\u0430\u0442\u0438 \u0432\u0456\u0434\u0433\u0443\u043A", + "desktop.callsNeedVerified": "\u0414\u0437\u0432\u0456\u043D\u043A\u0438 \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E\u0433\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0443.", + "desktop.noOpenChannel": "\u041D\u0435\u043C\u0430\u0454 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E\u0433\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0443.", + "desktop.chatCarriesCall": "\u0426\u0435\u0439 \u0447\u0430\u0442 \u043D\u0435\u0441\u0435 \u0433\u0440\u0443\u043F\u043E\u0432\u0438\u0439 \u0434\u0437\u0432\u0456\u043D\u043E\u043A. \u0412\u0438\u0439\u0434\u0456\u0442\u044C \u0456\u0437 \u0433\u0440\u0443\u043F\u043E\u0432\u043E\u0433\u043E \u0434\u0437\u0432\u0456\u043D\u043A\u0430, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u0442\u0435\u043B\u0435\u0444\u043E\u043D\u0443\u0432\u0430\u0442\u0438 \u043E\u0434\u0438\u043D \u043D\u0430 \u043E\u0434\u0438\u043D.", + "desktop.err.permission_denied": "\u0414\u0437\u0432\u0456\u043D\u043E\u043A \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u043F\u043E\u0447\u0430\u0442\u0438 - \u0434\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D\u0430 \u0439 \u043A\u0430\u043C\u0435\u0440\u0438 \u0437\u0430\u0431\u043B\u043E\u043A\u043E\u0432\u0430\u043D\u043E. \u0414\u043E\u0437\u0432\u043E\u043B\u044C\u0442\u0435 \u0439\u043E\u0433\u043E \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0438\u0445 \u043D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F\u0445 \u0456 \u0441\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0449\u0435 \u0440\u0430\u0437.", + "desktop.language": "\u041C\u043E\u0432\u0430", + "desktop.languageHint": "\u0417\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0454\u0442\u044C\u0441\u044F \u043E\u0434\u0440\u0430\u0437\u0443. \u0423\u0436\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043B\u0438\u0448\u0430\u044E\u0442\u044C\u0441\u044F \u0442\u0456\u0454\u044E \u043C\u043E\u0432\u043E\u044E, \u044F\u043A\u043E\u044E \u0457\u0445 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438.", + "desktop.compareCode": "\u041F\u043E\u0440\u0456\u0432\u043D\u044F\u0439\u0442\u0435 \u043A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u0437\u0456 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u043E\u043C \u0456 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u044C\u0442\u0435, \u044F\u043A\u0449\u043E \u0432\u0456\u043D \u0437\u0431\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F.", + "desktop.verifyBeforeFiles": "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u0444\u0430\u0439\u043B\u0438.", + "desktop.verifyBeforeSending": "\u0417\u0430\u0432\u0435\u0440\u0448\u0456\u0442\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443, \u043F\u0435\u0440\u0448 \u043D\u0456\u0436 \u043D\u0430\u0434\u0441\u0438\u043B\u0430\u0442\u0438 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F.", + "desktop.disconnectedByBackend": "\u0417\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0431\u0435\u0437\u043F\u0435\u0447\u043D\u043E \u0440\u043E\u0437\u0456\u0440\u0432\u0430\u043D\u043E.", + "desktop.restoreFailed": "\u041D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0432\u0456\u0434\u043D\u043E\u0432\u0438\u0442\u0438 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F. \u0426\u0435\u0439 \u0447\u0430\u0442 \u0431\u0443\u0434\u0435 \u0437\u0430\u043A\u0440\u0438\u0442\u043E.", + "desktop.channelNotReady": "\u041A\u0430\u043D\u0430\u043B \u0434\u0430\u043D\u0438\u0445 \u0449\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439. \u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435, \u0434\u043E\u043A\u0438 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C\u0441\u044F.", + "desktop.enterCode": "\u0412\u0432\u0435\u0434\u0456\u0442\u044C \u043A\u043E\u0434 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F.", + "desktop.noOffer": "\u0417\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E. \u0421\u043F\u0435\u0440\u0448\u0443 \u0441\u0442\u0432\u043E\u0440\u0456\u0442\u044C \u0439\u043E\u0433\u043E.", + "desktop.notInitiator": "\u0412\u0438 \u043D\u0435 \u0441\u0442\u0432\u043E\u0440\u044E\u0432\u0430\u043B\u0438 \u0446\u0435 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F, \u0442\u043E\u0436 \u0437\u0430\u0441\u0442\u043E\u0441\u043E\u0432\u0443\u0432\u0430\u0442\u0438 \u0432\u0456\u0434\u043F\u043E\u0432\u0456\u0434\u044C \u043D\u0456\u0447\u043E\u043C\u0443.", + "desktop.decryptFailed": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F \u0440\u043E\u0437\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u0442\u0438, \u0439\u043E\u0433\u043E \u0432\u0456\u0434\u043A\u0438\u043D\u0443\u0442\u043E.", + "desktop.badMessageFormat": "\u041D\u0430\u0434\u0456\u0439\u0448\u043E\u0432 \u043F\u043E\u0448\u043A\u043E\u0434\u0436\u0435\u043D\u0438\u0439 \u043A\u0430\u0434\u0440, \u0439\u043E\u0433\u043E \u0432\u0456\u0434\u043A\u0438\u043D\u0443\u0442\u043E.", + "desktop.notSentNotReady": "\u041F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043D\u0435 \u043D\u0430\u0434\u0456\u0441\u043B\u0430\u043D\u043E: \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u0438\u0439 \u043A\u0430\u043D\u0430\u043B \u043D\u0435 \u0433\u043E\u0442\u043E\u0432\u0438\u0439. \u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0438 \u0430\u0431\u043E \u043F\u0435\u0440\u0435\u043F\u0456\u0434\u043A\u043B\u044E\u0447\u0456\u0442\u044C\u0441\u044F.", + "desktop.micDenied": "\u0414\u043E\u0441\u0442\u0443\u043F \u0434\u043E \u043C\u0456\u043A\u0440\u043E\u0444\u043E\u043D\u0430 \u0432\u0456\u0434\u0445\u0438\u043B\u0435\u043D\u043E.", + "desktop.noChannelWait": "\u041D\u0435\u043C\u0430\u0454 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u043E\u0433\u043E \u0437\u0430\u0445\u0438\u0449\u0435\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0443 - \u0437\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435, \u0434\u043E\u043A\u0438 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u0432\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C\u0441\u044F.", + "desktop.sasFailed": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u043E. \u041C\u043E\u0436\u043B\u0438\u0432\u0430 \u043F\u0440\u0438\u0441\u0443\u0442\u043D\u0456\u0441\u0442\u044C \u043F\u043E\u0441\u0435\u0440\u0435\u0434\u043D\u0438\u043A\u0430, \u0442\u043E\u0436 \u0437\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0440\u0432\u0430\u043D\u043E.", + "desktop.sasOk": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u043E. \u0426\u0435\u0439 \u043A\u0430\u043D\u0430\u043B \u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u043E\u0432\u0430\u043D\u043E \u043D\u0430\u0441\u043A\u0440\u0456\u0437\u043D\u043E.", + "desktop.iceForgotten": "\u0417\u0431\u0435\u0440\u0435\u0436\u0435\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 \u0437\u0430\u0431\u0443\u0442\u043E. \u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 ICE.", + "desktop.icePublic": "\u0412\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u043E\u0432\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0443\u0431\u043B\u0456\u0447\u043D\u0456 \u0441\u0435\u0440\u0432\u0435\u0440\u0438 ICE.", + "desktop.verificationInProgress": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u0449\u0435 \u0442\u0440\u0438\u0432\u0430\u0454. \u0417\u0430\u0447\u0435\u043A\u0430\u0439\u0442\u0435 \u043D\u0430 \u0457\u0457 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043D\u044F.", + "desktop.fileGone": "\u0426\u0435\u0439 \u0444\u0430\u0439\u043B \u0431\u0456\u043B\u044C\u0448\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438\u0439 \u0434\u043B\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F.", + "desktop.codeMismatch": "\u041A\u043E\u0434\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043D\u0435 \u0437\u0431\u0456\u0433\u0430\u044E\u0442\u044C\u0441\u044F. \u0420\u043E\u0437\u2019\u0454\u0434\u043D\u0443\u0454\u043C\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.", + "desktop.noLocalCode": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0430 \u043D\u0435 \u0432\u0434\u0430\u043B\u0430\u0441\u044F: \u043D\u0435\u043C\u0430\u0454 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u043E\u0431\u0447\u0438\u0441\u043B\u0435\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0443 \u0434\u043B\u044F \u043F\u043E\u0440\u0456\u0432\u043D\u044F\u043D\u043D\u044F. \u0420\u043E\u0437\u2019\u0454\u0434\u043D\u0443\u0454\u043C\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.", + "desktop.protocolViolation": "\u0421\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A \u0437\u0430\u044F\u0432\u0438\u0432 \u043F\u0440\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0436\u0435\u043D\u043D\u044F \u043A\u043E\u0434\u0443 \u0440\u0430\u043D\u0456\u0448\u0435, \u043D\u0456\u0436 \u0432\u0438 \u0439\u043E\u0433\u043E \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438. \u0420\u043E\u0437\u2019\u0454\u0434\u043D\u0443\u0454\u043C\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.", + "desktop.verificationRejected": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u0432\u0456\u0434\u0445\u0438\u043B\u0435\u043D\u043E. \u0417\u2019\u0454\u0434\u043D\u0430\u043D\u043D\u044F \u043F\u0435\u0440\u0435\u0440\u0432\u0430\u043D\u043E \u0437\u0430\u0434\u043B\u044F \u0431\u0435\u0437\u043F\u0435\u043A\u0438.", + "secLevel.HIGH": "\u0412\u0418\u0421\u041E\u041A\u0418\u0419", + "secLevel.MEDIUM": "\u0421\u0415\u0420\u0415\u0414\u041D\u0406\u0419", + "secLevel.LOW": "\u041D\u0418\u0417\u042C\u041A\u0418\u0419", + "desktop.rerun": "\u041F\u0435\u0440\u0435\u0432\u0456\u0440\u0438\u0442\u0438 \u0437\u043D\u043E\u0432\u0443", + "desktop.ice.customDesc": "\u0414\u043E {max} \u0441\u0435\u0440\u0432\u0435\u0440\u0456\u0432, \u043F\u043E \u043E\u0434\u043D\u0456\u0439 URL-\u0430\u0434\u0440\u0435\u0441\u0456 \u043D\u0430 \u0440\u044F\u0434\u043E\u043A \u0430\u0431\u043E JSON.", + "desktop.ice.persistDesc": "\u0417\u0431\u0435\u0440\u0456\u0433\u0430\u0454\u0442\u044C\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457. \u041B\u0438\u0448\u0456\u0442\u044C \u0432\u0438\u043C\u043A\u043D\u0435\u043D\u0438\u043C, \u0449\u043E\u0431 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u0442\u0438 \u043B\u0438\u0448\u0435 \u0432 \u0446\u044C\u043E\u043C\u0443 \u0441\u0435\u0430\u043D\u0441\u0456.", + "desktop.group.leaveNote": "\u0406\u043D\u0448\u0456 \u0443\u0447\u0430\u0441\u043D\u0438\u043A\u0438 \u0434\u0456\u0437\u043D\u0430\u044E\u0442\u044C\u0441\u044F, \u0449\u043E \u0432\u0438 \u0432\u0438\u0439\u0448\u043B\u0438. \u041F\u0456\u0441\u043B\u044F \u0446\u044C\u043E\u0433\u043E \u043D\u0430 \u0446\u044C\u043E\u043C\u0443 \u043F\u0440\u0438\u0441\u0442\u0440\u043E\u0457 \u043D\u0435 \u043B\u0438\u0448\u0430\u0454\u0442\u044C\u0441\u044F \u043D\u0456\u0447\u043E\u0433\u043E \u043F\u0440\u043E \u0446\u044E \u0433\u0440\u0443\u043F\u0443 - \u0436\u043E\u0434\u0435\u043D \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0442\u0440\u0438\u043C\u0430\u0454 \u043A\u043E\u043F\u0456\u0457, \u0437 \u044F\u043A\u043E\u0457 \u043C\u043E\u0436\u043D\u0430 \u043F\u043E\u0432\u0435\u0440\u043D\u0443\u0442\u0438\u0441\u044F, \u0442\u043E\u0436 \u0437\u043D\u0430\u0434\u043E\u0431\u0438\u0442\u044C\u0441\u044F \u043D\u043E\u0432\u0435 \u0437\u0430\u043F\u0440\u043E\u0448\u0435\u043D\u043D\u044F.", + "desktop.sec.ecdsaOk": "\u041F\u0456\u0434\u043F\u0438\u0441 \u043F\u0430\u043A\u0435\u0442\u0430 \u043A\u043B\u044E\u0447\u0456\u0432 \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u043F\u0456\u0434 \u0447\u0430\u0441 \u0440\u0443\u043A\u043E\u0441\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u0420\u0443\u043A\u043E\u0441\u0442\u0438\u0441\u043A\u0430\u043D\u043D\u044F \u043D\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E", + "desktop.sec.ecdhOk": "\u041A\u043B\u044E\u0447\u0456 \u0441\u0435\u0430\u043D\u0441\u0443 \u0432\u0438\u0432\u0435\u0434\u0435\u043D\u043E \u0437 \u0442\u0438\u043C\u0447\u0430\u0441\u043E\u0432\u043E\u0433\u043E \u043E\u0431\u043C\u0456\u043D\u0443 ECDH P-384 \u0447\u0435\u0440\u0435\u0437 HKDF-SHA-256", + "desktop.sec.ecdhNone": "\u041A\u043B\u044E\u0447\u0456 \u0441\u0435\u0430\u043D\u0441\u0443 \u043D\u0435 \u0432\u0438\u0432\u0435\u0434\u0435\u043D\u043E", + "desktop.sec.encryptionOk": "\u0428\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F \u0439 \u0440\u043E\u0437\u0448\u0438\u0444\u0440\u0443\u0432\u0430\u043D\u043D\u044F AES-GCM \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E \u0432 \u044F\u0434\u0440\u0456", + "desktop.sec.encryptionNa": "\u0421\u0430\u043C\u043E\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 AES-GCM \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F", + "desktop.sec.integrityOk": "\u0426\u0456\u043B\u0456\u0441\u043D\u0456\u0441\u0442\u044C \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C \u043F\u0435\u0440\u0435\u0432\u0456\u0440\u0435\u043D\u043E (\u0430\u0432\u0442\u0435\u043D\u0442\u0438\u0444\u0456\u043A\u0430\u0446\u0456\u044F AES-GCM)", + "desktop.sec.integrityNa": "\u0421\u0430\u043C\u043E\u043F\u0435\u0440\u0435\u0432\u0456\u0440\u043A\u0443 \u0446\u0456\u043B\u0456\u0441\u043D\u043E\u0441\u0442\u0456 \u0432\u0438\u043A\u043E\u043D\u0430\u0442\u0438 \u043D\u0435 \u0432\u0434\u0430\u043B\u043E\u0441\u044F", + "desktop.sec.pfsOk": "Double Ratchet \u0430\u043A\u0442\u0438\u0432\u043D\u0438\u0439 - \u043A\u043E\u0436\u043D\u0435 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u043D\u044F \u043C\u0430\u0454 \u0432\u043B\u0430\u0441\u043D\u0438\u0439 \u043A\u043B\u044E\u0447", + "desktop.sec.pfsNa": "\u041D\u0435 \u0432\u0438\u043C\u0456\u0440\u044F\u043D\u043E", + "desktop.sec.replayOk": "\u041A\u043B\u044E\u0447\u0456 \u043F\u043E\u0432\u0456\u0434\u043E\u043C\u043B\u0435\u043D\u044C \u0440\u0430\u0442\u0447\u0435\u0442\u0430 \u0437\u043D\u0438\u0449\u0443\u044E\u0442\u044C\u0441\u044F \u043F\u0456\u0441\u043B\u044F \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043D\u044F, \u0442\u043E\u0436 \u043F\u0435\u0440\u0435\u0445\u043E\u043F\u043B\u0435\u043D\u0438\u0439 \u043A\u0430\u0434\u0440 \u043D\u0435 \u043C\u043E\u0436\u043D\u0430 \u0432\u0456\u0434\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E", + "desktop.sec.replayNa": "\u041D\u0435 \u0432\u0438\u043C\u0456\u0440\u044F\u043D\u043E", + "desktop.sec.dtlsPinned": "\u0412\u0456\u0434\u0431\u0438\u0442\u043E\u043A DTLS \u0441\u043F\u0456\u0432\u0440\u043E\u0437\u043C\u043E\u0432\u043D\u0438\u043A\u0430 \u0437\u0430\u043A\u0440\u0456\u043F\u043B\u0435\u043D\u043E: {fp}", + "desktop.sec.dtlsNone": "\u0412\u0456\u0434\u0431\u0438\u0442\u043A\u0430 DTLS \u0432\u0456\u0434\u0434\u0430\u043B\u0435\u043D\u043E\u0457 \u0441\u0442\u043E\u0440\u043E\u043D\u0438 \u043D\u0435\u043C\u0430\u0454", + "desktop.sec.sasBoth": "\u041E\u0431\u0438\u0434\u0432\u0456 \u0441\u0442\u043E\u0440\u043E\u043D\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u043F\u043E\u0437\u0430 \u043A\u0430\u043D\u0430\u043B\u043E\u043C", + "desktop.sec.sasIncomplete": "\u041A\u043E\u0434 \u0431\u0435\u0437\u043F\u0435\u043A\u0438 \u043F\u0456\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043D\u0435 \u043E\u0431\u0438\u0434\u0432\u0456 \u0441\u0442\u043E\u0440\u043E\u043D\u0438", + "desktop.sec.metadataOk": "\u0412\u0438\u0432\u0435\u0434\u0435\u043D\u043E \u043E\u043A\u0440\u0435\u043C\u0438\u0439 \u043A\u043B\u044E\u0447 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445 (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u041A\u043B\u044E\u0447\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u0438\u0445 \u043D\u0435\u043C\u0430\u0454", + "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" }, "ru": { "language.label": "\u042F\u0437\u044B\u043A", @@ -9053,7 +9428,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u0433\u043E\u0432\u043E\u0440\u0438\u0442", "groupCall.pin": "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C {name} \u043A\u0440\u0443\u043F\u043D\u043E", "groupCall.unpin": "\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A\u043E \u0432\u0441\u0435\u043C", - "groupCall.showEveryone": "\u0412\u0441\u0435" + "groupCall.showEveryone": "\u0412\u0441\u0435", + "msg.after5s": "5 \u0441 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F", + "msg.after15s": "15 \u0441 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F", + "msg.after30s": "30 \u0441 \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F", + "msg.after1m": "1 \u043C\u0438\u043D \u043F\u043E\u0441\u043B\u0435 \u043F\u0440\u043E\u0447\u0442\u0435\u043D\u0438\u044F", + "msg.sec30": "30 \u0441\u0435\u043A\u0443\u043D\u0434", + "msg.min5": "5 \u043C\u0438\u043D\u0443\u0442", + "msg.hour1": "1 \u0447\u0430\u0441", + "desktop.shareDesc": "\u041E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443. \u041E\u043D \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u044B\u0439 \u0438 \u0441\u043A\u043E\u0440\u043E \u0438\u0441\u0442\u0435\u0447\u0451\u0442.", + "desktop.invitationCreated": "\u0417\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u043E - \u043E\u0442\u043F\u0440\u0430\u0432\u044C\u0442\u0435 \u0435\u0433\u043E \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0443.", + "desktop.joinDesc": "\u0412\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043E\u0442\u0432\u0435\u0442.", + "desktop.offerTag": "\u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \xB7 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442", + "desktop.answerTag": "\u043E\u0442\u0432\u0435\u0442 \xB7 \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0441\u0442", + "desktop.offerPlaceholder": "\u0417\u0434\u0435\u0441\u044C \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u043A\u043E\u0434 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u044F\u2026", + "desktop.answerPlaceholder": "\u0417\u0434\u0435\u0441\u044C \u043F\u043E\u044F\u0432\u0438\u0442\u0441\u044F \u043A\u043E\u0434 \u043E\u0442\u0432\u0435\u0442\u0430\u2026", + "desktop.backToChats": "\u041D\u0430\u0437\u0430\u0434 \u043A \u0447\u0430\u0442\u0430\u043C", + "desktop.sendFeedback": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C \u043E\u0442\u0437\u044B\u0432", + "desktop.callsNeedVerified": "\u0414\u043B\u044F \u0437\u0432\u043E\u043D\u043A\u043E\u0432 \u043D\u0443\u0436\u0435\u043D \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043D\u043D\u044B\u0439 \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B.", + "desktop.noOpenChannel": "\u041D\u0435\u0442 \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0433\u043E \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0430.", + "desktop.chatCarriesCall": "\u0427\u0435\u0440\u0435\u0437 \u044D\u0442\u043E\u0442 \u0447\u0430\u0442 \u0438\u0434\u0451\u0442 \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0439 \u0437\u0432\u043E\u043D\u043E\u043A. \u0412\u044B\u0439\u0434\u0438\u0442\u0435 \u0438\u0437 \u0433\u0440\u0443\u043F\u043F\u043E\u0432\u043E\u0433\u043E \u0437\u0432\u043E\u043D\u043A\u0430, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u0437\u0432\u043E\u043D\u0438\u0442\u044C \u043E\u0434\u0438\u043D \u043D\u0430 \u043E\u0434\u0438\u043D.", + "desktop.err.permission_denied": "\u0417\u0432\u043E\u043D\u043E\u043A \u043D\u0435 \u043D\u0430\u0447\u0430\u043B\u0441\u044F - \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443 \u0438 \u043A\u0430\u043C\u0435\u0440\u0435 \u0437\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D. \u0420\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u0435 \u0435\u0433\u043E \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u044B\u0445 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445 \u0438 \u043F\u043E\u043F\u0440\u043E\u0431\u0443\u0439\u0442\u0435 \u0441\u043D\u043E\u0432\u0430.", + "desktop.language": "\u042F\u0437\u044B\u043A", + "desktop.languageHint": "\u041F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442\u0441\u044F \u0441\u0440\u0430\u0437\u0443. \u0423\u0436\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043D\u044B\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043E\u0441\u0442\u0430\u044E\u0442\u0441\u044F \u043D\u0430 \u0442\u043E\u043C \u044F\u0437\u044B\u043A\u0435, \u043D\u0430 \u043A\u043E\u0442\u043E\u0440\u043E\u043C \u0438\u0445 \u043D\u0430\u043F\u0438\u0441\u0430\u043B\u0438.", + "desktop.compareCode": "\u0421\u0432\u0435\u0440\u044C\u0442\u0435 \u043A\u043E\u0434 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0441 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u043E\u043C \u0438 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0435\u0441\u043B\u0438 \u043E\u043D \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u0435\u0442.", + "desktop.verifyBeforeFiles": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0444\u0430\u0439\u043B\u044B.", + "desktop.verifyBeforeSending": "\u0417\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0435 \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443, \u043F\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043C \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F.", + "desktop.disconnectedByBackend": "\u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u0440\u0430\u0437\u043E\u0440\u0432\u0430\u043D\u043E.", + "desktop.restoreFailed": "\u041D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0432\u043E\u0441\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435. \u042D\u0442\u043E\u0442 \u0447\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043A\u0440\u044B\u0442.", + "desktop.channelNotReady": "\u041A\u0430\u043D\u0430\u043B \u0434\u0430\u043D\u043D\u044B\u0445 \u0435\u0449\u0451 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D. \u0414\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F.", + "desktop.enterCode": "\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043A\u043E\u0434 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F.", + "desktop.noOffer": "\u041F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u043E. \u0421\u043D\u0430\u0447\u0430\u043B\u0430 \u0441\u043E\u0437\u0434\u0430\u0439\u0442\u0435 \u0435\u0433\u043E.", + "desktop.notInitiator": "\u0412\u044B \u043D\u0435 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u043B\u0438 \u044D\u0442\u043E \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0442\u044C \u043E\u0442\u0432\u0435\u0442 \u043D\u0435 \u043A \u0447\u0435\u043C\u0443.", + "desktop.decryptFailed": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u0442\u044C, \u043E\u043D\u043E \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D\u043E.", + "desktop.badMessageFormat": "\u041F\u0440\u0438\u0448\u0451\u043B \u043F\u043E\u0432\u0440\u0435\u0436\u0434\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u0434\u0440, \u043E\u043D \u043E\u0442\u0431\u0440\u043E\u0448\u0435\u043D.", + "desktop.notSentNotReady": "\u0421\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0435 \u043D\u0435 \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E: \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u044B\u0439 \u043A\u0430\u043D\u0430\u043B \u043D\u0435 \u0433\u043E\u0442\u043E\u0432. \u0414\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u043F\u043E\u0434\u043A\u043B\u044E\u0447\u0438\u0442\u0435\u0441\u044C.", + "desktop.micDenied": "\u0414\u043E\u0441\u0442\u0443\u043F \u043A \u043C\u0438\u043A\u0440\u043E\u0444\u043E\u043D\u0443 \u043E\u0442\u043A\u043B\u043E\u043D\u0451\u043D.", + "desktop.noChannelWait": "\u041D\u0435\u0442 \u043E\u0442\u043A\u0440\u044B\u0442\u043E\u0433\u043E \u0437\u0430\u0449\u0438\u0449\u0451\u043D\u043D\u043E\u0433\u043E \u043A\u0430\u043D\u0430\u043B\u0430 - \u0434\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F.", + "desktop.sasFailed": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430. \u0412\u043E\u0437\u043C\u043E\u0436\u0435\u043D \u043F\u043E\u0441\u0440\u0435\u0434\u043D\u0438\u043A, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0440\u0432\u0430\u043D\u043E.", + "desktop.sasOk": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043F\u0440\u043E\u0439\u0434\u0435\u043D\u0430. \u042D\u0442\u043E\u0442 \u043A\u0430\u043D\u0430\u043B \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u043E\u0432\u0430\u043D \u0441\u043A\u0432\u043E\u0437\u043D\u044B\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C.", + "desktop.iceForgotten": "\u0421\u043E\u0445\u0440\u0430\u043D\u0451\u043D\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B \u0437\u0430\u0431\u044B\u0442\u044B. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B ICE.", + "desktop.icePublic": "\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u044B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044B ICE.", + "desktop.verificationInProgress": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0435\u0449\u0451 \u0438\u0434\u0451\u0442. \u0414\u043E\u0436\u0434\u0438\u0442\u0435\u0441\u044C \u0435\u0451 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u044F.", + "desktop.fileGone": "\u042D\u0442\u043E\u0442 \u0444\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438.", + "desktop.codeMismatch": "\u041A\u043E\u0434\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u043D\u0435 \u0441\u043E\u0432\u043F\u0430\u0434\u0430\u044E\u0442. \u041E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.", + "desktop.noLocalCode": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043D\u0435 \u0443\u0434\u0430\u043B\u0430\u0441\u044C: \u043D\u0435\u0442 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u0432\u044B\u0447\u0438\u0441\u043B\u0435\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0434\u043B\u044F \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F. \u041E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.", + "desktop.protocolViolation": "\u0421\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A \u0437\u0430\u044F\u0432\u0438\u043B \u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u0438 \u043A\u043E\u0434\u0430 \u0440\u0430\u043D\u044C\u0448\u0435, \u0447\u0435\u043C \u0432\u044B \u0435\u0433\u043E \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438. \u041E\u0442\u043A\u043B\u044E\u0447\u0430\u0435\u043C\u0441\u044F \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.", + "desktop.verificationRejected": "\u041F\u0440\u043E\u0432\u0435\u0440\u043A\u0430 \u043E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0430. \u0421\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0435 \u043F\u0440\u0435\u0440\u0432\u0430\u043D\u043E \u0440\u0430\u0434\u0438 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438.", + "secLevel.HIGH": "\u0412\u042B\u0421\u041E\u041A\u0418\u0419", + "secLevel.MEDIUM": "\u0421\u0420\u0415\u0414\u041D\u0418\u0419", + "secLevel.LOW": "\u041D\u0418\u0417\u041A\u0418\u0419", + "desktop.rerun": "\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u044C \u0441\u043D\u043E\u0432\u0430", + "desktop.ice.customDesc": "\u0414\u043E {max} \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u0432, \u043F\u043E \u043E\u0434\u043D\u043E\u043C\u0443 URL \u0432 \u0441\u0442\u0440\u043E\u043A\u0435 \u0438\u043B\u0438 JSON.", + "desktop.ice.persistDesc": "\u0425\u0440\u0430\u043D\u0438\u0442\u0441\u044F \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E \u043D\u0430 \u044D\u0442\u043E\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435. \u041E\u0441\u0442\u0430\u0432\u044C\u0442\u0435 \u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D\u043D\u044B\u043C, \u0447\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C \u0442\u043E\u043B\u044C\u043A\u043E \u0432 \u044D\u0442\u043E\u043C \u0441\u0435\u0430\u043D\u0441\u0435.", + "desktop.group.leaveNote": "\u041E\u0441\u0442\u0430\u043B\u044C\u043D\u044B\u043C \u0443\u0447\u0430\u0441\u0442\u043D\u0438\u043A\u0430\u043C \u0441\u043E\u043E\u0431\u0449\u0430\u0442, \u0447\u0442\u043E \u0432\u044B \u0432\u044B\u0448\u043B\u0438. \u041F\u043E\u0441\u043B\u0435 \u044D\u0442\u043E\u0433\u043E \u043D\u0430 \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u0435 \u043D\u0435 \u043E\u0441\u0442\u0430\u0451\u0442\u0441\u044F \u043D\u0438\u0447\u0435\u0433\u043E \u043E\u0431 \u044D\u0442\u043E\u0439 \u0433\u0440\u0443\u043F\u043F\u0435 - \u043D\u0438 \u043E\u0434\u0438\u043D \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0445\u0440\u0430\u043D\u0438\u0442 \u043A\u043E\u043F\u0438\u044E, \u0447\u0442\u043E\u0431\u044B \u0432\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F, \u0442\u0430\u043A \u0447\u0442\u043E \u043F\u043E\u043D\u0430\u0434\u043E\u0431\u0438\u0442\u0441\u044F \u043D\u043E\u0432\u043E\u0435 \u043F\u0440\u0438\u0433\u043B\u0430\u0448\u0435\u043D\u0438\u0435.", + "desktop.sec.ecdsaOk": "\u041F\u043E\u0434\u043F\u0438\u0441\u044C \u043F\u0430\u043A\u0435\u0442\u0430 \u043A\u043B\u044E\u0447\u0435\u0439 \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u0430 \u043F\u0440\u0438 \u0440\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u0438 (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u0420\u0443\u043A\u043E\u043F\u043E\u0436\u0430\u0442\u0438\u0435 \u043D\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E", + "desktop.sec.ecdhOk": "\u041A\u043B\u044E\u0447\u0438 \u0441\u0435\u0430\u043D\u0441\u0430 \u0432\u044B\u0432\u0435\u0434\u0435\u043D\u044B \u0438\u0437 \u044D\u0444\u0435\u043C\u0435\u0440\u043D\u043E\u0433\u043E \u043E\u0431\u043C\u0435\u043D\u0430 ECDH P-384 \u0447\u0435\u0440\u0435\u0437 HKDF-SHA-256", + "desktop.sec.ecdhNone": "\u041A\u043B\u044E\u0447\u0438 \u0441\u0435\u0430\u043D\u0441\u0430 \u043D\u0435 \u0432\u044B\u0432\u0435\u0434\u0435\u043D\u044B", + "desktop.sec.encryptionOk": "\u0428\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0438 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043E\u0432\u0430\u043D\u0438\u0435 AES-GCM \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u044B \u0432 \u044F\u0434\u0440\u0435", + "desktop.sec.encryptionNa": "\u0421\u0430\u043C\u043E\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 AES-GCM \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C", + "desktop.sec.integrityOk": "\u0426\u0435\u043B\u043E\u0441\u0442\u043D\u043E\u0441\u0442\u044C \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D\u0430 (\u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F AES-GCM)", + "desktop.sec.integrityNa": "\u0421\u0430\u043C\u043E\u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0443 \u0446\u0435\u043B\u043E\u0441\u0442\u043D\u043E\u0441\u0442\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043D\u0435 \u0443\u0434\u0430\u043B\u043E\u0441\u044C", + "desktop.sec.pfsOk": "Double Ratchet \u0430\u043A\u0442\u0438\u0432\u0435\u043D - \u0443 \u043A\u0430\u0436\u0434\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u0441\u0432\u043E\u0439 \u043A\u043B\u044E\u0447", + "desktop.sec.pfsNa": "\u041D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u043E", + "desktop.sec.replayOk": "\u041A\u043B\u044E\u0447\u0438 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u0439 \u0440\u044D\u0442\u0447\u0435\u0442\u0430 \u0443\u043D\u0438\u0447\u0442\u043E\u0436\u0430\u044E\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F, \u043F\u043E\u044D\u0442\u043E\u043C\u0443 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0447\u0435\u043D\u043D\u044B\u0439 \u043A\u0430\u0434\u0440 \u043D\u0435\u043B\u044C\u0437\u044F \u0432\u043E\u0441\u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E", + "desktop.sec.replayNa": "\u041D\u0435 \u0438\u0437\u043C\u0435\u0440\u0435\u043D\u043E", + "desktop.sec.dtlsPinned": "\u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043E\u043A DTLS \u0441\u043E\u0431\u0435\u0441\u0435\u0434\u043D\u0438\u043A\u0430 \u0437\u0430\u043A\u0440\u0435\u043F\u043B\u0451\u043D: {fp}", + "desktop.sec.dtlsNone": "\u041E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430 DTLS \u0443\u0434\u0430\u043B\u0451\u043D\u043D\u043E\u0439 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043D\u0435\u0442", + "desktop.sec.sasBoth": "\u041E\u0431\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u0432\u043D\u0435 \u043A\u0430\u043D\u0430\u043B\u0430", + "desktop.sec.sasIncomplete": "\u041A\u043E\u0434 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043B\u0438 \u043D\u0435 \u043E\u0431\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u044B", + "desktop.sec.metadataOk": "\u0412\u044B\u0432\u0435\u0434\u0435\u043D \u043E\u0442\u0434\u0435\u043B\u044C\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445 (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u041A\u043B\u044E\u0447\u0430 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u0445 \u043D\u0435\u0442", + "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" }, "zh": { "language.label": "\u8BED\u8A00", @@ -9827,7 +10277,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u6B63\u5728\u8BB2\u8BDD", "groupCall.pin": "\u653E\u5927\u663E\u793A {name}", "groupCall.unpin": "\u8FD4\u56DE\u6240\u6709\u4EBA", - "groupCall.showEveryone": "\u6240\u6709\u4EBA" + "groupCall.showEveryone": "\u6240\u6709\u4EBA", + "msg.after5s": "\u9605\u540E 5 \u79D2", + "msg.after15s": "\u9605\u540E 15 \u79D2", + "msg.after30s": "\u9605\u540E 30 \u79D2", + "msg.after1m": "\u9605\u540E 1 \u5206\u949F", + "msg.sec30": "30 \u79D2", + "msg.min5": "5 \u5206\u949F", + "msg.hour1": "1 \u5C0F\u65F6", + "desktop.shareDesc": "\u628A\u4EE3\u7801\u53D1\u7ED9\u5BF9\u65B9\u3002\u5B83\u53EA\u80FD\u4F7F\u7528\u4E00\u6B21\uFF0C\u5E76\u4F1A\u5F88\u5FEB\u8FC7\u671F\u3002", + "desktop.invitationCreated": "\u5B89\u5168\u9080\u8BF7\u5DF2\u521B\u5EFA - \u53D1\u9001\u7ED9\u5BF9\u65B9\u3002", + "desktop.joinDesc": "\u7C98\u8D34\u5BF9\u65B9\u7684\u9080\u8BF7\u7801\uFF0C\u4EE5\u751F\u6210\u4F60\u7684\u5B89\u5168\u5E94\u7B54\u3002", + "desktop.offerTag": "\u9080\u8BF7 \xB7 \u590D\u5236\u6587\u672C", + "desktop.answerTag": "\u5E94\u7B54 \xB7 \u590D\u5236\u6587\u672C", + "desktop.offerPlaceholder": "\u9080\u8BF7\u7801\u5C06\u663E\u793A\u5728\u8FD9\u91CC\u2026", + "desktop.answerPlaceholder": "\u5E94\u7B54\u7801\u5C06\u663E\u793A\u5728\u8FD9\u91CC\u2026", + "desktop.backToChats": "\u8FD4\u56DE\u804A\u5929", + "desktop.sendFeedback": "\u53D1\u9001\u53CD\u9988", + "desktop.callsNeedVerified": "\u901A\u8BDD\u9700\u8981\u5DF2\u9A8C\u8BC1\u7684\u5B89\u5168\u901A\u9053\u3002", + "desktop.noOpenChannel": "\u6CA1\u6709\u5DF2\u6253\u5F00\u7684\u5B89\u5168\u901A\u9053\u3002", + "desktop.chatCarriesCall": "\u6B64\u804A\u5929\u6B63\u5728\u627F\u8F7D\u4E00\u573A\u7FA4\u7EC4\u901A\u8BDD\u3002\u8BF7\u5148\u79BB\u5F00\u7FA4\u7EC4\u901A\u8BDD\uFF0C\u518D\u53D1\u8D77\u4E00\u5BF9\u4E00\u901A\u8BDD\u3002", + "desktop.err.permission_denied": "\u901A\u8BDD\u65E0\u6CD5\u5F00\u59CB - \u9EA6\u514B\u98CE\u548C\u6444\u50CF\u5934\u6743\u9650\u88AB\u963B\u6B62\u3002\u8BF7\u5728\u7CFB\u7EDF\u8BBE\u7F6E\u4E2D\u5141\u8BB8\u540E\u91CD\u8BD5\u3002", + "desktop.language": "\u8BED\u8A00", + "desktop.languageHint": "\u7ACB\u5373\u751F\u6548\u3002\u5DF2\u53D1\u9001\u7684\u6D88\u606F\u4FDD\u6301\u539F\u672C\u7684\u6587\u5B57\u3002", + "desktop.compareCode": "\u4E0E\u5BF9\u65B9\u6838\u5BF9\u9A8C\u8BC1\u7801\uFF0C\u4E00\u81F4\u5219\u786E\u8BA4\u3002", + "desktop.verifyBeforeFiles": "\u53D1\u9001\u6587\u4EF6\u524D\u8BF7\u5148\u5B8C\u6210\u9A8C\u8BC1\u3002", + "desktop.verifyBeforeSending": "\u53D1\u9001\u6D88\u606F\u524D\u8BF7\u5148\u5B8C\u6210\u9A8C\u8BC1\u3002", + "desktop.disconnectedByBackend": "\u8FDE\u63A5\u5DF2\u5B89\u5168\u65AD\u5F00\u3002", + "desktop.restoreFailed": "\u65E0\u6CD5\u6062\u590D\u8FDE\u63A5\uFF0C\u6B63\u5728\u5173\u95ED\u6B64\u804A\u5929\u3002", + "desktop.channelNotReady": "\u6570\u636E\u901A\u9053\u5C1A\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7B49\u5F85\u8FDE\u63A5\u5EFA\u7ACB\u3002", + "desktop.enterCode": "\u8F93\u5165\u9A8C\u8BC1\u7801\u4EE5\u786E\u8BA4\u3002", + "desktop.noOffer": "\u672A\u627E\u5230\u9080\u8BF7\uFF0C\u8BF7\u5148\u521B\u5EFA\u4E00\u4E2A\u3002", + "desktop.notInitiator": "\u6B64\u8FDE\u63A5\u4E0D\u662F\u4F60\u521B\u5EFA\u7684\uFF0C\u56E0\u6B64\u6CA1\u6709\u53EF\u5E94\u7528\u7684\u5E94\u7B54\u3002", + "desktop.decryptFailed": "\u4E00\u6761\u6D88\u606F\u65E0\u6CD5\u89E3\u5BC6\uFF0C\u5DF2\u4E22\u5F03\u3002", + "desktop.badMessageFormat": "\u6536\u5230\u683C\u5F0F\u9519\u8BEF\u7684\u6570\u636E\u5E27\uFF0C\u5DF2\u4E22\u5F03\u3002", + "desktop.notSentNotReady": "\u6D88\u606F\u672A\u53D1\u9001\uFF1A\u5B89\u5168\u901A\u9053\u5C1A\u672A\u5C31\u7EEA\u3002\u8BF7\u7B49\u5F85\u9A8C\u8BC1\u5B8C\u6210\u6216\u91CD\u65B0\u8FDE\u63A5\u3002", + "desktop.micDenied": "\u9EA6\u514B\u98CE\u6743\u9650\u88AB\u62D2\u7EDD\u3002", + "desktop.noChannelWait": "\u6CA1\u6709\u5DF2\u6253\u5F00\u7684\u5B89\u5168\u901A\u9053 - \u8BF7\u7B49\u5F85\u8FDE\u63A5\u5EFA\u7ACB\u3002", + "desktop.sasFailed": "\u9A8C\u8BC1\u5931\u8D25\u3002\u53EF\u80FD\u5B58\u5728\u4E2D\u95F4\u4EBA\uFF0C\u8FDE\u63A5\u5DF2\u4E2D\u6B62\u3002", + "desktop.sasOk": "\u9A8C\u8BC1\u6210\u529F\u3002\u6B64\u901A\u9053\u5DF2\u7AEF\u5230\u7AEF\u8BA4\u8BC1\u3002", + "desktop.iceForgotten": "\u5DF2\u5FD8\u8BB0\u4FDD\u5B58\u7684\u670D\u52A1\u5668\uFF0C\u6539\u7528\u516C\u5171 ICE \u670D\u52A1\u5668\u3002", + "desktop.icePublic": "\u6B63\u5728\u4F7F\u7528\u516C\u5171 ICE \u670D\u52A1\u5668\u3002", + "desktop.verificationInProgress": "\u5B89\u5168\u9A8C\u8BC1\u4ECD\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u3002", + "desktop.fileGone": "\u6B64\u6587\u4EF6\u5DF2\u65E0\u6CD5\u4E0B\u8F7D\u3002", + "desktop.codeMismatch": "\u9A8C\u8BC1\u7801\u4E0D\u4E00\u81F4\uFF0C\u4E3A\u5B89\u5168\u8D77\u89C1\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\u3002", + "desktop.noLocalCode": "\u9A8C\u8BC1\u5931\u8D25\uFF1A\u672C\u5730\u6CA1\u6709\u53EF\u6BD4\u5BF9\u7684\u6D3E\u751F\u9A8C\u8BC1\u7801\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\u3002", + "desktop.protocolViolation": "\u5BF9\u65B9\u5728\u4F60\u786E\u8BA4\u9A8C\u8BC1\u7801\u4E4B\u524D\u5C31\u58F0\u79F0\u5DF2\u786E\u8BA4\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\u6B63\u5728\u65AD\u5F00\u8FDE\u63A5\u3002", + "desktop.verificationRejected": "\u9A8C\u8BC1\u88AB\u62D2\u7EDD\u3002\u4E3A\u5B89\u5168\u8D77\u89C1\u5DF2\u4E2D\u6B62\u8FDE\u63A5\u3002", + "secLevel.HIGH": "\u9AD8", + "secLevel.MEDIUM": "\u4E2D", + "secLevel.LOW": "\u4F4E", + "desktop.rerun": "\u91CD\u65B0\u68C0\u6D4B", + "desktop.ice.customDesc": "\u6700\u591A {max} \u4E2A\u670D\u52A1\u5668\uFF0C\u6BCF\u884C\u4E00\u4E2A URL \u6216\u4F7F\u7528 JSON\u3002", + "desktop.ice.persistDesc": "\u4FDD\u5B58\u5728\u672C\u8BBE\u5907\u4E0A\u3002\u5173\u95ED\u5219\u4EC5\u5728\u672C\u6B21\u4F1A\u8BDD\u4E2D\u4F7F\u7528\u3002", + "desktop.group.leaveNote": "\u5176\u4ED6\u6210\u5458\u4F1A\u5F97\u77E5\u4F60\u5DF2\u79BB\u5F00\u3002\u6B64\u540E\u672C\u8BBE\u5907\u4E0A\u4E0D\u4F1A\u7559\u4E0B\u8FD9\u4E2A\u7FA4\u7EC4\u7684\u4EFB\u4F55\u5185\u5BB9\u2014\u2014\u6CA1\u6709\u670D\u52A1\u5668\u4FDD\u5B58\u526F\u672C\u53EF\u4F9B\u91CD\u65B0\u52A0\u5165\uFF0C\u4F60\u9700\u8981\u4E00\u4EFD\u65B0\u7684\u9080\u8BF7\u3002", + "desktop.sec.ecdsaOk": "\u63E1\u624B\u671F\u95F4\u5DF2\u9A8C\u8BC1\u5BF9\u65B9\u5BC6\u94A5\u5305\u7684\u7B7E\u540D\uFF08ECDSA P-384 / SHA-384\uFF09", + "desktop.sec.ecdsaNone": "\u6CA1\u6709\u5B8C\u6210\u7684\u63E1\u624B", + "desktop.sec.ecdhOk": "\u4F1A\u8BDD\u5BC6\u94A5\u7531\u4E34\u65F6 ECDH P-384 \u4EA4\u6362\u7ECF HKDF-SHA-256 \u6D3E\u751F", + "desktop.sec.ecdhNone": "\u672A\u6D3E\u751F\u4F1A\u8BDD\u5BC6\u94A5", + "desktop.sec.encryptionOk": "\u5DF2\u5728\u6838\u5FC3\u4E2D\u9A8C\u8BC1 AES-GCM \u52A0\u89E3\u5BC6", + "desktop.sec.encryptionNa": "\u65E0\u6CD5\u8FD0\u884C AES-GCM \u81EA\u68C0", + "desktop.sec.integrityOk": "\u5DF2\u9A8C\u8BC1\u6D88\u606F\u5B8C\u6574\u6027\uFF08AES-GCM \u8BA4\u8BC1\uFF09", + "desktop.sec.integrityNa": "\u65E0\u6CD5\u8FD0\u884C\u5B8C\u6574\u6027\u81EA\u68C0", + "desktop.sec.pfsOk": "Double Ratchet \u5DF2\u542F\u7528\u2014\u2014\u6BCF\u6761\u6D88\u606F\u90FD\u6709\u81EA\u5DF1\u7684\u5BC6\u94A5", + "desktop.sec.pfsNa": "\u672A\u6D4B\u91CF", + "desktop.sec.replayOk": "\u68D8\u8F6E\u6D88\u606F\u5BC6\u94A5\u7528\u540E\u5373\u9500\u6BC1\uFF0C\u88AB\u622A\u83B7\u7684\u5E27\u65E0\u6CD5\u91CD\u653E", + "desktop.sec.replayNa": "\u672A\u6D4B\u91CF", + "desktop.sec.dtlsPinned": "\u5DF2\u56FA\u5B9A\u5BF9\u65B9 DTLS \u6307\u7EB9\uFF1A{fp}", + "desktop.sec.dtlsNone": "\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7AEF DTLS \u6307\u7EB9", + "desktop.sec.sasBoth": "\u53CC\u65B9\u5DF2\u5728\u5E26\u5916\u786E\u8BA4\u5B89\u5168\u7801", + "desktop.sec.sasIncomplete": "\u5B89\u5168\u7801\u5C1A\u672A\u7531\u53CC\u65B9\u786E\u8BA4", + "desktop.sec.metadataOk": "\u5DF2\u6D3E\u751F\u4E13\u7528\u7684\u5143\u6570\u636E\u5BC6\u94A5\uFF08HKDF metadata-protection-v4\uFF09", + "desktop.sec.metadataNone": "\u6CA1\u6709\u5143\u6570\u636E\u5BC6\u94A5", + "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" }, "ko": { "language.label": "\uC5B8\uC5B4", @@ -10601,7 +11126,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \uB2D8\uC774 \uB9D0\uD558\uB294 \uC911", "groupCall.pin": "{name} \uD06C\uAC8C \uBCF4\uAE30", "groupCall.unpin": "\uC804\uCCB4 \uBCF4\uAE30\uB85C \uB3CC\uC544\uAC00\uAE30", - "groupCall.showEveryone": "\uC804\uCCB4" + "groupCall.showEveryone": "\uC804\uCCB4", + "msg.after5s": "\uC77D\uC740 \uB4A4 5\uCD08", + "msg.after15s": "\uC77D\uC740 \uB4A4 15\uCD08", + "msg.after30s": "\uC77D\uC740 \uB4A4 30\uCD08", + "msg.after1m": "\uC77D\uC740 \uB4A4 1\uBD84", + "msg.sec30": "30\uCD08", + "msg.min5": "5\uBD84", + "msg.hour1": "1\uC2DC\uAC04", + "desktop.shareDesc": "\uC0C1\uB300\uC5D0\uAC8C \uCF54\uB4DC\uB97C \uBCF4\uB0B4\uC138\uC694. \uC77C\uD68C\uC6A9\uC774\uBA70 \uACE7 \uB9CC\uB8CC\uB429\uB2C8\uB2E4.", + "desktop.invitationCreated": "\uBCF4\uC548 \uCD08\uB300\uAC00 \uB9CC\uB4E4\uC5B4\uC84C\uC2B5\uB2C8\uB2E4 - \uC0C1\uB300\uC5D0\uAC8C \uBCF4\uB0B4\uC138\uC694.", + "desktop.joinDesc": "\uC0C1\uB300\uC758 \uCD08\uB300 \uCF54\uB4DC\uB97C \uBD99\uC5EC\uB123\uC5B4 \uBCF4\uC548 \uC751\uB2F5\uC744 \uB9CC\uB4DC\uC138\uC694.", + "desktop.offerTag": "\uCD08\uB300 \xB7 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC", + "desktop.answerTag": "\uC751\uB2F5 \xB7 \uD14D\uC2A4\uD2B8 \uBCF5\uC0AC", + "desktop.offerPlaceholder": "\uCD08\uB300 \uCF54\uB4DC\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4\u2026", + "desktop.answerPlaceholder": "\uC751\uB2F5 \uCF54\uB4DC\uAC00 \uC5EC\uAE30\uC5D0 \uD45C\uC2DC\uB429\uB2C8\uB2E4\u2026", + "desktop.backToChats": "\uCC44\uD305\uC73C\uB85C \uB3CC\uC544\uAC00\uAE30", + "desktop.sendFeedback": "\uD53C\uB4DC\uBC31 \uBCF4\uB0B4\uAE30", + "desktop.callsNeedVerified": "\uD1B5\uD654\uD558\uB824\uBA74 \uAC80\uC99D\uB41C \uBCF4\uC548 \uCC44\uB110\uC774 \uD544\uC694\uD569\uB2C8\uB2E4.", + "desktop.noOpenChannel": "\uC5F4\uB9B0 \uBCF4\uC548 \uCC44\uB110\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", + "desktop.chatCarriesCall": "\uC774 \uCC44\uD305\uC774 \uADF8\uB8F9 \uD1B5\uD654\uB97C \uC804\uB2EC\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4. 1:1 \uD1B5\uD654\uB97C \uAC78\uAE30 \uC804\uC5D0 \uADF8\uB8F9 \uD1B5\uD654\uC5D0\uC11C \uB098\uAC00\uC138\uC694.", + "desktop.err.permission_denied": "\uD1B5\uD654\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 - \uB9C8\uC774\uD06C\uC640 \uCE74\uBA54\uB77C \uC811\uADFC\uC774 \uCC28\uB2E8\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC2DC\uC2A4\uD15C \uC124\uC815\uC5D0\uC11C \uD5C8\uC6A9\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.", + "desktop.language": "\uC5B8\uC5B4", + "desktop.languageHint": "\uC989\uC2DC \uC801\uC6A9\uB429\uB2C8\uB2E4. \uC774\uBBF8 \uBCF4\uB0B8 \uBA54\uC2DC\uC9C0\uB294 \uC6D0\uB798 \uC5B8\uC5B4 \uADF8\uB300\uB85C \uB0A8\uC2B5\uB2C8\uB2E4.", + "desktop.compareCode": "\uC0C1\uB300\uC640 \uD655\uC778 \uCF54\uB4DC\uB97C \uBE44\uAD50\uD558\uACE0 \uC77C\uCE58\uD558\uBA74 \uD655\uC778\uD558\uC138\uC694.", + "desktop.verifyBeforeFiles": "\uD30C\uC77C\uC744 \uBCF4\uB0B4\uAE30 \uC804\uC5D0 \uAC80\uC99D\uC744 \uB9C8\uCE58\uC138\uC694.", + "desktop.verifyBeforeSending": "\uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uAE30 \uC804\uC5D0 \uAC80\uC99D\uC744 \uB9C8\uCE58\uC138\uC694.", + "desktop.disconnectedByBackend": "\uC5F0\uACB0\uC774 \uC548\uC804\uD558\uAC8C \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", + "desktop.restoreFailed": "\uC5F0\uACB0\uC744 \uBCF5\uAD6C\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uCC44\uD305\uC744 \uB2EB\uC2B5\uB2C8\uB2E4.", + "desktop.channelNotReady": "\uB370\uC774\uD130 \uCC44\uB110\uC774 \uC544\uC9C1 \uC5C6\uC2B5\uB2C8\uB2E4. \uC5F0\uACB0\uC774 \uB9FA\uC5B4\uC9C8 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uC138\uC694.", + "desktop.enterCode": "\uD655\uC778 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694.", + "desktop.noOffer": "\uCD08\uB300\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uBA3C\uC800 \uB9CC\uB4DC\uC138\uC694.", + "desktop.notInitiator": "\uC774 \uC5F0\uACB0\uC744 \uB9CC\uB4E0 \uCABD\uC774 \uC544\uB2C8\uBBC0\uB85C \uC801\uC6A9\uD560 \uC751\uB2F5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4.", + "desktop.decryptFailed": "\uBA54\uC2DC\uC9C0\uB97C \uBCF5\uD638\uD654\uD558\uC9C0 \uBABB\uD574 \uBC84\uB838\uC2B5\uB2C8\uB2E4.", + "desktop.badMessageFormat": "\uD615\uC2DD\uC774 \uC798\uBABB\uB41C \uD504\uB808\uC784\uC774 \uB3C4\uCC29\uD574 \uBC84\uB838\uC2B5\uB2C8\uB2E4.", + "desktop.notSentNotReady": "\uBA54\uC2DC\uC9C0\uB97C \uBCF4\uB0B4\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4: \uBCF4\uC548 \uCC44\uB110\uC774 \uC900\uBE44\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uAC80\uC99D\uC774 \uB05D\uB098\uAE30\uB97C \uAE30\uB2E4\uB9AC\uAC70\uB098 \uB2E4\uC2DC \uC5F0\uACB0\uD558\uC138\uC694.", + "desktop.micDenied": "\uB9C8\uC774\uD06C \uC811\uADFC\uC774 \uAC70\uBD80\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", + "desktop.noChannelWait": "\uC5F4\uB9B0 \uBCF4\uC548 \uCC44\uB110\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 - \uC5F0\uACB0\uC774 \uB9FA\uC5B4\uC9C8 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uC138\uC694.", + "desktop.sasFailed": "\uAC80\uC99D\uC5D0 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4. \uC911\uAC04\uC790\uAC00 \uC788\uC744 \uC218 \uC788\uC5B4 \uC5F0\uACB0\uC744 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4.", + "desktop.sasOk": "\uAC80\uC99D\uC5D0 \uC131\uACF5\uD588\uC2B5\uB2C8\uB2E4. \uC774 \uCC44\uB110\uC740 \uC885\uB2E8 \uAC04 \uC778\uC99D\uB418\uC5C8\uC2B5\uB2C8\uB2E4.", + "desktop.iceForgotten": "\uC800\uC7A5\uB41C \uC11C\uBC84\uB97C \uC9C0\uC6E0\uC2B5\uB2C8\uB2E4. \uACF5\uAC1C ICE \uC11C\uBC84\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.", + "desktop.icePublic": "\uACF5\uAC1C ICE \uC11C\uBC84\uB97C \uC0AC\uC6A9\uD569\uB2C8\uB2E4.", + "desktop.verificationInProgress": "\uBCF4\uC548 \uAC80\uC99D\uC774 \uC544\uC9C1 \uC9C4\uD589 \uC911\uC785\uB2C8\uB2E4. \uB05D\uB0A0 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uC138\uC694.", + "desktop.fileGone": "\uC774 \uD30C\uC77C\uC740 \uB354 \uC774\uC0C1 \uB0B4\uB824\uBC1B\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.", + "desktop.codeMismatch": "\uD655\uC778 \uCF54\uB4DC\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uB04A\uC2B5\uB2C8\uB2E4.", + "desktop.noLocalCode": "\uAC80\uC99D \uC2E4\uD328: \uBE44\uAD50\uD560 \uB85C\uCEEC \uD30C\uC0DD \uCF54\uB4DC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uB04A\uC2B5\uB2C8\uB2E4.", + "desktop.protocolViolation": "\uC0C1\uB300\uAC00 \uB2F9\uC2E0\uC774 \uD655\uC778\uD558\uAE30 \uC804\uC5D0 \uCF54\uB4DC\uAC00 \uD655\uC778\uB418\uC5C8\uB2E4\uACE0 \uC8FC\uC7A5\uD588\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uB04A\uC2B5\uB2C8\uB2E4.", + "desktop.verificationRejected": "\uAC80\uC99D\uC774 \uAC70\uBD80\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC548\uC804\uC744 \uC704\uD574 \uC5F0\uACB0\uC744 \uC911\uB2E8\uD588\uC2B5\uB2C8\uB2E4.", + "secLevel.HIGH": "\uB192\uC74C", + "secLevel.MEDIUM": "\uBCF4\uD1B5", + "secLevel.LOW": "\uB0AE\uC74C", + "desktop.rerun": "\uB2E4\uC2DC \uAC80\uC0AC", + "desktop.ice.customDesc": "\uCD5C\uB300 {max}\uAC1C \uC11C\uBC84, \uD55C \uC904\uC5D0 URL \uD558\uB098 \uB610\uB294 JSON.", + "desktop.ice.persistDesc": "\uC774 \uAE30\uAE30\uC5D0 \uB85C\uCEEC\uB85C \uC800\uC7A5\uB429\uB2C8\uB2E4. \uC774\uBC88 \uC138\uC158\uC5D0\uB9CC \uC0AC\uC6A9\uD558\uB824\uBA74 \uAEBC \uB450\uC138\uC694.", + "desktop.group.leaveNote": "\uB2E4\uB978 \uAD6C\uC131\uC6D0\uC5D0\uAC8C \uB2F9\uC2E0\uC774 \uB098\uAC14\uB2E4\uACE0 \uC54C\uB9BD\uB2C8\uB2E4. \uC774\uD6C4 \uC774 \uAE30\uAE30\uC5D0\uB294 \uC774 \uADF8\uB8F9\uC5D0 \uB300\uD55C \uAC83\uC774 \uC544\uBB34\uAC83\uB3C4 \uB0A8\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 - \uB2E4\uC2DC \uB4E4\uC5B4\uAC08 \uC0AC\uBCF8\uC744 \uAC00\uC9C4 \uC11C\uBC84\uAC00 \uC5C6\uC73C\uBBC0\uB85C \uC0C8 \uCD08\uB300\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4.", + "desktop.sec.ecdsaOk": "\uD578\uB4DC\uC170\uC774\uD06C \uC911 \uC0C1\uB300 \uD0A4 \uD328\uD0A4\uC9C0 \uC11C\uBA85\uC744 \uAC80\uC99D\uD588\uC2B5\uB2C8\uB2E4 (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\uC644\uB8CC\uB41C \uD578\uB4DC\uC170\uC774\uD06C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4", + "desktop.sec.ecdhOk": "\uC784\uC2DC ECDH P-384 \uAD50\uD658\uC5D0\uC11C HKDF-SHA-256\uC73C\uB85C \uC138\uC158 \uD0A4\uB97C \uD30C\uC0DD\uD588\uC2B5\uB2C8\uB2E4", + "desktop.sec.ecdhNone": "\uC138\uC158 \uD0A4\uAC00 \uD30C\uC0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4", + "desktop.sec.encryptionOk": "\uCF54\uC5B4\uC5D0\uC11C AES-GCM \uC554\xB7\uBCF5\uD638\uD654\uB97C \uAC80\uC99D\uD588\uC2B5\uB2C8\uB2E4", + "desktop.sec.encryptionNa": "AES-GCM \uC790\uCCB4 \uAC80\uC0AC\uB97C \uC2E4\uD589\uD560 \uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4", + "desktop.sec.integrityOk": "\uBA54\uC2DC\uC9C0 \uBB34\uACB0\uC131\uC744 \uAC80\uC99D\uD588\uC2B5\uB2C8\uB2E4 (AES-GCM \uC778\uC99D)", + "desktop.sec.integrityNa": "\uBB34\uACB0\uC131 \uC790\uCCB4 \uAC80\uC0AC\uB97C \uC2E4\uD589\uD560 \uC218 \uC5C6\uC5C8\uC2B5\uB2C8\uB2E4", + "desktop.sec.pfsOk": "Double Ratchet \uC791\uB3D9 \uC911 - \uBA54\uC2DC\uC9C0\uB9C8\uB2E4 \uACE0\uC720\uD55C \uD0A4\uAC00 \uC788\uC2B5\uB2C8\uB2E4", + "desktop.sec.pfsNa": "\uCE21\uC815\uB418\uC9C0 \uC54A\uC74C", + "desktop.sec.replayOk": "\uB798\uCE6B \uBA54\uC2DC\uC9C0 \uD0A4\uB294 \uC0AC\uC6A9 \uC989\uC2DC \uD30C\uAE30\uB418\uC5B4 \uAC00\uB85C\uCC48 \uD504\uB808\uC784\uC744 \uC7AC\uC0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4", + "desktop.sec.replayNa": "\uCE21\uC815\uB418\uC9C0 \uC54A\uC74C", + "desktop.sec.dtlsPinned": "\uC0C1\uB300 DTLS \uC9C0\uBB38 \uACE0\uC815: {fp}", + "desktop.sec.dtlsNone": "\uC6D0\uACA9 DTLS \uC9C0\uBB38\uC774 \uC5C6\uC2B5\uB2C8\uB2E4", + "desktop.sec.sasBoth": "\uC591\uCABD \uBAA8\uB450 \uB300\uC5ED \uC678\uC5D0\uC11C \uC548\uC804 \uCF54\uB4DC\uB97C \uD655\uC778\uD588\uC2B5\uB2C8\uB2E4", + "desktop.sec.sasIncomplete": "\uC548\uC804 \uCF54\uB4DC\uAC00 \uC591\uCABD \uBAA8\uB450\uC5D0\uAC8C \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4", + "desktop.sec.metadataOk": "\uC804\uC6A9 \uBA54\uD0C0\uB370\uC774\uD130 \uD0A4\uB97C \uD30C\uC0DD\uD588\uC2B5\uB2C8\uB2E4 (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\uBA54\uD0C0\uB370\uC774\uD130 \uD0A4 \uC5C6\uC74C", + "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" }, "hi": { "language.label": "\u092D\u093E\u0937\u093E", @@ -11375,7 +11975,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u092C\u094B\u0932 \u0930\u0939\u0947 \u0939\u0948\u0902", "groupCall.pin": "{name} \u0915\u094B \u092C\u0921\u093C\u093E \u0926\u093F\u0916\u093E\u090F\u0901", "groupCall.unpin": "\u0938\u092D\u0940 \u092A\u0930 \u0932\u094C\u091F\u0947\u0902", - "groupCall.showEveryone": "\u0938\u092D\u0940" + "groupCall.showEveryone": "\u0938\u092D\u0940", + "msg.after5s": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 5 \u0938\u0947\u0915\u0902\u0921 \u092C\u093E\u0926", + "msg.after15s": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 15 \u0938\u0947\u0915\u0902\u0921 \u092C\u093E\u0926", + "msg.after30s": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 30 \u0938\u0947\u0915\u0902\u0921 \u092C\u093E\u0926", + "msg.after1m": "\u092A\u0922\u093C\u0928\u0947 \u0915\u0947 1 \u092E\u093F\u0928\u091F \u092C\u093E\u0926", + "msg.sec30": "30 \u0938\u0947\u0915\u0902\u0921", + "msg.min5": "5 \u092E\u093F\u0928\u091F", + "msg.hour1": "1 \u0918\u0902\u091F\u093E", + "desktop.shareDesc": "\u0915\u094B\u0921 \u0905\u092A\u0928\u0947 \u0938\u093E\u0925\u0940 \u0915\u094B \u092D\u0947\u091C\u0947\u0902\u0964 \u092F\u0939 \u090F\u0915 \u092C\u093E\u0930 \u0915\u093E \u0939\u0948 \u0914\u0930 \u091C\u0932\u094D\u0926\u0940 \u0938\u092E\u093E\u092A\u094D\u0924 \u0939\u094B \u091C\u093E\u0924\u093E \u0939\u0948\u0964", + "desktop.invitationCreated": "\u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u092C\u0928 \u0917\u092F\u093E - \u0907\u0938\u0947 \u0905\u092A\u0928\u0947 \u0938\u093E\u0925\u0940 \u0915\u094B \u092D\u0947\u091C\u0947\u0902\u0964", + "desktop.joinDesc": "\u0905\u092A\u0928\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0909\u0924\u094D\u0924\u0930 \u092C\u0928\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0938\u093E\u0925\u0940 \u0915\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u091A\u093F\u092A\u0915\u093E\u090F\u0901\u0964", + "desktop.offerTag": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \xB7 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902", + "desktop.answerTag": "\u0909\u0924\u094D\u0924\u0930 \xB7 \u091F\u0947\u0915\u094D\u0938\u094D\u091F \u0915\u0949\u092A\u0940 \u0915\u0930\u0947\u0902", + "desktop.offerPlaceholder": "\u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0915\u094B\u0921 \u092F\u0939\u093E\u0901 \u0926\u093F\u0916\u093E\u0908 \u0926\u0947\u0917\u093E\u2026", + "desktop.answerPlaceholder": "\u0909\u0924\u094D\u0924\u0930 \u0915\u094B\u0921 \u092F\u0939\u093E\u0901 \u0926\u093F\u0916\u093E\u0908 \u0926\u0947\u0917\u093E\u2026", + "desktop.backToChats": "\u091A\u0948\u091F \u092A\u0930 \u0935\u093E\u092A\u0938", + "desktop.sendFeedback": "\u092A\u094D\u0930\u0924\u093F\u0915\u094D\u0930\u093F\u092F\u093E \u092D\u0947\u091C\u0947\u0902", + "desktop.callsNeedVerified": "\u0915\u0949\u0932 \u0915\u0947 \u0932\u093F\u090F \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u091A\u093E\u0939\u093F\u090F\u0964", + "desktop.noOpenChannel": "\u0915\u094B\u0908 \u0916\u0941\u0932\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964", + "desktop.chatCarriesCall": "\u092F\u0939 \u091A\u0948\u091F \u090F\u0915 \u0938\u092E\u0942\u0939 \u0915\u0949\u0932 \u0932\u0947 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948\u0964 1:1 \u0915\u0949\u0932 \u0915\u0930\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u092E\u0942\u0939 \u0915\u0949\u0932 \u091B\u094B\u0921\u093C\u0947\u0902\u0964", + "desktop.err.permission_denied": "\u0915\u0949\u0932 \u0936\u0941\u0930\u0942 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u0940 - \u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0914\u0930 \u0915\u0948\u092E\u0930\u0947 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0905\u0935\u0930\u0941\u0926\u094D\u0927 \u0939\u0948\u0964 \u0938\u093F\u0938\u094D\u091F\u092E \u0938\u0947\u091F\u093F\u0902\u0917\u094D\u0938 \u092E\u0947\u0902 \u0907\u0938\u0947 \u0905\u0928\u0941\u092E\u0924\u093F \u0926\u0947\u0902 \u0914\u0930 \u092B\u093F\u0930 \u0915\u094B\u0936\u093F\u0936 \u0915\u0930\u0947\u0902\u0964", + "desktop.language": "\u092D\u093E\u0937\u093E", + "desktop.languageHint": "\u0924\u0941\u0930\u0902\u0924 \u0932\u093E\u0917\u0942 \u0939\u094B\u0924\u093E \u0939\u0948\u0964 \u092A\u0939\u0932\u0947 \u092D\u0947\u091C\u0947 \u0917\u090F \u0938\u0902\u0926\u0947\u0936 \u0905\u092A\u0928\u0940 \u0939\u0940 \u092D\u093E\u0937\u093E \u092E\u0947\u0902 \u0930\u0939\u0924\u0947 \u0939\u0948\u0902\u0964", + "desktop.compareCode": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u0905\u092A\u0928\u0947 \u0938\u093E\u0925\u0940 \u0938\u0947 \u092E\u093F\u0932\u093E\u090F\u0901 \u0914\u0930 \u092E\u0947\u0932 \u0916\u093E\u0928\u0947 \u092A\u0930 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0947\u0902\u0964", + "desktop.verifyBeforeFiles": "\u092B\u093C\u093E\u0907\u0932\u0947\u0902 \u092D\u0947\u091C\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902\u0964", + "desktop.verifyBeforeSending": "\u0938\u0902\u0926\u0947\u0936 \u092D\u0947\u091C\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0915\u0930\u0947\u0902\u0964", + "desktop.disconnectedByBackend": "\u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u0930\u0942\u092A \u0938\u0947 \u092C\u0902\u0926 \u0915\u0930 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964", + "desktop.restoreFailed": "\u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0939\u093E\u0932 \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u093E\u0964 \u092F\u0939 \u091A\u0948\u091F \u092C\u0902\u0926 \u0915\u0940 \u091C\u093E \u0930\u0939\u0940 \u0939\u0948\u0964", + "desktop.channelNotReady": "\u0921\u0947\u091F\u093E \u091A\u0948\u0928\u0932 \u0905\u092D\u0940 \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0928\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964", + "desktop.enterCode": "\u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0947 \u0932\u093F\u090F \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u0926\u0930\u094D\u091C \u0915\u0930\u0947\u0902\u0964", + "desktop.noOffer": "\u0915\u094B\u0908 \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u093E\u0964 \u092A\u0939\u0932\u0947 \u090F\u0915 \u092C\u0928\u093E\u090F\u0901\u0964", + "desktop.notInitiator": "\u092F\u0939 \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0906\u092A\u0928\u0947 \u0928\u0939\u0940\u0902 \u092C\u0928\u093E\u092F\u093E, \u0907\u0938\u0932\u093F\u090F \u0932\u093E\u0917\u0942 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u0909\u0924\u094D\u0924\u0930 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964", + "desktop.decryptFailed": "\u090F\u0915 \u0938\u0902\u0926\u0947\u0936 \u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u091F \u0928\u0939\u0940\u0902 \u0939\u094B \u0938\u0915\u093E \u0914\u0930 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964", + "desktop.badMessageFormat": "\u0917\u0932\u0924 \u092A\u094D\u0930\u093E\u0930\u0942\u092A \u0935\u093E\u0932\u093E \u092B\u093C\u094D\u0930\u0947\u092E \u0906\u092F\u093E \u0914\u0930 \u0939\u091F\u093E \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964", + "desktop.notSentNotReady": "\u0938\u0902\u0926\u0947\u0936 \u0928\u0939\u0940\u0902 \u092D\u0947\u091C\u093E \u0917\u092F\u093E: \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0924\u0948\u092F\u093E\u0930 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u092A\u0942\u0930\u093E \u0939\u094B\u0928\u0947 \u0915\u0940 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902 \u092F\u093E \u092B\u093F\u0930 \u0938\u0947 \u091C\u0941\u0921\u093C\u0947\u0902\u0964", + "desktop.micDenied": "\u092E\u093E\u0907\u0915\u094D\u0930\u094B\u092B\u093C\u094B\u0928 \u0915\u0940 \u0905\u0928\u0941\u092E\u0924\u093F \u0905\u0938\u094D\u0935\u0940\u0915\u093E\u0930 \u0915\u0930 \u0926\u0940 \u0917\u0908\u0964", + "desktop.noChannelWait": "\u0915\u094B\u0908 \u0916\u0941\u0932\u093E \u0938\u0941\u0930\u0915\u094D\u0937\u093F\u0924 \u091A\u0948\u0928\u0932 \u0928\u0939\u0940\u0902 - \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0928\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964", + "desktop.sasFailed": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0935\u093F\u092B\u0932\u0964 \u092C\u0940\u091A \u092E\u0947\u0902 \u0915\u094B\u0908 \u0939\u094B \u0938\u0915\u0924\u093E \u0939\u0948, \u0907\u0938\u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0930\u094B\u0915 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964", + "desktop.sasOk": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0938\u092B\u0932\u0964 \u092F\u0939 \u091A\u0948\u0928\u0932 \u0938\u093F\u0930\u0947 \u0938\u0947 \u0938\u093F\u0930\u0947 \u0924\u0915 \u092A\u094D\u0930\u092E\u093E\u0923\u093F\u0924 \u0939\u0948\u0964", + "desktop.iceForgotten": "\u0938\u0939\u0947\u091C\u0947 \u0917\u090F \u0938\u0930\u094D\u0935\u0930 \u092D\u0941\u0932\u093E \u0926\u093F\u090F \u0917\u090F\u0964 \u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 ICE \u0938\u0930\u094D\u0935\u0930 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B \u0930\u0939\u0947 \u0939\u0948\u0902\u0964", + "desktop.icePublic": "\u0938\u093E\u0930\u094D\u0935\u091C\u0928\u093F\u0915 ICE \u0938\u0930\u094D\u0935\u0930 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B \u0930\u0939\u0947 \u0939\u0948\u0902\u0964", + "desktop.verificationInProgress": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0905\u092D\u0940 \u091A\u0932 \u0930\u0939\u093E \u0939\u0948\u0964 \u092A\u0942\u0930\u093E \u0939\u094B\u0928\u0947 \u0924\u0915 \u092A\u094D\u0930\u0924\u0940\u0915\u094D\u0937\u093E \u0915\u0930\u0947\u0902\u0964", + "desktop.fileGone": "\u092F\u0939 \u092B\u093C\u093E\u0907\u0932 \u0905\u092C \u0921\u093E\u0909\u0928\u0932\u094B\u0921 \u0915\u0947 \u0932\u093F\u090F \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964", + "desktop.codeMismatch": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0915\u094B\u0921 \u092E\u0947\u0932 \u0928\u0939\u0940\u0902 \u0916\u093E\u0924\u0947\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0902\u0926 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u0964", + "desktop.noLocalCode": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0935\u093F\u092B\u0932: \u0924\u0941\u0932\u0928\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u094B\u0908 \u0938\u094D\u0925\u093E\u0928\u0940\u092F \u0915\u094B\u0921 \u0928\u0939\u0940\u0902 \u0939\u0948\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0902\u0926 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u0964", + "desktop.protocolViolation": "\u0938\u093E\u0925\u0940 \u0928\u0947 \u0906\u092A\u0915\u0947 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0930\u0928\u0947 \u0938\u0947 \u092A\u0939\u0932\u0947 \u0939\u0940 \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u093E \u0926\u093E\u0935\u093E \u0915\u093F\u092F\u093E\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u092C\u0902\u0926 \u0915\u093F\u092F\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948\u0964", + "desktop.verificationRejected": "\u0938\u0924\u094D\u092F\u093E\u092A\u0928 \u0905\u0938\u094D\u0935\u0940\u0915\u093E\u0930\u0964 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u0947 \u0932\u093F\u090F \u0915\u0928\u0947\u0915\u094D\u0936\u0928 \u0930\u094B\u0915 \u0926\u093F\u092F\u093E \u0917\u092F\u093E\u0964", + "secLevel.HIGH": "\u0909\u091A\u094D\u091A", + "secLevel.MEDIUM": "\u092E\u0927\u094D\u092F\u092E", + "secLevel.LOW": "\u0928\u093F\u092E\u094D\u0928", + "desktop.rerun": "\u0926\u094B\u092C\u093E\u0930\u093E \u091C\u093E\u0901\u091A\u0947\u0902", + "desktop.ice.customDesc": "\u0905\u0927\u093F\u0915\u0924\u092E {max} \u0938\u0930\u094D\u0935\u0930, \u092A\u094D\u0930\u0924\u093F \u092A\u0902\u0915\u094D\u0924\u093F \u090F\u0915 URL \u092F\u093E JSON\u0964", + "desktop.ice.persistDesc": "\u0907\u0938\u0940 \u0921\u093F\u0935\u093E\u0907\u0938 \u092A\u0930 \u0938\u0939\u0947\u091C\u093E \u091C\u093E\u0924\u093E \u0939\u0948\u0964 \u0915\u0947\u0935\u0932 \u0907\u0938\u0940 \u0938\u0924\u094D\u0930 \u0915\u0947 \u0932\u093F\u090F \u0909\u092A\u092F\u094B\u0917 \u0915\u0930\u0928\u093E \u0939\u094B \u0924\u094B \u092C\u0902\u0926 \u0930\u0939\u0928\u0947 \u0926\u0947\u0902\u0964", + "desktop.group.leaveNote": "\u092C\u093E\u0915\u0940 \u0938\u0926\u0938\u094D\u092F\u094B\u0902 \u0915\u094B \u092C\u0924\u093E \u0926\u093F\u092F\u093E \u091C\u093E\u0924\u093E \u0939\u0948 \u0915\u093F \u0906\u092A \u091A\u0932\u0947 \u0917\u090F\u0964 \u0909\u0938\u0915\u0947 \u092C\u093E\u0926 \u0907\u0938 \u0921\u093F\u0935\u093E\u0907\u0938 \u092A\u0930 \u0907\u0938 \u0938\u092E\u0942\u0939 \u0915\u093E \u0915\u0941\u091B \u0928\u0939\u0940\u0902 \u0930\u0939\u0924\u093E - \u0915\u093F\u0938\u0940 \u0938\u0930\u094D\u0935\u0930 \u0915\u0947 \u092A\u093E\u0938 \u092A\u094D\u0930\u0924\u093F \u0928\u0939\u0940\u0902 \u0939\u0948 \u091C\u093F\u0938\u0938\u0947 \u0932\u094C\u091F\u093E \u091C\u093E \u0938\u0915\u0947, \u0907\u0938\u0932\u093F\u090F \u0928\u092F\u093E \u0928\u093F\u092E\u0902\u0924\u094D\u0930\u0923 \u091A\u093E\u0939\u093F\u090F \u0939\u094B\u0917\u093E\u0964", + "desktop.sec.ecdsaOk": "\u0939\u0948\u0902\u0921\u0936\u0947\u0915 \u0915\u0947 \u0926\u094C\u0930\u093E\u0928 \u0938\u093E\u0925\u0940 \u0915\u0947 \u0915\u0940-\u092A\u0948\u0915\u0947\u091C \u0915\u093E \u0939\u0938\u094D\u0924\u093E\u0915\u094D\u0937\u0930 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u0915\u094B\u0908 \u092A\u0942\u0930\u094D\u0923 \u0939\u0948\u0902\u0921\u0936\u0947\u0915 \u0928\u0939\u0940\u0902", + "desktop.sec.ecdhOk": "\u0938\u0924\u094D\u0930 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0905\u0938\u094D\u0925\u093E\u092F\u0940 ECDH P-384 \u0935\u093F\u0928\u093F\u092E\u092F \u0938\u0947 HKDF-SHA-256 \u0926\u094D\u0935\u093E\u0930\u093E \u0935\u094D\u092F\u0941\u0924\u094D\u092A\u0928\u094D\u0928", + "desktop.sec.ecdhNone": "\u0915\u094B\u0908 \u0938\u0924\u094D\u0930 \u0915\u0941\u0902\u091C\u0940 \u0935\u094D\u092F\u0941\u0924\u094D\u092A\u0928\u094D\u0928 \u0928\u0939\u0940\u0902 \u0939\u0941\u0908", + "desktop.sec.encryptionOk": "\u0915\u094B\u0930 \u092E\u0947\u0902 AES-GCM \u090F\u0928\u094D\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0914\u0930 \u0921\u093F\u0915\u094D\u0930\u093F\u092A\u094D\u0936\u0928 \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924", + "desktop.sec.encryptionNa": "AES-GCM \u0938\u094D\u0935-\u092A\u0930\u0940\u0915\u094D\u0937\u0923 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u093E", + "desktop.sec.integrityOk": "\u0938\u0902\u0926\u0947\u0936 \u0905\u0916\u0902\u0921\u0924\u093E \u0938\u0924\u094D\u092F\u093E\u092A\u093F\u0924 (AES-GCM \u092A\u094D\u0930\u092E\u093E\u0923\u0940\u0915\u0930\u0923)", + "desktop.sec.integrityNa": "\u0905\u0916\u0902\u0921\u0924\u093E \u0938\u094D\u0935-\u092A\u0930\u0940\u0915\u094D\u0937\u0923 \u0928\u0939\u0940\u0902 \u091A\u0932 \u0938\u0915\u093E", + "desktop.sec.pfsOk": "Double Ratchet \u0938\u0915\u094D\u0930\u093F\u092F - \u0939\u0930 \u0938\u0902\u0926\u0947\u0936 \u0915\u0940 \u0905\u092A\u0928\u0940 \u0915\u0941\u0902\u091C\u0940 \u0939\u0948", + "desktop.sec.pfsNa": "\u092E\u093E\u092A\u093E \u0928\u0939\u0940\u0902 \u0917\u092F\u093E", + "desktop.sec.replayOk": "\u0930\u0948\u091A\u0947\u091F \u0938\u0902\u0926\u0947\u0936 \u0915\u0941\u0902\u091C\u093F\u092F\u093E\u0901 \u0909\u092A\u092F\u094B\u0917 \u0939\u094B\u0924\u0947 \u0939\u0940 \u0928\u0937\u094D\u091F \u0939\u094B \u091C\u093E\u0924\u0940 \u0939\u0948\u0902, \u0907\u0938\u0932\u093F\u090F \u092A\u0915\u0921\u093C\u093E \u0917\u092F\u093E \u092B\u093C\u094D\u0930\u0947\u092E \u0926\u094B\u092C\u093E\u0930\u093E \u0928\u0939\u0940\u0902 \u091A\u0932\u093E\u092F\u093E \u091C\u093E \u0938\u0915\u0924\u093E", + "desktop.sec.replayNa": "\u092E\u093E\u092A\u093E \u0928\u0939\u0940\u0902 \u0917\u092F\u093E", + "desktop.sec.dtlsPinned": "\u0938\u093E\u0925\u0940 \u0915\u093E DTLS \u092B\u093C\u093F\u0902\u0917\u0930\u092A\u094D\u0930\u093F\u0902\u091F \u092A\u093F\u0928 \u0915\u093F\u092F\u093E \u0917\u092F\u093E: {fp}", + "desktop.sec.dtlsNone": "\u0926\u0942\u0930\u0938\u094D\u0925 DTLS \u092B\u093C\u093F\u0902\u0917\u0930\u092A\u094D\u0930\u093F\u0902\u091F \u0909\u092A\u0932\u092C\u094D\u0927 \u0928\u0939\u0940\u0902", + "desktop.sec.sasBoth": "\u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0928\u0947 \u092C\u093E\u0939\u0930\u0940 \u092E\u093E\u0927\u094D\u092F\u092E \u0938\u0947 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0915\u0940", + "desktop.sec.sasIncomplete": "\u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0915\u094B\u0921 \u0915\u0940 \u092A\u0941\u0937\u094D\u091F\u093F \u0926\u094B\u0928\u094B\u0902 \u092A\u0915\u094D\u0937\u094B\u0902 \u0928\u0947 \u0928\u0939\u0940\u0902 \u0915\u0940", + "desktop.sec.metadataOk": "\u0938\u092E\u0930\u094D\u092A\u093F\u0924 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0915\u0941\u0902\u091C\u0940 \u0935\u094D\u092F\u0941\u0924\u094D\u092A\u0928\u094D\u0928 (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u0915\u094B\u0908 \u092E\u0947\u091F\u093E\u0921\u0947\u091F\u093E \u0915\u0941\u0902\u091C\u0940 \u0928\u0939\u0940\u0902", + "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" }, "ar": { "language.label": "\u0627\u0644\u0644\u063A\u0629", @@ -12149,7 +12824,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u064A\u062A\u062D\u062F\u0651\u062B \u0627\u0644\u0622\u0646", "groupCall.pin": "\u0639\u0631\u0636 {name} \u0628\u062D\u062C\u0645 \u0643\u0628\u064A\u0631", "groupCall.unpin": "\u0627\u0644\u0639\u0648\u062F\u0629 \u0625\u0644\u0649 \u0627\u0644\u062C\u0645\u064A\u0639", - "groupCall.showEveryone": "\u0627\u0644\u062C\u0645\u064A\u0639" + "groupCall.showEveryone": "\u0627\u0644\u062C\u0645\u064A\u0639", + "msg.after5s": "\u0665 \u062B\u0648\u0627\u0646\u064D \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629", + "msg.after15s": "\u0661\u0665 \u062B\u0627\u0646\u064A\u0629 \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629", + "msg.after30s": "\u0663\u0660 \u062B\u0627\u0646\u064A\u0629 \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629", + "msg.after1m": "\u062F\u0642\u064A\u0642\u0629 \u0648\u0627\u062D\u062F\u0629 \u0628\u0639\u062F \u0627\u0644\u0642\u0631\u0627\u0621\u0629", + "msg.sec30": "\u0663\u0660 \u062B\u0627\u0646\u064A\u0629", + "msg.min5": "\u0665 \u062F\u0642\u0627\u0626\u0642", + "msg.hour1": "\u0633\u0627\u0639\u0629 \u0648\u0627\u062D\u062F\u0629", + "desktop.shareDesc": "\u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0645\u0632 \u0625\u0644\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631. \u064A\u064F\u0633\u062A\u062E\u062F\u0645 \u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629 \u0648\u064A\u0646\u062A\u0647\u064A \u0633\u0631\u064A\u0639\u064B\u0627.", + "desktop.invitationCreated": "\u0623\u064F\u0646\u0634\u0626\u062A \u0627\u0644\u062F\u0639\u0648\u0629 \u0627\u0644\u0622\u0645\u0646\u0629 - \u0623\u0631\u0633\u0644\u0647\u0627 \u0625\u0644\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631.", + "desktop.joinDesc": "\u0627\u0644\u0635\u0642 \u0631\u0645\u0632 \u062F\u0639\u0648\u0629 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0644\u0628\u0646\u0627\u0621 \u0631\u062F\u0643 \u0627\u0644\u0622\u0645\u0646.", + "desktop.offerTag": "\u062F\u0639\u0648\u0629 \xB7 \u0646\u0633\u062E \u0627\u0644\u0646\u0635", + "desktop.answerTag": "\u0631\u062F \xB7 \u0646\u0633\u062E \u0627\u0644\u0646\u0635", + "desktop.offerPlaceholder": "\u0633\u064A\u0638\u0647\u0631 \u0631\u0645\u0632 \u0627\u0644\u062F\u0639\u0648\u0629 \u0647\u0646\u0627\u2026", + "desktop.answerPlaceholder": "\u0633\u064A\u0638\u0647\u0631 \u0631\u0645\u0632 \u0627\u0644\u0631\u062F \u0647\u0646\u0627\u2026", + "desktop.backToChats": "\u0627\u0644\u0639\u0648\u062F\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0627\u062A", + "desktop.sendFeedback": "\u0625\u0631\u0633\u0627\u0644 \u0645\u0644\u0627\u062D\u0638\u0627\u062A", + "desktop.callsNeedVerified": "\u062A\u062A\u0637\u0644\u0628 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0627\u062A \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0645\u064F\u062A\u062D\u0642\u064E\u0651\u0642\u064B\u0627 \u0645\u0646\u0647\u0627.", + "desktop.noOpenChannel": "\u0644\u0627 \u062A\u0648\u062C\u062F \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0645\u0641\u062A\u0648\u062D\u0629.", + "desktop.chatCarriesCall": "\u062A\u062D\u0645\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629 \u0645\u0643\u0627\u0644\u0645\u0629 \u062C\u0645\u0627\u0639\u064A\u0629. \u063A\u0627\u062F\u0631 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 \u0627\u0644\u062C\u0645\u0627\u0639\u064A\u0629 \u0642\u0628\u0644 \u0625\u062C\u0631\u0627\u0621 \u0645\u0643\u0627\u0644\u0645\u0629 \u0641\u0631\u062F\u064A\u0629.", + "desktop.err.permission_denied": "\u062A\u0639\u0630\u0651\u0631 \u0628\u062F\u0621 \u0627\u0644\u0645\u0643\u0627\u0644\u0645\u0629 - \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646 \u0648\u0627\u0644\u0643\u0627\u0645\u064A\u0631\u0627 \u0645\u062D\u0638\u0648\u0631. \u0627\u0633\u0645\u062D \u0628\u0647 \u0641\u064A \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0627\u0644\u0646\u0638\u0627\u0645 \u062B\u0645 \u0623\u0639\u062F \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629.", + "desktop.language": "\u0627\u0644\u0644\u063A\u0629", + "desktop.languageHint": "\u064A\u064F\u0637\u0628\u064E\u0651\u0642 \u0641\u0648\u0631\u064B\u0627. \u0627\u0644\u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0645\u064F\u0631\u0633\u0644\u0629 \u062A\u0628\u0642\u0649 \u0628\u0627\u0644\u0643\u0644\u0645\u0627\u062A \u0627\u0644\u062A\u064A \u0643\u064F\u062A\u0628\u062A \u0628\u0647\u0627.", + "desktop.compareCode": "\u0642\u0627\u0631\u0646 \u0631\u0645\u0632 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0639 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0648\u0623\u0643\u0650\u0651\u062F\u0647 \u0625\u0630\u0627 \u062A\u0637\u0627\u0628\u0642.", + "desktop.verifyBeforeFiles": "\u0623\u0643\u0645\u0644 \u0627\u0644\u062A\u062D\u0642\u0642 \u0642\u0628\u0644 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0645\u0644\u0641\u0627\u062A.", + "desktop.verifyBeforeSending": "\u0623\u0643\u0645\u0644 \u0627\u0644\u062A\u062D\u0642\u0642 \u0642\u0628\u0644 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u0631\u0633\u0627\u0626\u0644.", + "desktop.disconnectedByBackend": "\u0623\u064F\u063A\u0644\u0642 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u0628\u0623\u0645\u0627\u0646.", + "desktop.restoreFailed": "\u062A\u0639\u0630\u0651\u0631\u062A \u0627\u0633\u062A\u0639\u0627\u062F\u0629 \u0627\u0644\u0627\u062A\u0635\u0627\u0644. \u0633\u064A\u062A\u0645 \u0625\u063A\u0644\u0627\u0642 \u0647\u0630\u0647 \u0627\u0644\u0645\u062D\u0627\u062F\u062B\u0629.", + "desktop.channelNotReady": "\u0642\u0646\u0627\u0629 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u063A\u064A\u0631 \u0645\u062A\u0627\u062D\u0629 \u0628\u0639\u062F. \u0627\u0646\u062A\u0638\u0631 \u062D\u062A\u0649 \u064A\u064F\u0646\u0634\u0623 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.", + "desktop.enterCode": "\u0623\u062F\u062E\u0644 \u0631\u0645\u0632 \u0627\u0644\u062A\u062D\u0642\u0642 \u0644\u0644\u062A\u0623\u0643\u064A\u062F.", + "desktop.noOffer": "\u0644\u0645 \u064A\u064F\u0639\u062B\u0631 \u0639\u0644\u0649 \u062F\u0639\u0648\u0629. \u0623\u0646\u0634\u0626 \u0648\u0627\u062D\u062F\u0629 \u0623\u0648\u0644\u064B\u0627.", + "desktop.notInitiator": "\u0644\u0645 \u062A\u064F\u0646\u0634\u0626 \u0647\u0630\u0627 \u0627\u0644\u0627\u062A\u0635\u0627\u0644\u060C \u0641\u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u062F \u0644\u062A\u0637\u0628\u064A\u0642\u0647.", + "desktop.decryptFailed": "\u062A\u0639\u0630\u0651\u0631 \u0641\u0643 \u062A\u0634\u0641\u064A\u0631 \u0631\u0633\u0627\u0644\u0629\u060C \u0648\u0642\u062F \u0623\u064F\u0647\u0645\u0644\u062A.", + "desktop.badMessageFormat": "\u0648\u0635\u0644 \u0625\u0637\u0627\u0631 \u0645\u064F\u0634\u0648\u064E\u0651\u0647 \u0648\u0623\u064F\u0647\u0645\u0644.", + "desktop.notSentNotReady": "\u0644\u0645 \u062A\u064F\u0631\u0633\u0644 \u0627\u0644\u0631\u0633\u0627\u0644\u0629: \u0627\u0644\u0642\u0646\u0627\u0629 \u0627\u0644\u0622\u0645\u0646\u0629 \u063A\u064A\u0631 \u062C\u0627\u0647\u0632\u0629. \u0627\u0646\u062A\u0638\u0631 \u0627\u0646\u062A\u0647\u0627\u0621 \u0627\u0644\u062A\u062D\u0642\u0642 \u0623\u0648 \u0623\u0639\u062F \u0627\u0644\u0627\u062A\u0635\u0627\u0644.", + "desktop.micDenied": "\u0631\u064F\u0641\u0636 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u064A\u0643\u0631\u0648\u0641\u0648\u0646.", + "desktop.noChannelWait": "\u0644\u0627 \u062A\u0648\u062C\u062F \u0642\u0646\u0627\u0629 \u0622\u0645\u0646\u0629 \u0645\u0641\u062A\u0648\u062D\u0629 - \u0627\u0646\u062A\u0638\u0631 \u062D\u062A\u0649 \u064A\u064F\u0646\u0634\u0623 \u0627\u0644\u0627\u062A\u0635\u0627\u0644.", + "desktop.sasFailed": "\u0641\u0634\u0644 \u0627\u0644\u062A\u062D\u0642\u0642. \u0642\u062F \u064A\u0648\u062C\u062F \u0648\u0633\u064A\u0637\u060C \u0644\u0630\u0644\u0643 \u0623\u064F\u0644\u063A\u064A \u0627\u0644\u0627\u062A\u0635\u0627\u0644.", + "desktop.sasOk": "\u0646\u062C\u062D \u0627\u0644\u062A\u062D\u0642\u0642. \u0647\u0630\u0647 \u0627\u0644\u0642\u0646\u0627\u0629 \u0645\u0648\u062B\u064E\u0651\u0642\u0629 \u0645\u0646 \u0637\u0631\u0641 \u0625\u0644\u0649 \u0637\u0631\u0641.", + "desktop.iceForgotten": "\u0646\u064F\u0633\u064A\u062A \u0627\u0644\u062E\u0648\u0627\u062F\u0645 \u0627\u0644\u0645\u062D\u0641\u0648\u0638\u0629. \u062A\u064F\u0633\u062A\u062E\u062F\u0645 \u062E\u0648\u0627\u062F\u0645 ICE \u0627\u0644\u0639\u0627\u0645\u0629.", + "desktop.icePublic": "\u062A\u064F\u0633\u062A\u062E\u062F\u0645 \u062E\u0648\u0627\u062F\u0645 ICE \u0627\u0644\u0639\u0627\u0645\u0629.", + "desktop.verificationInProgress": "\u0645\u0627 \u0632\u0627\u0644 \u0627\u0644\u062A\u062D\u0642\u0642 \u0627\u0644\u0623\u0645\u0646\u064A \u062C\u0627\u0631\u064A\u064B\u0627. \u0627\u0646\u062A\u0638\u0631 \u062D\u062A\u0649 \u064A\u0646\u062A\u0647\u064A.", + "desktop.fileGone": "\u0644\u0645 \u064A\u0639\u062F \u0647\u0630\u0627 \u0627\u0644\u0645\u0644\u0641 \u0645\u062A\u0627\u062D\u064B\u0627 \u0644\u0644\u062A\u0646\u0632\u064A\u0644.", + "desktop.codeMismatch": "\u0631\u0645\u0648\u0632 \u0627\u0644\u062A\u062D\u0642\u0642 \u063A\u064A\u0631 \u0645\u062A\u0637\u0627\u0628\u0642\u0629. \u064A\u062C\u0631\u064A \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.", + "desktop.noLocalCode": "\u0641\u0634\u0644 \u0627\u0644\u062A\u062D\u0642\u0642: \u0644\u0627 \u064A\u0648\u062C\u062F \u0631\u0645\u0632 \u0645\u0634\u062A\u0642 \u0645\u062D\u0644\u064A\u064B\u0627 \u0644\u0644\u0645\u0642\u0627\u0631\u0646\u0629. \u064A\u062C\u0631\u064A \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.", + "desktop.protocolViolation": "\u0627\u062F\u0651\u0639\u0649 \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u062A\u0623\u0643\u064A\u062F \u0627\u0644\u0631\u0645\u0632 \u0642\u0628\u0644 \u0623\u0646 \u062A\u0624\u0643\u0651\u062F\u0647 \u0623\u0646\u062A. \u064A\u062C\u0631\u064A \u0642\u0637\u0639 \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.", + "desktop.verificationRejected": "\u0631\u064F\u0641\u0636 \u0627\u0644\u062A\u062D\u0642\u0642. \u0623\u064F\u0644\u063A\u064A \u0627\u0644\u0627\u062A\u0635\u0627\u0644 \u062D\u0641\u0627\u0638\u064B\u0627 \u0639\u0644\u0649 \u0627\u0644\u0623\u0645\u0627\u0646.", + "secLevel.HIGH": "\u0639\u0627\u0644\u064D", + "secLevel.MEDIUM": "\u0645\u062A\u0648\u0633\u0637", + "secLevel.LOW": "\u0645\u0646\u062E\u0641\u0636", + "desktop.rerun": "\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0641\u062D\u0635", + "desktop.ice.customDesc": "\u062D\u062A\u0649 {max} \u062E\u0627\u062F\u0645\u064B\u0627\u060C \u0631\u0627\u0628\u0637 \u0648\u0627\u062D\u062F \u0644\u0643\u0644 \u0633\u0637\u0631 \u0623\u0648 \u0628\u0635\u064A\u063A\u0629 JSON.", + "desktop.ice.persistDesc": "\u064A\u064F\u062D\u0641\u0638 \u0645\u062D\u0644\u064A\u064B\u0627 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632. \u0627\u062A\u0631\u0643\u0647 \u0645\u0637\u0641\u0623\u064B \u0644\u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647 \u0641\u064A \u0647\u0630\u0647 \u0627\u0644\u062C\u0644\u0633\u0629 \u0641\u0642\u0637.", + "desktop.group.leaveNote": "\u064A\u064F\u0628\u0644\u064E\u0651\u063A \u0628\u0642\u064A\u0629 \u0627\u0644\u0623\u0639\u0636\u0627\u0621 \u0628\u0623\u0646\u0643 \u063A\u0627\u062F\u0631\u062A. \u0628\u0639\u062F \u0630\u0644\u0643 \u0644\u0627 \u064A\u0628\u0642\u0649 \u0634\u064A\u0621 \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u062C\u0645\u0648\u0639\u0629 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632 - \u0644\u0627 \u064A\u0648\u062C\u062F \u062E\u0627\u062F\u0645 \u064A\u062D\u062A\u0641\u0638 \u0628\u0646\u0633\u062E\u0629 \u0644\u0644\u0639\u0648\u062F\u0629 \u0645\u0646\u0647\u0627\u060C \u0644\u0630\u0627 \u0633\u062A\u062D\u062A\u0627\u062C \u0625\u0644\u0649 \u062F\u0639\u0648\u0629 \u062C\u062F\u064A\u062F\u0629.", + "desktop.sec.ecdsaOk": "\u062A\u0645 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u062A\u0648\u0642\u064A\u0639 \u062D\u0632\u0645\u0629 \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631 \u0623\u062B\u0646\u0627\u0621 \u0627\u0644\u0645\u0635\u0627\u0641\u062D\u0629 (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u0644\u0627 \u062A\u0648\u062C\u062F \u0645\u0635\u0627\u0641\u062D\u0629 \u0645\u0643\u062A\u0645\u0644\u0629", + "desktop.sec.ecdhOk": "\u0627\u0634\u062A\u064F\u0642\u0651\u062A \u0645\u0641\u0627\u062A\u064A\u062D \u0627\u0644\u062C\u0644\u0633\u0629 \u0645\u0646 \u062A\u0628\u0627\u062F\u0644 ECDH P-384 \u0639\u0627\u0628\u0631 \u0639\u0628\u0631 HKDF-SHA-256", + "desktop.sec.ecdhNone": "\u0644\u0645 \u062A\u064F\u0634\u062A\u0642 \u0645\u0641\u0627\u062A\u064A\u062D \u062C\u0644\u0633\u0629", + "desktop.sec.encryptionOk": "\u062A\u0645 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0627\u0644\u062A\u0634\u0641\u064A\u0631 \u0648\u0641\u0643 \u0627\u0644\u062A\u0634\u0641\u064A\u0631 AES-GCM \u062F\u0627\u062E\u0644 \u0627\u0644\u0646\u0648\u0627\u0629", + "desktop.sec.encryptionNa": "\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u0644\u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0630\u0627\u062A\u064A \u0644\u0640 AES-GCM", + "desktop.sec.integrityOk": "\u062A\u0645 \u0627\u0644\u062A\u062D\u0642\u0642 \u0645\u0646 \u0633\u0644\u0627\u0645\u0629 \u0627\u0644\u0631\u0633\u0627\u0626\u0644 (\u062A\u0648\u062B\u064A\u0642 AES-GCM)", + "desktop.sec.integrityNa": "\u062A\u0639\u0630\u0651\u0631 \u062A\u0634\u063A\u064A\u0644 \u0627\u062E\u062A\u0628\u0627\u0631 \u0627\u0644\u0633\u0644\u0627\u0645\u0629 \u0627\u0644\u0630\u0627\u062A\u064A", + "desktop.sec.pfsOk": "Double Ratchet \u0646\u0634\u0637 - \u0644\u0643\u0644 \u0631\u0633\u0627\u0644\u0629 \u0645\u0641\u062A\u0627\u062D\u0647\u0627 \u0627\u0644\u062E\u0627\u0635", + "desktop.sec.pfsNa": "\u0644\u0645 \u064A\u064F\u0642\u064E\u0633", + "desktop.sec.replayOk": "\u062A\u064F\u062A\u0644\u064E\u0641 \u0645\u0641\u0627\u062A\u064A\u062D \u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0631\u0627\u062A\u0634\u064A\u062A \u0641\u0648\u0631 \u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647\u0627\u060C \u0641\u0644\u0627 \u064A\u0645\u0643\u0646 \u0625\u0639\u0627\u062F\u0629 \u062A\u0634\u063A\u064A\u0644 \u0625\u0637\u0627\u0631 \u0645\u064F\u0644\u062A\u0642\u064E\u0637", + "desktop.sec.replayNa": "\u0644\u0645 \u064A\u064F\u0642\u064E\u0633", + "desktop.sec.dtlsPinned": "\u062A\u0645 \u062A\u062B\u0628\u064A\u062A \u0628\u0635\u0645\u0629 DTLS \u0644\u0644\u0637\u0631\u0641 \u0627\u0644\u0622\u062E\u0631: {fp}", + "desktop.sec.dtlsNone": "\u0644\u0627 \u062A\u062A\u0648\u0641\u0631 \u0628\u0635\u0645\u0629 DTLS \u0644\u0644\u0637\u0631\u0641 \u0627\u0644\u0628\u0639\u064A\u062F", + "desktop.sec.sasBoth": "\u0623\u0643\u0651\u062F \u0627\u0644\u0637\u0631\u0641\u0627\u0646 \u0631\u0645\u0632 \u0627\u0644\u0623\u0645\u0627\u0646 \u062E\u0627\u0631\u062C \u0627\u0644\u0642\u0646\u0627\u0629", + "desktop.sec.sasIncomplete": "\u0644\u0645 \u064A\u0624\u0643\u0651\u062F \u0627\u0644\u0637\u0631\u0641\u0627\u0646 \u0631\u0645\u0632 \u0627\u0644\u0623\u0645\u0627\u0646", + "desktop.sec.metadataOk": "\u0627\u0634\u062A\u064F\u0642\u0651 \u0645\u0641\u062A\u0627\u062D \u0645\u062E\u0635\u0635 \u0644\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629 (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u0644\u0627 \u064A\u0648\u062C\u062F \u0645\u0641\u062A\u0627\u062D \u0644\u0644\u0628\u064A\u0627\u0646\u0627\u062A \u0627\u0644\u0648\u0635\u0641\u064A\u0629", + "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" }, "he": { "language.label": "\u05E9\u05E4\u05D4", @@ -12923,7 +13673,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u05DE\u05D3\u05D1\u05E8/\u05EA", "groupCall.pin": "\u05D4\u05E6\u05D2\u05EA {name} \u05D1\u05D2\u05D3\u05D5\u05DC", "groupCall.unpin": "\u05D7\u05D6\u05E8\u05D4 \u05DC\u05DB\u05D5\u05DC\u05DD", - "groupCall.showEveryone": "\u05DB\u05D5\u05DC\u05DD" + "groupCall.showEveryone": "\u05DB\u05D5\u05DC\u05DD", + "msg.after5s": "5 \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4", + "msg.after15s": "15 \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4", + "msg.after30s": "30 \u05E9\u05E0\u05D9\u05D5\u05EA \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4", + "msg.after1m": "\u05D3\u05E7\u05D4 \u05D0\u05D7\u05E8\u05D9 \u05D4\u05E7\u05E8\u05D9\u05D0\u05D4", + "msg.sec30": "30 \u05E9\u05E0\u05D9\u05D5\u05EA", + "msg.min5": "5 \u05D3\u05E7\u05D5\u05EA", + "msg.hour1": "\u05E9\u05E2\u05D4", + "desktop.shareDesc": "\u05E9\u05DC\u05D7\u05D5 \u05D0\u05EA \u05D4\u05E7\u05D5\u05D3 \u05DC\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9. \u05D4\u05D5\u05D0 \u05D7\u05D3-\u05E4\u05E2\u05DE\u05D9 \u05D5\u05E4\u05D2 \u05D1\u05DE\u05D4\u05D9\u05E8\u05D5\u05EA.", + "desktop.invitationCreated": "\u05D4\u05D6\u05DE\u05E0\u05D4 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA \u05E0\u05D5\u05E6\u05E8\u05D4 - \u05E9\u05DC\u05D7\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05DC\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9.", + "desktop.joinDesc": "\u05D4\u05D3\u05D1\u05D9\u05E7\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05E9\u05DC \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05DB\u05D3\u05D9 \u05DC\u05D1\u05E0\u05D5\u05EA \u05D0\u05EA \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7\u05EA \u05E9\u05DC\u05DB\u05DD.", + "desktop.offerTag": "\u05D4\u05D6\u05DE\u05E0\u05D4 \xB7 \u05D4\u05E2\u05EA\u05E7\u05EA \u05D8\u05E7\u05E1\u05D8", + "desktop.answerTag": "\u05EA\u05E9\u05D5\u05D1\u05D4 \xB7 \u05D4\u05E2\u05EA\u05E7\u05EA \u05D8\u05E7\u05E1\u05D8", + "desktop.offerPlaceholder": "\u05E7\u05D5\u05D3 \u05D4\u05D4\u05D6\u05DE\u05E0\u05D4 \u05D9\u05D5\u05E4\u05D9\u05E2 \u05DB\u05D0\u05DF\u2026", + "desktop.answerPlaceholder": "\u05E7\u05D5\u05D3 \u05D4\u05EA\u05E9\u05D5\u05D1\u05D4 \u05D9\u05D5\u05E4\u05D9\u05E2 \u05DB\u05D0\u05DF\u2026", + "desktop.backToChats": "\u05D7\u05D6\u05E8\u05D4 \u05DC\u05E6\u05F3\u05D0\u05D8\u05D9\u05DD", + "desktop.sendFeedback": "\u05E9\u05DC\u05D9\u05D7\u05EA \u05DE\u05E9\u05D5\u05D1", + "desktop.callsNeedVerified": "\u05E9\u05D9\u05D7\u05D5\u05EA \u05D3\u05D5\u05E8\u05E9\u05D5\u05EA \u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05DE\u05D0\u05D5\u05DE\u05EA.", + "desktop.noOpenChannel": "\u05D0\u05D9\u05DF \u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E4\u05EA\u05D5\u05D7.", + "desktop.chatCarriesCall": "\u05D4\u05E6\u05F3\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05E0\u05D5\u05E9\u05D0 \u05E9\u05D9\u05D7\u05D4 \u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA. \u05E6\u05D0\u05D5 \u05DE\u05D4\u05E9\u05D9\u05D7\u05D4 \u05D4\u05E7\u05D1\u05D5\u05E6\u05EA\u05D9\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D9\u05D7\u05D4 \u05D0\u05D7\u05D3-\u05E2\u05DC-\u05D0\u05D7\u05D3.", + "desktop.err.permission_denied": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05EA\u05D7\u05D9\u05DC \u05D0\u05EA \u05D4\u05E9\u05D9\u05D7\u05D4 - \u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05D5\u05DC\u05DE\u05E6\u05DC\u05DE\u05D4 \u05D7\u05E1\u05D5\u05DE\u05D4. \u05D0\u05E4\u05E9\u05E8\u05D5 \u05D0\u05D5\u05EA\u05D4 \u05D1\u05D4\u05D2\u05D3\u05E8\u05D5\u05EA \u05D4\u05DE\u05E2\u05E8\u05DB\u05EA \u05D5\u05E0\u05E1\u05D5 \u05E9\u05D5\u05D1.", + "desktop.language": "\u05E9\u05E4\u05D4", + "desktop.languageHint": "\u05D7\u05DC \u05DE\u05D9\u05D3. \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DB\u05D1\u05E8 \u05E0\u05E9\u05DC\u05D7\u05D5 \u05E0\u05E9\u05D0\u05E8\u05D5\u05EA \u05D1\u05DE\u05D9\u05DC\u05D9\u05DD \u05E9\u05D1\u05D4\u05DF \u05E0\u05DB\u05EA\u05D1\u05D5.", + "desktop.compareCode": "\u05D4\u05E9\u05D5\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E2\u05DD \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D5\u05D0\u05E9\u05E8\u05D5 \u05D0\u05DD \u05D4\u05D5\u05D0 \u05EA\u05D5\u05D0\u05DD.", + "desktop.verifyBeforeFiles": "\u05D4\u05E9\u05DC\u05D9\u05DE\u05D5 \u05D0\u05EA \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05D9\u05D7\u05EA \u05E7\u05D1\u05E6\u05D9\u05DD.", + "desktop.verifyBeforeSending": "\u05D4\u05E9\u05DC\u05D9\u05DE\u05D5 \u05D0\u05EA \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC\u05E4\u05E0\u05D9 \u05E9\u05DC\u05D9\u05D7\u05EA \u05D4\u05D5\u05D3\u05E2\u05D5\u05EA.", + "desktop.disconnectedByBackend": "\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05E0\u05E1\u05D2\u05E8 \u05D1\u05D1\u05D8\u05D7\u05D4.", + "desktop.restoreFailed": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E9\u05D7\u05D6\u05E8 \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8. \u05D4\u05E6\u05F3\u05D0\u05D8 \u05D4\u05D6\u05D4 \u05E0\u05E1\u05D2\u05E8.", + "desktop.channelNotReady": "\u05E2\u05E8\u05D5\u05E5 \u05D4\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD \u05E2\u05D3\u05D9\u05D9\u05DF \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF. \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05E2\u05D3 \u05E9\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D9\u05D9\u05D5\u05D5\u05E6\u05E8.", + "desktop.enterCode": "\u05D4\u05D6\u05D9\u05E0\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05DC\u05D0\u05D9\u05E9\u05D5\u05E8.", + "desktop.noOffer": "\u05DC\u05D0 \u05E0\u05DE\u05E6\u05D0\u05D4 \u05D4\u05D6\u05DE\u05E0\u05D4. \u05E6\u05E8\u05D5 \u05D0\u05D7\u05EA \u05E7\u05D5\u05D3\u05DD.", + "desktop.notInitiator": "\u05DC\u05D0 \u05D0\u05EA\u05DD \u05D9\u05E6\u05E8\u05EA\u05DD \u05D0\u05EA \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D4\u05D6\u05D4, \u05D5\u05DC\u05DB\u05DF \u05D0\u05D9\u05DF \u05EA\u05E9\u05D5\u05D1\u05D4 \u05DC\u05D4\u05D7\u05D9\u05DC.", + "desktop.decryptFailed": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05E4\u05E2\u05E0\u05D7 \u05D4\u05D5\u05D3\u05E2\u05D4 \u05D5\u05D4\u05D9\u05D0 \u05E0\u05D6\u05E8\u05E7\u05D4.", + "desktop.badMessageFormat": "\u05D4\u05D2\u05D9\u05E2\u05D4 \u05DE\u05E1\u05D2\u05E8\u05EA \u05E4\u05D2\u05D5\u05DE\u05D4 \u05D5\u05D4\u05D9\u05D0 \u05E0\u05D6\u05E8\u05E7\u05D4.", + "desktop.notSentNotReady": "\u05D4\u05D4\u05D5\u05D3\u05E2\u05D4 \u05DC\u05D0 \u05E0\u05E9\u05DC\u05D7\u05D4: \u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05D0\u05D9\u05E0\u05D5 \u05DE\u05D5\u05DB\u05DF. \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05DC\u05E1\u05D9\u05D5\u05DD \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D5 \u05D4\u05EA\u05D7\u05D1\u05E8\u05D5 \u05DE\u05D7\u05D3\u05E9.", + "desktop.micDenied": "\u05D4\u05D2\u05D9\u05E9\u05D4 \u05DC\u05DE\u05D9\u05E7\u05E8\u05D5\u05E4\u05D5\u05DF \u05E0\u05D3\u05D7\u05EA\u05D4.", + "desktop.noChannelWait": "\u05D0\u05D9\u05DF \u05E2\u05E8\u05D5\u05E5 \u05DE\u05D0\u05D5\u05D1\u05D8\u05D7 \u05E4\u05EA\u05D5\u05D7 - \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05E2\u05D3 \u05E9\u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D9\u05D9\u05D5\u05D5\u05E6\u05E8.", + "desktop.sasFailed": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC. \u05D9\u05D9\u05EA\u05DB\u05DF \u05E9\u05D9\u05E9 \u05DE\u05EA\u05D5\u05D5\u05DA, \u05D5\u05DC\u05DB\u05DF \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D1\u05D5\u05D8\u05DC.", + "desktop.sasOk": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D4\u05E6\u05DC\u05D9\u05D7. \u05D4\u05E2\u05E8\u05D5\u05E5 \u05D4\u05D6\u05D4 \u05DE\u05D0\u05D5\u05DE\u05EA \u05DE\u05E7\u05E6\u05D4 \u05DC\u05E7\u05E6\u05D4.", + "desktop.iceForgotten": "\u05D4\u05E9\u05E8\u05EA\u05D9\u05DD \u05D4\u05E9\u05DE\u05D5\u05E8\u05D9\u05DD \u05E0\u05E9\u05DB\u05D7\u05D5. \u05E0\u05E2\u05E9\u05D4 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05E9\u05E8\u05EA\u05D9 ICE \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD.", + "desktop.icePublic": "\u05E0\u05E2\u05E9\u05D4 \u05E9\u05D9\u05DE\u05D5\u05E9 \u05D1\u05E9\u05E8\u05EA\u05D9 ICE \u05E6\u05D9\u05D1\u05D5\u05E8\u05D9\u05D9\u05DD.", + "desktop.verificationInProgress": "\u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05D0\u05D1\u05D8\u05D7\u05D4 \u05E2\u05D3\u05D9\u05D9\u05DF \u05E4\u05D5\u05E2\u05DC\u05EA. \u05D4\u05DE\u05EA\u05D9\u05E0\u05D5 \u05DC\u05E1\u05D9\u05D5\u05DE\u05D4.", + "desktop.fileGone": "\u05D4\u05E7\u05D5\u05D1\u05E5 \u05D4\u05D6\u05D4 \u05DB\u05D1\u05E8 \u05D0\u05D9\u05E0\u05D5 \u05D6\u05DE\u05D9\u05DF \u05DC\u05D4\u05D5\u05E8\u05D3\u05D4.", + "desktop.codeMismatch": "\u05E7\u05D5\u05D3\u05D9 \u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05D0\u05D9\u05E0\u05DD \u05EA\u05D5\u05D0\u05DE\u05D9\u05DD. \u05DE\u05EA\u05E0\u05EA\u05E7\u05D9\u05DD \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.", + "desktop.noLocalCode": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05DB\u05E9\u05DC: \u05D0\u05D9\u05DF \u05E7\u05D5\u05D3 \u05DE\u05E7\u05D5\u05DE\u05D9 \u05DC\u05D4\u05E9\u05D5\u05D5\u05D0\u05D4. \u05DE\u05EA\u05E0\u05EA\u05E7\u05D9\u05DD \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.", + "desktop.protocolViolation": "\u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D8\u05E2\u05DF \u05E9\u05D4\u05E7\u05D5\u05D3 \u05D0\u05D5\u05E9\u05E8 \u05DC\u05E4\u05E0\u05D9 \u05E9\u05D0\u05D9\u05E9\u05E8\u05EA\u05DD \u05D0\u05D5\u05EA\u05D5. \u05DE\u05EA\u05E0\u05EA\u05E7\u05D9\u05DD \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.", + "desktop.verificationRejected": "\u05D4\u05D0\u05D9\u05DE\u05D5\u05EA \u05E0\u05D3\u05D7\u05D4. \u05D4\u05D7\u05D9\u05D1\u05D5\u05E8 \u05D1\u05D5\u05D8\u05DC \u05DC\u05DE\u05E2\u05DF \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA.", + "secLevel.HIGH": "\u05D2\u05D1\u05D5\u05D4\u05D4", + "secLevel.MEDIUM": "\u05D1\u05D9\u05E0\u05D5\u05E0\u05D9\u05EA", + "secLevel.LOW": "\u05E0\u05DE\u05D5\u05DB\u05D4", + "desktop.rerun": "\u05D1\u05D3\u05D9\u05E7\u05D4 \u05D7\u05D5\u05D6\u05E8\u05EA", + "desktop.ice.customDesc": "\u05E2\u05D3 {max} \u05E9\u05E8\u05EA\u05D9\u05DD, \u05DB\u05EA\u05D5\u05D1\u05EA \u05D0\u05D7\u05EA \u05D1\u05DB\u05DC \u05E9\u05D5\u05E8\u05D4 \u05D0\u05D5 JSON.", + "desktop.ice.persistDesc": "\u05E0\u05E9\u05DE\u05E8 \u05DE\u05E7\u05D5\u05DE\u05D9\u05EA \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4. \u05D4\u05E9\u05D0\u05D9\u05E8\u05D5 \u05DB\u05D1\u05D5\u05D9 \u05DB\u05D3\u05D9 \u05DC\u05D4\u05E9\u05EA\u05DE\u05E9 \u05E8\u05E7 \u05D1\u05D4\u05E4\u05E2\u05DC\u05D4 \u05D4\u05E0\u05D5\u05DB\u05D7\u05D9\u05EA.", + "desktop.group.leaveNote": "\u05DC\u05E9\u05D0\u05E8 \u05D4\u05D7\u05D1\u05E8\u05D9\u05DD \u05E0\u05DE\u05E1\u05E8 \u05E9\u05E2\u05D6\u05D1\u05EA\u05DD. \u05D0\u05D7\u05E8 \u05DB\u05DA \u05DC\u05D0 \u05E0\u05E9\u05D0\u05E8 \u05D1\u05DE\u05DB\u05E9\u05D9\u05E8 \u05D4\u05D6\u05D4 \u05D3\u05D1\u05E8 \u05DE\u05D4\u05E7\u05D1\u05D5\u05E6\u05D4 - \u05D0\u05D9\u05DF \u05E9\u05E8\u05EA \u05E9\u05DE\u05D7\u05D6\u05D9\u05E7 \u05E2\u05D5\u05EA\u05E7 \u05DC\u05D7\u05D6\u05D5\u05E8 \u05D0\u05DC\u05D9\u05D5, \u05D5\u05DC\u05DB\u05DF \u05EA\u05D9\u05D3\u05E8\u05E9 \u05D4\u05D6\u05DE\u05E0\u05D4 \u05D7\u05D3\u05E9\u05D4.", + "desktop.sec.ecdsaOk": "\u05D7\u05EA\u05D9\u05DE\u05EA \u05D7\u05D1\u05D9\u05DC\u05EA \u05D4\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05E9\u05DC \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05D0\u05D5\u05DE\u05EA\u05D4 \u05D1\u05DC\u05D7\u05D9\u05E6\u05EA \u05D4\u05D9\u05D3 (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u05D0\u05D9\u05DF \u05DC\u05D7\u05D9\u05E6\u05EA \u05D9\u05D3 \u05E9\u05D4\u05D5\u05E9\u05DC\u05DE\u05D4", + "desktop.sec.ecdhOk": "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D4\u05E4\u05E2\u05DC\u05D4 \u05E0\u05D2\u05D6\u05E8\u05D5 \u05DE\u05D4\u05D7\u05DC\u05E4\u05EA ECDH P-384 \u05D7\u05D5\u05DC\u05E4\u05EA \u05D3\u05E8\u05DA HKDF-SHA-256", + "desktop.sec.ecdhNone": "\u05DC\u05D0 \u05E0\u05D2\u05D6\u05E8\u05D5 \u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05E4\u05E2\u05DC\u05D4", + "desktop.sec.encryptionOk": "\u05D4\u05E6\u05E4\u05E0\u05D4 \u05D5\u05E4\u05E2\u05E0\u05D5\u05D7 AES-GCM \u05D0\u05D5\u05DE\u05EA\u05D5 \u05D1\u05DC\u05D9\u05D1\u05D4", + "desktop.sec.encryptionNa": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D4\u05D1\u05D3\u05D9\u05E7\u05D4 \u05D4\u05E2\u05E6\u05DE\u05D9\u05EA \u05E9\u05DC AES-GCM", + "desktop.sec.integrityOk": "\u05E9\u05DC\u05DE\u05D5\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05D0\u05D5\u05DE\u05EA\u05D4 (\u05D0\u05D9\u05DE\u05D5\u05EA AES-GCM)", + "desktop.sec.integrityNa": "\u05DC\u05D0 \u05E0\u05D9\u05EA\u05DF \u05D4\u05D9\u05D4 \u05DC\u05D4\u05E8\u05D9\u05E5 \u05D0\u05EA \u05D1\u05D3\u05D9\u05E7\u05EA \u05D4\u05E9\u05DC\u05DE\u05D5\u05EA", + "desktop.sec.pfsOk": "Double Ratchet \u05E4\u05E2\u05D9\u05DC - \u05DC\u05DB\u05DC \u05D4\u05D5\u05D3\u05E2\u05D4 \u05DE\u05E4\u05EA\u05D7 \u05DE\u05E9\u05DC\u05D4", + "desktop.sec.pfsNa": "\u05DC\u05D0 \u05E0\u05DE\u05D3\u05D3", + "desktop.sec.replayOk": "\u05DE\u05E4\u05EA\u05D7\u05D5\u05EA \u05D4\u05D4\u05D5\u05D3\u05E2\u05D5\u05EA \u05E9\u05DC \u05D4\u05E8\u05D0\u05E6\u05F3\u05D8 \u05DE\u05D5\u05E9\u05DE\u05D3\u05D9\u05DD \u05E2\u05DD \u05D4\u05E9\u05D9\u05DE\u05D5\u05E9, \u05D5\u05DC\u05DB\u05DF \u05D0\u05D9 \u05D0\u05E4\u05E9\u05E8 \u05DC\u05E9\u05D3\u05E8 \u05DE\u05D7\u05D3\u05E9 \u05DE\u05E1\u05D2\u05E8\u05EA \u05E9\u05E0\u05DC\u05DB\u05D3\u05D4", + "desktop.sec.replayNa": "\u05DC\u05D0 \u05E0\u05DE\u05D3\u05D3", + "desktop.sec.dtlsPinned": "\u05D8\u05D1\u05D9\u05E2\u05EA \u05D4\u05D0\u05E6\u05D1\u05E2 DTLS \u05E9\u05DC \u05D4\u05E6\u05D3 \u05D4\u05E9\u05E0\u05D9 \u05DE\u05D5\u05E6\u05DE\u05D3\u05EA: {fp}", + "desktop.sec.dtlsNone": "\u05D0\u05D9\u05DF \u05D8\u05D1\u05D9\u05E2\u05EA \u05D0\u05E6\u05D1\u05E2 DTLS \u05DE\u05E8\u05D5\u05D7\u05E7\u05EA", + "desktop.sec.sasBoth": "\u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD \u05D0\u05D9\u05E9\u05E8\u05D5 \u05D0\u05EA \u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05DE\u05D7\u05D5\u05E5 \u05DC\u05E2\u05E8\u05D5\u05E5", + "desktop.sec.sasIncomplete": "\u05E7\u05D5\u05D3 \u05D4\u05D1\u05D8\u05D9\u05D7\u05D5\u05EA \u05DC\u05D0 \u05D0\u05D5\u05E9\u05E8 \u05D1\u05D9\u05D3\u05D9 \u05E9\u05E0\u05D9 \u05D4\u05E6\u05D3\u05D3\u05D9\u05DD", + "desktop.sec.metadataOk": "\u05E0\u05D2\u05D6\u05E8 \u05DE\u05E4\u05EA\u05D7 \u05D9\u05D9\u05E2\u05D5\u05D3\u05D9 \u05DC\u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u05D0\u05D9\u05DF \u05DE\u05E4\u05EA\u05D7 \u05DE\u05D8\u05D0-\u05E0\u05EA\u05D5\u05E0\u05D9\u05DD", + "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" }, "fa": { "language.label": "\u0632\u0628\u0627\u0646", @@ -13697,7 +14522,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u062F\u0631 \u062D\u0627\u0644 \u0635\u062D\u0628\u062A \u0627\u0633\u062A", "groupCall.pin": "\u0646\u0645\u0627\u06CC\u0634 \u0628\u0632\u0631\u06AF {name}", "groupCall.unpin": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u0647\u0645\u0647", - "groupCall.showEveryone": "\u0647\u0645\u0647" + "groupCall.showEveryone": "\u0647\u0645\u0647", + "msg.after5s": "\u06F5 \u062B\u0627\u0646\u06CC\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646", + "msg.after15s": "\u06F1\u06F5 \u062B\u0627\u0646\u06CC\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646", + "msg.after30s": "\u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646", + "msg.after1m": "\u06F1 \u062F\u0642\u06CC\u0642\u0647 \u067E\u0633 \u0627\u0632 \u062E\u0648\u0627\u0646\u062F\u0646", + "msg.sec30": "\u06F3\u06F0 \u062B\u0627\u0646\u06CC\u0647", + "msg.min5": "\u06F5 \u062F\u0642\u06CC\u0642\u0647", + "msg.hour1": "\u06F1 \u0633\u0627\u0639\u062A", + "desktop.shareDesc": "\u06A9\u062F \u0631\u0627 \u0628\u0631\u0627\u06CC \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F. \u06CC\u06A9\u200C\u0628\u0627\u0631\u0645\u0635\u0631\u0641 \u0627\u0633\u062A \u0648 \u0632\u0648\u062F \u0645\u0646\u0642\u0636\u06CC \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.invitationCreated": "\u062F\u0639\u0648\u062A\u200C\u0646\u0627\u0645\u0647\u0654 \u0627\u0645\u0646 \u0633\u0627\u062E\u062A\u0647 \u0634\u062F - \u0622\u0646 \u0631\u0627 \u0628\u0631\u0627\u06CC \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0628\u0641\u0631\u0633\u062A\u06CC\u062F.", + "desktop.joinDesc": "\u06A9\u062F \u062F\u0639\u0648\u062A \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0631\u0627 \u0628\u0686\u0633\u0628\u0627\u0646\u06CC\u062F \u062A\u0627 \u067E\u0627\u0633\u062E \u0627\u0645\u0646 \u0634\u0645\u0627 \u0633\u0627\u062E\u062A\u0647 \u0634\u0648\u062F.", + "desktop.offerTag": "\u062F\u0639\u0648\u062A \xB7 \u06A9\u067E\u06CC \u0645\u062A\u0646", + "desktop.answerTag": "\u067E\u0627\u0633\u062E \xB7 \u06A9\u067E\u06CC \u0645\u062A\u0646", + "desktop.offerPlaceholder": "\u06A9\u062F \u062F\u0639\u0648\u062A \u0627\u06CC\u0646\u062C\u0627 \u0646\u0645\u0627\u06CC\u0627\u0646 \u0645\u06CC\u200C\u0634\u0648\u062F\u2026", + "desktop.answerPlaceholder": "\u06A9\u062F \u067E\u0627\u0633\u062E \u0627\u06CC\u0646\u062C\u0627 \u0646\u0645\u0627\u06CC\u0627\u0646 \u0645\u06CC\u200C\u0634\u0648\u062F\u2026", + "desktop.backToChats": "\u0628\u0627\u0632\u06AF\u0634\u062A \u0628\u0647 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648\u0647\u0627", + "desktop.sendFeedback": "\u0627\u0631\u0633\u0627\u0644 \u0628\u0627\u0632\u062E\u0648\u0631\u062F", + "desktop.callsNeedVerified": "\u062A\u0645\u0627\u0633\u200C\u0647\u0627 \u0628\u0647 \u06CC\u06A9 \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646\u0650 \u062A\u0623\u06CC\u06CC\u062F\u0634\u062F\u0647 \u0646\u06CC\u0627\u0632 \u062F\u0627\u0631\u0646\u062F.", + "desktop.noOpenChannel": "\u0647\u06CC\u0686 \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0628\u0627\u0632\u06CC \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F.", + "desktop.chatCarriesCall": "\u0627\u06CC\u0646 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648 \u062D\u0627\u0645\u0644 \u06CC\u06A9 \u062A\u0645\u0627\u0633 \u06AF\u0631\u0648\u0647\u06CC \u0627\u0633\u062A. \u067E\u06CC\u0634 \u0627\u0632 \u062A\u0645\u0627\u0633 \u062F\u0648\u0646\u0641\u0631\u0647\u060C \u0627\u0632 \u062A\u0645\u0627\u0633 \u06AF\u0631\u0648\u0647\u06CC \u062E\u0627\u0631\u062C \u0634\u0648\u06CC\u062F.", + "desktop.err.permission_denied": "\u062A\u0645\u0627\u0633 \u0622\u063A\u0627\u0632 \u0646\u0634\u062F - \u062F\u0633\u062A\u0631\u0633\u06CC \u0628\u0647 \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0648 \u062F\u0648\u0631\u0628\u06CC\u0646 \u0645\u0633\u062F\u0648\u062F \u0627\u0633\u062A. \u0622\u0646 \u0631\u0627 \u062F\u0631 \u062A\u0646\u0638\u06CC\u0645\u0627\u062A \u0633\u06CC\u0633\u062A\u0645 \u0645\u062C\u0627\u0632 \u06A9\u0646\u06CC\u062F \u0648 \u062F\u0648\u0628\u0627\u0631\u0647 \u062A\u0644\u0627\u0634 \u06A9\u0646\u06CC\u062F.", + "desktop.language": "\u0632\u0628\u0627\u0646", + "desktop.languageHint": "\u0628\u06CC\u200C\u062F\u0631\u0646\u06AF \u0627\u0639\u0645\u0627\u0644 \u0645\u06CC\u200C\u0634\u0648\u062F. \u067E\u06CC\u0627\u0645\u200C\u0647\u0627\u06CC \u0627\u0631\u0633\u0627\u0644\u200C\u0634\u062F\u0647 \u0628\u0627 \u0647\u0645\u0627\u0646 \u0648\u0627\u0698\u0647\u200C\u0647\u0627 \u0628\u0627\u0642\u06CC \u0645\u06CC\u200C\u0645\u0627\u0646\u0646\u062F.", + "desktop.compareCode": "\u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u0628\u0627 \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0645\u0642\u0627\u06CC\u0633\u0647 \u06A9\u0646\u06CC\u062F \u0648 \u0627\u06AF\u0631 \u06CC\u06A9\u0633\u0627\u0646 \u0628\u0648\u062F \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0646\u06CC\u062F.", + "desktop.verifyBeforeFiles": "\u067E\u06CC\u0634 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u0641\u0627\u06CC\u0644\u060C \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u06A9\u0627\u0645\u0644 \u06A9\u0646\u06CC\u062F.", + "desktop.verifyBeforeSending": "\u067E\u06CC\u0634 \u0627\u0632 \u0627\u0631\u0633\u0627\u0644 \u067E\u06CC\u0627\u0645\u060C \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u06A9\u0627\u0645\u0644 \u06A9\u0646\u06CC\u062F.", + "desktop.disconnectedByBackend": "\u0627\u062A\u0635\u0627\u0644 \u0628\u0647\u200C\u0637\u0648\u0631 \u0627\u0645\u0646 \u0642\u0637\u0639 \u0634\u062F.", + "desktop.restoreFailed": "\u0627\u062A\u0635\u0627\u0644 \u0628\u0627\u0632\u06CC\u0627\u0628\u06CC \u0646\u0634\u062F. \u0627\u06CC\u0646 \u06AF\u0641\u062A\u200C\u0648\u06AF\u0648 \u0628\u0633\u062A\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.channelNotReady": "\u06A9\u0627\u0646\u0627\u0644 \u062F\u0627\u062F\u0647 \u0647\u0646\u0648\u0632 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A. \u062A\u0627 \u0628\u0631\u0642\u0631\u0627\u0631\u06CC \u0627\u062A\u0635\u0627\u0644 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.", + "desktop.enterCode": "\u0628\u0631\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F\u060C \u06A9\u062F \u062A\u0623\u06CC\u06CC\u062F \u0631\u0627 \u0648\u0627\u0631\u062F \u06A9\u0646\u06CC\u062F.", + "desktop.noOffer": "\u062F\u0639\u0648\u062A\u06CC \u06CC\u0627\u0641\u062A \u0646\u0634\u062F. \u0646\u062E\u0633\u062A \u06CC\u06A9\u06CC \u0628\u0633\u0627\u0632\u06CC\u062F.", + "desktop.notInitiator": "\u0627\u06CC\u0646 \u0627\u062A\u0635\u0627\u0644 \u0631\u0627 \u0634\u0645\u0627 \u0646\u0633\u0627\u062E\u062A\u0647\u200C\u0627\u06CC\u062F\u060C \u067E\u0633 \u067E\u0627\u0633\u062E\u06CC \u0628\u0631\u0627\u06CC \u0627\u0639\u0645\u0627\u0644 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F.", + "desktop.decryptFailed": "\u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC \u06CC\u06A9 \u067E\u06CC\u0627\u0645 \u0645\u0645\u06A9\u0646 \u0646\u0634\u062F \u0648 \u06A9\u0646\u0627\u0631 \u06AF\u0630\u0627\u0634\u062A\u0647 \u0634\u062F.", + "desktop.badMessageFormat": "\u0642\u0627\u0628\u06CC \u0646\u0627\u062F\u0631\u0633\u062A \u0631\u0633\u06CC\u062F \u0648 \u06A9\u0646\u0627\u0631 \u06AF\u0630\u0627\u0634\u062A\u0647 \u0634\u062F.", + "desktop.notSentNotReady": "\u067E\u06CC\u0627\u0645 \u0627\u0631\u0633\u0627\u0644 \u0646\u0634\u062F: \u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646 \u0622\u0645\u0627\u062F\u0647 \u0646\u06CC\u0633\u062A. \u062A\u0627 \u067E\u0627\u06CC\u0627\u0646 \u062A\u0623\u06CC\u06CC\u062F \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F \u06CC\u0627 \u062F\u0648\u0628\u0627\u0631\u0647 \u0648\u0635\u0644 \u0634\u0648\u06CC\u062F.", + "desktop.micDenied": "\u062F\u0633\u062A\u0631\u0633\u06CC \u0628\u0647 \u0645\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0631\u062F \u0634\u062F.", + "desktop.noChannelWait": "\u06A9\u0627\u0646\u0627\u0644 \u0627\u0645\u0646\u0650 \u0628\u0627\u0632\u06CC \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F - \u062A\u0627 \u0628\u0631\u0642\u0631\u0627\u0631\u06CC \u0627\u062A\u0635\u0627\u0644 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.", + "desktop.sasFailed": "\u062A\u0623\u06CC\u06CC\u062F \u0646\u0627\u0645\u0648\u0641\u0642 \u0628\u0648\u062F. \u0634\u0627\u06CC\u062F \u0648\u0627\u0633\u0637\u0647\u200C\u0627\u06CC \u062F\u0631 \u0645\u06CC\u0627\u0646 \u0628\u0627\u0634\u062F\u060C \u0628\u0646\u0627\u0628\u0631\u0627\u06CC\u0646 \u0627\u062A\u0635\u0627\u0644 \u0642\u0637\u0639 \u0634\u062F.", + "desktop.sasOk": "\u062A\u0623\u06CC\u06CC\u062F \u0645\u0648\u0641\u0642 \u0628\u0648\u062F. \u0627\u06CC\u0646 \u06A9\u0627\u0646\u0627\u0644 \u0633\u0631\u062A\u0627\u0633\u0631\u06CC \u0627\u062D\u0631\u0627\u0632 \u0647\u0648\u06CC\u062A \u0634\u062F\u0647 \u0627\u0633\u062A.", + "desktop.iceForgotten": "\u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0630\u062E\u06CC\u0631\u0647\u200C\u0634\u062F\u0647 \u0641\u0631\u0627\u0645\u0648\u0634 \u0634\u062F\u0646\u062F. \u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC ICE \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.icePublic": "\u0627\u0632 \u0633\u0631\u0648\u0631\u0647\u0627\u06CC \u0639\u0645\u0648\u0645\u06CC ICE \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.verificationInProgress": "\u0628\u0631\u0631\u0633\u06CC \u0627\u0645\u0646\u06CC\u062A\u06CC \u0647\u0646\u0648\u0632 \u062F\u0631 \u062C\u0631\u06CC\u0627\u0646 \u0627\u0633\u062A. \u062A\u0627 \u067E\u0627\u06CC\u0627\u0646 \u0622\u0646 \u0635\u0628\u0631 \u06A9\u0646\u06CC\u062F.", + "desktop.fileGone": "\u0627\u06CC\u0646 \u0641\u0627\u06CC\u0644 \u062F\u06CC\u06AF\u0631 \u0628\u0631\u0627\u06CC \u062F\u0627\u0646\u0644\u0648\u062F \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.", + "desktop.codeMismatch": "\u06A9\u062F\u0647\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F \u06CC\u06A9\u0633\u0627\u0646 \u0646\u06CC\u0633\u062A\u0646\u062F. \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.noLocalCode": "\u062A\u0623\u06CC\u06CC\u062F \u0646\u0627\u0645\u0648\u0641\u0642: \u06A9\u062F \u0645\u062D\u0644\u06CC\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC \u0645\u0642\u0627\u06CC\u0633\u0647 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F. \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.protocolViolation": "\u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u067E\u06CC\u0634 \u0627\u0632 \u062A\u0623\u06CC\u06CC\u062F \u0634\u0645\u0627 \u0627\u062F\u0639\u0627\u06CC \u062A\u0623\u06CC\u06CC\u062F \u06A9\u062F \u0631\u0627 \u06A9\u0631\u062F. \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0645\u06CC\u200C\u0634\u0648\u062F.", + "desktop.verificationRejected": "\u062A\u0623\u06CC\u06CC\u062F \u0631\u062F \u0634\u062F. \u0627\u062A\u0635\u0627\u0644 \u0628\u0631\u0627\u06CC \u0627\u06CC\u0645\u0646\u06CC \u0642\u0637\u0639 \u0634\u062F.", + "secLevel.HIGH": "\u0628\u0627\u0644\u0627", + "secLevel.MEDIUM": "\u0645\u062A\u0648\u0633\u0637", + "secLevel.LOW": "\u067E\u0627\u06CC\u06CC\u0646", + "desktop.rerun": "\u0628\u0631\u0631\u0633\u06CC \u062F\u0648\u0628\u0627\u0631\u0647", + "desktop.ice.customDesc": "\u062A\u0627 {max} \u0633\u0631\u0648\u0631\u060C \u062F\u0631 \u0647\u0631 \u062E\u0637 \u06CC\u06A9 \u0646\u0634\u0627\u0646\u06CC \u06CC\u0627 \u0628\u0627 \u0642\u0627\u0644\u0628 JSON.", + "desktop.ice.persistDesc": "\u0628\u0647\u200C\u0635\u0648\u0631\u062A \u0645\u062D\u0644\u06CC \u0631\u0648\u06CC \u0647\u0645\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0630\u062E\u06CC\u0631\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F. \u0628\u0631\u0627\u06CC \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0641\u0642\u0637 \u062F\u0631 \u0627\u06CC\u0646 \u0646\u0634\u0633\u062A\u060C \u062E\u0627\u0645\u0648\u0634 \u0628\u06AF\u0630\u0627\u0631\u06CC\u062F.", + "desktop.group.leaveNote": "\u0628\u0647 \u0628\u0642\u06CC\u0647\u0654 \u0627\u0639\u0636\u0627 \u0627\u0637\u0644\u0627\u0639 \u062F\u0627\u062F\u0647 \u0645\u06CC\u200C\u0634\u0648\u062F \u06A9\u0647 \u062E\u0627\u0631\u062C \u0634\u062F\u0647\u200C\u0627\u06CC\u062F. \u067E\u0633 \u0627\u0632 \u0622\u0646 \u0686\u06CC\u0632\u06CC \u0627\u0632 \u0627\u06CC\u0646 \u06AF\u0631\u0648\u0647 \u0631\u0648\u06CC \u0627\u06CC\u0646 \u062F\u0633\u062A\u06AF\u0627\u0647 \u0646\u0645\u06CC\u200C\u0645\u0627\u0646\u062F - \u0647\u06CC\u0686 \u0633\u0631\u0648\u0631\u06CC \u0646\u0633\u062E\u0647\u200C\u0627\u06CC \u0646\u062F\u0627\u0631\u062F \u06A9\u0647 \u0628\u062A\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646 \u0628\u0627\u0632\u06AF\u0634\u062A\u060C \u067E\u0633 \u0628\u0647 \u062F\u0639\u0648\u062A \u062A\u0627\u0632\u0647 \u0646\u06CC\u0627\u0632 \u062E\u0648\u0627\u0647\u06CC\u062F \u062F\u0627\u0634\u062A.", + "desktop.sec.ecdsaOk": "\u0627\u0645\u0636\u0627\u06CC \u0628\u0633\u062A\u0647\u0654 \u06A9\u0644\u06CC\u062F \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u0647\u0646\u06AF\u0627\u0645 \u062F\u0633\u062A\u200C\u062F\u0627\u062F\u0646 \u0628\u0631\u0631\u0633\u06CC \u0634\u062F (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u062F\u0633\u062A\u200C\u062F\u0627\u062F\u0646\u06CC \u06A9\u0627\u0645\u0644 \u0646\u0634\u062F\u0647 \u0627\u0633\u062A", + "desktop.sec.ecdhOk": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u0646\u0634\u0633\u062A \u0627\u0632 \u062A\u0628\u0627\u062F\u0644 \u06AF\u0630\u0631\u0627\u06CC ECDH P-384 \u0628\u0627 HKDF-SHA-256 \u0645\u0634\u062A\u0642 \u0634\u062F\u0646\u062F", + "desktop.sec.ecdhNone": "\u06A9\u0644\u06CC\u062F \u0646\u0634\u0633\u062A\u06CC \u0645\u0634\u062A\u0642 \u0646\u0634\u062F", + "desktop.sec.encryptionOk": "\u0631\u0645\u0632\u06AF\u0630\u0627\u0631\u06CC \u0648 \u0631\u0645\u0632\u06AF\u0634\u0627\u06CC\u06CC AES-GCM \u062F\u0631 \u0647\u0633\u062A\u0647 \u0628\u0631\u0631\u0633\u06CC \u0634\u062F", + "desktop.sec.encryptionNa": "\u062E\u0648\u062F\u0622\u0632\u0645\u0648\u0646 AES-GCM \u0627\u062C\u0631\u0627 \u0646\u0634\u062F", + "desktop.sec.integrityOk": "\u06CC\u06A9\u067E\u0627\u0631\u0686\u06AF\u06CC \u067E\u06CC\u0627\u0645\u200C\u0647\u0627 \u0628\u0631\u0631\u0633\u06CC \u0634\u062F (\u0627\u062D\u0631\u0627\u0632 AES-GCM)", + "desktop.sec.integrityNa": "\u062E\u0648\u062F\u0622\u0632\u0645\u0648\u0646 \u06CC\u06A9\u067E\u0627\u0631\u0686\u06AF\u06CC \u0627\u062C\u0631\u0627 \u0646\u0634\u062F", + "desktop.sec.pfsOk": "Double Ratchet \u0641\u0639\u0627\u0644 \u0627\u0633\u062A - \u0647\u0631 \u067E\u06CC\u0627\u0645 \u06A9\u0644\u06CC\u062F \u062E\u0648\u062F\u0634 \u0631\u0627 \u062F\u0627\u0631\u062F", + "desktop.sec.pfsNa": "\u0627\u0646\u062F\u0627\u0632\u0647\u200C\u06AF\u06CC\u0631\u06CC \u0646\u0634\u062F", + "desktop.sec.replayOk": "\u06A9\u0644\u06CC\u062F\u0647\u0627\u06CC \u067E\u06CC\u0627\u0645 \u0631\u0686\u062A \u067E\u0633 \u0627\u0632 \u0627\u0633\u062A\u0641\u0627\u062F\u0647 \u0646\u0627\u0628\u0648\u062F \u0645\u06CC\u200C\u0634\u0648\u0646\u062F\u060C \u067E\u0633 \u0642\u0627\u0628\u06CC \u06A9\u0647 \u0634\u0646\u0648\u062F \u0634\u062F\u0647 \u062F\u0648\u0628\u0627\u0631\u0647 \u067E\u062E\u0634 \u0646\u0645\u06CC\u200C\u0634\u0648\u062F", + "desktop.sec.replayNa": "\u0627\u0646\u062F\u0627\u0632\u0647\u200C\u06AF\u06CC\u0631\u06CC \u0646\u0634\u062F", + "desktop.sec.dtlsPinned": "\u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A DTLS \u0637\u0631\u0641 \u0645\u0642\u0627\u0628\u0644 \u067E\u06CC\u0646 \u0634\u062F: {fp}", + "desktop.sec.dtlsNone": "\u0627\u062B\u0631 \u0627\u0646\u06AF\u0634\u062A DTLS \u0637\u0631\u0641 \u062F\u0648\u0631 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A", + "desktop.sec.sasBoth": "\u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u0631\u0627 \u0628\u06CC\u0631\u0648\u0646 \u0627\u0632 \u06A9\u0627\u0646\u0627\u0644 \u062A\u0623\u06CC\u06CC\u062F \u06A9\u0631\u062F\u0646\u062F", + "desktop.sec.sasIncomplete": "\u06A9\u062F \u0627\u06CC\u0645\u0646\u06CC \u0631\u0627 \u0647\u0631 \u062F\u0648 \u0637\u0631\u0641 \u062A\u0623\u06CC\u06CC\u062F \u0646\u06A9\u0631\u062F\u0647\u200C\u0627\u0646\u062F", + "desktop.sec.metadataOk": "\u06A9\u0644\u06CC\u062F \u0627\u062E\u062A\u0635\u0627\u0635\u06CC \u0641\u0631\u0627\u062F\u0627\u062F\u0647 \u0645\u0634\u062A\u0642 \u0634\u062F (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u06A9\u0644\u06CC\u062F \u0641\u0631\u0627\u062F\u0627\u062F\u0647 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F", + "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" }, "ur": { "language.label": "\u0632\u0628\u0627\u0646", @@ -14471,7 +15371,82 @@ var DICTIONARIES = { "groupCall.speaking": "{name} \u0628\u0648\u0644 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA", "groupCall.pin": "{name} \u06A9\u0648 \u0628\u0691\u0627 \u062F\u06A9\u06BE\u0627\u0626\u06CC\u06BA", "groupCall.unpin": "\u0633\u0628 \u067E\u0631 \u0648\u0627\u067E\u0633 \u062C\u0627\u0626\u06CC\u06BA", - "groupCall.showEveryone": "\u0633\u0628" + "groupCall.showEveryone": "\u0633\u0628", + "msg.after5s": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 5 \u0633\u06CC\u06A9\u0646\u0688 \u0628\u0639\u062F", + "msg.after15s": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 15 \u0633\u06CC\u06A9\u0646\u0688 \u0628\u0639\u062F", + "msg.after30s": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 30 \u0633\u06CC\u06A9\u0646\u0688 \u0628\u0639\u062F", + "msg.after1m": "\u067E\u0691\u06BE\u0646\u06D2 \u06A9\u06D2 1 \u0645\u0646\u0679 \u0628\u0639\u062F", + "msg.sec30": "30 \u0633\u06CC\u06A9\u0646\u0688", + "msg.min5": "5 \u0645\u0646\u0679", + "msg.hour1": "1 \u06AF\u06BE\u0646\u0679\u06C1", + "desktop.shareDesc": "\u06A9\u0648\u0688 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4 \u06CC\u06C1 \u0627\u06CC\u06A9 \u0628\u0627\u0631 \u06A9\u0627 \u06C1\u06D2 \u0627\u0648\u0631 \u062C\u0644\u062F \u062E\u062A\u0645 \u06C1\u0648 \u062C\u0627\u062A\u0627 \u06C1\u06D2\u06D4", + "desktop.invitationCreated": "\u0645\u062D\u0641\u0648\u0638 \u062F\u0639\u0648\u062A \u0628\u0646 \u06AF\u0626\u06CC - \u0627\u0633\u06D2 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0648 \u0628\u06BE\u06CC\u062C\u06CC\u06BA\u06D4", + "desktop.joinDesc": "\u0627\u067E\u0646\u0627 \u0645\u062D\u0641\u0648\u0638 \u062C\u0648\u0627\u0628 \u0628\u0646\u0627\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u0627 \u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u0686\u0633\u067E\u0627\u06BA \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.offerTag": "\u062F\u0639\u0648\u062A \xB7 \u0645\u062A\u0646 \u06A9\u0627\u067E\u06CC \u06A9\u0631\u06CC\u06BA", + "desktop.answerTag": "\u062C\u0648\u0627\u0628 \xB7 \u0645\u062A\u0646 \u06A9\u0627\u067E\u06CC \u06A9\u0631\u06CC\u06BA", + "desktop.offerPlaceholder": "\u062F\u0639\u0648\u062A\u06CC \u06A9\u0648\u0688 \u06CC\u06C1\u0627\u06BA \u0638\u0627\u06C1\u0631 \u06C1\u0648\u06AF\u0627\u2026", + "desktop.answerPlaceholder": "\u062C\u0648\u0627\u0628\u06CC \u06A9\u0648\u0688 \u06CC\u06C1\u0627\u06BA \u0638\u0627\u06C1\u0631 \u06C1\u0648\u06AF\u0627\u2026", + "desktop.backToChats": "\u0686\u06CC\u0679\u0633 \u067E\u0631 \u0648\u0627\u067E\u0633", + "desktop.sendFeedback": "\u0631\u0627\u0626\u06D2 \u0628\u06BE\u06CC\u062C\u06CC\u06BA", + "desktop.callsNeedVerified": "\u06A9\u0627\u0644\u0648\u06BA \u06A9\u06D2 \u0644\u06CC\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u0634\u062F\u06C1 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u062F\u0631\u06A9\u0627\u0631 \u06C1\u06D2\u06D4", + "desktop.noOpenChannel": "\u06A9\u0648\u0626\u06CC \u06A9\u06BE\u0644\u0627 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u0646\u06C1\u06CC\u06BA \u06C1\u06D2\u06D4", + "desktop.chatCarriesCall": "\u06CC\u06C1 \u0686\u06CC\u0679 \u0627\u06CC\u06A9 \u06AF\u0631\u0648\u067E \u06A9\u0627\u0644 \u0627\u0679\u06BE\u0627\u0626\u06D2 \u06C1\u0648\u0626\u06D2 \u06C1\u06D2\u06D4 \u0648\u0646 \u0679\u0648 \u0648\u0646 \u06A9\u0627\u0644 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u06AF\u0631\u0648\u067E \u06A9\u0627\u0644 \u0686\u06BE\u0648\u0691\u06CC\u06BA\u06D4", + "desktop.err.permission_denied": "\u06A9\u0627\u0644 \u0634\u0631\u0648\u0639 \u0646\u06C1 \u06C1\u0648 \u0633\u06A9\u06CC - \u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u0627\u0648\u0631 \u06A9\u06CC\u0645\u0631\u06D2 \u062A\u06A9 \u0631\u0633\u0627\u0626\u06CC \u0628\u0646\u062F \u06C1\u06D2\u06D4 \u0633\u0633\u0679\u0645 \u0633\u06CC\u0679\u0646\u06AF\u0632 \u0645\u06CC\u06BA \u0627\u062C\u0627\u0632\u062A \u062F\u06CC\u06BA \u0627\u0648\u0631 \u062F\u0648\u0628\u0627\u0631\u06C1 \u06A9\u0648\u0634\u0634 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.language": "\u0632\u0628\u0627\u0646", + "desktop.languageHint": "\u0641\u0648\u0631\u0627\u064B \u0644\u0627\u06AF\u0648 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4 \u067E\u06C1\u0644\u06D2 \u0628\u06BE\u06CC\u062C\u06D2 \u06AF\u0626\u06D2 \u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u0627\u067E\u0646\u06D2 \u06C1\u06CC \u0627\u0644\u0641\u0627\u0638 \u0645\u06CC\u06BA \u0631\u06C1\u062A\u06D2 \u06C1\u06CC\u06BA\u06D4", + "desktop.compareCode": "\u062A\u0635\u062F\u06CC\u0642\u06CC \u06A9\u0648\u0688 \u0627\u067E\u0646\u06D2 \u0633\u0627\u062A\u06BE\u06CC \u0633\u06D2 \u0645\u0644\u0627\u0626\u06CC\u06BA \u0627\u0648\u0631 \u0645\u0637\u0627\u0628\u0642\u062A \u067E\u0631 \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.verifyBeforeFiles": "\u0641\u0627\u0626\u0644\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.verifyBeforeSending": "\u067E\u06CC\u063A\u0627\u0645\u0627\u062A \u0628\u06BE\u06CC\u062C\u0646\u06D2 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.disconnectedByBackend": "\u06A9\u0646\u06A9\u0634\u0646 \u0645\u062D\u0641\u0648\u0638 \u0637\u0631\u06CC\u0642\u06D2 \u0633\u06D2 \u0628\u0646\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4", + "desktop.restoreFailed": "\u06A9\u0646\u06A9\u0634\u0646 \u0628\u062D\u0627\u0644 \u0646\u06C1 \u06C1\u0648 \u0633\u06A9\u0627\u06D4 \u06CC\u06C1 \u0686\u06CC\u0679 \u0628\u0646\u062F \u06A9\u06CC \u062C\u0627 \u0631\u06C1\u06CC \u06C1\u06D2\u06D4", + "desktop.channelNotReady": "\u0688\u06CC\u0679\u0627 \u0686\u06CC\u0646\u0644 \u0627\u0628\u06BE\u06CC \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4 \u06A9\u0646\u06A9\u0634\u0646 \u0642\u0627\u0626\u0645 \u06C1\u0648\u0646\u06D2 \u062A\u06A9 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.enterCode": "\u062A\u0635\u062F\u06CC\u0642 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0648\u0688 \u062F\u0631\u062C \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.noOffer": "\u06A9\u0648\u0626\u06CC \u062F\u0639\u0648\u062A \u0646\u06C1\u06CC\u06BA \u0645\u0644\u06CC\u06D4 \u067E\u06C1\u0644\u06D2 \u0627\u06CC\u06A9 \u0628\u0646\u0627\u0626\u06CC\u06BA\u06D4", + "desktop.notInitiator": "\u06CC\u06C1 \u06A9\u0646\u06A9\u0634\u0646 \u0622\u067E \u0646\u06D2 \u0646\u06C1\u06CC\u06BA \u0628\u0646\u0627\u06CC\u0627\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u0644\u0627\u06AF\u0648 \u06A9\u0631\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0648\u0626\u06CC \u062C\u0648\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4", + "desktop.decryptFailed": "\u0627\u06CC\u06A9 \u067E\u06CC\u063A\u0627\u0645 \u0688\u06CC \u06A9\u0631\u067E\u0679 \u0646\u06C1 \u06C1\u0648 \u0633\u06A9\u0627 \u0627\u0648\u0631 \u0631\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4", + "desktop.badMessageFormat": "\u062E\u0631\u0627\u0628 \u0641\u0631\u06CC\u0645 \u0622\u06CC\u0627 \u0627\u0648\u0631 \u0631\u062F \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4", + "desktop.notSentNotReady": "\u067E\u06CC\u063A\u0627\u0645 \u0646\u06C1\u06CC\u06BA \u0628\u06BE\u06CC\u062C\u0627 \u06AF\u06CC\u0627: \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u062A\u06CC\u0627\u0631 \u0646\u06C1\u06CC\u06BA\u06D4 \u062A\u0635\u062F\u06CC\u0642 \u0645\u06A9\u0645\u0644 \u06C1\u0648\u0646\u06D2 \u06A9\u0627 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA \u06CC\u0627 \u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0691\u06CC\u06BA\u06D4", + "desktop.micDenied": "\u0645\u0627\u0626\u06CC\u06A9\u0631\u0648\u0641\u0648\u0646 \u062A\u06A9 \u0631\u0633\u0627\u0626\u06CC \u0645\u0633\u062A\u0631\u062F \u06A9\u0631 \u062F\u06CC \u06AF\u0626\u06CC\u06D4", + "desktop.noChannelWait": "\u06A9\u0648\u0626\u06CC \u06A9\u06BE\u0644\u0627 \u0645\u062D\u0641\u0648\u0638 \u0686\u06CC\u0646\u0644 \u0646\u06C1\u06CC\u06BA - \u06A9\u0646\u06A9\u0634\u0646 \u0642\u0627\u0626\u0645 \u06C1\u0648\u0646\u06D2 \u062A\u06A9 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.sasFailed": "\u062A\u0635\u062F\u06CC\u0642 \u0646\u0627\u06A9\u0627\u0645\u06D4 \u062F\u0631\u0645\u06CC\u0627\u0646 \u0645\u06CC\u06BA \u06A9\u0648\u0626\u06CC \u06C1\u0648 \u0633\u06A9\u062A\u0627 \u06C1\u06D2\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0631\u0648\u06A9 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4", + "desktop.sasOk": "\u062A\u0635\u062F\u06CC\u0642 \u06A9\u0627\u0645\u06CC\u0627\u0628\u06D4 \u06CC\u06C1 \u0686\u06CC\u0646\u0644 \u0633\u0631\u06D2 \u0633\u06D2 \u0633\u0631\u06D2 \u062A\u06A9 \u0645\u0633\u062A\u0646\u062F \u06C1\u06D2\u06D4", + "desktop.iceForgotten": "\u0645\u062D\u0641\u0648\u0638 \u0633\u0631\u0648\u0631 \u0628\u06BE\u0644\u0627 \u062F\u06CC\u06D2 \u06AF\u0626\u06D2\u06D4 \u0639\u0648\u0627\u0645\u06CC ICE \u0633\u0631\u0648\u0631 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06C1\u0648 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA\u06D4", + "desktop.icePublic": "\u0639\u0648\u0627\u0645\u06CC ICE \u0633\u0631\u0648\u0631 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06C1\u0648 \u0631\u06C1\u06D2 \u06C1\u06CC\u06BA\u06D4", + "desktop.verificationInProgress": "\u0633\u06CC\u06A9\u06CC\u0648\u0631\u0679\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0627\u0628\u06BE\u06CC \u062C\u0627\u0631\u06CC \u06C1\u06D2\u06D4 \u0645\u06A9\u0645\u0644 \u06C1\u0648\u0646\u06D2 \u062A\u06A9 \u0627\u0646\u062A\u0638\u0627\u0631 \u06A9\u0631\u06CC\u06BA\u06D4", + "desktop.fileGone": "\u06CC\u06C1 \u0641\u0627\u0626\u0644 \u0627\u0628 \u0688\u0627\u0624\u0646 \u0644\u0648\u0688 \u06A9\u06D2 \u0644\u06CC\u06D2 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA\u06D4", + "desktop.codeMismatch": "\u062A\u0635\u062F\u06CC\u0642\u06CC \u06A9\u0648\u0688 \u0645\u0637\u0627\u0628\u0642\u062A \u0646\u06C1\u06CC\u06BA \u0631\u06A9\u06BE\u062A\u06D2\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0645\u0646\u0642\u0637\u0639 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u06D4", + "desktop.noLocalCode": "\u062A\u0635\u062F\u06CC\u0642 \u0646\u0627\u06A9\u0627\u0645: \u0645\u0648\u0627\u0632\u0646\u06D2 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0645\u0642\u0627\u0645\u06CC \u06A9\u0648\u0688 \u0645\u0648\u062C\u0648\u062F \u0646\u06C1\u06CC\u06BA\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0645\u0646\u0642\u0637\u0639 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u06D4", + "desktop.protocolViolation": "\u0633\u0627\u062A\u06BE\u06CC \u0646\u06D2 \u0622\u067E \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u0633\u06D2 \u067E\u06C1\u0644\u06D2 \u06C1\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u0627 \u062F\u0639\u0648\u06CC\u0670 \u06A9\u06CC\u0627\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0645\u0646\u0642\u0637\u0639 \u06A9\u06CC\u0627 \u062C\u0627 \u0631\u06C1\u0627 \u06C1\u06D2\u06D4", + "desktop.verificationRejected": "\u062A\u0635\u062F\u06CC\u0642 \u0645\u0633\u062A\u0631\u062F\u06D4 \u062D\u0641\u0627\u0638\u062A \u06A9\u06D2 \u0644\u06CC\u06D2 \u06A9\u0646\u06A9\u0634\u0646 \u0631\u0648\u06A9 \u062F\u06CC\u0627 \u06AF\u06CC\u0627\u06D4", + "secLevel.HIGH": "\u0628\u0644\u0646\u062F", + "secLevel.MEDIUM": "\u062F\u0631\u0645\u06CC\u0627\u0646\u06C1", + "secLevel.LOW": "\u06A9\u0645", + "desktop.rerun": "\u062F\u0648\u0628\u0627\u0631\u06C1 \u062C\u0627\u0646\u0686\u06CC\u06BA", + "desktop.ice.customDesc": "\u0632\u06CC\u0627\u062F\u06C1 \u0633\u06D2 \u0632\u06CC\u0627\u062F\u06C1 {max} \u0633\u0631\u0648\u0631\u060C \u0641\u06CC \u0633\u0637\u0631 \u0627\u06CC\u06A9 URL \u06CC\u0627 JSON\u06D4", + "desktop.ice.persistDesc": "\u0627\u0633\u06CC \u0688\u06CC\u0648\u0627\u0626\u0633 \u067E\u0631 \u0645\u0642\u0627\u0645\u06CC \u0637\u0648\u0631 \u067E\u0631 \u0645\u062D\u0641\u0648\u0638 \u06C1\u0648\u062A\u0627 \u06C1\u06D2\u06D4 \u0635\u0631\u0641 \u0627\u0633\u06CC \u0633\u06CC\u0634\u0646 \u06A9\u06D2 \u0644\u06CC\u06D2 \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u0631\u0646\u0627 \u06C1\u0648 \u062A\u0648 \u0628\u0646\u062F \u0631\u06C1\u0646\u06D2 \u062F\u06CC\u06BA\u06D4", + "desktop.group.leaveNote": "\u0628\u0627\u0642\u06CC \u0627\u0631\u0627\u06A9\u06CC\u0646 \u06A9\u0648 \u0628\u062A\u0627 \u062F\u06CC\u0627 \u062C\u0627\u062A\u0627 \u06C1\u06D2 \u06A9\u06C1 \u0622\u067E \u0686\u0644\u06D2 \u06AF\u0626\u06D2\u06D4 \u0627\u0633 \u06A9\u06D2 \u0628\u0639\u062F \u0627\u0633 \u0688\u06CC\u0648\u0627\u0626\u0633 \u067E\u0631 \u0627\u0633 \u06AF\u0631\u0648\u067E \u06A9\u0627 \u06A9\u0686\u06BE \u0628\u0627\u0642\u06CC \u0646\u06C1\u06CC\u06BA \u0631\u06C1\u062A\u0627 - \u06A9\u0633\u06CC \u0633\u0631\u0648\u0631 \u06A9\u06D2 \u067E\u0627\u0633 \u0646\u0642\u0644 \u0646\u06C1\u06CC\u06BA \u06A9\u06C1 \u0648\u0627\u067E\u0633 \u0622 \u0633\u06A9\u06CC\u06BA\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u0646\u0626\u06CC \u062F\u0639\u0648\u062A \u062F\u0631\u06A9\u0627\u0631 \u06C1\u0648\u06AF\u06CC\u06D4", + "desktop.sec.ecdsaOk": "\u06C1\u06CC\u0646\u0688 \u0634\u06CC\u06A9 \u06A9\u06D2 \u062F\u0648\u0631\u0627\u0646 \u0633\u0627\u062A\u06BE\u06CC \u06A9\u06D2 \u06A9\u0644\u06CC\u062F \u067E\u06CC\u06A9\u062C \u06A9\u06D2 \u062F\u0633\u062A\u062E\u0637 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0626\u06CC (ECDSA P-384 / SHA-384)", + "desktop.sec.ecdsaNone": "\u06A9\u0648\u0626\u06CC \u0645\u06A9\u0645\u0644 \u06C1\u06CC\u0646\u0688 \u0634\u06CC\u06A9 \u0646\u06C1\u06CC\u06BA", + "desktop.sec.ecdhOk": "\u0633\u06CC\u0634\u0646 \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0639\u0627\u0631\u0636\u06CC ECDH P-384 \u062A\u0628\u0627\u062F\u0644\u06D2 \u0633\u06D2 HKDF-SHA-256 \u06A9\u06D2 \u0630\u0631\u06CC\u0639\u06D2 \u0627\u062E\u0630 \u06C1\u0648\u0626\u06CC\u06BA", + "desktop.sec.ecdhNone": "\u06A9\u0648\u0626\u06CC \u0633\u06CC\u0634\u0646 \u06A9\u0644\u06CC\u062F \u0627\u062E\u0630 \u0646\u06C1\u06CC\u06BA \u06C1\u0648\u0626\u06CC", + "desktop.sec.encryptionOk": "\u06A9\u0648\u0631 \u0645\u06CC\u06BA AES-GCM \u0627\u0646\u06A9\u0631\u067E\u0634\u0646 \u0627\u0648\u0631 \u0688\u06A9\u0631\u067E\u0634\u0646 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0626\u06CC", + "desktop.sec.encryptionNa": "AES-GCM \u062E\u0648\u062F \u062C\u0627\u0646\u0686 \u0646\u06C1 \u0686\u0644 \u0633\u06A9\u06CC", + "desktop.sec.integrityOk": "\u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0633\u0627\u0644\u0645\u06CC\u062A \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06C1\u0648\u0626\u06CC (AES-GCM \u062A\u0635\u062F\u06CC\u0642)", + "desktop.sec.integrityNa": "\u0633\u0627\u0644\u0645\u06CC\u062A \u06A9\u06CC \u062E\u0648\u062F \u062C\u0627\u0646\u0686 \u0646\u06C1 \u0686\u0644 \u0633\u06A9\u06CC", + "desktop.sec.pfsOk": "Double Ratchet \u0641\u0639\u0627\u0644 \u06C1\u06D2 - \u06C1\u0631 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u06CC \u0627\u067E\u0646\u06CC \u06A9\u0644\u06CC\u062F \u06C1\u06D2", + "desktop.sec.pfsNa": "\u0646\u0627\u067E\u0627 \u0646\u06C1\u06CC\u06BA \u06AF\u06CC\u0627", + "desktop.sec.replayOk": "\u0631\u06CC\u0686\u0679 \u067E\u06CC\u063A\u0627\u0645 \u06A9\u0644\u06CC\u062F\u06CC\u06BA \u0627\u0633\u062A\u0639\u0645\u0627\u0644 \u06A9\u06D2 \u0641\u0648\u0631\u0627\u064B \u0628\u0639\u062F \u062E\u062A\u0645 \u06C1\u0648 \u062C\u0627\u062A\u06CC \u06C1\u06CC\u06BA\u060C \u0627\u0633 \u0644\u06CC\u06D2 \u067E\u06A9\u0691\u0627 \u06AF\u06CC\u0627 \u0641\u0631\u06CC\u0645 \u062F\u0648\u0628\u0627\u0631\u06C1 \u0646\u06C1\u06CC\u06BA \u0686\u0644\u0627\u06CC\u0627 \u062C\u0627 \u0633\u06A9\u062A\u0627", + "desktop.sec.replayNa": "\u0646\u0627\u067E\u0627 \u0646\u06C1\u06CC\u06BA \u06AF\u06CC\u0627", + "desktop.sec.dtlsPinned": "\u0633\u0627\u062A\u06BE\u06CC \u06A9\u0627 DTLS \u0641\u0646\u06AF\u0631 \u067E\u0631\u0646\u0679 \u067E\u0646 \u06A9\u0631 \u062F\u06CC\u0627 \u06AF\u06CC\u0627: {fp}", + "desktop.sec.dtlsNone": "\u062F\u0648\u0631 \u062F\u0631\u0627\u0632 DTLS \u0641\u0646\u06AF\u0631 \u067E\u0631\u0646\u0679 \u062F\u0633\u062A\u06CC\u0627\u0628 \u0646\u06C1\u06CC\u06BA", + "desktop.sec.sasBoth": "\u062F\u0648\u0646\u0648\u06BA \u0641\u0631\u06CC\u0642\u0648\u06BA \u0646\u06D2 \u0686\u06CC\u0646\u0644 \u0633\u06D2 \u0628\u0627\u06C1\u0631 \u0633\u06CC\u0641\u0679\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u06A9\u06CC", + "desktop.sec.sasIncomplete": "\u0633\u06CC\u0641\u0679\u06CC \u06A9\u0648\u0688 \u06A9\u06CC \u062A\u0635\u062F\u06CC\u0642 \u062F\u0648\u0646\u0648\u06BA \u0641\u0631\u06CC\u0642\u0648\u06BA \u0646\u06D2 \u0646\u06C1\u06CC\u06BA \u06A9\u06CC", + "desktop.sec.metadataOk": "\u0645\u062E\u0635\u0648\u0635 \u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0644\u06CC\u062F \u0627\u062E\u0630 \u06C1\u0648\u0626\u06CC (HKDF metadata-protection-v4)", + "desktop.sec.metadataNone": "\u06A9\u0648\u0626\u06CC \u0645\u06CC\u0679\u0627 \u0688\u06CC\u0679\u0627 \u06A9\u0644\u06CC\u062F \u0646\u06C1\u06CC\u06BA", + "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" } }; @@ -32317,7 +33292,7 @@ Right-click or Ctrl+click to disconnect`, window.EnhancedMinimalHeader = EnhancedMinimalHeader; // src/components/ui/DownloadApps.jsx -var DESKTOP_VERSION = "0.5.0"; +var DESKTOP_VERSION = "1.0.0"; var DESKTOP_RELEASE = `https://github.com/SecureBitChat/securebit-desktop/releases/download/v${DESKTOP_VERSION}`; var DownloadApps = () => { const apps = [ diff --git a/dist/app-boot.js.map b/dist/app-boot.js.map index 19f26ce..ab947f3 100644 --- a/dist/app-boot.js.map +++ b/dist/app-boot.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/notifications/SecureNotificationManager.js", "../src/notifications/NotificationIntegration.js", "../node_modules/dompurify/src/utils.ts", "../node_modules/dompurify/src/tags.ts", "../node_modules/dompurify/src/attrs.ts", "../node_modules/dompurify/src/regexp.ts", "../node_modules/dompurify/src/purify.ts", "../src/crypto/EnhancedSecureCryptoUtils.js", "../src/i18n/generated.js", "../src/i18n/index.js", "../src/transfer/EnhancedSecureFileTransfer.js", "../src/network/webrtc/config.js", "../src/network/webrtc/sdp.js", "../src/network/webrtc/audio.js", "../src/network/webrtc/video.js", "../src/network/webrtc/adaptation/metrics.js", "../src/network/webrtc/adaptation/controller.js", "../src/crypto/DoubleRatchet.js", "../src/network/descriptor/sbq2.js", "../src/network/descriptor/keyexchange.js", "../src/network/EnhancedSecureWebRTCManager.js", "../src/scripts/app-boot.js", "../package.json", "../src/components/ui/LanguageSwitcher.jsx", "../src/components/ui/Header.jsx", "../src/components/ui/DownloadApps.jsx", "../src/components/ui/BecomePartner.jsx", "../src/components/ui/UniqueFeatureSlider.jsx", "../src/components/ui/Roadmap.jsx", "../src/components/ui/CommunityCTA.jsx", "../src/components/ui/FileTransfer.jsx", "../src/network/iceServers.js", "../src/components/ui/IceServerSettings.jsx", "../src/components/ui/CallUI.jsx"], - "sourcesContent": ["/**\n * Secure and Reliable Notification Manager for P2P WebRTC Chat\n * Follows best practices: OWASP, MDN, Chrome DevRel\n * \n * @version 1.0.0\n * @author SecureBit Team\n * @license MIT\n */\n\nclass SecureChatNotificationManager {\n constructor(config = {}) {\n // Safely read Notification permission (iOS Safari may not define Notification)\n this.permission = (typeof Notification !== 'undefined' && Notification && typeof Notification.permission === 'string')\n ? Notification.permission\n : 'denied';\n this.isTabActive = this.checkTabActive(); // Initialize with proper check\n this.unreadCount = 0;\n this.originalTitle = document.title;\n this.notificationQueue = [];\n this.maxQueueSize = config.maxQueueSize || 5;\n this.rateLimitMs = config.rateLimitMs || 2000; // Spam protection\n this.lastNotificationTime = 0;\n this.trustedOrigins = config.trustedOrigins || [];\n \n // Secure context flag\n this.isSecureContext = window.isSecureContext;\n \n // Cross-browser compatibility for Page Visibility API\n this.hidden = this.getHiddenProperty();\n this.visibilityChange = this.getVisibilityChangeEvent();\n \n this.initVisibilityTracking();\n this.initSecurityChecks();\n }\n\n /**\n * Initialize security checks and validation\n * @private\n */\n initSecurityChecks() {\n // Security checks are performed silently\n }\n\n /**\n * Get hidden property name for cross-browser compatibility\n * @returns {string} Hidden property name\n * @private\n */\n getHiddenProperty() {\n if (typeof document.hidden !== \"undefined\") {\n return \"hidden\";\n } else if (typeof document.msHidden !== \"undefined\") {\n return \"msHidden\";\n } else if (typeof document.webkitHidden !== \"undefined\") {\n return \"webkitHidden\";\n }\n return \"hidden\"; // fallback\n }\n\n /**\n * Get visibility change event name for cross-browser compatibility\n * @returns {string} Visibility change event name\n * @private\n */\n getVisibilityChangeEvent() {\n if (typeof document.hidden !== \"undefined\") {\n return \"visibilitychange\";\n } else if (typeof document.msHidden !== \"undefined\") {\n return \"msvisibilitychange\";\n } else if (typeof document.webkitHidden !== \"undefined\") {\n return \"webkitvisibilitychange\";\n }\n return \"visibilitychange\"; // fallback\n }\n\n /**\n * Check if tab is currently active using multiple methods\n * @returns {boolean} True if tab is active\n * @private\n */\n checkTabActive() {\n // Primary method: Page Visibility API\n if (this.hidden && typeof document[this.hidden] !== \"undefined\") {\n return !document[this.hidden];\n }\n \n // Fallback method: document.hasFocus()\n if (typeof document.hasFocus === \"function\") {\n return document.hasFocus();\n }\n \n // Ultimate fallback: assume active\n return true;\n }\n\n /**\n * Initialize page visibility tracking (Page Visibility API)\n * @private\n */\n initVisibilityTracking() {\n // Primary method: Page Visibility API with cross-browser support\n if (typeof document.addEventListener !== \"undefined\" && typeof document[this.hidden] !== \"undefined\") {\n document.addEventListener(this.visibilityChange, () => {\n this.isTabActive = this.checkTabActive();\n \n if (this.isTabActive) {\n this.resetUnreadCount();\n this.clearNotificationQueue();\n }\n });\n }\n\n // Fallback method: Window focus/blur events\n window.addEventListener('focus', () => {\n this.isTabActive = this.checkTabActive();\n if (this.isTabActive) {\n this.resetUnreadCount();\n }\n });\n\n window.addEventListener('blur', () => {\n this.isTabActive = this.checkTabActive();\n });\n\n // Page unload cleanup\n window.addEventListener('beforeunload', () => {\n this.clearNotificationQueue();\n });\n }\n\n /**\n * Request notification permission (BEST PRACTICE: Only call in response to user action)\n * Never call on page load!\n * @returns {Promise} Permission granted status\n */\n async requestPermission() {\n // Secure context check\n if (!this.isSecureContext || !('Notification' in window)) {\n return false;\n }\n\n if (this.permission === 'granted') {\n return true;\n }\n\n if (this.permission === 'denied') {\n return false;\n }\n\n try {\n this.permission = await Notification.requestPermission();\n return this.permission === 'granted';\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Update page title with unread count\n * @private\n */\n updateTitle() {\n if (this.unreadCount > 0) {\n document.title = `(${this.unreadCount}) ${this.originalTitle}`;\n } else {\n document.title = this.originalTitle;\n }\n }\n\n /**\n * XSS Protection: Sanitize input text\n * @param {string} text - Text to sanitize\n * @returns {string} Sanitized text\n * @private\n */\n sanitizeText(text) {\n if (typeof text !== 'string') {\n return '';\n }\n \n // Remove HTML tags and potentially dangerous characters\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .substring(0, 500); // Length limit\n }\n\n /**\n * Validate icon URL (XSS protection)\n * @param {string} url - URL to validate\n * @returns {string|null} Validated URL or null\n * @private\n */\n validateIconUrl(url) {\n if (!url) return null;\n \n try {\n const parsedUrl = new URL(url, window.location.origin);\n \n // Only allow HTTPS and data URLs\n if (parsedUrl.protocol === 'https:' || parsedUrl.protocol === 'data:') {\n // Check trusted origins if specified\n if (this.trustedOrigins.length > 0) {\n const isTrusted = this.trustedOrigins.some(origin => \n parsedUrl.origin === origin\n );\n return isTrusted ? parsedUrl.href : null;\n }\n return parsedUrl.href;\n }\n \n return null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Rate limiting for spam protection\n * @returns {boolean} Rate limit check passed\n * @private\n */\n checkRateLimit() {\n const now = Date.now();\n if (now - this.lastNotificationTime < this.rateLimitMs) {\n return false;\n }\n this.lastNotificationTime = now;\n return true;\n }\n\n /**\n * Send secure notification\n * @param {string} senderName - Name of message sender\n * @param {string} message - Message content\n * @param {Object} options - Notification options\n * @returns {Notification|null} Created notification or null\n */\n notify(senderName, message, options = {}) {\n // Abort if Notifications API is not available (e.g., iOS Safari)\n if (typeof Notification === 'undefined') {\n return null;\n }\n // Update tab active state before checking\n this.isTabActive = this.checkTabActive();\n \n // Only show if tab is NOT active (user is on another tab or minimized)\n if (this.isTabActive) {\n return null;\n }\n\n // Permission check\n if (this.permission !== 'granted') {\n return null;\n }\n\n // Rate limiting\n if (!this.checkRateLimit()) {\n return null;\n }\n\n // Data sanitization (XSS Protection)\n const safeSenderName = this.sanitizeText(senderName || 'Unknown');\n const safeMessage = this.sanitizeText(message || '');\n const safeIcon = this.validateIconUrl(options.icon) || '/logo/icon-192x192.png';\n\n // Queue overflow protection\n if (this.notificationQueue.length >= this.maxQueueSize) {\n this.clearNotificationQueue();\n }\n\n try {\n \n const notification = new Notification(\n `${safeSenderName}`,\n {\n body: safeMessage.substring(0, 200), // Length limit\n icon: safeIcon,\n badge: safeIcon,\n tag: `chat-${options.senderId || 'unknown'}`, // Grouping\n requireInteraction: false, // Don't block user\n silent: options.silent || false,\n // Vibrate only for mobile and if supported\n vibrate: navigator.vibrate ? [200, 100, 200] : undefined,\n // Safe metadata\n data: {\n senderId: this.sanitizeText(options.senderId),\n timestamp: Date.now(),\n // Don't include sensitive data!\n }\n }\n );\n\n // Increment counter\n this.unreadCount++;\n this.updateTitle();\n\n // Add to queue for management\n this.notificationQueue.push(notification);\n\n // Safe click handler\n notification.onclick = (event) => {\n event.preventDefault(); // Prevent default behavior\n window.focus();\n notification.close();\n \n // Safe callback\n if (typeof options.onClick === 'function') {\n try {\n options.onClick(options.senderId);\n } catch (error) {\n console.error('[Notifications] Error in onClick handler:', error);\n }\n }\n };\n\n // Error handler\n notification.onerror = (event) => {\n console.error('[Notifications] Error showing notification:', event);\n };\n\n // Auto-close after reasonable time\n const autoCloseTimeout = Math.min(options.autoClose || 5000, 10000);\n setTimeout(() => {\n notification.close();\n this.removeFromQueue(notification);\n }, autoCloseTimeout);\n\n return notification;\n \n } catch (error) {\n console.error('[Notifications] Failed to create notification:', error);\n return null;\n }\n }\n\n /**\n * Remove notification from queue\n * @param {Notification} notification - Notification to remove\n * @private\n */\n removeFromQueue(notification) {\n const index = this.notificationQueue.indexOf(notification);\n if (index > -1) {\n this.notificationQueue.splice(index, 1);\n }\n }\n\n /**\n * Clear all notifications\n */\n clearNotificationQueue() {\n this.notificationQueue.forEach(notification => {\n try {\n notification.close();\n } catch (error) {\n // Ignore errors when closing\n }\n });\n this.notificationQueue = [];\n }\n\n /**\n * Reset unread counter\n */\n resetUnreadCount() {\n this.unreadCount = 0;\n this.updateTitle();\n }\n\n /**\n * Get current status\n * @returns {Object} Current notification status\n */\n getStatus() {\n return {\n permission: this.permission,\n isTabActive: this.isTabActive,\n unreadCount: this.unreadCount,\n isSecureContext: this.isSecureContext,\n queueSize: this.notificationQueue.length\n };\n }\n}\n\n/**\n * Secure integration with WebRTC\n */\nclass SecureP2PChat {\n constructor() {\n this.notificationManager = new SecureChatNotificationManager({\n maxQueueSize: 5,\n rateLimitMs: 2000,\n trustedOrigins: [\n window.location.origin,\n // Add other trusted origins for CDN icons\n ]\n });\n \n this.dataChannel = null;\n this.peerConnection = null;\n this.remotePeerName = 'Peer';\n this.messageHistory = [];\n this.maxHistorySize = 100;\n }\n\n /**\n * Initialize when user connects\n */\n async init() {\n // Initialize notification manager silently\n }\n\n /**\n * Method for manual permission request (called on click)\n * @returns {Promise} Permission granted status\n */\n async enableNotifications() {\n const granted = await this.notificationManager.requestPermission();\n return granted;\n }\n\n /**\n * Setup DataChannel with security checks\n * @param {RTCDataChannel} dataChannel - WebRTC data channel\n */\n setupDataChannel(dataChannel) {\n if (!dataChannel) {\n console.error('[Chat] Invalid DataChannel');\n return;\n }\n\n this.dataChannel = dataChannel;\n \n // Setup handlers\n this.dataChannel.onmessage = (event) => {\n this.handleIncomingMessage(event.data);\n };\n\n this.dataChannel.onerror = (error) => {\n // Handle error silently\n };\n }\n\n /**\n * XSS Protection: Validate incoming messages\n * @param {string|Object} data - Message data\n * @returns {Object|null} Validated message or null\n * @private\n */\n validateMessage(data) {\n try {\n const message = typeof data === 'string' ? JSON.parse(data) : data;\n \n // Check message structure\n if (!message || typeof message !== 'object') {\n throw new Error('Invalid message structure');\n }\n\n // Check required fields\n if (!message.text || typeof message.text !== 'string') {\n throw new Error('Invalid message text');\n }\n\n // Message length limit (DoS protection)\n if (message.text.length > 10000) {\n throw new Error('Message too long');\n }\n\n return {\n text: message.text,\n senderName: message.senderName || 'Unknown',\n senderId: message.senderId || 'unknown',\n timestamp: message.timestamp || Date.now(),\n senderAvatar: message.senderAvatar || null\n };\n \n } catch (error) {\n console.error('[Chat] Message validation failed:', error);\n return null;\n }\n }\n\n /**\n * Secure handling of incoming messages\n * @param {string|Object} data - Message data\n * @private\n */\n handleIncomingMessage(data) {\n const message = this.validateMessage(data);\n \n if (!message) {\n return;\n }\n\n // Save to history (with limit)\n this.messageHistory.push(message);\n if (this.messageHistory.length > this.maxHistorySize) {\n this.messageHistory.shift();\n }\n\n // Display in UI (with sanitization)\n this.displayMessage(message);\n\n // Send notification only if tab is inactive\n this.notificationManager.notify(\n message.senderName,\n message.text,\n {\n icon: message.senderAvatar,\n senderId: message.senderId,\n onClick: (senderId) => {\n this.scrollToLatestMessage();\n }\n }\n );\n\n // Optional: sound (with check)\n if (!this.notificationManager.isTabActive) {\n this.playNotificationSound();\n }\n }\n\n /**\n * XSS Protection: Safe message display\n * @param {Object} message - Message to display\n * @private\n */\n displayMessage(message) {\n const container = document.getElementById('messages');\n if (!container) {\n return;\n }\n\n const messageEl = document.createElement('div');\n messageEl.className = 'message';\n \n // Use textContent to prevent XSS\n const nameEl = document.createElement('strong');\n nameEl.textContent = message.senderName + ': ';\n \n const textEl = document.createElement('span');\n textEl.textContent = message.text;\n textEl.style.wordWrap = 'break-word';\n textEl.style.overflowWrap = 'break-word';\n textEl.style.whiteSpace = 'normal';\n \n const timeEl = document.createElement('small');\n timeEl.textContent = new Date(message.timestamp).toLocaleTimeString();\n \n messageEl.appendChild(nameEl);\n messageEl.appendChild(textEl);\n messageEl.appendChild(document.createElement('br'));\n messageEl.appendChild(timeEl);\n \n container.appendChild(messageEl);\n this.scrollToLatestMessage();\n }\n\n /**\n * Safe sound playback\n * @private\n */\n playNotificationSound() {\n try {\n // Use only local audio files\n const audio = new Audio('/assets/audio/notification.mp3');\n audio.volume = 0.3; // Moderate volume\n \n // Error handling\n audio.play().catch(error => {\n // Handle audio error silently\n });\n } catch (error) {\n // Handle audio creation error silently\n }\n }\n\n /**\n * Scroll to latest message\n * @private\n */\n scrollToLatestMessage() {\n const container = document.getElementById('messages');\n if (container) {\n container.scrollTop = container.scrollHeight;\n }\n }\n\n /**\n * Get status\n * @returns {Object} Current chat status\n */\n getStatus() {\n return {\n notifications: this.notificationManager.getStatus(),\n messageCount: this.messageHistory.length,\n connected: this.dataChannel?.readyState === 'open'\n };\n }\n}\n\n// Export for use in other modules\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { SecureChatNotificationManager, SecureP2PChat };\n}\n\n// Global export for browser usage\nif (typeof window !== 'undefined') {\n window.SecureChatNotificationManager = SecureChatNotificationManager;\n window.SecureP2PChat = SecureP2PChat;\n}\n", "/**\n * Notification Integration Module for SecureBit WebRTC Chat\n * Integrates secure notifications with existing WebRTC architecture\n * \n * @version 1.0.0\n * @author SecureBit Team\n * @license MIT\n */\n\nimport { SecureChatNotificationManager } from './SecureNotificationManager.js';\n\nclass NotificationIntegration {\n constructor(webrtcManager) {\n this.webrtcManager = webrtcManager;\n this.notificationManager = new SecureChatNotificationManager({\n maxQueueSize: 10,\n rateLimitMs: 1000, // Reduced from 2000ms to 1000ms\n trustedOrigins: [\n window.location.origin,\n // Add other trusted origins for CDN icons\n ]\n });\n \n this.isInitialized = false;\n this.originalOnMessage = null;\n this.originalOnStatusChange = null;\n this.processedMessages = new Set(); // Track processed messages to avoid duplicates\n }\n\n /**\n * Initialize notification integration\n * @returns {Promise} Initialization success\n */\n async init() {\n try {\n if (this.isInitialized) {\n return true;\n }\n\n // Store original callbacks\n this.originalOnMessage = this.webrtcManager.onMessage;\n this.originalOnStatusChange = this.webrtcManager.onStatusChange;\n\n\n // Wrap the original onMessage callback.\n // IMPORTANT: forward ALL arguments (incl. per-message `meta`) so the app\n // still receives view-once / disappearing / unsend metadata.\n this.webrtcManager.onMessage = (message, type, ...rest) => {\n this.handleIncomingMessage(message, type, rest[0]);\n\n // Call original callback if it exists\n if (this.originalOnMessage) {\n this.originalOnMessage(message, type, ...rest);\n }\n };\n\n // Wrap the original onStatusChange callback\n this.webrtcManager.onStatusChange = (status) => {\n this.handleStatusChange(status);\n \n // Call original callback if it exists\n if (this.originalOnStatusChange) {\n this.originalOnStatusChange(status);\n }\n };\n\n // Also hook into the deliverMessageToUI method if it exists.\n // IMPORTANT: forward ALL arguments (incl. per-message `meta`) to the\n // original, otherwise view-once / disappearing / unsend metadata is lost.\n if (this.webrtcManager.deliverMessageToUI) {\n this.originalDeliverMessageToUI = this.webrtcManager.deliverMessageToUI.bind(this.webrtcManager);\n this.webrtcManager.deliverMessageToUI = (message, type, ...rest) => {\n this.handleIncomingMessage(message, type, rest[0]);\n this.originalDeliverMessageToUI(message, type, ...rest);\n };\n }\n\n this.isInitialized = true;\n return true;\n\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Handle incoming messages and trigger notifications\n * @param {*} message - Message content\n * @param {string} type - Message type\n * @private\n */\n handleIncomingMessage(message, type, meta) {\n try {\n // Create a unique key for this message to avoid duplicates\n const messageKey = `${type}:${typeof message === 'string' ? message : JSON.stringify(message)}`;\n \n // Skip if we've already processed this message\n if (this.processedMessages.has(messageKey)) {\n return;\n }\n \n // Mark message as processed\n this.processedMessages.add(messageKey);\n \n // Clean up old processed messages (keep only last 100)\n if (this.processedMessages.size > 100) {\n const messagesArray = Array.from(this.processedMessages);\n this.processedMessages.clear();\n messagesArray.slice(-50).forEach(msg => this.processedMessages.add(msg));\n }\n \n \n // Only process chat messages, not system messages\n if (type === 'system' || type === 'file-transfer' || type === 'heartbeat') {\n return;\n }\n\n // Extract message information\n const messageInfo = this.extractMessageInfo(message, type);\n if (!messageInfo) {\n return;\n }\n\n // PRIVACY: a view-once or disappearing message must not be copied into the\n // OS notification. Notifications are shown only while the tab is in the\n // background \u2014 i.e. typically on a lock screen \u2014 and once the OS has the\n // text it lands in the notification centre, in backups and on the user's\n // other synced devices. From there the app can no longer delete it, so the\n // message the UI destroys after 30 seconds outlives itself indefinitely.\n // Show that something arrived; never what it said.\n const isEphemeral = !!meta && typeof meta === 'object' &&\n (meta.once === true || (Number.isFinite(meta.ttl) && meta.ttl > 0));\n const notificationText = isEphemeral ? 'Sent you a private message' : messageInfo.text;\n\n // Send notification\n const notificationResult = this.notificationManager.notify(\n messageInfo.senderName,\n notificationText,\n {\n icon: messageInfo.senderAvatar,\n senderId: messageInfo.senderId,\n onClick: (senderId) => {\n this.focusChatWindow();\n }\n }\n );\n\n } catch (error) {\n // Handle error silently\n }\n }\n\n /**\n * Handle status changes\n * @param {string} status - Connection status\n * @private\n */\n handleStatusChange(status) {\n try {\n // Clear notifications when connection is lost\n if (status === 'disconnected' || status === 'failed') {\n this.notificationManager.clearNotificationQueue();\n this.notificationManager.resetUnreadCount();\n }\n } catch (error) {\n // Handle error silently\n }\n }\n\n /**\n * Extract message information for notifications\n * @param {*} message - Message content\n * @param {string} type - Message type\n * @returns {Object|null} Extracted message info or null\n * @private\n */\n extractMessageInfo(message, type) {\n try {\n let messageData = message;\n\n // Handle different message formats\n if (typeof message === 'string') {\n try {\n messageData = JSON.parse(message);\n } catch (e) {\n // Plain text message\n return {\n senderName: 'Peer',\n text: message,\n senderId: 'peer',\n senderAvatar: null\n };\n }\n }\n\n // Handle structured message data\n if (typeof messageData === 'object' && messageData !== null) {\n return {\n senderName: messageData.senderName || messageData.name || 'Peer',\n text: messageData.text || messageData.message || messageData.content || '',\n senderId: messageData.senderId || messageData.id || 'peer',\n senderAvatar: messageData.senderAvatar || messageData.avatar || null\n };\n }\n\n return null;\n } catch (error) {\n return null;\n }\n }\n\n /**\n * Focus chat window when notification is clicked\n * @private\n */\n focusChatWindow() {\n try {\n window.focus();\n \n // Scroll to bottom of messages if container exists\n const messagesContainer = document.getElementById('messages');\n if (messagesContainer) {\n messagesContainer.scrollTop = messagesContainer.scrollHeight;\n }\n } catch (error) {\n // Handle error silently\n }\n }\n\n /**\n * Request notification permission\n * @returns {Promise} Permission granted status\n */\n async requestPermission() {\n try {\n return await this.notificationManager.requestPermission();\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Get notification status\n * @returns {Object} Notification status\n */\n getStatus() {\n return this.notificationManager.getStatus();\n }\n\n /**\n * Clear all notifications\n */\n clearNotifications() {\n this.notificationManager.clearNotificationQueue();\n this.notificationManager.resetUnreadCount();\n }\n\n /**\n * Cleanup integration\n */\n cleanup() {\n try {\n if (this.isInitialized) {\n // Restore original callbacks\n if (this.originalOnMessage) {\n this.webrtcManager.onMessage = this.originalOnMessage;\n }\n if (this.originalOnStatusChange) {\n this.webrtcManager.onStatusChange = this.originalOnStatusChange;\n }\n if (this.originalDeliverMessageToUI) {\n this.webrtcManager.deliverMessageToUI = this.originalDeliverMessageToUI;\n }\n\n // Clear notifications\n this.clearNotifications();\n\n this.isInitialized = false;\n }\n } catch (error) {\n // Handle error silently\n }\n }\n}\n\n// Export for use in other modules\nif (typeof module !== 'undefined' && module.exports) {\n module.exports = { NotificationIntegration };\n}\n\n// Global export for browser usage\nif (typeof window !== 'undefined') {\n window.NotificationIntegration = NotificationIntegration;\n}\n", "const {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n} = Object;\n\nlet { freeze, seal, create } = Object; // eslint-disable-line import/no-mutable-exports\nlet { apply, construct } = typeof Reflect !== 'undefined' && Reflect;\n\nif (!freeze) {\n freeze = function (x: T): T {\n return x;\n };\n}\n\nif (!seal) {\n seal = function (x: T): T {\n return x;\n };\n}\n\nif (!apply) {\n apply = function (\n func: (thisArg: any, ...args: any[]) => T,\n thisArg: any,\n ...args: any[]\n ): T {\n return func.apply(thisArg, args);\n };\n}\n\nif (!construct) {\n construct = function (Func: new (...args: any[]) => T, ...args: any[]): T {\n return new Func(...args);\n };\n}\n\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayIndexOf = unapply(Array.prototype.indexOf);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySlice = unapply(Array.prototype.slice);\nconst arraySplice = unapply(Array.prototype.splice);\nconst arrayIsArray = Array.isArray;\n\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\n\nconst numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString =\n typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString =\n typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\n\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\n\nconst regExpTest = unapply(RegExp.prototype.test);\n\nconst typeErrorCreate = unconstruct(TypeError);\n\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(\n func: (thisArg: any, ...args: any[]) => T\n): (thisArg: any, ...args: any[]) => T {\n return (thisArg: any, ...args: any[]): T => {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n\n return apply(func, thisArg, args);\n };\n}\n\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(\n Func: new (...args: any[]) => T\n): (...args: any[]) => T {\n return (...args: any[]): T => construct(Func, args);\n}\n\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(\n set: Record,\n array: readonly unknown[],\n transformCaseFunc: ReturnType> = stringToLowerCase\n): Record {\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n\n if (!arrayIsArray(array)) {\n return set;\n }\n\n let l = array.length;\n while (l--) {\n let element = array[l];\n\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n (array as unknown[])[l] = lcElement;\n }\n\n element = lcElement;\n }\n }\n\n set[element as string] = true;\n }\n\n return set;\n}\n\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array: T[]): Array {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n\n return array;\n}\n\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone>(object: T): T {\n const newObject = create(null);\n\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n\n if (isPropertyExist) {\n if (arrayIsArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (\n value &&\n typeof value === 'object' &&\n value.constructor === Object\n ) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n\n return newObject;\n}\n\n/**\n * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value: unknown): string {\n switch (typeof value) {\n case 'string': {\n return value;\n }\n\n case 'number': {\n return numberToString(value);\n }\n\n case 'boolean': {\n return booleanToString(value);\n }\n\n case 'bigint': {\n return bigintToString ? bigintToString(value) : '0';\n }\n\n case 'symbol': {\n return symbolToString ? symbolToString(value) : 'Symbol()';\n }\n\n case 'undefined': {\n return objectToString(value);\n }\n\n case 'function':\n case 'object': {\n if (value === null) {\n return objectToString(value);\n }\n\n const valueAsRecord = value as Record;\n const valueToString = lookupGetter(valueAsRecord, 'toString');\n\n if (typeof valueToString === 'function') {\n const stringified = valueToString(valueAsRecord);\n\n return typeof stringified === 'string'\n ? stringified\n : objectToString(stringified);\n }\n\n return objectToString(value);\n }\n\n default: {\n return objectToString(value);\n }\n }\n}\n\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter>(\n object: T,\n prop: string\n): ReturnType> | (() => null) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n\n object = getPrototypeOf(object);\n }\n\n function fallbackValue(): null {\n return null;\n }\n\n return fallbackValue;\n}\n\nfunction isRegex(value: unknown): value is RegExp {\n try {\n regExpTest(value as RegExp, '');\n return true;\n } catch {\n return false;\n }\n}\n\nexport {\n // Array\n arrayForEach,\n arrayIndexOf,\n arrayIsArray,\n arrayLastIndexOf,\n arrayPop,\n arrayPush,\n arraySlice,\n arraySplice,\n // Object\n entries,\n freeze,\n getPrototypeOf,\n getOwnPropertyDescriptor,\n isFrozen,\n setPrototypeOf,\n seal,\n clone,\n create,\n objectHasOwnProperty,\n objectToString,\n // RegExp\n regExpTest,\n isRegex,\n // String\n stringIndexOf,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringTrim,\n // Other conversion\n stringifyValue,\n // Errors\n typeErrorCreate,\n // Other\n lookupGetter,\n addToSet,\n // Reflect\n unapply,\n unconstruct,\n};\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'a',\n 'abbr',\n 'acronym',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blink',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'center',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'content',\n 'data',\n 'datalist',\n 'dd',\n 'decorator',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'dir',\n 'div',\n 'dl',\n 'dt',\n 'element',\n 'em',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'font',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'main',\n 'map',\n 'mark',\n 'marquee',\n 'menu',\n 'menuitem',\n 'meter',\n 'nav',\n 'nobr',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'search',\n 'section',\n 'select',\n 'shadow',\n 'slot',\n 'small',\n 'source',\n 'spacer',\n 'span',\n 'strike',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'tr',\n 'track',\n 'tt',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr',\n] as const);\n\nexport const svg = freeze([\n 'svg',\n 'a',\n 'altglyph',\n 'altglyphdef',\n 'altglyphitem',\n 'animatecolor',\n 'animatemotion',\n 'animatetransform',\n 'circle',\n 'clippath',\n 'defs',\n 'desc',\n 'ellipse',\n 'enterkeyhint',\n 'exportparts',\n 'filter',\n 'font',\n 'g',\n 'glyph',\n 'glyphref',\n 'hkern',\n 'image',\n 'inputmode',\n 'line',\n 'lineargradient',\n 'marker',\n 'mask',\n 'metadata',\n 'mpath',\n 'part',\n 'path',\n 'pattern',\n 'polygon',\n 'polyline',\n 'radialgradient',\n 'rect',\n 'stop',\n 'style',\n 'switch',\n 'symbol',\n 'text',\n 'textpath',\n 'title',\n 'tref',\n 'tspan',\n 'view',\n 'vkern',\n] as const);\n\nexport const svgFilters = freeze([\n 'feBlend',\n 'feColorMatrix',\n 'feComponentTransfer',\n 'feComposite',\n 'feConvolveMatrix',\n 'feDiffuseLighting',\n 'feDisplacementMap',\n 'feDistantLight',\n 'feDropShadow',\n 'feFlood',\n 'feFuncA',\n 'feFuncB',\n 'feFuncG',\n 'feFuncR',\n 'feGaussianBlur',\n 'feImage',\n 'feMerge',\n 'feMergeNode',\n 'feMorphology',\n 'feOffset',\n 'fePointLight',\n 'feSpecularLighting',\n 'feSpotLight',\n 'feTile',\n 'feTurbulence',\n] as const);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nexport const svgDisallowed = freeze([\n 'animate',\n 'color-profile',\n 'cursor',\n 'discard',\n 'font-face',\n 'font-face-format',\n 'font-face-name',\n 'font-face-src',\n 'font-face-uri',\n 'foreignobject',\n 'hatch',\n 'hatchpath',\n 'mesh',\n 'meshgradient',\n 'meshpatch',\n 'meshrow',\n 'missing-glyph',\n 'script',\n 'set',\n 'solidcolor',\n 'unknown',\n 'use',\n] as const);\n\nexport const mathMl = freeze([\n 'math',\n 'menclose',\n 'merror',\n 'mfenced',\n 'mfrac',\n 'mglyph',\n 'mi',\n 'mlabeledtr',\n 'mmultiscripts',\n 'mn',\n 'mo',\n 'mover',\n 'mpadded',\n 'mphantom',\n 'mroot',\n 'mrow',\n 'ms',\n 'mspace',\n 'msqrt',\n 'mstyle',\n 'msub',\n 'msup',\n 'msubsup',\n 'mtable',\n 'mtd',\n 'mtext',\n 'mtr',\n 'munder',\n 'munderover',\n 'mprescripts',\n] as const);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nexport const mathMlDisallowed = freeze([\n 'maction',\n 'maligngroup',\n 'malignmark',\n 'mlongdiv',\n 'mscarries',\n 'mscarry',\n 'msgroup',\n 'mstack',\n 'msline',\n 'msrow',\n 'semantics',\n 'annotation',\n 'annotation-xml',\n 'mprescripts',\n 'none',\n] as const);\n\nexport const text = freeze(['#text'] as const);\n", "import { freeze } from './utils.js';\n\nexport const html = freeze([\n 'accept',\n 'action',\n 'align',\n 'alt',\n 'autocapitalize',\n 'autocomplete',\n 'autopictureinpicture',\n 'autoplay',\n 'background',\n 'bgcolor',\n 'border',\n 'capture',\n 'cellpadding',\n 'cellspacing',\n 'checked',\n 'cite',\n 'class',\n 'clear',\n 'color',\n 'cols',\n 'colspan',\n 'command',\n 'commandfor',\n 'controls',\n 'controlslist',\n 'coords',\n 'crossorigin',\n 'datetime',\n 'decoding',\n 'default',\n 'dir',\n 'disabled',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'download',\n 'draggable',\n 'enctype',\n 'enterkeyhint',\n 'exportparts',\n 'face',\n 'for',\n 'headers',\n 'height',\n 'hidden',\n 'high',\n 'href',\n 'hreflang',\n 'id',\n 'inert',\n 'inputmode',\n 'integrity',\n 'ismap',\n 'kind',\n 'label',\n 'lang',\n 'list',\n 'loading',\n 'loop',\n 'low',\n 'max',\n 'maxlength',\n 'media',\n 'method',\n 'min',\n 'minlength',\n 'multiple',\n 'muted',\n 'name',\n 'nonce',\n 'noshade',\n 'novalidate',\n 'nowrap',\n 'open',\n 'optimum',\n 'part',\n 'pattern',\n 'placeholder',\n 'playsinline',\n 'popover',\n 'popovertarget',\n 'popovertargetaction',\n 'poster',\n 'preload',\n 'pubdate',\n 'radiogroup',\n 'readonly',\n 'rel',\n 'required',\n 'rev',\n 'reversed',\n 'role',\n 'rows',\n 'rowspan',\n 'spellcheck',\n 'scope',\n 'selected',\n 'shape',\n 'size',\n 'sizes',\n 'slot',\n 'span',\n 'srclang',\n 'start',\n 'src',\n 'srcset',\n 'step',\n 'style',\n 'summary',\n 'tabindex',\n 'title',\n 'translate',\n 'type',\n 'usemap',\n 'valign',\n 'value',\n 'width',\n 'wrap',\n 'xmlns',\n] as const);\n\nexport const svg = freeze([\n 'accent-height',\n 'accumulate',\n 'additive',\n 'alignment-baseline',\n 'amplitude',\n 'ascent',\n 'attributename',\n 'attributetype',\n 'azimuth',\n 'basefrequency',\n 'baseline-shift',\n 'begin',\n 'bias',\n 'by',\n 'class',\n 'clip',\n 'clippathunits',\n 'clip-path',\n 'clip-rule',\n 'color',\n 'color-interpolation',\n 'color-interpolation-filters',\n 'color-profile',\n 'color-rendering',\n 'cx',\n 'cy',\n 'd',\n 'dx',\n 'dy',\n 'diffuseconstant',\n 'direction',\n 'display',\n 'divisor',\n 'dur',\n 'edgemode',\n 'elevation',\n 'end',\n 'exponent',\n 'fill',\n 'fill-opacity',\n 'fill-rule',\n 'filter',\n 'filterunits',\n 'flood-color',\n 'flood-opacity',\n 'font-family',\n 'font-size',\n 'font-size-adjust',\n 'font-stretch',\n 'font-style',\n 'font-variant',\n 'font-weight',\n 'fx',\n 'fy',\n 'g1',\n 'g2',\n 'glyph-name',\n 'glyphref',\n 'gradientunits',\n 'gradienttransform',\n 'height',\n 'href',\n 'id',\n 'image-rendering',\n 'in',\n 'in2',\n 'intercept',\n 'k',\n 'k1',\n 'k2',\n 'k3',\n 'k4',\n 'kerning',\n 'keypoints',\n 'keysplines',\n 'keytimes',\n 'lang',\n 'lengthadjust',\n 'letter-spacing',\n 'kernelmatrix',\n 'kernelunitlength',\n 'lighting-color',\n 'local',\n 'marker-end',\n 'marker-mid',\n 'marker-start',\n 'markerheight',\n 'markerunits',\n 'markerwidth',\n 'maskcontentunits',\n 'maskunits',\n 'max',\n 'mask',\n 'mask-type',\n 'media',\n 'method',\n 'mode',\n 'min',\n 'name',\n 'numoctaves',\n 'offset',\n 'operator',\n 'opacity',\n 'order',\n 'orient',\n 'orientation',\n 'origin',\n 'overflow',\n 'paint-order',\n 'path',\n 'pathlength',\n 'patterncontentunits',\n 'patterntransform',\n 'patternunits',\n 'points',\n 'preservealpha',\n 'preserveaspectratio',\n 'primitiveunits',\n 'r',\n 'rx',\n 'ry',\n 'radius',\n 'refx',\n 'refy',\n 'repeatcount',\n 'repeatdur',\n 'restart',\n 'result',\n 'rotate',\n 'scale',\n 'seed',\n 'shape-rendering',\n 'slope',\n 'specularconstant',\n 'specularexponent',\n 'spreadmethod',\n 'startoffset',\n 'stddeviation',\n 'stitchtiles',\n 'stop-color',\n 'stop-opacity',\n 'stroke-dasharray',\n 'stroke-dashoffset',\n 'stroke-linecap',\n 'stroke-linejoin',\n 'stroke-miterlimit',\n 'stroke-opacity',\n 'stroke',\n 'stroke-width',\n 'style',\n 'surfacescale',\n 'systemlanguage',\n 'tabindex',\n 'tablevalues',\n 'targetx',\n 'targety',\n 'transform',\n 'transform-origin',\n 'text-anchor',\n 'text-decoration',\n 'text-rendering',\n 'textlength',\n 'type',\n 'u1',\n 'u2',\n 'unicode',\n 'values',\n 'viewbox',\n 'visibility',\n 'version',\n 'vert-adv-y',\n 'vert-origin-x',\n 'vert-origin-y',\n 'width',\n 'word-spacing',\n 'wrap',\n 'writing-mode',\n 'xchannelselector',\n 'ychannelselector',\n 'x',\n 'x1',\n 'x2',\n 'xmlns',\n 'y',\n 'y1',\n 'y2',\n 'z',\n 'zoomandpan',\n] as const);\n\nexport const mathMl = freeze([\n 'accent',\n 'accentunder',\n 'align',\n 'bevelled',\n 'close',\n 'columnalign',\n 'columnlines',\n 'columnspacing',\n 'columnspan',\n 'denomalign',\n 'depth',\n 'dir',\n 'display',\n 'displaystyle',\n 'encoding',\n 'fence',\n 'frame',\n 'height',\n 'href',\n 'id',\n 'largeop',\n 'length',\n 'linethickness',\n 'lquote',\n 'lspace',\n 'mathbackground',\n 'mathcolor',\n 'mathsize',\n 'mathvariant',\n 'maxsize',\n 'minsize',\n 'movablelimits',\n 'notation',\n 'numalign',\n 'open',\n 'rowalign',\n 'rowlines',\n 'rowspacing',\n 'rowspan',\n 'rspace',\n 'rquote',\n 'scriptlevel',\n 'scriptminsize',\n 'scriptsizemultiplier',\n 'selection',\n 'separator',\n 'separators',\n 'stretchy',\n 'subscriptshift',\n 'supscriptshift',\n 'symmetric',\n 'voffset',\n 'width',\n 'xmlns',\n]);\n\nexport const xml = freeze([\n 'xlink:href',\n 'xml:id',\n 'xlink:title',\n 'xml:space',\n 'xmlns:xlink',\n] as const);\n", "import { seal } from './utils.js';\n\nexport const MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nexport const ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nexport const TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\nexport const DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nexport const ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nexport const IS_ALLOWED_URI = seal(\n /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nexport const IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nexport const ATTR_WHITESPACE = seal(\n /[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nexport const DOCTYPE_NAME = seal(/^html$/i);\nexport const CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\n// Markup-significant character probes used by _sanitizeElements.\n// Shared module-level instances are safe despite the sticky /g flags:\n// unapply() resets lastIndex for RegExp receivers before every call.\nexport const ELEMENT_MARKUP_PROBE = seal(/<[/\\w!]/g);\nexport const COMMENT_MARKUP_PROBE = seal(/<[/\\w]/g);\nexport const FALLBACK_TAG_CLOSE = seal(/<\\/no(script|embed|frames)/i);\nexport const SELF_CLOSING_TAG = seal(/\\/>/i);\n", "/* eslint-disable @typescript-eslint/indent */\n\nimport type { Config, UseProfilesConfig } from './config';\nimport type { DOMPurify, HooksMap, HookFunction, WindowLike } from './types';\nimport * as TAGS from './tags.js';\nimport * as ATTRS from './attrs.js';\nimport * as EXPRESSIONS from './regexp.js';\nimport {\n addToSet,\n clone,\n entries,\n freeze,\n seal,\n arrayForEach,\n arrayIsArray,\n arrayLastIndexOf,\n arrayPop,\n arrayPush,\n arraySplice,\n stringMatch,\n stringReplace,\n stringToLowerCase,\n stringToString,\n stringIndexOf,\n stringTrim,\n regExpTest,\n isRegex,\n typeErrorCreate,\n lookupGetter,\n create,\n objectHasOwnProperty,\n stringifyValue,\n} from './utils.js';\n\nexport type { Config } from './config';\n\nexport type {\n DOMPurify,\n RemovedElement,\n RemovedAttribute,\n HookName,\n NodeHook,\n ElementHook,\n DocumentFragmentHook,\n UponSanitizeElementHook,\n UponSanitizeAttributeHook,\n UponSanitizeElementHookEvent,\n UponSanitizeAttributeHookEvent,\n WindowLike,\n} from './types';\n\ndeclare const VERSION: string;\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5, // Deprecated\n entityNode: 6, // Deprecated\n processingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12, // Deprecated\n};\n\nconst getGlobal = function (): WindowLike {\n return typeof window === 'undefined' ? null : window;\n};\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function (\n trustedTypes: TrustedTypePolicyFactory,\n purifyHostElement: HTMLScriptElement\n) {\n if (\n typeof trustedTypes !== 'object' ||\n typeof trustedTypes.createPolicy !== 'function'\n ) {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n },\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn(\n 'TrustedTypes policy ' + policyName + ' could not be created.'\n );\n return null;\n }\n};\n\nconst _createHooksMap = function (): HooksMap {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: [],\n };\n};\n\n/**\n * Resolve a set-valued configuration option: a fresh set built from\n * cfg[key] when it is an own array property (seeded with a clone of\n * options.base when given, case-normalized via options.transform),\n * the fallback set otherwise.\n *\n * @param cfg the cloned, prototype-free configuration object\n * @param key the configuration property to read\n * @param fallback the set to use when the option is absent or not an array\n * @param options transform and optional base set to merge into\n * @returns the resolved set\n */\nconst _resolveSetOption = function (\n cfg: Config,\n key: keyof Config,\n fallback: Record,\n options: {\n transform: Parameters[2];\n base?: Record;\n }\n): Record {\n return objectHasOwnProperty(cfg, key) && arrayIsArray(cfg[key])\n ? addToSet(\n options.base ? clone(options.base) : {},\n cfg[key] as readonly unknown[],\n options.transform\n )\n : fallback;\n};\n\nfunction createDOMPurify(window: WindowLike = getGlobal()): DOMPurify {\n const DOMPurify: DOMPurify = (root: WindowLike) => createDOMPurify(root);\n\n DOMPurify.version = VERSION;\n\n DOMPurify.removed = [];\n\n if (\n !window ||\n !window.document ||\n window.document.nodeType !== NODE_TYPE.document ||\n !window.Element\n ) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n\n return DOMPurify;\n }\n\n let { document } = window;\n\n const originalDocument = document;\n const currentScript: HTMLScriptElement =\n originalDocument.currentScript as HTMLScriptElement;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || (window as any).MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes,\n } = window;\n\n const ElementPrototype = Element.prototype;\n\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n const getShadowRoot = lookupGetter(ElementPrototype, 'shadowRoot');\n const getAttributes = lookupGetter(ElementPrototype, 'attributes');\n const getNodeType =\n Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeType') : null;\n const getNodeName =\n Node && Node.prototype ? lookupGetter(Node.prototype, 'nodeName') : null;\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n\n let trustedTypesPolicy;\n let emptyHTML = '';\n\n // The instance's own internal Trusted Types policy. Unlike a caller-supplied\n // `TRUSTED_TYPES_POLICY`, this is created at most once \u2014 Trusted Types throws\n // on duplicate policy names \u2014 and is the only policy allowed to persist\n // across configurations and survive `clearConfig()`.\n let defaultTrustedTypesPolicy;\n let defaultTrustedTypesPolicyResolved = false;\n\n // Tracks whether we are already inside a call to the configured Trusted Types\n // policy (`createHTML` or `createScriptURL`). If a supplied policy callback\n // itself calls `DOMPurify.sanitize` (the cause of #1422), `sanitize` would\n // re-enter the policy and recurse until the stack overflows. We detect that\n // re-entry and throw a clear, actionable error instead. The guard is shared\n // across both callbacks, because either one re-entering `sanitize` triggers\n // the same unbounded recursion.\n let IN_TRUSTED_TYPES_POLICY = 0;\n const _assertNotInTrustedTypesPolicy = function (): void {\n if (IN_TRUSTED_TYPES_POLICY > 0) {\n throw typeErrorCreate(\n 'A configured TRUSTED_TYPES_POLICY callback (createHTML or ' +\n 'createScriptURL) must not call DOMPurify.sanitize, as that causes ' +\n 'infinite recursion. Do not pass a policy whose callbacks wrap ' +\n 'DOMPurify as TRUSTED_TYPES_POLICY; see the \"DOMPurify and Trusted ' +\n 'Types\" section of the README.'\n );\n }\n };\n\n const _createTrustedHTML = function (html: string): string {\n _assertNotInTrustedTypesPolicy();\n\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createHTML(html);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n\n const _createTrustedScriptURL = function (scriptUrl: string): string {\n _assertNotInTrustedTypesPolicy();\n\n IN_TRUSTED_TYPES_POLICY++;\n try {\n return trustedTypesPolicy.createScriptURL(scriptUrl);\n } finally {\n IN_TRUSTED_TYPES_POLICY--;\n }\n };\n\n // Lazily resolve (and cache) the instance's internal default policy.\n // Resolution is attempted at most once: a successful `createPolicy` cannot be\n // repeated (Trusted Types throws on duplicate names), and a failed or\n // unsupported attempt must not be retried on every parse.\n const _getDefaultTrustedTypesPolicy = function () {\n if (!defaultTrustedTypesPolicyResolved) {\n defaultTrustedTypesPolicy = _createTrustedTypesPolicy(\n trustedTypes,\n currentScript\n );\n defaultTrustedTypesPolicyResolved = true;\n }\n\n return defaultTrustedTypesPolicy;\n };\n\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName,\n } = document;\n const { importNode } = originalDocument;\n\n let hooks = _createHooksMap();\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported =\n typeof entries === 'function' &&\n typeof getParentNode === 'function' &&\n implementation &&\n implementation.createHTMLDocument !== undefined;\n\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT,\n } = EXPRESSIONS;\n\n let { IS_ALLOWED_URI } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [\n ...TAGS.html,\n ...TAGS.svg,\n ...TAGS.svgFilters,\n ...TAGS.mathMl,\n ...TAGS.text,\n ]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [\n ...ATTRS.html,\n ...ATTRS.svg,\n ...ATTRS.mathMl,\n ...ATTRS.xml,\n ]);\n\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(\n create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false,\n },\n })\n );\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(\n create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null,\n },\n })\n );\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (\u00A77.3.3)\n * - DOM Tree Accessors (\u00A73.1.5)\n * - Form Element Parent-Child Relations (\u00A74.10.3)\n * - Iframe srcdoc / Nested WindowProxies (\u00A74.8.5)\n * - HTMLCollection (\u00A74.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES: UseProfilesConfig | false = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, [\n 'annotation-xml',\n 'audio',\n 'colgroup',\n 'desc',\n 'foreignobject',\n 'head',\n 'iframe',\n 'math',\n 'mi',\n 'mn',\n 'mo',\n 'ms',\n 'mtext',\n 'noembed',\n 'noframes',\n 'noscript',\n 'plaintext',\n 'script',\n // mirrors the selected